diff --git a/Barotrauma/BarotraumaClient/LinuxClient.csproj b/Barotrauma/BarotraumaClient/LinuxClient.csproj index c3c50da75..56b243537 100644 --- a/Barotrauma/BarotraumaClient/LinuxClient.csproj +++ b/Barotrauma/BarotraumaClient/LinuxClient.csproj @@ -274,63 +274,6 @@ PreserveNewest - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - @@ -361,6 +304,6 @@ - + \ No newline at end of file diff --git a/Barotrauma/BarotraumaClient/Properties/AssemblyInfo.cs b/Barotrauma/BarotraumaClient/Properties/AssemblyInfo.cs index d93ecf6e3..598c5e10d 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.9.0.2")] -[assembly: AssemblyFileVersion("0.9.0.2")] +[assembly: AssemblyVersion("0.9.0.1")] +[assembly: AssemblyFileVersion("0.9.0.1")] diff --git a/Barotrauma/BarotraumaClient/Source/Characters/Character.cs b/Barotrauma/BarotraumaClient/Source/Characters/Character.cs index 633916804..4c029c726 100644 --- a/Barotrauma/BarotraumaClient/Source/Characters/Character.cs +++ b/Barotrauma/BarotraumaClient/Source/Characters/Character.cs @@ -504,7 +504,7 @@ namespace Barotrauma foreach (Character c in CharacterList) { - if (!CanInteractWith(c, checkVisibility: false)) continue; + if (!CanInteractWith(c)) continue; float dist = Vector2.DistanceSquared(mouseSimPos, c.SimPosition); if (dist < maxDist * maxDist && (closestCharacter == null || dist < closestDist)) diff --git a/Barotrauma/BarotraumaClient/Source/Characters/Health/CharacterHealth.cs b/Barotrauma/BarotraumaClient/Source/Characters/Health/CharacterHealth.cs index afa1d3daf..86f4895d3 100644 --- a/Barotrauma/BarotraumaClient/Source/Characters/Health/CharacterHealth.cs +++ b/Barotrauma/BarotraumaClient/Source/Characters/Health/CharacterHealth.cs @@ -121,8 +121,8 @@ namespace Barotrauma if (value == null && Character.Controlled?.SelectedCharacter?.CharacterHealth != null && - Character.Controlled.SelectedCharacter.CharacterHealth == prevOpenHealthWindow/* && - !Character.Controlled.SelectedCharacter.CanInventoryBeAccessed*/) + Character.Controlled.SelectedCharacter.CharacterHealth == prevOpenHealthWindow && + !Character.Controlled.SelectedCharacter.CanInventoryBeAccessed) { Character.Controlled.DeselectCharacter(); } @@ -188,9 +188,14 @@ namespace Barotrauma afflictionInfoContainer = new GUIListBox(new RectTransform(new Vector2(0.7f, 0.85f), paddedInfoFrame.RectTransform, Anchor.BottomLeft)); - new GUITextBlock(new RectTransform(new Vector2(0.5f, 0.05f), paddedInfoFrame.RectTransform, Anchor.TopRight), TextManager.Get("SuitableTreatments"), textAlignment: Alignment.TopRight); + lowSkillIndicator = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.05f), paddedInfoFrame.RectTransform, Anchor.TopRight), + TextManager.Get("LowMedicalSkillWarning"), Color.Orange, textAlignment: Alignment.TopRight, font: GUI.SmallFont, wrap: true) + { + Visible = false + }; + new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.05f), paddedInfoFrame.RectTransform) { RelativeOffset = new Vector2(0.0f, 0.05f) }, TextManager.Get("SuitableTreatments"), textAlignment: Alignment.BottomRight); - recommendedTreatmentContainer = new GUIListBox(new RectTransform(new Vector2(0.28f, 0.47f), paddedInfoFrame.RectTransform, Anchor.TopRight) { RelativeOffset = new Vector2(0.0f, 0.15f) }); + recommendedTreatmentContainer = new GUIListBox(new RectTransform(new Vector2(0.28f, 0.5f), paddedInfoFrame.RectTransform, Anchor.TopRight) { RelativeOffset = new Vector2(0.0f, 0.12f) }); dropItemArea = new GUIFrame(new RectTransform(new Vector2(0.28f, 0.3f), paddedInfoFrame.RectTransform, Anchor.BottomRight) { RelativeOffset = new Vector2(0.02f, 0.0f) }, style: null) { @@ -198,17 +203,6 @@ namespace Barotrauma }; dropItemArea.RectTransform.NonScaledSize = new Point(dropItemArea.Rect.Width); - lowSkillIndicator = new GUIImage(new RectTransform(new Vector2(0.5f, 0.22f), paddedInfoFrame.RectTransform, Anchor.TopRight, Pivot.Center) { RelativeOffset = new Vector2(0.16f, 0.12f) }, - style: "GUINotificationButton") - { - ToolTip = TextManager.Get("lowmedicalskillwarning"), - Color = Color.OrangeRed, - HoverColor = Color.Orange, - PressedColor = Color.Orange, - Visible = false - }; - lowSkillIndicator.RectTransform.MaxSize = new Point(lowSkillIndicator.Rect.Height); - string[] healthCircleStyles = new string[] { "HealthCircleInner", "HealthCircleMid", "HealthCircleOuter" }; foreach (string healthCircleStyle in healthCircleStyles) { @@ -663,8 +657,7 @@ namespace Barotrauma openHealthWindow = null; } - lowSkillIndicator.Visible = Character.Controlled != null && Character.Controlled.GetSkillLevel("medical") < 50.0f; - lowSkillIndicator.Color = new Color(lowSkillIndicator.Color, MathHelper.Lerp(0.1f, 1.0f, (float)(Math.Sin(Timing.TotalTime * 5.0f) + 1.0f) / 2.0f)); + lowSkillIndicator.Visible = Timing.TotalTime % 1.0f < 0.8f && Character.Controlled != null && Character.Controlled.GetSkillLevel("medical") < 50.0f; float rotationSpeed = 0.25f; int i = 0; @@ -1060,10 +1053,10 @@ namespace Barotrauma var itemSlot = new GUIFrame(new RectTransform(new Point(recommendedTreatmentContainer.Content.Rect.Width, slotSize), recommendedTreatmentContainer.Content.RectTransform, Anchor.TopCenter), style: "InnerGlow") { - UserData = item + UserData = item, + CanBeFocused = false }; itemSlot.Color = ToolBox.GradientLerp(treatment.Value, Color.Red, Color.Orange, Color.LightGreen); - itemSlot.SelectedColor = itemSlot.HoverColor = itemSlot.Color; Sprite itemSprite = item.InventoryIcon ?? item.sprite; Color itemColor = itemSprite == item.sprite ? item.SpriteColor : item.InventoryIconColor; @@ -1075,7 +1068,7 @@ namespace Barotrauma HoverColor = itemColor, SelectedColor = itemColor }; - itemSlot.ToolTip = item.Name; + itemSlot.ToolTip = item.Name + "\n" + item.Description; } afflictionInfoContainer.Content.RectTransform.SortChildren((r1, r2) => diff --git a/Barotrauma/BarotraumaClient/Source/GUI/GUI.cs b/Barotrauma/BarotraumaClient/Source/GUI/GUI.cs index be2740daa..18093e0ed 100644 --- a/Barotrauma/BarotraumaClient/Source/GUI/GUI.cs +++ b/Barotrauma/BarotraumaClient/Source/GUI/GUI.cs @@ -1439,22 +1439,23 @@ namespace Barotrauma { PauseMenu = new GUIFrame(new RectTransform(Vector2.One, Canvas), style: null, color: Color.Black * 0.5f); - var pauseMenuInner = new GUIFrame(new RectTransform(new Vector2(0.13f, 0.35f), PauseMenu.RectTransform, Anchor.Center) { MinSize = new Point(200, 300) }); + var pauseMenuInner = new GUIFrame(new RectTransform(new Vector2(0.13f, 0.3f), PauseMenu.RectTransform, Anchor.Center) { MinSize = new Point(200, 300) }); - var buttonContainer = new GUILayoutGroup(new RectTransform(new Vector2(0.85f, 0.8f), pauseMenuInner.RectTransform, Anchor.Center) { RelativeOffset = new Vector2(0.0f, 0.05f) }) + var buttonContainer = new GUILayoutGroup(new RectTransform(new Vector2(0.85f, 0.85f), pauseMenuInner.RectTransform, Anchor.Center)) { Stretch = true, RelativeSpacing = 0.05f }; - var button = new GUIButton(new RectTransform(new Vector2(0.12f, 0.12f), buttonContainer.RectTransform, Anchor.TopRight) { RelativeOffset = new Vector2(-0.05f, -0.13f) }, - "", style: "GUIBugButton") + var button = new GUIButton(new RectTransform(new Vector2(1.0f, 0.1f), buttonContainer.RectTransform), TextManager.Get("bugreportbutton"), style: "GUIButtonLarge") { - IgnoreLayoutGroups = true, - ToolTip = TextManager.Get("bugreportbutton"), + Color = Color.Red, + HoverColor = Color.DarkRed, + PressedColor = Color.White, OnClicked = (btn, userdata) => { GameMain.Instance.ShowBugReporter(); return true; } }; + button = new GUIButton(new RectTransform(new Vector2(1.0f, 0.1f), buttonContainer.RectTransform), TextManager.Get("PauseMenuResume"), style: "GUIButtonLarge") { OnClicked = TogglePauseMenu diff --git a/Barotrauma/BarotraumaClient/Source/GUI/LoadingScreen.cs b/Barotrauma/BarotraumaClient/Source/GUI/LoadingScreen.cs index ef928a8ac..4c352fbac 100644 --- a/Barotrauma/BarotraumaClient/Source/GUI/LoadingScreen.cs +++ b/Barotrauma/BarotraumaClient/Source/GUI/LoadingScreen.cs @@ -16,7 +16,7 @@ namespace Barotrauma private RenderTarget2D renderTarget; private Sprite languageSelectionCursor; - private ScalableFont languageSelectionFont, languageSelectionFontCJK; + private ScalableFont languageSelectionFont; private Video currSplashScreen; private DateTime videoStartTime; @@ -220,13 +220,7 @@ namespace Barotrauma { if (languageSelectionFont == null) { - languageSelectionFont = new ScalableFont("Content/Fonts/NotoSans/NotoSans-Bold.ttf", - (uint)(30 * (GameMain.GraphicsHeight / 1080.0f)), graphicsDevice); - } - if (languageSelectionFontCJK == null) - { - languageSelectionFontCJK = new ScalableFont("Content/Fonts/NotoSans/NotoSansCJKsc-Bold.otf", - (uint)(30 * (GameMain.GraphicsHeight / 1080.0f)), graphicsDevice, dynamicLoading: true); + languageSelectionFont = new ScalableFont("Content/Fonts/BebasNeue-Regular.otf", (uint)(30 * (GameMain.GraphicsHeight / 1080.0f)), graphicsDevice); } if (languageSelectionCursor == null) { @@ -237,15 +231,13 @@ namespace Barotrauma Vector2 textSpacing = new Vector2(0.0f, (GameMain.GraphicsHeight * 0.5f) / TextManager.AvailableLanguages.Count()); foreach (string language in TextManager.AvailableLanguages) { - string localizedLanguageName = TextManager.GetTranslatedLanguageName(language); - var font = TextManager.IsCJK(localizedLanguageName) ? languageSelectionFontCJK : languageSelectionFont; - - Vector2 textSize = font.MeasureString(localizedLanguageName); + Vector2 textSize = languageSelectionFont.MeasureString(language); bool hover = Math.Abs(PlayerInput.MousePosition.X - textPos.X) < textSize.X / 2 && Math.Abs(PlayerInput.MousePosition.Y - textPos.Y) < textSpacing.Y / 2; - font.DrawString(spriteBatch, localizedLanguageName, textPos - textSize / 2, + //TODO: display the name of the language in the target language? + languageSelectionFont.DrawString(spriteBatch, language, textPos - textSize / 2, hover ? Color.White : Color.White * 0.6f); if (hover && PlayerInput.LeftButtonClicked()) { @@ -255,15 +247,12 @@ namespace Barotrauma GameMain.Config.SetDefaultBindings(legacy: false); GameMain.Config.CheckBindings(useDefaults: true); WaitForLanguageSelection = false; - languageSelectionFont?.Dispose(); languageSelectionFont = null; - languageSelectionFontCJK?.Dispose(); languageSelectionFontCJK = null; - break; } textPos += textSpacing; } - languageSelectionCursor.Draw(spriteBatch, PlayerInput.LatestMousePosition, scale: 0.5f); + languageSelectionCursor.Draw(spriteBatch, PlayerInput.LatestMousePosition); } private void DrawSplashScreen(SpriteBatch spriteBatch, GraphicsDevice graphics) diff --git a/Barotrauma/BarotraumaClient/Source/GameMain.cs b/Barotrauma/BarotraumaClient/Source/GameMain.cs index a7e1de746..35a63376e 100644 --- a/Barotrauma/BarotraumaClient/Source/GameMain.cs +++ b/Barotrauma/BarotraumaClient/Source/GameMain.cs @@ -287,7 +287,13 @@ namespace Barotrauma { if (GameSettings.ShowUserStatisticsPrompt) { - if (TextManager.ContainsTag("statisticspromptheader") && TextManager.ContainsTag("statisticsprompttext")) + //TODO: translate + var userStatsPrompt = new GUIMessageBox( + "Do you want to help us make Barotrauma better?", + "Do you allow Barotrauma to send usage statistics and error reports to the developers? The data is anonymous, " + + "does not contain any personal information and is only used to help us diagnose issues and improve Barotrauma.", + new string[] { "Yes", "No" }); + userStatsPrompt.Buttons[0].OnClicked += (btn, userdata) => { var userStatsPrompt = new GUIMessageBox( TextManager.Get("statisticspromptheader"), @@ -318,7 +324,17 @@ namespace Barotrauma GameSettings.SendUserStatistics = true; GameAnalyticsManager.Init(); Config.SaveNewPlayerConfig(); - } + return true; + }; + userStatsPrompt.Buttons[0].OnClicked += userStatsPrompt.Close; + userStatsPrompt.Buttons[1].OnClicked += (btn, userdata) => + { + GameSettings.ShowUserStatisticsPrompt = false; + GameSettings.SendUserStatistics = false; + Config.SaveNewPlayerConfig(); + return true; + }; + userStatsPrompt.Buttons[1].OnClicked += userStatsPrompt.Close; } else if (GameSettings.SendUserStatistics) { @@ -383,10 +399,10 @@ namespace Barotrauma DebugConsole.Log("Selected content packages: " + string.Join(", ", SelectedPackages.Select(cp => cp.Name))); } -/*#if DEBUG +#if DEBUG GameSettings.ShowUserStatisticsPrompt = false; GameSettings.SendUserStatistics = false; -#endif*/ +#endif InitUserStats(); diff --git a/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/CaptainTutorial.cs b/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/CaptainTutorial.cs index 0e329d0f2..18512989d 100644 --- a/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/CaptainTutorial.cs +++ b/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/CaptainTutorial.cs @@ -132,7 +132,7 @@ namespace Barotrauma.Tutorials { shakeTimer -= 0.1f; GameMain.GameScreen.Cam.Shake = shakeAmount; - yield return new WaitForSeconds(0.1f, false); + yield return new WaitForSeconds(0.1f); } // Room 2 @@ -142,7 +142,7 @@ namespace Barotrauma.Tutorials // Room 3 do { yield return null; } while (!captain_medicObjectiveSensor.MotionDetected); GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(captain_medic.Info.DisplayName, TextManager.Get("Captain.Radio.Medic"), ChatMessageType.Radio, null); - yield return new WaitForSeconds(2f, false); + yield return new WaitForSeconds(2f); GameMain.GameSession.CrewManager.ToggleCrewAreaOpen = true; GameMain.GameSession.CrewManager.AddCharacter(captain_medic); TriggerTutorialSegment(0); @@ -157,7 +157,7 @@ namespace Barotrauma.Tutorials // Submarine do { yield return null; } while (!captain_enteredSubmarineSensor.MotionDetected); - yield return new WaitForSeconds(3f, false); + yield return new WaitForSeconds(3f); captain_mechanic.AIController.Enabled = captain_security.AIController.Enabled = captain_engineer.AIController.Enabled = true; TriggerTutorialSegment(1); GameMain.GameSession.CrewManager.AddCharacter(captain_mechanic); @@ -169,7 +169,7 @@ namespace Barotrauma.Tutorials } while (!HasOrder(captain_mechanic, "repairsystems", "jobspecific")); RemoveCompletedObjective(segments[1]); - yield return new WaitForSeconds(2f, false); + yield return new WaitForSeconds(2f); TriggerTutorialSegment(2); GameMain.GameSession.CrewManager.AddCharacter(captain_security); do @@ -180,7 +180,7 @@ namespace Barotrauma.Tutorials } while (!HasOrder(captain_security, "operateweapons", "fireatwill")); RemoveCompletedObjective(segments[2]); - yield return new WaitForSeconds(4f, false); + yield return new WaitForSeconds(4f); TriggerTutorialSegment(3); GameMain.GameSession.CrewManager.AddCharacter(captain_engineer); do @@ -202,10 +202,10 @@ namespace Barotrauma.Tutorials do { //captain_navConsoleCustomInterface.HighlightElement(0, uiHighlightColor, duration: 1.0f, pulsateAmount: 0.0f); - yield return new WaitForSeconds(1.0f, false); + yield return new WaitForSeconds(1.0f); } while (Submarine.MainSub.DockedTo.Count > 0); RemoveCompletedObjective(segments[4]); - yield return new WaitForSeconds(2f, false); + yield return new WaitForSeconds(2f); TriggerTutorialSegment(5); // Navigate to destination do { @@ -221,15 +221,15 @@ namespace Barotrauma.Tutorials } while (!captain_sonar.IsActive); do { yield return null; } while (Vector2.Distance(Submarine.MainSub.WorldPosition, Level.Loaded.EndPosition) > 4000f); RemoveCompletedObjective(segments[5]); - yield return new WaitForSeconds(4f, false); + yield return new WaitForSeconds(4f); TriggerTutorialSegment(6); // Docking do { //captain_navConsoleCustomInterface.HighlightElement(0, uiHighlightColor, duration: 1.0f, pulsateAmount: 0.0f); - yield return new WaitForSeconds(1.0f, false); + yield return new WaitForSeconds(1.0f); } while (!Submarine.MainSub.AtEndPosition || Submarine.MainSub.DockedTo.Count == 0); RemoveCompletedObjective(segments[6]); - yield return new WaitForSeconds(3f, false); + yield return new WaitForSeconds(3f); GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Captain.Radio.Complete").Replace("[OUTPOSTNAME]", GameMain.GameSession.EndLocation.Name), ChatMessageType.Radio, null); SetHighlight(captain_navConsole.Item, false); SetHighlight(captain_sonar.Item, false); diff --git a/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/DoctorTutorial.cs b/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/DoctorTutorial.cs index ef9a5000c..f5259472d 100644 --- a/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/DoctorTutorial.cs +++ b/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/DoctorTutorial.cs @@ -21,7 +21,7 @@ namespace Barotrauma.Tutorials private ItemContainer doctor_suppliesCabinet; private ItemContainer doctor_medBayCabinet; private Character patient1, patient2; - private List subPatients; + private List subPatients = new List(); private Hull startRoom; private Hull medBay; @@ -38,8 +38,7 @@ namespace Barotrauma.Tutorials private LightComponent tutorial_submarineDoorLight; // Variables - private Sprite doctor_firstAidIcon; - private Color doctor_firstAidIconColor; + private Color doctor_iconColor = new Color(178, 118, 139); public DoctorTutorial(XElement element) : base(element) { @@ -48,11 +47,6 @@ namespace Barotrauma.Tutorials { base.Start(); - var firstAidOrder = Order.PrefabList.Find(order => order.AITag == "requestfirstaid"); - doctor_firstAidIcon = firstAidOrder.SymbolSprite; - doctor_firstAidIconColor = firstAidOrder.Color; - - subPatients = new List(); radioSpeakerName = TextManager.Get("Tutorial.Radio.Speaker"); doctor = Character.Controlled; @@ -125,7 +119,7 @@ namespace Barotrauma.Tutorials // explosions and radio messages ------------------------------------------------------ - yield return new WaitForSeconds(3.0f, false); + yield return new WaitForSeconds(3.0f); //SoundPlayer.PlayDamageSound("StructureBlunt", 10, Character.Controlled.WorldPosition); //// Room 1 @@ -147,7 +141,7 @@ namespace Barotrauma.Tutorials explosion.Explode(Character.Controlled.WorldPosition - Vector2.UnitX * 25, null); SoundPlayer.PlayDamageSound("StructureBlunt", 10, Character.Controlled.WorldPosition - Vector2.UnitX * 25); - yield return new WaitForSeconds(0.5f, false); + yield return new WaitForSeconds(0.5f); doctor.DamageLimb( Character.Controlled.WorldPosition, @@ -160,15 +154,15 @@ namespace Barotrauma.Tutorials { shakeTimer -= 0.1f; GameMain.GameScreen.Cam.Shake = shakeAmount; - yield return new WaitForSeconds(0.1f, false); + yield return new WaitForSeconds(0.1f); } - yield return new WaitForSeconds(3.0f, false); + yield return new WaitForSeconds(3.0f); GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Doctor.Radio.KnockedDown"), ChatMessageType.Radio, null); // first tutorial segment, get medical supplies ------------------------------------------------------ - yield return new WaitForSeconds(1.5f, false); + yield return new WaitForSeconds(1.5f); SetHighlight(doctor_suppliesCabinet.Item, true); /*while (doctor.CurrentHull != doctor_suppliesCabinet.Item.CurrentHull) @@ -196,24 +190,22 @@ namespace Barotrauma.Tutorials } yield return null; } while (doctor.Inventory.FindItemByIdentifier("antidama1") == null); // Wait until looted - yield return new WaitForSeconds(1.0f, false); + yield return new WaitForSeconds(1.0f); SetHighlight(doctor_suppliesCabinet.Item, false); RemoveCompletedObjective(segments[0]); - yield return new WaitForSeconds(1.0f, false); + yield return new WaitForSeconds(1.0f); // 2nd tutorial segment, treat self ------------------------------------------------------------------------- TriggerTutorialSegment(1, GameMain.Config.KeyBind(InputType.Health)); // Open health interface while (CharacterHealth.OpenHealthWindow == null) { - doctor.CharacterHealth.HealthBarPulsateTimer = 1.0f; - yield return null; + yield return new WaitForSeconds(1.0f); } - yield return null; RemoveCompletedObjective(segments[1]); - yield return new WaitForSeconds(1.0f, false); + TriggerTutorialSegment(2); //Treat self while (doctor.CharacterHealth.GetAfflictionStrength("damage") > 0.01f) { @@ -234,22 +226,23 @@ namespace Barotrauma.Tutorials while (CharacterHealth.OpenHealthWindow != null) { - yield return new WaitForSeconds(1.0f, false); + yield return new WaitForSeconds(1.0f); } // treat patient -------------------------------------------------------------------------------------------- //patient 1 requests first aid + patient1.CanSpeak = true; var newOrder = new Order(Order.PrefabList.Find(o => o.AITag == "requestfirstaid"), patient1.CurrentHull, null, orderGiver: patient1); - doctor.AddActiveObjectiveEntity(patient1, doctor_firstAidIcon, doctor_firstAidIconColor); - //GameMain.GameSession.CrewManager.AddOrder(newOrder, newOrder.FadeOutTime); - GameMain.GameSession.CrewManager.AddSinglePlayerChatMessage(patient1.Name, newOrder.GetChatMessage("", patient1.CurrentHull?.DisplayName, givingOrderToSelf: false), ChatMessageType.Order, null); + GameMain.GameSession.CrewManager.AddOrder(newOrder, newOrder.FadeOutTime); + patient1.Speak(newOrder.GetChatMessage("", patient1.CurrentHull?.DisplayName, givingOrderToSelf: false), ChatMessageType.Order); + patient1.AIController.Enabled = true; while (doctor.CurrentHull != patient1.CurrentHull) { - yield return new WaitForSeconds(1.0f, false); + yield return new WaitForSeconds(1.0f); } - yield return new WaitForSeconds(0.0f, false); + yield return new WaitForSeconds(0.0f); GameMain.GameSession.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Doctor.Radio.AssistantBurns"), ChatMessageType.Radio, null); GameMain.GameSession.CrewManager.AllowCharacterSwitch = false; @@ -257,9 +250,7 @@ namespace Barotrauma.Tutorials GameMain.GameSession.CrewManager.AddCharacter(patient1); GameMain.GameSession.CrewManager.ToggleCrewAreaOpen = true; - yield return new WaitForSeconds(3.0f, false); - patient1.AIController.Enabled = true; - doctor.RemoveActiveObjectiveEntity(patient1); + yield return new WaitForSeconds(3.0f); TriggerTutorialSegment(3); // Get the patient to medbay while (patient1.CurrentOrder == null || patient1.CurrentOrder.AITag != "follow") @@ -272,13 +263,13 @@ namespace Barotrauma.Tutorials while (patient1.CurrentHull != medBay) { - yield return new WaitForSeconds(1.0f, false); + yield return new WaitForSeconds(1.0f); } RemoveCompletedObjective(segments[3]); SetHighlight(doctor_medBayCabinet.Item, true); SetDoorAccess(doctor_thirdDoor, doctor_thirdDoorLight, true); - yield return new WaitForSeconds(2.0f, false); + yield return new WaitForSeconds(2.0f); TriggerTutorialSegment(4, GameMain.Config.KeyBind(InputType.Health)); // treat burns @@ -318,19 +309,17 @@ namespace Barotrauma.Tutorials } RemoveCompletedObjective(segments[4]); SetHighlight(patient1, false); - yield return new WaitForSeconds(1.0f, false); + yield return new WaitForSeconds(1.0f); GameMain.GameSession.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Doctor.Radio.AssistantBurnsHealed"), ChatMessageType.Radio, null); // treat unconscious patient ------------------------------------------------------ //patient calls for help - //patient2.CanSpeak = true; - yield return new WaitForSeconds(2.0f, false); + patient2.CanSpeak = true; newOrder = new Order(Order.PrefabList.Find(o => o.AITag == "requestfirstaid"), patient2.CurrentHull, null, orderGiver: patient2); - doctor.AddActiveObjectiveEntity(patient2, doctor_firstAidIcon, doctor_firstAidIconColor); - //GameMain.GameSession.CrewManager.AddOrder(newOrder, newOrder.FadeOutTime); - GameMain.GameSession.CrewManager.AddSinglePlayerChatMessage(patient2.Name, newOrder.GetChatMessage("", patient1.CurrentHull?.DisplayName, givingOrderToSelf: false), ChatMessageType.Order, null); + GameMain.GameSession.CrewManager.AddOrder(newOrder, newOrder.FadeOutTime); + patient2.Speak(newOrder.GetChatMessage("", patient1.CurrentHull?.DisplayName, givingOrderToSelf: false), ChatMessageType.Order); patient2.AIController.Enabled = true; patient2.Oxygen = -50; CoroutineManager.StartCoroutine(KeepPatientAlive(patient2), "KeepPatient2Alive"); @@ -340,7 +329,7 @@ namespace Barotrauma.Tutorials yield return new WaitForSeconds(1.0f); }*/ do { yield return null; } while (!tutorial_upperFinalDoor.IsOpen); - yield return new WaitForSeconds(2.0f, false); + yield return new WaitForSeconds(2.0f); TriggerTutorialSegment(5, GameMain.Config.KeyBind(InputType.Health)); // perform CPR SetHighlight(patient2, true); @@ -355,24 +344,23 @@ namespace Barotrauma.Tutorials } RemoveCompletedObjective(segments[5]); SetHighlight(patient2, false); - doctor.RemoveActiveObjectiveEntity(patient2); CoroutineManager.StopCoroutines("KeepPatient2Alive"); SetDoorAccess(tutorial_submarineDoor, tutorial_submarineDoorLight, true); while (doctor.Submarine != Submarine.MainSub) { - yield return new WaitForSeconds(1.0f, false); + yield return new WaitForSeconds(1.0f); } - yield return new WaitForSeconds(5.0f, false); + yield return new WaitForSeconds(5.0f); GameMain.GameSession.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Doctor.Radio.EnteredSub"), ChatMessageType.Radio, null); - yield return new WaitForSeconds(3.0f, false); + yield return new WaitForSeconds(3.0f); TriggerTutorialSegment(6, GameMain.Config.KeyBind(InputType.Health)); // give treatment to anyone in need foreach (var patient in subPatients) { - //patient.CanSpeak = true; + patient.CanSpeak = true; patient.AIController.Enabled = true; SetHighlight(patient, true); } @@ -381,8 +369,7 @@ namespace Barotrauma.Tutorials double subEnterTime = Timing.TotalTime; - bool[] patientCalledHelp = new bool[] { false, false, false }; - + bool[] patientCalledHelp = new bool[] { false, false, false, false, false, false }; while (subPatients.Any(p => p.Vitality < p.MaxVitality * 0.9f && !p.IsDead)) { for (int i = 0; i < subPatients.Count; i++) @@ -391,26 +378,32 @@ namespace Barotrauma.Tutorials //(within 1 minute intervals of entering the sub) if (!patientCalledHelp[i] && Timing.TotalTime > subEnterTime + 60 * (i + 1)) { - doctor.AddActiveObjectiveEntity(subPatients[i], doctor_firstAidIcon, doctor_firstAidIconColor); newOrder = new Order(Order.PrefabList.Find(o => o.AITag == "requestfirstaid"), subPatients[i].CurrentHull, null, orderGiver: subPatients[i]); + GameMain.GameSession.CrewManager.AddOrder(newOrder, newOrder.FadeOutTime); + string message = newOrder.GetChatMessage("", subPatients[i].CurrentHull?.DisplayName, givingOrderToSelf: false); - GameMain.GameSession.CrewManager.AddSinglePlayerChatMessage(subPatients[i].Name, message, ChatMessageType.Order, null); + if (subPatients[i].CanSpeak) + { + subPatients[i].Speak(message, ChatMessageType.Order); + } + else + { + GameMain.GameSession.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, message, ChatMessageType.Radio, null); + } patientCalledHelp[i] = true; } if (subPatients[i].ExternalHighlight && subPatients[i].Vitality >= subPatients[i].MaxVitality * 0.9f) { - doctor.RemoveActiveObjectiveEntity(subPatients[i]); SetHighlight(subPatients[i], false); } } - yield return new WaitForSeconds(1.0f, false); + yield return new WaitForSeconds(1.0f); } RemoveCompletedObjective(segments[6]); foreach (var patient in subPatients) { SetHighlight(patient, false); - doctor.RemoveActiveObjectiveEntity(patient); } // END TUTORIAL diff --git a/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/EngineerTutorial.cs b/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/EngineerTutorial.cs index 12f6bcf47..f230542a1 100644 --- a/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/EngineerTutorial.cs +++ b/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/EngineerTutorial.cs @@ -213,7 +213,7 @@ namespace Barotrauma.Tutorials { shakeTimer -= 0.1f; GameMain.GameScreen.Cam.Shake = shakeAmount; - yield return new WaitForSeconds(0.1f, false); + yield return new WaitForSeconds(0.1f); } //// Remove @@ -231,7 +231,7 @@ namespace Barotrauma.Tutorials // Room 2 do { yield return null; } while (!engineer_equipmentObjectiveSensor.MotionDetected); GameMain.GameSession.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Engineer.Radio.Equipment"), ChatMessageType.Radio, null); - yield return new WaitForSeconds(0.5f, false); + yield return new WaitForSeconds(0.5f); TriggerTutorialSegment(0, GameMain.Config.KeyBind(InputType.Select), GameMain.Config.KeyBind(InputType.Deselect)); // Retrieve equipment bool firstSlotRemoved = false; bool secondSlotRemoved = false; @@ -280,7 +280,7 @@ namespace Barotrauma.Tutorials // Room 3 do { yield return null; } while (!IsSelectedItem(engineer_reactor.Item)); - yield return new WaitForSeconds(0.5f, false); + yield return new WaitForSeconds(0.5f); TriggerTutorialSegment(1); do { @@ -326,7 +326,7 @@ namespace Barotrauma.Tutorials } yield return null; } while (!reactorOperatedProperly); - yield return new WaitForSeconds(2f, false); + yield return new WaitForSeconds(2f); GameMain.GameSession.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Engineer.Radio.ReactorStable"), ChatMessageType.Radio, null); do { @@ -343,7 +343,7 @@ namespace Barotrauma.Tutorials float wait = 1.5f; do { - yield return new WaitForSeconds(0.1f, false); + yield return new WaitForSeconds(0.1f); wait -= 0.1f; engineer_reactor.AutoTempSlider.BarScrollValue = 0.0f; } while (wait > 0.0f); @@ -356,24 +356,9 @@ namespace Barotrauma.Tutorials // Room 4 do { yield return null; } while (!engineer_secondDoor.IsOpen); - yield return new WaitForSeconds(1f, false); - Repairable repairableJunctionBoxComponent = engineer_brokenJunctionBox.GetComponent(); + yield return new WaitForSeconds(1f); TriggerTutorialSegment(2, GameMain.Config.KeyBind(InputType.Select)); // Repair the junction box - do - { - if (!engineer.HasEquippedItem("screwdriver")) - { - HighlightInventorySlot(engineer.Inventory, "screwdriver", highlightColor, .5f, .5f, 0f); - } - else if (IsSelectedItem(engineer_brokenJunctionBox) && repairableJunctionBoxComponent.CurrentFixer == null) - { - if (repairableJunctionBoxComponent.RepairButton.Frame.FlashTimer <= 0) - { - repairableJunctionBoxComponent.RepairButton.Frame.Flash(); - } - } - yield return null; - } while (!engineer_brokenJunctionBox.IsFullCondition); // Wait until repaired + do { yield return null; } while (!engineer_brokenJunctionBox.IsFullCondition); // Wait until repaired SetHighlight(engineer_brokenJunctionBox, false); RemoveCompletedObjective(segments[2]); SetDoorAccess(engineer_thirdDoor, engineer_thirdDoorLight, true); @@ -385,7 +370,7 @@ namespace Barotrauma.Tutorials // Room 5 do { yield return null; } while (!engineer_thirdDoor.IsOpen); GameMain.GameSession.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Engineer.Radio.FaultyWiring"), ChatMessageType.Radio, null); - yield return new WaitForSeconds(2f, false); + yield return new WaitForSeconds(2f); TriggerTutorialSegment(3, GameMain.Config.KeyBind(InputType.Use), GameMain.Config.KeyBind(InputType.Deselect)); // Connect the junction boxes do { CheckGhostWires(); HandleJunctionBoxWiringHighlights(); yield return null; } while (engineer_workingPump.Voltage < engineer_workingPump.MinVoltage); // Wait until connected all the way to the pump CheckGhostWires(); @@ -402,7 +387,7 @@ namespace Barotrauma.Tutorials // Submarine do { yield return null; } while (!tutorial_enteredSubmarineSensor.MotionDetected); GameMain.GameSession.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Engineer.Radio.Submarine"), ChatMessageType.Radio, null); - yield return new WaitForSeconds(2f, false); + yield return new WaitForSeconds(2f); TriggerTutorialSegment(4); // Repair junction box while (ContentRunning) yield return null; SetHighlight(engineer_submarineJunctionBox_1, true); @@ -458,7 +443,7 @@ namespace Barotrauma.Tutorials tutorial_oxygenGenerator.PowerConsumption = reactorLoads[i]; while (timer > 0) { - yield return new WaitForSeconds(0.1f, false); + yield return new WaitForSeconds(0.1f); if (IsReactorPoweredUp(engineer_reactor)) { timer -= 0.1f; diff --git a/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/MechanicTutorial.cs b/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/MechanicTutorial.cs index 4d516fb8e..8032483c3 100644 --- a/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/MechanicTutorial.cs +++ b/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/MechanicTutorial.cs @@ -230,25 +230,25 @@ namespace Barotrauma.Tutorials { shakeTimer -= 0.1f; GameMain.GameScreen.Cam.Shake = shakeAmount; - yield return new WaitForSeconds(0.1f, false); + yield return new WaitForSeconds(0.1f); } - yield return new WaitForSeconds(2.5f, false); + yield return new WaitForSeconds(2.5f); mechanic_fabricator.RemoveFabricationRecipes(new List() { "extinguisher", "wrench", "weldingtool", "weldingfuel", "divingmask", "railgunshell", "nuclearshell", "uex", "harpoongun" }); GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Mechanic.Radio.WakeUp"), ChatMessageType.Radio, null); - yield return new WaitForSeconds(2.5f, false); + yield return new WaitForSeconds(2.5f); TriggerTutorialSegment(0, GameMain.Config.KeyBind(InputType.Up), GameMain.Config.KeyBind(InputType.Left), GameMain.Config.KeyBind(InputType.Down), GameMain.Config.KeyBind(InputType.Right), GameMain.Config.KeyBind(InputType.Select), GameMain.Config.KeyBind(InputType.Select)); // Open door objective - yield return new WaitForSeconds(0.0f, false); + yield return new WaitForSeconds(0.0f); SetDoorAccess(mechanic_firstDoor, mechanic_firstDoorLight, true); SetHighlight(mechanic_firstDoor.Item, true); do { yield return null; } while (!mechanic_firstDoor.IsOpen); SetHighlight(mechanic_firstDoor.Item, false); - yield return new WaitForSeconds(1.5f, false); + yield return new WaitForSeconds(1.5f); RemoveCompletedObjective(segments[0]); // Room 2 - yield return new WaitForSeconds(0.0f, false); + yield return new WaitForSeconds(0.0f); GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Mechanic.Radio.Equipment"), ChatMessageType.Radio, null); do { yield return null; } while (!mechanic_equipmentObjectiveSensor.MotionDetected); TriggerTutorialSegment(1, GameMain.Config.KeyBind(InputType.Select), GameMain.Config.KeyBind(InputType.Deselect)); // Equipment & inventory objective @@ -287,7 +287,7 @@ namespace Barotrauma.Tutorials yield return null; } while (mechanic.Inventory.FindItemByIdentifier("divingmask") == null || mechanic.Inventory.FindItemByIdentifier("weldingtool") == null || mechanic.Inventory.FindItemByIdentifier("wrench") == null); // Wait until looted SetHighlight(mechanic_equipmentCabinet.Item, false); - yield return new WaitForSeconds(1.5f, false); + yield return new WaitForSeconds(1.5f); RemoveCompletedObjective(segments[1]); GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Mechanic.Radio.Breach"), ChatMessageType.Radio, null); @@ -312,13 +312,13 @@ namespace Barotrauma.Tutorials do { yield return null; } while (WallHasDamagedSections(mechanic_brokenWall_1)); // Highlight until repaired mechanic.RemoveActiveObjectiveEntity(mechanic_brokenWall_1); RemoveCompletedObjective(segments[2]); - yield return new WaitForSeconds(1f, false); + yield return new WaitForSeconds(1f); TriggerTutorialSegment(3, GameMain.Config.KeyBind(InputType.Select)); // Pump objective SetHighlight(mechanic_workingPump.Item, true); do { yield return null; - if (IsSelectedItem(mechanic_workingPump.Item)) + if (IsSelectedItem(mechanic_brokenPump.Item)) { if (mechanic_workingPump.IsActiveSlider.FlashTimer <= 0) { @@ -330,17 +330,17 @@ namespace Barotrauma.Tutorials do { yield return null; } while (mechanic_brokenhull_1.WaterPercentage > waterVolumeBeforeOpening); // Unlock door once drained RemoveCompletedObjective(segments[3]); SetDoorAccess(mechanic_thirdDoor, mechanic_thirdDoorLight, true); - yield return new WaitForSeconds(1.5f, false); + yield return new WaitForSeconds(1.5f); //TriggerTutorialSegment(11, GameMain.Config.KeyBind(InputType.Select), GameMain.Config.KeyBind(InputType.Up), GameMain.Config.KeyBind(InputType.Down), GameMain.Config.KeyBind(InputType.Select)); // Ladder objective //do { yield return null; } while (!mechanic_ladderSensor.MotionDetected); //RemoveCompletedObjective(segments[11]); GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Mechanic.Radio.News"), ChatMessageType.Radio, null); - yield return new WaitForSeconds(1f, false); + yield return new WaitForSeconds(1f); GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Mechanic.Radio.Fire"), ChatMessageType.Radio, null); // Room 4 do { yield return null; } while (!mechanic_thirdDoor.IsOpen); - yield return new WaitForSeconds(1f, false); + yield return new WaitForSeconds(1f); mechanic_fire = new DummyFireSource(new Vector2(20f, 2f), Item.ItemList.Find(i => i.HasTag("mechanic_fire")).WorldPosition); //do { yield return null; } while (!mechanic_craftingObjectiveSensor.MotionDetected); TriggerTutorialSegment(4); // Deconstruct @@ -364,7 +364,7 @@ namespace Barotrauma.Tutorials } yield return null; } while (mechanic.Inventory.FindItemByIdentifier("oxygentank") == null || mechanic.Inventory.FindItemByIdentifier("sodium") == null); // Wait until looted - yield return new WaitForSeconds(1.0f, false); + yield return new WaitForSeconds(1.0f); SetHighlight(mechanic_craftingCabinet.Item, false); SetHighlight(mechanic_deconstructor.Item, true); @@ -409,7 +409,7 @@ namespace Barotrauma.Tutorials SetHighlight(mechanic_deconstructor.Item, false); RemoveCompletedObjective(segments[4]); - yield return new WaitForSeconds(1f, false); + yield return new WaitForSeconds(1f); TriggerTutorialSegment(5); // Fabricate SetHighlight(mechanic_fabricator.Item, true); do @@ -465,7 +465,7 @@ namespace Barotrauma.Tutorials do { yield return null; } while (!mechanic_fireSensor.MotionDetected); TriggerTutorialSegment(6, GameMain.Config.KeyBind(InputType.Aim), GameMain.Config.KeyBind(InputType.Shoot)); // Using the extinguisher do { yield return null; } while (!mechanic_fire.Removed); // Wait until extinguished - yield return new WaitForSeconds(3f, false); + yield return new WaitForSeconds(3f); RemoveCompletedObjective(segments[6]); if (mechanic.HasEquippedItem("extinguisher")) // do not trigger if dropped already @@ -527,16 +527,6 @@ namespace Barotrauma.Tutorials } } } - else - { - if (IsSelectedItem(mechanic_brokenPump.Item)) - { - if (mechanic_brokenPump.IsActiveSlider.FlashTimer <= 0) - { - mechanic_brokenPump.IsActiveSlider.Flash(uiHighlightColor, 1.5f, true); - } - } - } } while (!mechanic_brokenPump.Item.IsFullCondition || mechanic_brokenPump.FlowPercentage >= 0 || !mechanic_brokenPump.IsActive); RemoveCompletedObjective(segments[9]); SetHighlight(mechanic_brokenPump.Item, false); diff --git a/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/OfficerTutorial.cs b/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/OfficerTutorial.cs index 3b8b62909..3feff2ddd 100644 --- a/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/OfficerTutorial.cs +++ b/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/OfficerTutorial.cs @@ -197,7 +197,7 @@ namespace Barotrauma.Tutorials { shakeTimer -= 0.1f; GameMain.GameScreen.Cam.Shake = shakeAmount; - yield return new WaitForSeconds(0.1f, false); + yield return new WaitForSeconds(0.1f); } GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Officer.Radio.WakeUp"), ChatMessageType.Radio, null); @@ -205,7 +205,7 @@ namespace Barotrauma.Tutorials // Room 2 do { yield return null; } while (!officer_equipmentObjectiveSensor.MotionDetected); GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Officer.Radio.Equipment"), ChatMessageType.Radio, null); - yield return new WaitForSeconds(3f, false); + yield return new WaitForSeconds(3f); //TriggerTutorialSegment(0, GameMain.Config.KeyBind(InputType.Select), GameMain.Config.KeyBind(InputType.Deselect)); // Retrieve equipment SetHighlight(officer_equipmentCabinet.Item, true); bool firstSlotRemoved = false; @@ -259,7 +259,7 @@ namespace Barotrauma.Tutorials { HighlightInventorySlot(officer.Inventory, "ballistichelmet", highlightColor, .5f, .5f, 0f); } - yield return new WaitForSeconds(1f, false); + yield return new WaitForSeconds(1f); } while (!officer.HasEquippedItem("stunbaton") || !officer.HasEquippedItem("bodyarmor") || !officer.HasEquippedItem("ballistichelmet")); RemoveCompletedObjective(segments[1]); SetDoorAccess(officer_firstDoor, officer_firstDoorLight, true); @@ -271,7 +271,7 @@ namespace Barotrauma.Tutorials do { yield return null; } while (!officer_crawler.IsDead); RemoveCompletedObjective(segments[2]); Heal(officer); - yield return new WaitForSeconds(1f, false); + yield return new WaitForSeconds(1f); GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Officer.Radio.CrawlerDead"), ChatMessageType.Radio, null); SetDoorAccess(officer_secondDoor, officer_secondDoorLight, true); @@ -296,7 +296,7 @@ namespace Barotrauma.Tutorials SetHighlight(officer_ammoShelf_1.Item, false); SetHighlight(officer_ammoShelf_2.Item, false); RemoveCompletedObjective(segments[3]); - yield return new WaitForSeconds(2f, false); + yield return new WaitForSeconds(2f); TriggerTutorialSegment(4, GameMain.Config.KeyBind(InputType.Select), GameMain.Config.KeyBind(InputType.Shoot), GameMain.Config.KeyBind(InputType.Deselect)); // Kill hammerhead officer_hammerhead = SpawnMonster(hammerheadCharacterFile, officer_hammerheadSpawnPos); officer_hammerhead.AIController.SelectTarget(officer.AiTarget); @@ -316,14 +316,14 @@ namespace Barotrauma.Tutorials Heal(officer); SetHighlight(officer_coilgunPeriscope, false); RemoveCompletedObjective(segments[4]); - yield return new WaitForSeconds(1f, false); + yield return new WaitForSeconds(1f); GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Officer.Radio.HammerheadDead"), ChatMessageType.Radio, null); SetDoorAccess(officer_thirdDoor, officer_thirdDoorLight, true); // Room 5 //do { yield return null; } while (!officer_rangedWeaponSensor.MotionDetected); do { yield return null; } while (!officer_thirdDoor.IsOpen); - yield return new WaitForSeconds(3f, false); + yield return new WaitForSeconds(3f); TriggerTutorialSegment(5, GameMain.Config.KeyBind(InputType.Aim), GameMain.Config.KeyBind(InputType.Shoot)); // Ranged weapons SetHighlight(officer_rangedWeaponHolder.Item, true); do { yield return null; } while (!officer_rangedWeaponHolder.Inventory.IsEmpty()); // Wait until looted @@ -387,9 +387,8 @@ namespace Barotrauma.Tutorials officer.AddActiveObjectiveEntity(officer_subAmmoBox_1, officer_gunIcon, officer_gunIconColor); officer.AddActiveObjectiveEntity(officer_subAmmoBox_2, officer_gunIcon, officer_gunIconColor); officer.AddActiveObjectiveEntity(officer_subSuperCapacitor_1.Item, officer_gunIcon, officer_gunIconColor); + officer.AddActiveObjectiveEntity(officer_subSuperCapacitor_1.Item, officer_gunIcon, officer_gunIconColor); officer.AddActiveObjectiveEntity(officer_subSuperCapacitor_2.Item, officer_gunIcon, officer_gunIconColor); - SetHighlight(officer_subSuperCapacitor_1.Item, true); - SetHighlight(officer_subSuperCapacitor_2.Item, true); GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Officer.Radio.Submarine"), ChatMessageType.Radio, null); do { @@ -410,8 +409,8 @@ namespace Barotrauma.Tutorials officer.RemoveActiveObjectiveEntity(officer_subSuperCapacitor_2.Item); } - SetHighlight(officer_subAmmoBox_1, officer_subAmmoBox_1.ParentInventory != officer_subLoader_1.Inventory && officer_subAmmoBox_1.ParentInventory != officer_subLoader_2.Inventory); - SetHighlight(officer_subAmmoBox_2, officer_subAmmoBox_2.ParentInventory != officer_subLoader_1.Inventory && officer_subAmmoBox_2.ParentInventory != officer_subLoader_2.Inventory); + SetHighlight(officer_subAmmoBox_1, officer_subLoader_1.Item.ExternalHighlight || officer_subLoader_2.Item.ExternalHighlight); + SetHighlight(officer_subAmmoBox_2, officer_subLoader_1.Item.ExternalHighlight || officer_subLoader_2.Item.ExternalHighlight); SetHighlight(officer_subAmmoShelf.Item, officer_subLoader_1.Item.ExternalHighlight || officer_subLoader_2.Item.ExternalHighlight); if (officer_subAmmoBox_1.ParentInventory == officer_subLoader_1.Inventory || officer_subAmmoBox_1.ParentInventory == officer_subLoader_2.Inventory) officer.RemoveActiveObjectiveEntity(officer_subAmmoBox_1); if (officer_subAmmoBox_2.ParentInventory == officer_subLoader_1.Inventory || officer_subAmmoBox_2.ParentInventory == officer_subLoader_2.Inventory) officer.RemoveActiveObjectiveEntity(officer_subAmmoBox_2); @@ -431,7 +430,7 @@ namespace Barotrauma.Tutorials RemoveCompletedObjective(segments[7]); GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Officer.Radio.Complete"), ChatMessageType.Radio, null); - yield return new WaitForSeconds(4f, false); + yield return new WaitForSeconds(4f); CoroutineManager.StartCoroutine(TutorialCompleted()); } diff --git a/Barotrauma/BarotraumaClient/Source/GameSettings.cs b/Barotrauma/BarotraumaClient/Source/GameSettings.cs index 212acdc56..1dde7cb03 100644 --- a/Barotrauma/BarotraumaClient/Source/GameSettings.cs +++ b/Barotrauma/BarotraumaClient/Source/GameSettings.cs @@ -477,7 +477,7 @@ namespace Barotrauma if (string.IsNullOrWhiteSpace(VoiceCaptureDevice)) VoiceCaptureDevice = deviceNames[0]; #if (!OSX) - var deviceList = new GUIDropDown(new RectTransform(new Vector2(1.0f, 0.05f), audioSliders.RectTransform), TextManager.EnsureUTF8(VoiceCaptureDevice), deviceNames.Count); + var deviceList = new GUIDropDown(new RectTransform(new Vector2(1.0f, 0.05f), audioSliders.RectTransform), VoiceCaptureDevice, deviceNames.Count); foreach (string name in deviceNames) { deviceList.AddItem(TextManager.EnsureUTF8(name), name); @@ -492,7 +492,7 @@ namespace Barotrauma }; #else var suavemente = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.05f), audioSliders.RectTransform), - TextManager.AddPunctuation(':', TextManager.Get("CurrentDevice"), TextManager.EnsureUTF8(VoiceCaptureDevice))) + TextManager.AddPunctuation(':', TextManager.Get("CurrentDevice"), VoiceCaptureDevice)) { ToolTip = TextManager.Get("CurrentDeviceToolTip.OSX"), TextAlignment = Alignment.CenterX @@ -507,7 +507,7 @@ namespace Barotrauma if (VoiceCaptureDevice == deviceNames[0]) return true; VoipCapture.ChangeCaptureDevice(deviceNames[0]); - suavemente.Text = TextManager.AddPunctuation(':', TextManager.Get("CurrentDevice"), TextManager.EnsureUTF8(VoiceCaptureDevice)); + suavemente.Text = TextManager.AddPunctuation(':', TextManager.Get("CurrentDevice"), VoiceCaptureDevice); suavemente.Flash(Color.Blue); return true; diff --git a/Barotrauma/BarotraumaClient/Source/Map/Map/Map.cs b/Barotrauma/BarotraumaClient/Source/Map/Map/Map.cs index 27ae86b7a..8bb06d630 100644 --- a/Barotrauma/BarotraumaClient/Source/Map/Map/Map.cs +++ b/Barotrauma/BarotraumaClient/Source/Map/Map/Map.cs @@ -624,22 +624,10 @@ namespace Barotrauma if (mouseOn && PlayerInput.LeftButtonClicked() && !messageBoxOpen) { - if (TextManager.ContainsTag("centerarealockedheader") && TextManager.ContainsTag("centerarealockedtext") ) - { - var messageBox = new GUIMessageBox( - TextManager.Get("centerarealockedheader"), - TextManager.Get("centerarealockedtext")); - messageBoxOpen = true; - CoroutineManager.StartCoroutine(WaitForMessageBoxClosed(messageBox)); - } - else - { - //if the message cannot be shown in the selected language, - //show the campaign roadmap (which mentions the center location not being reachable) - var messageBox = new GUIMessageBox(TextManager.Get("CampaignRoadMapTitle"), TextManager.Get("CampaignRoadMapText")); - messageBoxOpen = true; - CoroutineManager.StartCoroutine(WaitForMessageBoxClosed(messageBox)); - } + //TODO: translate or replace + var messageBox = new GUIMessageBox("Mysteries lie ahead...", "This area is unreachable in this version of Barotrauma. Please wait for future updates!"); + messageBoxOpen = true; + CoroutineManager.StartCoroutine(WaitForMessageBoxClosed(messageBox)); } } diff --git a/Barotrauma/BarotraumaClient/Source/Screens/CampaignSetupUI.cs b/Barotrauma/BarotraumaClient/Source/Screens/CampaignSetupUI.cs index 70b981ebe..7ef09692e 100644 --- a/Barotrauma/BarotraumaClient/Source/Screens/CampaignSetupUI.cs +++ b/Barotrauma/BarotraumaClient/Source/Screens/CampaignSetupUI.cs @@ -435,8 +435,6 @@ namespace Barotrauma saveTime = time.ToString(); } - string mapseed = doc.Root.GetAttributeString("mapseed", "unknown"); - var saveFileFrame = new GUIFrame(new RectTransform(new Vector2(0.45f, 0.6f), loadGameContainer.RectTransform, Anchor.TopRight) { RelativeOffset = new Vector2(0.0f, 0.1f) diff --git a/Barotrauma/BarotraumaClient/Source/Screens/CampaignUI.cs b/Barotrauma/BarotraumaClient/Source/Screens/CampaignUI.cs index e622bc1ca..304aba705 100644 --- a/Barotrauma/BarotraumaClient/Source/Screens/CampaignUI.cs +++ b/Barotrauma/BarotraumaClient/Source/Screens/CampaignUI.cs @@ -74,14 +74,15 @@ namespace Barotrauma outpostBtn.TextBlock.Font = GUI.LargeFont; outpostBtn.TextBlock.AutoScale = true; - var tabButtonContainer = new GUILayoutGroup(new RectTransform(new Vector2(0.4f, 0.4f), topPanelContent.RectTransform, Anchor.BottomLeft), isHorizontal: true); + var tabButtonContainer = new GUILayoutGroup(new RectTransform(new Vector2(0.4f, 0.3f), topPanelContent.RectTransform, Anchor.BottomLeft), isHorizontal: true); int i = 0; var tabValues = Enum.GetValues(typeof(Tab)); foreach (Tab tab in tabValues) { var tabButton = new GUIButton(new RectTransform(new Vector2(0.25f, 1.0f), tabButtonContainer.RectTransform), - "", + TextManager.Get(tab.ToString()), + textAlignment: Alignment.Center, style: i == 0 ? "GUISlopedTabButtonLeft" : (i == tabValues.Length - 1 ? "GUISlopedTabButtonRight" : "GUISlopedTabButtonMid")) { UserData = tab, @@ -92,32 +93,11 @@ namespace Barotrauma tabButton.RectTransform.MaxSize = new Point( (int)(tabButton.Rect.Height * (buttonSprite.Sprite.size.X / buttonSprite.Sprite.size.Y)), int.MaxValue); - //the text needs to be positioned differently in the buttons at the edges due to the "slopes" in the button - if (i == 0 || i == tabValues.Length - 1) - { - new GUITextBlock(new RectTransform(new Vector2(0.8f, 0.9f), tabButton.RectTransform, i == 0 ? Anchor.CenterLeft : Anchor.CenterRight) { RelativeOffset = new Vector2(0.05f, 0.0f) }, - TextManager.Get(tab.ToString()), textColor: tabButton.TextColor, font: GUI.LargeFont, textAlignment: Alignment.Center, style: null) - { - UserData = "buttontext" - }; - } - else - { - new GUITextBlock(new RectTransform(new Vector2(0.7f, 0.9f), tabButton.RectTransform, Anchor.Center), - TextManager.Get(tab.ToString()), textColor: tabButton.TextColor, font: GUI.LargeFont, textAlignment: Alignment.Center, style: null) - { - UserData = "buttontext" - }; - } - tabButtons.Add(tabButton); + tabButton.Font = GUI.LargeFont; i++; } - GUITextBlock.AutoScaleAndNormalize(tabButtons.Select(t => t.GetChildByUserData("buttontext") as GUITextBlock)); - tabButtons.FirstOrDefault().RectTransform.SizeChanged += () => - { - GUITextBlock.AutoScaleAndNormalize(tabButtons.Select(t => t.GetChildByUserData("buttontext") as GUITextBlock)); - }; + GUITextBlock.AutoScaleAndNormalize(tabButtons.Select(t => t.TextBlock)); // crew tab ------------------------------------------------------------------------- diff --git a/Barotrauma/BarotraumaClient/Source/Utils/ToolBox.cs b/Barotrauma/BarotraumaClient/Source/Utils/ToolBox.cs index c949e94fc..0a45900e2 100644 --- a/Barotrauma/BarotraumaClient/Source/Utils/ToolBox.cs +++ b/Barotrauma/BarotraumaClient/Source/Utils/ToolBox.cs @@ -111,7 +111,7 @@ namespace Barotrauma string currWord = ""; for (int i = 0; i < text.Length; i++) { - if (TextManager.IsCJK(text[i].ToString())) + if (isCJK.IsMatch(text[i].ToString())) { if (currWord.Length > 0) { @@ -200,13 +200,24 @@ namespace Barotrauma linePos = size.X + spaceSize.X; } - if (i < words.Count - 1 && !TextManager.IsCJK(words[i]) && !TextManager.IsCJK(words[i + 1])) + if (i < words.Count - 1 && !isCJK.IsMatch(words[i]) && !isCJK.IsMatch(words[i + 1])) { wrappedText.Append(" "); } } return wrappedText.ToString().Replace(" \n ", "\n"); - } + } + + static Regex isCJK = new Regex( + @"\p{IsHangulJamo}|" + + @"\p{IsCJKRadicalsSupplement}|" + + @"\p{IsCJKSymbolsandPunctuation}|" + + @"\p{IsEnclosedCJKLettersandMonths}|" + + @"\p{IsCJKCompatibility}|" + + @"\p{IsCJKUnifiedIdeographsExtensionA}|" + + @"\p{IsCJKUnifiedIdeographs}|" + + @"\p{IsHangulSyllables}|" + + @"\p{IsCJKCompatibilityForms}"); } } diff --git a/Barotrauma/BarotraumaServer/Properties/AssemblyInfo.cs b/Barotrauma/BarotraumaServer/Properties/AssemblyInfo.cs index 160a3625a..62a738a43 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.9.0.2")] -[assembly: AssemblyFileVersion("0.9.0.2")] +[assembly: AssemblyVersion("0.9.0.1")] +[assembly: AssemblyFileVersion("0.9.0.1")] diff --git a/Barotrauma/BarotraumaServer/Source/Program.cs b/Barotrauma/BarotraumaServer/Source/Program.cs index eba307e45..f7812cbbd 100644 --- a/Barotrauma/BarotraumaServer/Source/Program.cs +++ b/Barotrauma/BarotraumaServer/Source/Program.cs @@ -68,7 +68,6 @@ namespace Barotrauma sb.AppendLine("Game version " + GameMain.Version + " (debug build)"); #else sb.AppendLine("Game version " + GameMain.Version); -#endif sb.AppendLine("Selected content packages: " + (!GameMain.SelectedPackages.Any() ? "None" : string.Join(", ", GameMain.SelectedPackages.Select(c => c.Name)))); sb.AppendLine("Level seed: " + ((Level.Loaded == null) ? "no level loaded" : Level.Loaded.Seed)); sb.AppendLine("Loaded submarine: " + ((Submarine.MainSub == null) ? "None" : Submarine.MainSub.Name + " (" + Submarine.MainSub.MD5Hash + ")")); diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/HumanAIController.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/HumanAIController.cs index 7b61861e2..81cb836b6 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/HumanAIController.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/HumanAIController.cs @@ -82,10 +82,8 @@ namespace Barotrauma public override void Update(float deltaTime) { if (DisableCrewAI || Character.IsUnconscious) return; - - float maxDistanceToSub = 3000; - if (Character.Submarine != null || SelectedAiTarget?.Entity?.Submarine != null && - Vector2.DistanceSquared(Character.WorldPosition, SelectedAiTarget.Entity.Submarine.WorldPosition) < maxDistanceToSub * maxDistanceToSub) + + if (Character.Submarine != null || SelectedAiTarget?.Entity?.Submarine != null) { if (steeringManager != insideSteering) { @@ -485,11 +483,7 @@ namespace Barotrauma } else if (ObjectiveManager.CurrentOrder is AIObjectiveRescueAll rescueAll && rescueAll.Targets.None()) { - //TODO: re-enable on all languages after DialogNoRescueTargets has been translated - if (TextManager.Language == "English") - { - Character.Speak(TextManager.Get("DialogNoRescueTargets"), null, 3.0f, "norescuetargets"); - } + Character.Speak(TextManager.Get("DialogNoRescueTargets"), null, 3.0f, "norescuetargets"); } else if (ObjectiveManager.CurrentOrder is AIObjectivePumpWater pumpWater && pumpWater.Targets.None()) { @@ -540,8 +534,6 @@ namespace Barotrauma public static bool HasItem(Character character, string tag, string containedTag, float conditionPercentage = 0) { - if (character == null) { return false; } - if (character.Inventory == null) { return false; } var item = character.Inventory.FindItemByTag(tag); return item != null && item.ConditionPercentage > conditionPercentage && diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/IndoorsSteeringManager.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/IndoorsSteeringManager.cs index 633163ab7..40ebc5006 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/IndoorsSteeringManager.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/IndoorsSteeringManager.cs @@ -164,15 +164,7 @@ namespace Barotrauma } var newPath = pathFinder.FindPath(pos, target, "(Character: " + character.Name + ")"); - bool useNewPath = currentPath == null || needsNewPath; - if (!useNewPath && currentPath != null && currentPath.CurrentNode != null && newPath.Nodes.Any() && !newPath.Unreachable) - { - // It's possible that the current path was calculated from a start point that is no longer valid. - // Therefore, let's accept also paths with a greater cost than the current, if the current node is much farther than the new start node. - useNewPath = newPath.Cost < currentPath.Cost || - Vector2.DistanceSquared(character.WorldPosition, currentPath.CurrentNode.WorldPosition) > Math.Pow(Vector2.Distance(character.WorldPosition, newPath.Nodes.First().WorldPosition) * 2, 2); - } - if (useNewPath) + if (currentPath == null || needsNewPath || !newPath.Unreachable && newPath.Cost < currentPath.Cost) { currentPath = newPath; } @@ -414,7 +406,7 @@ namespace Barotrauma { if (door.HasIntegratedButtons) { - door.Item.TryInteract(character, false, true); + door.Item.TryInteract(character, false, true, true); buttonPressCooldown = ButtonPressInterval; break; } @@ -422,7 +414,7 @@ namespace Barotrauma { if (Vector2.DistanceSquared(closestButton.Item.WorldPosition, character.WorldPosition) < MathUtils.Pow(closestButton.Item.InteractDistance * 2, 2)) { - closestButton.Item.TryInteract(character, false, true); + closestButton.Item.TryInteract(character, false, true, false); buttonPressCooldown = ButtonPressInterval; break; } diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveCombat.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveCombat.cs index 89e3d1e05..6fca16ea2 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveCombat.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveCombat.cs @@ -128,7 +128,7 @@ namespace Barotrauma if (seekAmmunition == null || !subObjectives.Contains(seekAmmunition)) { Move(); - if (WeaponComponent != null) + if (Weapon != null) { OperateWeapon(deltaTime); } @@ -279,6 +279,24 @@ namespace Barotrauma Weapon.Drop(character); } } + //if (!character.SelectedItems.Contains(Weapon)) + if (!character.HasEquippedItem(Weapon)) + { + Weapon.TryInteract(character, forceSelectKey: true); + var slots = Weapon.AllowedSlots.FindAll(s => s == InvSlotType.LeftHand || s == InvSlotType.RightHand || s == (InvSlotType.LeftHand | InvSlotType.RightHand)); + if (character.Inventory.TryPutItem(Weapon, character, slots)) + { + Weapon.Equip(character); + aimTimer = Rand.Range(0.5f, 1f); + } + else + { + Weapon = null; + Mode = CombatMode.Retreat; + return false; + } + } + return true; } private bool Equip() @@ -320,10 +338,7 @@ namespace Barotrauma { retreatTarget = findSafety.FindBestHull(HumanAIController.VisibleHulls); } - if (character.CurrentHull != retreatTarget) - { - TryAddSubObjective(ref retreatObjective, () => new AIObjectiveGoTo(retreatTarget, character, objectiveManager, false, true)); - } + TryAddSubObjective(ref retreatObjective, () => new AIObjectiveGoTo(retreatTarget, character, objectiveManager, false, true)); } private void Engage() @@ -339,7 +354,8 @@ namespace Barotrauma constructor: () => new AIObjectiveGoTo(Enemy, character, objectiveManager, repeat: true, getDivingGearIfNeeded: true) { AllowGoingOutside = true, - IgnoreIfTargetDead = true + IgnoreIfTargetDead = true, + CheckVisibility = true }, onAbandon: () => { @@ -349,7 +365,7 @@ namespace Barotrauma if (followTargetObjective != null && subObjectives.Contains(followTargetObjective)) { followTargetObjective.CloseEnough = - WeaponComponent is RangedWeapon ? 300 : + WeaponComponent is RangedWeapon ? 3 : WeaponComponent is MeleeWeapon mw ? mw.Range : WeaponComponent is RepairTool rt ? rt.Range : 50; } @@ -439,7 +455,7 @@ namespace Barotrauma float squaredDistance = Vector2.DistanceSquared(character.Position, Enemy.Position); character.CursorPosition = Enemy.Position; float engageDistance = 500; - if (character.CurrentHull != Enemy.CurrentHull && squaredDistance > engageDistance * engageDistance) { return; } + if (squaredDistance > engageDistance * engageDistance) { return; } if (!character.CanSeeCharacter(Enemy)) { return; } if (Weapon.RequireAimToUse) { @@ -452,7 +468,7 @@ namespace Barotrauma isOperatingButtons = door.HasIntegratedButtons || door.Item.GetConnectedComponents(true).Any(); } } - if (!isOperatingButtons) + if (!isOperatingButtons && character.SelectedConstruction == null) { character.SetInput(InputType.Aim, false, true); } diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveGoTo.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveGoTo.cs index 980ca257d..1a5874252 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveGoTo.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveGoTo.cs @@ -1,6 +1,7 @@ -using Microsoft.Xna.Framework; +using FarseerPhysics; +using Microsoft.Xna.Framework; using System; -using Barotrauma.Extensions; +using System.Linq; namespace Barotrauma { @@ -16,21 +17,17 @@ namespace Barotrauma public Func customCondition; - public bool followControlledCharacter; - public bool mimic; - /// /// Display units /// public float CloseEnough { get; set; } = 50; public bool IgnoreIfTargetDead { get; set; } public bool AllowGoingOutside { get; set; } - - public ISpatialEntity Target { get; private set; } + public bool CheckVisibility { get; set; } public override float GetPriority() { - if (followControlledCharacter && Character.Controlled == null) { return 0.0f; } + if (FollowControlledCharacter && Character.Controlled == null) { return 0.0f; } if (Target is Entity e && e.Removed) { return 0.0f; } if (IgnoreIfTargetDead && Target is Character character && character.IsDead) { return 0.0f; } if (objectiveManager.CurrentOrder == this) @@ -40,19 +37,23 @@ namespace Barotrauma return 1.0f; } + public ISpatialEntity Target { get; private set; } + + public bool FollowControlledCharacter; + public AIObjectiveGoTo(ISpatialEntity target, Character character, AIObjectiveManager objectiveManager, bool repeat = false, bool getDivingGearIfNeeded = true, float priorityModifier = 1) : base (character, objectiveManager, priorityModifier) { this.Target = target; this.repeat = repeat; - waitUntilPathUnreachable = 3.0f; + waitUntilPathUnreachable = 2.0f; this.getDivingGearIfNeeded = getDivingGearIfNeeded; CalculateCloseEnough(); } protected override void Act(float deltaTime) { - if (followControlledCharacter) + if (FollowControlledCharacter) { if (Character.Controlled == null) { @@ -91,18 +92,11 @@ namespace Barotrauma { abandon = true; } - else if (waitUntilPathUnreachable < 0) + else if (!repeat && waitUntilPathUnreachable < 0) { - if (SteeringManager == PathSteering && PathSteering.CurrentPath != null && PathSteering.CurrentPath.Unreachable) + if (SteeringManager == PathSteering && PathSteering.CurrentPath != null) { - if (repeat) - { - SteeringManager.Reset(); - } - else - { - abandon = true; - } + abandon = PathSteering.CurrentPath.Unreachable; } } if (abandon) @@ -121,9 +115,9 @@ namespace Barotrauma Vector2 currTargetSimPos = Vector2.Zero; currTargetSimPos = Target.SimPosition; // Take the sub position into account in the sim pos - if (SteeringManager != PathSteering && character.Submarine == null && Target.Submarine != null) + if (character.Submarine == null && Target.Submarine != null) { - currTargetSimPos += Target.Submarine.SimPosition; + //currTargetSimPos += Target.Submarine.SimPosition; } else if (character.Submarine != null && Target.Submarine == null) { @@ -138,15 +132,10 @@ namespace Barotrauma } } character.AIController.SteeringManager.SteeringSeek(currTargetSimPos); - if (SteeringManager != PathSteering) - { - SteeringManager.SteeringAvoid(deltaTime, lookAheadDistance: 5, weight: 1, heading: VectorExtensions.Forward(character.AnimController.Collider.Rotation)); - } if (getDivingGearIfNeeded) { - Character followTarget = Target as Character; - bool needsDivingGear = HumanAIController.NeedsDivingGear(targetHull) || mimic && HumanAIController.HasDivingMask(followTarget); - bool needsDivingSuit = needsDivingGear && (targetHull == null || targetIsOutside || targetHull.WaterPercentage > 90) || mimic && HumanAIController.HasDivingSuit(followTarget); + bool needsDivingGear = HumanAIController.NeedsDivingGear(targetHull); + bool needsDivingSuit = needsDivingGear && (targetHull == null || targetIsOutside || targetHull.WaterPercentage > 90); bool needsEquipment = false; if (needsDivingSuit) { diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveManager.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveManager.cs index 19a21b7ff..8aae67958 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveManager.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveManager.cs @@ -239,8 +239,7 @@ namespace Barotrauma CloseEnough = 150, AllowGoingOutside = true, IgnoreIfTargetDead = true, - followControlledCharacter = orderGiver == character, - mimic = true + FollowControlledCharacter = orderGiver == character }; break; case "wait": @@ -259,7 +258,7 @@ namespace Barotrauma newObjective = new AIObjectiveRescueAll(character, this, priorityModifier); break; case "repairsystems": - newObjective = new AIObjectiveRepairItems(character, this, priorityModifier) { RequireAdequateSkills = option == "jobspecific" }; + newObjective = new AIObjectiveRepairItems(character, this, priorityModifier) { RequireAdequateSkills = option != "all" }; break; case "pumpwater": newObjective = new AIObjectivePumpWater(character, this, option, priorityModifier: priorityModifier); diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveOperateItem.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveOperateItem.cs index d77c798c3..455392e05 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveOperateItem.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveOperateItem.cs @@ -68,12 +68,6 @@ namespace Barotrauma { if (character.CanInteractWith(target.Item, out _, checkLinked: false)) { - // Don't allow to operate an item that someone already operates, unless this objective is an order - if (objectiveManager.CurrentOrder != this && Character.CharacterList.Any(c => c.SelectedConstruction == target.Item && c != character && HumanAIController.IsFriendly(c))) - { - abandon = true; - return; - } if (character.SelectedConstruction != target.Item) { target.Item.TryInteract(character, false, true); diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveRescue.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveRescue.cs index 65c43a1d9..6c3d8212f 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveRescue.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveRescue.cs @@ -2,6 +2,7 @@ using Microsoft.Xna.Framework; using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; namespace Barotrauma @@ -16,22 +17,13 @@ namespace Barotrauma private readonly Character targetCharacter; private AIObjectiveGoTo goToObjective; + private float treatmentTimer; - private Hull safeHull; public AIObjectiveRescue(Character character, Character targetCharacter, AIObjectiveManager objectiveManager, float priorityModifier = 1) : base(character, objectiveManager, priorityModifier) { - if (targetCharacter == null) - { - string errorMsg = "Attempted to create a Rescue objective with no target!\n" + Environment.StackTrace; - DebugConsole.ThrowError(errorMsg); - GameAnalyticsManager.AddErrorEventOnce("AIObjectiveRescue:ctor:targetnull", GameAnalyticsSDK.Net.EGAErrorSeverity.Error, errorMsg); - abandon = true; - return; - } - - if (targetCharacter == character) + if (targetCharacter != character) { // TODO: enable healing self too abandon = true; @@ -48,11 +40,6 @@ namespace Barotrauma protected override void Act(float deltaTime) { - if (targetCharacter == null || targetCharacter.Removed) - { - return; - } - // Unconcious target is not in a safe place -> Move to a safe place first if (targetCharacter.IsUnconscious && HumanAIController.GetHullSafety(targetCharacter.CurrentHull, targetCharacter) < HumanAIController.HULL_SAFETY_THRESHOLD) { @@ -84,22 +71,15 @@ namespace Barotrauma { goToObjective = null; } - if (safeHull == null) + var findSafety = objectiveManager.GetObjective(); + if (findSafety == null) { - var findSafety = objectiveManager.GetObjective(); - if (findSafety == null) - { - // Ensure that we have the find safety objective (should always be the case) - findSafety = new AIObjectiveFindSafety(character, objectiveManager); - objectiveManager.AddObjective(findSafety); - } - safeHull = findSafety.FindBestHull(HumanAIController.VisibleHulls); - } - if (character.CurrentHull != safeHull) - { - TryAddSubObjective(ref goToObjective, () => new AIObjectiveGoTo(safeHull, character, objectiveManager)); + // Ensure that we have the find safety objective (should always be the case) + objectiveManager.AddObjective(new AIObjectiveFindSafety(character, objectiveManager)); } + TryAddSubObjective(ref goToObjective, () => new AIObjectiveGoTo(findSafety.FindBestHull(HumanAIController.VisibleHulls), character, objectiveManager)); } + return; } if (subObjectives.Any()) { return; } @@ -227,19 +207,13 @@ namespace Barotrauma public override bool IsCompleted() { - if (targetCharacter == null || targetCharacter.Removed) - { - abandon = true; - return true; - } - bool isCompleted = targetCharacter.Bleeding <= 0 && targetCharacter.Vitality / targetCharacter.MaxVitality > AIObjectiveRescueAll.GetVitalityThreshold(objectiveManager); if (isCompleted) { character.Speak(TextManager.Get("DialogTargetHealed").Replace("[targetname]", targetCharacter.Name), null, 1.0f, "targethealed" + targetCharacter.Name, 60.0f); } - return isCompleted || targetCharacter.IsDead; + return isCompleted || targetCharacter.Removed || targetCharacter.IsDead; } public override float GetPriority() diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/SteeringManager.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/SteeringManager.cs index 3f47266e4..1ff6c66b7 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/SteeringManager.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/SteeringManager.cs @@ -45,9 +45,9 @@ namespace Barotrauma steering += DoSteeringWander(weight); } - public void SteeringAvoid(float deltaTime, float lookAheadDistance, float weight = 1, Vector2? heading = null) + public void SteeringAvoid(float deltaTime, float lookAheadDistance, float weight = 1) { - steering += DoSteeringAvoid(deltaTime, lookAheadDistance, weight, heading); + steering += DoSteeringAvoid(deltaTime, lookAheadDistance, weight); } public void SteeringManual(float deltaTime, Vector2 velocity) @@ -129,12 +129,10 @@ namespace Barotrauma return newSteering; } - protected virtual Vector2 DoSteeringAvoid(float deltaTime, float lookAheadDistance, float weight, Vector2? heading = null) + protected virtual Vector2 DoSteeringAvoid(float deltaTime, float lookAheadDistance, float weight) { - if (steering == Vector2.Zero || host.Steering == Vector2.Zero) - { - return Vector2.Zero; - } + if (steering == Vector2.Zero || host.Steering == Vector2.Zero) return Vector2.Zero; + float maxDistance = lookAheadDistance; if (rayCastTimer <= 0.0f) { @@ -160,11 +158,19 @@ namespace Barotrauma { obstaclePosition.X = closestStructure.SimPosition.X; } + avoidObstaclePos = obstaclePosition; + //avoidSteering = Vector2.Normalize(Submarine.LastPickedPosition - obstaclePosition); } + /*else if (closestBody.UserData is Item) + { + avoidSteering = Vector2.Normalize(Submarine.LastPickedPosition - item.SimPosition); + }*/ else { + avoidObstaclePos = Submarine.LastPickedPosition; + //avoidSteering = Vector2.Normalize(host.SimPosition - Submarine.LastPickedPosition); } } } @@ -179,26 +185,14 @@ namespace Barotrauma Vector2 diff = avoidObstaclePos.Value - host.SimPosition; float dist = diff.Length(); - if (dist > maxDistance) - { - return Vector2.Zero; - } - if (heading.HasValue) - { - var f = heading ?? host.Steering; - // Avoid to left or right depending on the current heading - Vector2 relativeVector = Vector2.Normalize(diff) - Vector2.Normalize(f); - var dir = relativeVector.X > 0 ? diff.Right() : diff.Left(); - float factor = 1.0f - Math.Min(dist / maxDistance, 1); - return dir * factor * weight; - } - else - { - // Doesn't work right because it effectively just slows down or reverses the movement, where as we'd like to go right or left to avoid the target. - // There's also another issue, which also affects going right or left: the raycast doesn't hit anything if we turn too much -> avoiding doesn't work well. - // Could probably "remember" the avoidance a bit longer so that the avoid steering is not immedieately disgarded, but kept for a while and reduced gradually? - return -diff * (1.0f - dist / maxDistance) * weight; - } + if (!avoidObstaclePos.HasValue) return Vector2.Zero; + + Vector2 diff = avoidObstaclePos.Value - host.SimPosition; + float dist = diff.Length(); + + if (dist > maxDistance) return Vector2.Zero; + + return -diff * (1.0f - dist / maxDistance) * weight; } } } diff --git a/Barotrauma/BarotraumaShared/Source/ContentPackage.cs b/Barotrauma/BarotraumaShared/Source/ContentPackage.cs index 682e055ae..b9071ec17 100644 --- a/Barotrauma/BarotraumaShared/Source/ContentPackage.cs +++ b/Barotrauma/BarotraumaShared/Source/ContentPackage.cs @@ -240,11 +240,6 @@ namespace Barotrauma errorMessages = new List(); foreach (ContentFile file in Files) { -#if SERVER - //dedicated server doesn't care if the client executable is present or not - if (file.Type == ContentType.Executable) { continue; } -#endif - if (!File.Exists(file.Path)) { errorMessages.Add("File \"" + file.Path + "\" not found."); diff --git a/Barotrauma/BarotraumaShared/Source/CoroutineManager.cs b/Barotrauma/BarotraumaShared/Source/CoroutineManager.cs index e31ffb9dc..5e3d12d47 100644 --- a/Barotrauma/BarotraumaShared/Source/CoroutineManager.cs +++ b/Barotrauma/BarotraumaShared/Source/CoroutineManager.cs @@ -204,7 +204,6 @@ namespace Barotrauma { timer = time; TotalTime = time; - this.ignorePause = ignorePause; } public bool CheckFinished(float deltaTime) diff --git a/Barotrauma/BarotraumaShared/Source/Events/Missions/MissionPrefab.cs b/Barotrauma/BarotraumaShared/Source/Events/Missions/MissionPrefab.cs index 49827886d..df7a431fa 100644 --- a/Barotrauma/BarotraumaShared/Source/Events/Missions/MissionPrefab.cs +++ b/Barotrauma/BarotraumaShared/Source/Events/Missions/MissionPrefab.cs @@ -83,15 +83,11 @@ namespace Barotrauma Commonness = element.GetAttributeInt("commonness", 1); SuccessMessage = TextManager.Get("MissionSuccess." + Identifier, true) ?? element.GetAttributeString("successmessage", "Mission completed successfully"); - FailureMessage = TextManager.Get("MissionFailure." + Identifier, true) ?? ""; - if (string.IsNullOrEmpty(FailureMessage) && TextManager.ContainsTag("missionfailed")) - { - FailureMessage = TextManager.Get("missionfailed", returnNull: true) ?? ""; - } - if (string.IsNullOrEmpty(FailureMessage) && GameMain.Config.Language == "English") - { - FailureMessage = element.GetAttributeString("failuremessage", ""); - } + FailureMessage = + TextManager.Get("MissionFailure." + Identifier, true) ?? + element.GetAttributeString("failuremessage", null) ?? + TextManager.Get("missionfailed", returnNull: true) ?? + ""; SonarLabel = TextManager.Get("MissionSonarLabel." + Identifier, true) ?? element.GetAttributeString("sonarlabel", ""); diff --git a/Barotrauma/BarotraumaShared/Source/Extensions/VectorExtensions.cs b/Barotrauma/BarotraumaShared/Source/Extensions/VectorExtensions.cs index 479b031d3..3ea2039a7 100644 --- a/Barotrauma/BarotraumaShared/Source/Extensions/VectorExtensions.cs +++ b/Barotrauma/BarotraumaShared/Source/Extensions/VectorExtensions.cs @@ -69,7 +69,6 @@ namespace Barotrauma.Extensions /// public static Vector2 TransformVector(this Vector2 v, Vector2 up) { - up = Vector2.Normalize(up); return (up * v.Y) + (up.Right() * v.X); } diff --git a/Barotrauma/BarotraumaShared/Source/GameSettings.cs b/Barotrauma/BarotraumaShared/Source/GameSettings.cs index 3227f1413..a6c19d120 100644 --- a/Barotrauma/BarotraumaShared/Source/GameSettings.cs +++ b/Barotrauma/BarotraumaShared/Source/GameSettings.cs @@ -750,7 +750,6 @@ namespace Barotrauma if (!fileFound) { ShowLanguageSelectionPrompt = true; - ShowUserStatisticsPrompt = true; SaveNewPlayerConfig(); } } @@ -821,6 +820,58 @@ namespace Barotrauma { VoiceSetting = voiceSetting; } + foreach (ContentFile file in contentPackage.Files) + { + ToolBox.IsProperFilenameCase(file.Path); + } + } + if (!SelectedContentPackages.Any()) + { + var availablePackage = ContentPackage.List.FirstOrDefault(cp => cp.IsCompatible() && cp.CorePackage); + if (availablePackage != null) + { + SelectedContentPackages.Add(availablePackage); + } + } + + //save to get rid of the invalid selected packages in the config file + if (missingPackagePaths.Count > 0 || incompatiblePackages.Count > 0) { SaveNewPlayerConfig(); } + } + #endregion + + #region Save DefaultConfig + private void SaveNewDefaultConfig() + { + XDocument doc = new XDocument(); + + if (doc.Root == null) + { + doc.Add(new XElement("config")); + } + + doc.Root.Add( + new XAttribute("language", TextManager.Language), + new XAttribute("masterserverurl", MasterServerUrl), + new XAttribute("autocheckupdates", AutoCheckUpdates), + new XAttribute("musicvolume", musicVolume), + new XAttribute("soundvolume", soundVolume), + new XAttribute("voicechatvolume", voiceChatVolume), + new XAttribute("verboselogging", VerboseLogging), + new XAttribute("savedebugconsolelogs", SaveDebugConsoleLogs), + new XAttribute("enablesplashscreen", EnableSplashScreen), + new XAttribute("usesteammatchmaking", useSteamMatchmaking), + new XAttribute("quickstartsub", QuickStartSubmarineName), + new XAttribute("requiresteamauthentication", requireSteamAuthentication), + new XAttribute("aimassistamount", aimAssistAmount)); + + if (!ShowUserStatisticsPrompt) + { + doc.Root.Add(new XAttribute("senduserstatistics", sendUserStatistics)); + } + + if (WasGameUpdated) + { + doc.Root.Add(new XAttribute("wasgameupdated", true)); } useSteamMatchmaking = doc.Root.GetAttributeBool("usesteammatchmaking", useSteamMatchmaking); diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/Connection.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/Connection.cs index d12dfc5a9..cb84886c5 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/Connection.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/Connection.cs @@ -79,10 +79,14 @@ namespace Barotrauma.Items.Components wires = new Wire[MaxLinked]; - IsOutput = element.Name.ToString() == "output"; - Name = element.GetAttributeString("name", IsOutput ? "output" : "input"); + if (string.IsNullOrEmpty(DisplayName)) + { +#if DEBUG + DebugConsole.ThrowError("Missing display name in connection " + item.Name + ": " + Name); +#endif + DisplayName = Name; + } - string displayNameTag = "", fallbackTag = ""; //if displayname is not present, attempt to find it from the prefab if (element.Attribute("displayname") == null) { @@ -94,44 +98,26 @@ namespace Barotrauma.Items.Components { if (connectionElement.Name.ToString() != element.Name.ToString()) { continue; } - string prefabConnectionName = element.GetAttributeString("name", IsOutput ? "output" : "input"); + string prefabConnectionName = element.GetAttributeString("name", (IsOutput) ? "output" : "input"); if (prefabConnectionName == Name) { - displayNameTag = connectionElement.GetAttributeString("displayname", ""); - fallbackTag = connectionElement.GetAttributeString("fallbackdisplayname", ""); + DisplayName = TextManager.GetServerMessage(connectionElement.GetAttributeString("displayname", Name)); } - } + } } +#if DEBUG + if (string.IsNullOrEmpty(DisplayName)) + { + DebugConsole.ThrowError("Missing display name in connection " + item.Name + ": " + Name); + } +#endif } else { - displayNameTag = element.GetAttributeString("displayname", ""); - fallbackTag = element.GetAttributeString("fallbackdisplayname", null); + DisplayName = TextManager.GetServerMessage(element.GetAttributeString("displayname", Name)); } - if (!string.IsNullOrEmpty(displayNameTag)) - { - //extract the tag parts in case the tags contains variables - string tagWithoutVariables = displayNameTag?.Split('~')?.FirstOrDefault(); - string fallbackTagWithoutVariables = fallbackTag?.Split('~')?.FirstOrDefault(); - //use displayNameTag if found, otherwise fallBack - if (TextManager.ContainsTag(tagWithoutVariables)) - { - DisplayName = TextManager.GetServerMessage(displayNameTag); - } - else if (TextManager.ContainsTag(fallbackTagWithoutVariables)) - { - DisplayName = TextManager.GetServerMessage(fallbackTag); - } - } - if (string.IsNullOrEmpty(DisplayName)) - { -#if DEBUG - DebugConsole.ThrowError("Missing display name in connection " + item.Name + ": " + Name); -#endif - DisplayName = Name; - } IsPower = Name == "power_in" || Name == "power" || Name == "power_out"; diff --git a/Barotrauma/BarotraumaShared/Source/Items/Item.cs b/Barotrauma/BarotraumaShared/Source/Items/Item.cs index da2ae77e2..f3e5de9d9 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Item.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Item.cs @@ -1641,7 +1641,7 @@ namespace Barotrauma { if (!ic.HasRequiredContainedItems(user == Character.Controlled)) continue; - bool success = Rand.Range(0.0f, 0.5f) < ic.DegreeOfSuccess(user); + bool success = Rand.Range(0.0f, 1.0f) < ic.DegreeOfSuccess(user); ActionType actionType = success ? ActionType.OnUse : ActionType.OnFailure; #if CLIENT diff --git a/Barotrauma/BarotraumaShared/Source/SteamAchievementManager.cs b/Barotrauma/BarotraumaShared/Source/SteamAchievementManager.cs index cd5989c75..9dfe58a9e 100644 --- a/Barotrauma/BarotraumaShared/Source/SteamAchievementManager.cs +++ b/Barotrauma/BarotraumaShared/Source/SteamAchievementManager.cs @@ -119,40 +119,23 @@ namespace Barotrauma } } - if (GameMain.GameSession != null) + if (GameMain.GameSession != null && Character.Controlled != null) { -#if CLIENT - if (Character.Controlled != null) { CheckMidRoundAchievements(Character.Controlled); } -#else - foreach (Client client in GameMain.Server.ConnectedClients) + if (Character.Controlled.HasEquippedItem("clownmask") && + Character.Controlled.HasEquippedItem("clowncostume")) { - if (client.Character != null) + UnlockAchievement(Character.Controlled, "clowncostume"); + } + + if (Submarine.MainSub != null && Character.Controlled.Submarine == null) + { + float dist = 500 / Physics.DisplayToRealWorldRatio; + if (Vector2.DistanceSquared(Character.Controlled.WorldPosition, Submarine.MainSub.WorldPosition) > + dist * dist) { - CheckMidRoundAchievements(client.Character); + UnlockAchievement(Character.Controlled, "crewaway"); } - } -#endif - } - } - - private static void CheckMidRoundAchievements(Character c) - { - if (c == null || c.Removed) { return; } - - if (c.HasEquippedItem("clownmask") && - c.HasEquippedItem("clowncostume")) - { - UnlockAchievement(c, "clowncostume"); - } - - if (Submarine.MainSub != null && c.Submarine == null) - { - float dist = 500 / Physics.DisplayToRealWorldRatio; - if (Vector2.DistanceSquared(c.WorldPosition, Submarine.MainSub.WorldPosition) > - dist * dist) - { - UnlockAchievement(c, "crewaway"); - } + } } } @@ -231,8 +214,7 @@ namespace Barotrauma } if (character.HasEquippedItem("clownmask") && - character.HasEquippedItem("clowncostume") && - causeOfDeath.Killer != character) + character.HasEquippedItem("clowncostume")) { UnlockAchievement(causeOfDeath.Killer, "killclown"); } diff --git a/Barotrauma/BarotraumaShared/Source/TextManager.cs b/Barotrauma/BarotraumaShared/Source/TextManager.cs index 60ff00a43..82250d9e5 100644 --- a/Barotrauma/BarotraumaShared/Source/TextManager.cs +++ b/Barotrauma/BarotraumaShared/Source/TextManager.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; -using System.Text.RegularExpressions; namespace Barotrauma { @@ -43,26 +42,6 @@ namespace Barotrauma GetTextFilesRecursive(subDir, ref list); } } - - /// - /// Returns the name of the language in the respective language - /// - public static string GetTranslatedLanguageName(string language) - { - if (!textPacks.ContainsKey(language)) - { - return language; - } - - foreach (var textPack in textPacks[language]) - { - if (textPack.Language == language) - { - return textPack.TranslatedName; - } - } - return language; - } public static void LoadTextPacks(IEnumerable selectedContentPackages) { @@ -101,26 +80,6 @@ namespace Barotrauma } } - public static bool ContainsTag(string textTag) - { - if (string.IsNullOrEmpty(textTag)) { return false; } - - 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!"); - } - } - foreach (TextPack textPack in textPacks[Language]) - { - if (textPack.Get(textTag) != null) { return true; } - } - return false; - } - public static string Get(string textTag, bool returnNull = false, string fallBackTag = null) { if (!textPacks.ContainsKey(Language)) @@ -132,6 +91,8 @@ namespace Barotrauma throw new Exception("No text packs available in English!"); } } + return false; + } foreach (TextPack textPack in textPacks[Language]) { @@ -155,13 +116,7 @@ namespace Barotrauma foreach (TextPack textPack in textPacks["English"]) { string text = textPack.Get(textTag); - if (text != null) - { -#if DEBUG - DebugConsole.NewMessage("Text \"" + textTag + "\" not found for the language \"" + Language + "\". Using the English text \"" + text + "\" instead."); -#endif - return text; - } + if (text != null) return text; } } @@ -412,6 +367,42 @@ namespace Barotrauma return isCJK.IsMatch(text); } +#if DEBUG + public static void CheckForDuplicates(string lang) + { + if (!textPacks.ContainsKey(lang)) + { + DebugConsole.ThrowError("No text packs available for the selected language (" + lang + ")!"); + return; + } + + int packIndex = 0; + foreach (TextPack textPack in textPacks[lang]) + { + textPack.CheckForDuplicates(packIndex); + packIndex++; + } + } + + public static void WriteToCSV() + { + string lang = "English"; + + if (!textPacks.ContainsKey(lang)) + { + DebugConsole.ThrowError("No text packs available for the selected language (" + lang + ")!"); + return; + } + + int packIndex = 0; + foreach (TextPack textPack in textPacks[lang]) + { + textPack.WriteToCSV(packIndex); + packIndex++; + } + } +#endif + #if DEBUG public static void CheckForDuplicates(string lang) { diff --git a/Barotrauma/BarotraumaShared/Source/TextPack.cs b/Barotrauma/BarotraumaShared/Source/TextPack.cs index 565b752da..18b0170d8 100644 --- a/Barotrauma/BarotraumaShared/Source/TextPack.cs +++ b/Barotrauma/BarotraumaShared/Source/TextPack.cs @@ -10,11 +10,6 @@ namespace Barotrauma { public readonly string Language; - /// - /// The name of the language in the language this pack is written in - /// - public readonly string TranslatedName; - private Dictionary> texts; private readonly string filePath; @@ -28,7 +23,6 @@ namespace Barotrauma if (doc == null || doc.Root == null) return; Language = doc.Root.GetAttributeString("language", "Unknown"); - TranslatedName = doc.Root.GetAttributeString("translatedname", Language); foreach (XElement subElement in doc.Root.Elements()) { diff --git a/Barotrauma/BarotraumaShared/Submarines/Bunyip.sub b/Barotrauma/BarotraumaShared/Submarines/Bunyip.sub index 0981c2849..3d6deb368 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 4286ee8ec..ce81dd5a0 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 0a5465f3e..c986d80a9 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 311edf3e7..39ebfe8e7 100644 Binary files a/Barotrauma/BarotraumaShared/Submarines/Orca.sub and b/Barotrauma/BarotraumaShared/Submarines/Orca.sub differ diff --git a/Barotrauma/BarotraumaShared/Submarines/Remora.sub b/Barotrauma/BarotraumaShared/Submarines/Remora.sub index 6e3afa65c..7e277f1ff 100644 Binary files a/Barotrauma/BarotraumaShared/Submarines/Remora.sub and b/Barotrauma/BarotraumaShared/Submarines/Remora.sub differ diff --git a/Barotrauma/BarotraumaShared/Submarines/RemoraDrone.sub b/Barotrauma/BarotraumaShared/Submarines/RemoraDrone.sub index ec48ad330..eb9b88997 100644 Binary files a/Barotrauma/BarotraumaShared/Submarines/RemoraDrone.sub and b/Barotrauma/BarotraumaShared/Submarines/RemoraDrone.sub differ diff --git a/Barotrauma/BarotraumaShared/Submarines/Selkie.sub b/Barotrauma/BarotraumaShared/Submarines/Selkie.sub index e5a2fc4f9..1c30b9a86 100644 Binary files a/Barotrauma/BarotraumaShared/Submarines/Selkie.sub and b/Barotrauma/BarotraumaShared/Submarines/Selkie.sub differ diff --git a/Barotrauma/BarotraumaShared/Submarines/Typhon.sub b/Barotrauma/BarotraumaShared/Submarines/Typhon.sub index 110792142..8605eff50 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 893423726..3d6fcc970 100644 --- a/Barotrauma/BarotraumaShared/changelog.txt +++ b/Barotrauma/BarotraumaShared/changelog.txt @@ -2,42 +2,16 @@ v0.9.0.2 --------------------------------------------------------------------------------------------------------- -- Automatically set the keybinds to AZERTY when French is selected as the display language. +- Fixed a bug that caused frequent desync kicks when playing a multiplayer monster mission. +- Fixed an index out of range error in DoctorTutorial if proceeding too fast to the submarine. +- Fixes to missing translations and UI layout problems when using languages other than English. - More readable font and a fix to some texts appearing slightly "clipped". - Additions to the credits. -- Minor tweaks to subs and shuttles. -- Added propeller damage to the shuttle engine. -- Increased maximum voice chat volume. -- Directional voice chat is enabled by default. -- Display the language names in the respective languages in the initial language selection screen. -- Playing the splash screens or tutorial videos doesn't require libvlc and libvlccore to be installed -on the user's system in the Linux version anymore. - -Bugfixes: -- Fixed a bug that caused frequent desync kicks when playing a multiplayer monster mission. -- Fixed private servers showing up in the server list. -- Fixed an index out of range error in DoctorTutorial if proceeding too fast to the submarine. -- Fixed report messages not going through to some clients when there are multiple clients on the server. -- Fixed players not seeing reports made by bots in multiplayer. -- Fixes to missing translations and UI layout problems when using languages other than English. -- Miscellaneous crew AI fixes and improvements. -- Fixed find safety AI objective not working properly. - Fixed bots loading only half of the target items in the contain item objective. -- Fixed directional sonar indicators not being displayed on the sonar monitor. -- Fixed floating ice chunks occasionally spawning too close to the start of a level, causing them to clip -through the submarin and/or the outpost. +- Minor tweaks to subs and shuttles. +- Fixed find safety AI objective not working properly. +- Miscellaneous crew AI fixes and improvements. - Fixed incorrect reward amount in the "Chemical shipment" description. -- Fixed inability to use the underwater scooters with LMB. -- Fixes to UI layouts on 4K resolution. -- Fixed unnecessary silence at the end of the "Objective Complete" music track. -- Fixed ruin walls being almost impossible to cut from inside the ruins. -- Fixed the "report leaks" button being highlighted inside ruins. -- Fixes to wall colliders. -- Fixed "Pause on focus lost" setting being always treated as if being enabled. -- Fixed dedicated server overwriting existing crash reports. -- Fixed save time being displayed in UNIX time in the right-hand panel in the campaign setup UI. -- Fixed "Praise the Honkmother" and "Extravehicular activity" achievements not unlocking in multiplayer. -- Fixed "No fun allowed" achievement being possible to unlock by committing suicide while wearing a clown costume. --------------------------------------------------------------------------------------------------------- v0.9.0.1 diff --git a/Barotrauma/BarotraumaShared/config.xml b/Barotrauma/BarotraumaShared/config.xml index 6e38e3c7c..ee19fb607 100644 --- a/Barotrauma/BarotraumaShared/config.xml +++ b/Barotrauma/BarotraumaShared/config.xml @@ -9,13 +9,13 @@ savedebugconsolelogs="false" enablesplashscreen="true" usesteammatchmaking="true" - quickstartsub="Humpback" + quickstartsub = "Humpback" requiresteamauthentication="true">