Merge branch 'dev'
This commit is contained in:
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<ShowAllFiles>true</ShowAllFiles>
|
||||||
|
</PropertyGroup>
|
||||||
|
</Project>
|
||||||
@@ -274,6 +274,63 @@
|
|||||||
<None Include="System.Xml.Linq.dll">
|
<None Include="System.Xml.Linq.dll">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</None>
|
</None>
|
||||||
|
<None Include="libvlc.so.5">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="vlc\plugins\access\libfilesystem_plugin.so">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="vlc\plugins\audio_filter\libaudio_format_plugin.so">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="vlc\plugins\audio_filter\libugly_resampler_plugin.so">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="vlc\plugins\audio_output\libamem_plugin.so">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="vlc\plugins\codec\libavcodec_plugin.so">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="vlc\plugins\codec\libva.so.1">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="vlc\plugins\demux\libmp4_plugin.so">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="vlc\plugins\packetizer\libpacketizer_mpeg4audio_plugin.so">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="vlc\plugins\packetizer\libpacketizer_mpeg4video_plugin.so">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="vlc\plugins\packetizer\libpacketizer_mpegvideo_plugin.so">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="vlc\plugins\video_chroma\librv32_plugin.so">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="vlc\plugins\video_chroma\libswscale_plugin.so">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="vlc\plugins\video_output\libvmem_plugin.so">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="libvlc.so.5.6.0">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="libvlccore.la">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="libvlccore.so">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="libvlccore.so.9">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="libvlccore.so.9.0.0">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup />
|
<ItemGroup />
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@@ -304,6 +361,6 @@
|
|||||||
<GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
|
<GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
|
||||||
<Output TaskParameter="Assemblies" ItemName="CurrentAssembly" />
|
<Output TaskParameter="Assemblies" ItemName="CurrentAssembly" />
|
||||||
</GetAssemblyIdentity>
|
</GetAssemblyIdentity>
|
||||||
<Exec Command="echo v%(CurrentAssembly.Version) > $(TargetDir)Version.txt"></Exec>
|
<Exec Command="echo v%(CurrentAssembly.Version) > $(TargetDir)Version.txt"></Exec>
|
||||||
</Target>
|
</Target>
|
||||||
</Project>
|
</Project>
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<ProjectView>ShowAllFiles</ProjectView>
|
||||||
|
</PropertyGroup>
|
||||||
|
</Project>
|
||||||
@@ -31,5 +31,5 @@ using System.Runtime.InteropServices;
|
|||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("0.9.0.1")]
|
[assembly: AssemblyVersion("0.9.0.2")]
|
||||||
[assembly: AssemblyFileVersion("0.9.0.1")]
|
[assembly: AssemblyFileVersion("0.9.0.2")]
|
||||||
|
|||||||
@@ -504,7 +504,7 @@ namespace Barotrauma
|
|||||||
|
|
||||||
foreach (Character c in CharacterList)
|
foreach (Character c in CharacterList)
|
||||||
{
|
{
|
||||||
if (!CanInteractWith(c)) continue;
|
if (!CanInteractWith(c, checkVisibility: false)) continue;
|
||||||
|
|
||||||
float dist = Vector2.DistanceSquared(mouseSimPos, c.SimPosition);
|
float dist = Vector2.DistanceSquared(mouseSimPos, c.SimPosition);
|
||||||
if (dist < maxDist * maxDist && (closestCharacter == null || dist < closestDist))
|
if (dist < maxDist * maxDist && (closestCharacter == null || dist < closestDist))
|
||||||
|
|||||||
@@ -370,7 +370,13 @@ namespace Barotrauma
|
|||||||
|
|
||||||
private static void DrawOrderIndicator(SpriteBatch spriteBatch, Camera cam, Character character, Order order, float iconAlpha = 1.0f)
|
private static void DrawOrderIndicator(SpriteBatch spriteBatch, Camera cam, Character character, Order order, float iconAlpha = 1.0f)
|
||||||
{
|
{
|
||||||
if (order.TargetAllCharacters && !order.HasAppropriateJob(character)) { return; }
|
if (order.TargetAllCharacters)
|
||||||
|
{
|
||||||
|
if (order.OrderGiver != character && !order.HasAppropriateJob(character))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Entity target = order.ConnectedController != null ? order.ConnectedController.Item : order.TargetEntity;
|
Entity target = order.ConnectedController != null ? order.ConnectedController.Item : order.TargetEntity;
|
||||||
if (target == null) { return; }
|
if (target == null) { return; }
|
||||||
|
|||||||
@@ -121,8 +121,8 @@ namespace Barotrauma
|
|||||||
|
|
||||||
if (value == null &&
|
if (value == null &&
|
||||||
Character.Controlled?.SelectedCharacter?.CharacterHealth != null &&
|
Character.Controlled?.SelectedCharacter?.CharacterHealth != null &&
|
||||||
Character.Controlled.SelectedCharacter.CharacterHealth == prevOpenHealthWindow &&
|
Character.Controlled.SelectedCharacter.CharacterHealth == prevOpenHealthWindow/* &&
|
||||||
!Character.Controlled.SelectedCharacter.CanInventoryBeAccessed)
|
!Character.Controlled.SelectedCharacter.CanInventoryBeAccessed*/)
|
||||||
{
|
{
|
||||||
Character.Controlled.DeselectCharacter();
|
Character.Controlled.DeselectCharacter();
|
||||||
}
|
}
|
||||||
@@ -188,14 +188,9 @@ namespace Barotrauma
|
|||||||
|
|
||||||
afflictionInfoContainer = new GUIListBox(new RectTransform(new Vector2(0.7f, 0.85f), paddedInfoFrame.RectTransform, Anchor.BottomLeft));
|
afflictionInfoContainer = new GUIListBox(new RectTransform(new Vector2(0.7f, 0.85f), paddedInfoFrame.RectTransform, Anchor.BottomLeft));
|
||||||
|
|
||||||
lowSkillIndicator = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.05f), paddedInfoFrame.RectTransform, Anchor.TopRight),
|
new GUITextBlock(new RectTransform(new Vector2(0.5f, 0.05f), paddedInfoFrame.RectTransform, Anchor.TopRight), TextManager.Get("SuitableTreatments"), textAlignment: Alignment.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.5f), paddedInfoFrame.RectTransform, Anchor.TopRight) { RelativeOffset = new Vector2(0.0f, 0.12f) });
|
recommendedTreatmentContainer = new GUIListBox(new RectTransform(new Vector2(0.28f, 0.47f), paddedInfoFrame.RectTransform, Anchor.TopRight) { RelativeOffset = new Vector2(0.0f, 0.15f) });
|
||||||
dropItemArea = new GUIFrame(new RectTransform(new Vector2(0.28f, 0.3f), paddedInfoFrame.RectTransform, Anchor.BottomRight)
|
dropItemArea = new GUIFrame(new RectTransform(new Vector2(0.28f, 0.3f), paddedInfoFrame.RectTransform, Anchor.BottomRight)
|
||||||
{ RelativeOffset = new Vector2(0.02f, 0.0f) }, style: null)
|
{ RelativeOffset = new Vector2(0.02f, 0.0f) }, style: null)
|
||||||
{
|
{
|
||||||
@@ -203,6 +198,17 @@ namespace Barotrauma
|
|||||||
};
|
};
|
||||||
dropItemArea.RectTransform.NonScaledSize = new Point(dropItemArea.Rect.Width);
|
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" };
|
string[] healthCircleStyles = new string[] { "HealthCircleInner", "HealthCircleMid", "HealthCircleOuter" };
|
||||||
foreach (string healthCircleStyle in healthCircleStyles)
|
foreach (string healthCircleStyle in healthCircleStyles)
|
||||||
{
|
{
|
||||||
@@ -273,7 +279,7 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
IsHorizontal = false
|
IsHorizontal = false
|
||||||
};
|
};
|
||||||
cprButton = new GUIButton(new RectTransform(new Point(80, 80), GUI.Canvas), text: "", style: "CPRButton")
|
cprButton = new GUIButton(new RectTransform(new Point((int)(80 * GUI.Scale)), GUI.Canvas), text: "", style: "CPRButton")
|
||||||
{
|
{
|
||||||
OnClicked = (button, userData) =>
|
OnClicked = (button, userData) =>
|
||||||
{
|
{
|
||||||
@@ -657,7 +663,8 @@ namespace Barotrauma
|
|||||||
openHealthWindow = null;
|
openHealthWindow = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
lowSkillIndicator.Visible = Timing.TotalTime % 1.0f < 0.8f && Character.Controlled != null && Character.Controlled.GetSkillLevel("medical") < 50.0f;
|
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));
|
||||||
|
|
||||||
float rotationSpeed = 0.25f;
|
float rotationSpeed = 0.25f;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
@@ -1053,10 +1060,10 @@ namespace Barotrauma
|
|||||||
var itemSlot = new GUIFrame(new RectTransform(new Point(recommendedTreatmentContainer.Content.Rect.Width, slotSize), recommendedTreatmentContainer.Content.RectTransform, Anchor.TopCenter),
|
var itemSlot = new GUIFrame(new RectTransform(new Point(recommendedTreatmentContainer.Content.Rect.Width, slotSize), recommendedTreatmentContainer.Content.RectTransform, Anchor.TopCenter),
|
||||||
style: "InnerGlow")
|
style: "InnerGlow")
|
||||||
{
|
{
|
||||||
UserData = item,
|
UserData = item
|
||||||
CanBeFocused = false
|
|
||||||
};
|
};
|
||||||
itemSlot.Color = ToolBox.GradientLerp(treatment.Value, Color.Red, Color.Orange, Color.LightGreen);
|
itemSlot.Color = ToolBox.GradientLerp(treatment.Value, Color.Red, Color.Orange, Color.LightGreen);
|
||||||
|
itemSlot.SelectedColor = itemSlot.HoverColor = itemSlot.Color;
|
||||||
|
|
||||||
Sprite itemSprite = item.InventoryIcon ?? item.sprite;
|
Sprite itemSprite = item.InventoryIcon ?? item.sprite;
|
||||||
Color itemColor = itemSprite == item.sprite ? item.SpriteColor : item.InventoryIconColor;
|
Color itemColor = itemSprite == item.sprite ? item.SpriteColor : item.InventoryIconColor;
|
||||||
@@ -1068,7 +1075,7 @@ namespace Barotrauma
|
|||||||
HoverColor = itemColor,
|
HoverColor = itemColor,
|
||||||
SelectedColor = itemColor
|
SelectedColor = itemColor
|
||||||
};
|
};
|
||||||
itemSlot.ToolTip = item.Name + "\n" + item.Description;
|
itemSlot.ToolTip = item.Name;
|
||||||
}
|
}
|
||||||
|
|
||||||
afflictionInfoContainer.Content.RectTransform.SortChildren((r1, r2) =>
|
afflictionInfoContainer.Content.RectTransform.SortChildren((r1, r2) =>
|
||||||
|
|||||||
@@ -903,6 +903,26 @@ namespace Barotrauma
|
|||||||
}, isCheat: false));
|
}, isCheat: false));
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
|
commands.Add(new Command("checkmissingloca", "", (string[] args) =>
|
||||||
|
{
|
||||||
|
foreach (MapEntityPrefab me in MapEntityPrefab.List)
|
||||||
|
{
|
||||||
|
string name = TextManager.Get("entityname." + me.Identifier, returnNull: true);
|
||||||
|
if (!string.IsNullOrEmpty(name)) { continue; }
|
||||||
|
|
||||||
|
if (me is ItemPrefab itemPrefab)
|
||||||
|
{
|
||||||
|
string nameIdentifier = itemPrefab.ConfigElement?.GetAttributeString("nameidentifier", "");
|
||||||
|
if (nameIdentifier != null)
|
||||||
|
{
|
||||||
|
name = TextManager.Get("entityname." + nameIdentifier, returnNull: true);
|
||||||
|
if (!string.IsNullOrEmpty(name)) { continue; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NewMessage("Entity name not translated (" + me.Name + ", " + me.Identifier + ")!", me is ItemPrefab ? Color.Red : Color.Yellow);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
commands.Add(new Command("spamchatmessages", "", (string[] args) =>
|
commands.Add(new Command("spamchatmessages", "", (string[] args) =>
|
||||||
{
|
{
|
||||||
int msgCount = 1000;
|
int msgCount = 1000;
|
||||||
|
|||||||
@@ -36,6 +36,16 @@ namespace Barotrauma
|
|||||||
get { return (GameMain.GraphicsWidth / 1920.0f + GameMain.GraphicsHeight / 1080.0f) / 2.0f * GameSettings.HUDScale; }
|
get { return (GameMain.GraphicsWidth / 1920.0f + GameMain.GraphicsHeight / 1080.0f) / 2.0f * GameSettings.HUDScale; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static float xScale
|
||||||
|
{
|
||||||
|
get { return GameMain.GraphicsWidth / 1920.0f * GameSettings.HUDScale; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float yScale
|
||||||
|
{
|
||||||
|
get { return GameMain.GraphicsHeight / 1080.0f * GameSettings.HUDScale; }
|
||||||
|
}
|
||||||
|
|
||||||
public static GUIStyle Style;
|
public static GUIStyle Style;
|
||||||
|
|
||||||
private static Texture2D t;
|
private static Texture2D t;
|
||||||
@@ -386,8 +396,11 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
MouseOn.DrawToolTip(spriteBatch);
|
MouseOn.DrawToolTip(spriteBatch);
|
||||||
}
|
}
|
||||||
|
|
||||||
Cursor.Draw(spriteBatch, PlayerInput.LatestMousePosition);
|
if (GameMain.WindowActive)
|
||||||
|
{
|
||||||
|
Cursor.Draw(spriteBatch, PlayerInput.LatestMousePosition, 0, Scale / 2f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void DrawBackgroundSprite(SpriteBatch spriteBatch, Sprite backgroundSprite, float blurAmount = 1.0f, float aberrationStrength = 1.0f)
|
public static void DrawBackgroundSprite(SpriteBatch spriteBatch, Sprite backgroundSprite, float blurAmount = 1.0f, float aberrationStrength = 1.0f)
|
||||||
@@ -557,7 +570,7 @@ namespace Barotrauma
|
|||||||
|
|
||||||
private static void HandlePersistingElements(float deltaTime)
|
private static void HandlePersistingElements(float deltaTime)
|
||||||
{
|
{
|
||||||
if (GUIMessageBox.VisibleBox != null && GUIMessageBox.VisibleBox.UserData as string != "verificationprompt")
|
if (GUIMessageBox.VisibleBox != null && GUIMessageBox.VisibleBox.UserData as string != "verificationprompt" && GUIMessageBox.VisibleBox.UserData as string != "bugreporter")
|
||||||
{
|
{
|
||||||
GUIMessageBox.VisibleBox.AddToGUIUpdateList();
|
GUIMessageBox.VisibleBox.AddToGUIUpdateList();
|
||||||
}
|
}
|
||||||
@@ -572,7 +585,7 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
|
|
||||||
//the "are you sure you want to quit" prompts are drawn on top of everything else
|
//the "are you sure you want to quit" prompts are drawn on top of everything else
|
||||||
if (GUIMessageBox.VisibleBox?.UserData as string == "verificationprompt")
|
if (GUIMessageBox.VisibleBox?.UserData as string == "verificationprompt" || GUIMessageBox.VisibleBox?.UserData as string == "bugreporter")
|
||||||
{
|
{
|
||||||
GUIMessageBox.VisibleBox.AddToGUIUpdateList();
|
GUIMessageBox.VisibleBox.AddToGUIUpdateList();
|
||||||
}
|
}
|
||||||
@@ -1426,15 +1439,23 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
PauseMenu = new GUIFrame(new RectTransform(Vector2.One, Canvas), style: null, color: Color.Black * 0.5f);
|
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.3f), PauseMenu.RectTransform, Anchor.Center) { MinSize = new Point(200, 300) });
|
var pauseMenuInner = new GUIFrame(new RectTransform(new Vector2(0.13f, 0.35f), PauseMenu.RectTransform, Anchor.Center) { MinSize = new Point(200, 300) });
|
||||||
|
|
||||||
var buttonContainer = new GUILayoutGroup(new RectTransform(new Vector2(0.85f, 0.85f), pauseMenuInner.RectTransform, Anchor.Center))
|
var buttonContainer = new GUILayoutGroup(new RectTransform(new Vector2(0.85f, 0.8f), pauseMenuInner.RectTransform, Anchor.Center) { RelativeOffset = new Vector2(0.0f, 0.05f) })
|
||||||
{
|
{
|
||||||
Stretch = true,
|
Stretch = true,
|
||||||
RelativeSpacing = 0.05f
|
RelativeSpacing = 0.05f
|
||||||
};
|
};
|
||||||
|
|
||||||
var button = new GUIButton(new RectTransform(new Vector2(1.0f, 0.1f), buttonContainer.RectTransform), TextManager.Get("PauseMenuResume"), style: "GUIButtonLarge")
|
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")
|
||||||
|
{
|
||||||
|
IgnoreLayoutGroups = true,
|
||||||
|
ToolTip = TextManager.Get("bugreportbutton"),
|
||||||
|
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
|
OnClicked = TogglePauseMenu
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -471,6 +471,8 @@ namespace Barotrauma
|
|||||||
|
|
||||||
public static void DrawToolTip(SpriteBatch spriteBatch, string toolTip, Rectangle targetElement)
|
public static void DrawToolTip(SpriteBatch spriteBatch, string toolTip, Rectangle targetElement)
|
||||||
{
|
{
|
||||||
|
if (Tutorials.Tutorial.ContentRunning) return;
|
||||||
|
|
||||||
int width = (int)(400 * GUI.Scale);
|
int width = (int)(400 * GUI.Scale);
|
||||||
int height = (int)(18 * GUI.Scale);
|
int height = (int)(18 * GUI.Scale);
|
||||||
Point padding = new Point((int)(20 * GUI.Scale), (int)(7 * GUI.Scale));
|
Point padding = new Point((int)(20 * GUI.Scale), (int)(7 * GUI.Scale));
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
|
|
||||||
InnerFrame.RectTransform.NonScaledSize =
|
InnerFrame.RectTransform.NonScaledSize =
|
||||||
new Point(InnerFrame.Rect.Width, (int)Math.Max(height / Content.RectTransform.RelativeSize.Y, height + 50));
|
new Point(InnerFrame.Rect.Width, (int)Math.Max(height / Content.RectTransform.RelativeSize.Y, height + (int)(50 * GUI.yScale)));
|
||||||
Content.RectTransform.NonScaledSize =
|
Content.RectTransform.NonScaledSize =
|
||||||
new Point(Content.Rect.Width, height);
|
new Point(Content.Rect.Width, height);
|
||||||
}
|
}
|
||||||
@@ -99,7 +99,7 @@ namespace Barotrauma
|
|||||||
Buttons = new List<GUIButton>(buttons.Length);
|
Buttons = new List<GUIButton>(buttons.Length);
|
||||||
for (int i = 0; i < buttons.Length; i++)
|
for (int i = 0; i < buttons.Length; i++)
|
||||||
{
|
{
|
||||||
var button = new GUIButton(new RectTransform(new Vector2(Math.Min(0.9f / buttons.Length, 0.5f), 1.0f), buttonContainer.RectTransform, maxSize: new Point(300, 35)), buttons[i], style: "GUIButtonLarge");
|
var button = new GUIButton(new RectTransform(new Vector2(Math.Min(0.9f / buttons.Length, 0.5f), 1.0f), buttonContainer.RectTransform), buttons[i], style: "GUIButtonLarge");
|
||||||
Buttons.Add(button);
|
Buttons.Add(button);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,8 @@ namespace Barotrauma
|
|||||||
|
|
||||||
public bool Wrap;
|
public bool Wrap;
|
||||||
|
|
||||||
|
public bool RoundToNearestPixel = true;
|
||||||
|
|
||||||
private bool overflowClipActive;
|
private bool overflowClipActive;
|
||||||
public bool OverflowClip;
|
public bool OverflowClip;
|
||||||
|
|
||||||
@@ -328,9 +330,16 @@ namespace Barotrauma
|
|||||||
|
|
||||||
if (!string.IsNullOrEmpty(text))
|
if (!string.IsNullOrEmpty(text))
|
||||||
{
|
{
|
||||||
|
Vector2 pos = rect.Location.ToVector2() + textPos + TextOffset;
|
||||||
|
if (RoundToNearestPixel)
|
||||||
|
{
|
||||||
|
pos.X = (int)pos.X;
|
||||||
|
pos.Y = (int)pos.Y;
|
||||||
|
}
|
||||||
|
|
||||||
Font.DrawString(spriteBatch,
|
Font.DrawString(spriteBatch,
|
||||||
Wrap ? wrappedText : text,
|
Wrap ? wrappedText : text,
|
||||||
rect.Location.ToVector2() + textPos + TextOffset,
|
pos,
|
||||||
textColor * (textColor.A / 255.0f),
|
textColor * (textColor.A / 255.0f),
|
||||||
0.0f, origin, TextScale,
|
0.0f, origin, TextScale,
|
||||||
SpriteEffects.None, textDepth);
|
SpriteEffects.None, textDepth);
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ namespace Barotrauma
|
|||||||
private RenderTarget2D renderTarget;
|
private RenderTarget2D renderTarget;
|
||||||
|
|
||||||
private Sprite languageSelectionCursor;
|
private Sprite languageSelectionCursor;
|
||||||
private ScalableFont languageSelectionFont;
|
private ScalableFont languageSelectionFont, languageSelectionFontCJK;
|
||||||
|
|
||||||
private Video currSplashScreen;
|
private Video currSplashScreen;
|
||||||
private DateTime videoStartTime;
|
private DateTime videoStartTime;
|
||||||
@@ -208,7 +208,7 @@ namespace Barotrauma
|
|||||||
for (int i = 0; i < lines.Length; i++)
|
for (int i = 0; i < lines.Length; i++)
|
||||||
{
|
{
|
||||||
GUI.Font.DrawString(spriteBatch, lines[i],
|
GUI.Font.DrawString(spriteBatch, lines[i],
|
||||||
new Vector2(GameMain.GraphicsWidth / 2.0f - GUI.Font.MeasureString(lines[i]).X / 2.0f, GameMain.GraphicsHeight * 0.78f + i * lineHeight), Color.White);
|
new Vector2((int)(GameMain.GraphicsWidth / 2.0f - GUI.Font.MeasureString(lines[i]).X / 2.0f), (int)(GameMain.GraphicsHeight * 0.78f + i * lineHeight)), Color.White);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -220,7 +220,13 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
if (languageSelectionFont == null)
|
if (languageSelectionFont == null)
|
||||||
{
|
{
|
||||||
languageSelectionFont = new ScalableFont("Content/Fonts/BebasNeue-Regular.otf", (uint)(30 * (GameMain.GraphicsHeight / 1080.0f)), graphicsDevice);
|
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);
|
||||||
}
|
}
|
||||||
if (languageSelectionCursor == null)
|
if (languageSelectionCursor == null)
|
||||||
{
|
{
|
||||||
@@ -231,24 +237,33 @@ namespace Barotrauma
|
|||||||
Vector2 textSpacing = new Vector2(0.0f, (GameMain.GraphicsHeight * 0.5f) / TextManager.AvailableLanguages.Count());
|
Vector2 textSpacing = new Vector2(0.0f, (GameMain.GraphicsHeight * 0.5f) / TextManager.AvailableLanguages.Count());
|
||||||
foreach (string language in TextManager.AvailableLanguages)
|
foreach (string language in TextManager.AvailableLanguages)
|
||||||
{
|
{
|
||||||
Vector2 textSize = languageSelectionFont.MeasureString(language);
|
string localizedLanguageName = TextManager.GetTranslatedLanguageName(language);
|
||||||
|
var font = TextManager.IsCJK(localizedLanguageName) ? languageSelectionFontCJK : languageSelectionFont;
|
||||||
|
|
||||||
|
Vector2 textSize = font.MeasureString(localizedLanguageName);
|
||||||
bool hover =
|
bool hover =
|
||||||
Math.Abs(PlayerInput.MousePosition.X - textPos.X) < textSize.X / 2 &&
|
Math.Abs(PlayerInput.MousePosition.X - textPos.X) < textSize.X / 2 &&
|
||||||
Math.Abs(PlayerInput.MousePosition.Y - textPos.Y) < textSpacing.Y / 2;
|
Math.Abs(PlayerInput.MousePosition.Y - textPos.Y) < textSpacing.Y / 2;
|
||||||
|
|
||||||
//TODO: display the name of the language in the target language?
|
font.DrawString(spriteBatch, localizedLanguageName, textPos - textSize / 2,
|
||||||
languageSelectionFont.DrawString(spriteBatch, language, textPos - textSize / 2,
|
|
||||||
hover ? Color.White : Color.White * 0.6f);
|
hover ? Color.White : Color.White * 0.6f);
|
||||||
if (hover && PlayerInput.LeftButtonClicked())
|
if (hover && PlayerInput.LeftButtonClicked())
|
||||||
{
|
{
|
||||||
GameMain.Config.Language = language;
|
GameMain.Config.Language = language;
|
||||||
|
//reload tip in the selected language
|
||||||
|
selectedTip = TextManager.Get("LoadingScreenTip", true);
|
||||||
|
GameMain.Config.SetDefaultBindings(legacy: false);
|
||||||
|
GameMain.Config.CheckBindings(useDefaults: true);
|
||||||
WaitForLanguageSelection = false;
|
WaitForLanguageSelection = false;
|
||||||
|
languageSelectionFont?.Dispose(); languageSelectionFont = null;
|
||||||
|
languageSelectionFontCJK?.Dispose(); languageSelectionFontCJK = null;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
textPos += textSpacing;
|
textPos += textSpacing;
|
||||||
}
|
}
|
||||||
|
|
||||||
languageSelectionCursor.Draw(spriteBatch, PlayerInput.LatestMousePosition);
|
languageSelectionCursor.Draw(spriteBatch, PlayerInput.LatestMousePosition, scale: 0.5f);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DrawSplashScreen(SpriteBatch spriteBatch, GraphicsDevice graphics)
|
private void DrawSplashScreen(SpriteBatch spriteBatch, GraphicsDevice graphics)
|
||||||
|
|||||||
@@ -356,7 +356,7 @@ namespace Barotrauma
|
|||||||
|
|
||||||
Point? minSize = null, maxSize = null;
|
Point? minSize = null, maxSize = null;
|
||||||
if (element.Attribute("minsize") != null) minSize = element.GetAttributePoint("minsize", Point.Zero);
|
if (element.Attribute("minsize") != null) minSize = element.GetAttributePoint("minsize", Point.Zero);
|
||||||
if (element.Attribute("maxsize") != null) maxSize = element.GetAttributePoint("maxsize", new Point(1000, 1000));
|
//if (element.Attribute("maxsize") != null) maxSize = element.GetAttributePoint("maxsize", new Point(1000, 1000));
|
||||||
|
|
||||||
RectTransform rectTransform;
|
RectTransform rectTransform;
|
||||||
if (element.Attribute("relativesize") != null)
|
if (element.Attribute("relativesize") != null)
|
||||||
|
|||||||
@@ -287,29 +287,38 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
if (GameSettings.ShowUserStatisticsPrompt)
|
if (GameSettings.ShowUserStatisticsPrompt)
|
||||||
{
|
{
|
||||||
//TODO: translate
|
if (TextManager.ContainsTag("statisticspromptheader") && TextManager.ContainsTag("statisticsprompttext"))
|
||||||
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"),
|
||||||
|
TextManager.Get("statisticsprompttext"),
|
||||||
|
new string[] { TextManager.Get("Yes"), TextManager.Get("No") });
|
||||||
|
userStatsPrompt.Buttons[0].OnClicked += (btn, userdata) =>
|
||||||
|
{
|
||||||
|
GameSettings.ShowUserStatisticsPrompt = false;
|
||||||
|
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
|
||||||
|
{
|
||||||
|
//user statistics enabled by default if the prompt cannot be shown in the user's language
|
||||||
GameSettings.ShowUserStatisticsPrompt = false;
|
GameSettings.ShowUserStatisticsPrompt = false;
|
||||||
GameSettings.SendUserStatistics = true;
|
GameSettings.SendUserStatistics = true;
|
||||||
GameAnalyticsManager.Init();
|
GameAnalyticsManager.Init();
|
||||||
Config.SaveNewPlayerConfig();
|
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)
|
else if (GameSettings.SendUserStatistics)
|
||||||
{
|
{
|
||||||
@@ -334,7 +343,7 @@ namespace Barotrauma
|
|||||||
SoundManager.SetCategoryGainMultiplier("ui", Config.SoundVolume);
|
SoundManager.SetCategoryGainMultiplier("ui", Config.SoundVolume);
|
||||||
SoundManager.SetCategoryGainMultiplier("waterambience", Config.SoundVolume);
|
SoundManager.SetCategoryGainMultiplier("waterambience", Config.SoundVolume);
|
||||||
SoundManager.SetCategoryGainMultiplier("music", Config.MusicVolume);
|
SoundManager.SetCategoryGainMultiplier("music", Config.MusicVolume);
|
||||||
SoundManager.SetCategoryGainMultiplier("voip", Config.VoiceChatVolume);
|
SoundManager.SetCategoryGainMultiplier("voip", Config.VoiceChatVolume * 5.0f);
|
||||||
if (Config.EnableSplashScreen)
|
if (Config.EnableSplashScreen)
|
||||||
{
|
{
|
||||||
var pendingSplashScreens = TitleScreen.PendingSplashScreens;
|
var pendingSplashScreens = TitleScreen.PendingSplashScreens;
|
||||||
@@ -374,10 +383,10 @@ namespace Barotrauma
|
|||||||
DebugConsole.Log("Selected content packages: " + string.Join(", ", SelectedPackages.Select(cp => cp.Name)));
|
DebugConsole.Log("Selected content packages: " + string.Join(", ", SelectedPackages.Select(cp => cp.Name)));
|
||||||
}
|
}
|
||||||
|
|
||||||
#if DEBUG
|
/*#if DEBUG
|
||||||
GameSettings.ShowUserStatisticsPrompt = false;
|
GameSettings.ShowUserStatisticsPrompt = false;
|
||||||
GameSettings.SendUserStatistics = false;
|
GameSettings.SendUserStatistics = false;
|
||||||
#endif
|
#endif*/
|
||||||
|
|
||||||
InitUserStats();
|
InitUserStats();
|
||||||
|
|
||||||
@@ -666,7 +675,7 @@ namespace Barotrauma
|
|||||||
(NetworkMember == null || !NetworkMember.GameStarted);
|
(NetworkMember == null || !NetworkMember.GameStarted);
|
||||||
|
|
||||||
#if !DEBUG
|
#if !DEBUG
|
||||||
if (NetworkMember == null && !WindowActive && !paused && true && Screen.Selected != MainMenuScreen)
|
if (NetworkMember == null && !WindowActive && !paused && true && Screen.Selected != MainMenuScreen && Config.PauseOnFocusLost)
|
||||||
{
|
{
|
||||||
GUI.TogglePauseMenu();
|
GUI.TogglePauseMenu();
|
||||||
paused = true;
|
paused = true;
|
||||||
@@ -812,17 +821,19 @@ namespace Barotrauma
|
|||||||
// ToDo: Move texts/links to localization, when possible.
|
// ToDo: Move texts/links to localization, when possible.
|
||||||
public void ShowBugReporter()
|
public void ShowBugReporter()
|
||||||
{
|
{
|
||||||
var msgBox = new GUIMessageBox("", "");
|
var msgBox = new GUIMessageBox(TextManager.Get("bugreportbutton"), "");
|
||||||
var linkHolder = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 0.5f), msgBox.Content.RectTransform)) { Stretch = true, RelativeSpacing = 0.05f };
|
msgBox.UserData = "bugreporter";
|
||||||
|
var linkHolder = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 1.0f), msgBox.Content.RectTransform)) { Stretch = true, RelativeSpacing = 0.025f };
|
||||||
|
linkHolder.RectTransform.MaxSize = new Point(int.MaxValue, linkHolder.Rect.Height);
|
||||||
|
|
||||||
List<Pair<string, string>> links = new List<Pair<string, string>>()
|
List<Pair<string, string>> links = new List<Pair<string, string>>()
|
||||||
{
|
{
|
||||||
new Pair<string, string>("Barotrauma Feedback Form","https://barotraumagame.com/feedback"),
|
new Pair<string, string>(TextManager.Get("bugreportfeedbackform"),"https://barotraumagame.com/feedback"),
|
||||||
new Pair<string, string>("Github Issue Form (Needs account)","https://github.com/Regalis11/Barotrauma/issues/new?template=bug_report.md")
|
new Pair<string, string>(TextManager.Get("bugreportgithubform"),"https://github.com/Regalis11/Barotrauma/issues/new?template=bug_report.md")
|
||||||
};
|
};
|
||||||
foreach (var link in links)
|
foreach (var link in links)
|
||||||
{
|
{
|
||||||
new GUIButton(new RectTransform(new Vector2(1.0f, 0.2f), linkHolder.RectTransform), link.First, style: "MainMenuGUIButton", textAlignment: Alignment.Left)
|
new GUIButton(new RectTransform(new Vector2(1.0f, 1.0f), linkHolder.RectTransform), link.First, style: "MainMenuGUIButton", textAlignment: Alignment.Left)
|
||||||
{
|
{
|
||||||
UserData = link.Second,
|
UserData = link.Second,
|
||||||
OnClicked = (btn, userdata) =>
|
OnClicked = (btn, userdata) =>
|
||||||
@@ -833,6 +844,9 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
msgBox.InnerFrame.RectTransform.MinSize = new Point(0,
|
||||||
|
msgBox.InnerFrame.Rect.Height + linkHolder.Rect.Height + msgBox.Content.AbsoluteSpacing * 2 + (int)(50 * GUI.Scale));
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool waitForKeyHit = true;
|
static bool waitForKeyHit = true;
|
||||||
|
|||||||
@@ -747,7 +747,7 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
if (orderGiver == null || orderGiver.CurrentHull == null) { return; }
|
if (orderGiver == null || orderGiver.CurrentHull == null) { return; }
|
||||||
var hull = orderGiver.CurrentHull;
|
var hull = orderGiver.CurrentHull;
|
||||||
AddOrder(new Order(order.Prefab, hull, null), order.Prefab.FadeOutTime);
|
AddOrder(new Order(order.Prefab, hull, null, orderGiver), order.Prefab.FadeOutTime);
|
||||||
if (IsSinglePlayer)
|
if (IsSinglePlayer)
|
||||||
{
|
{
|
||||||
orderGiver.Speak(
|
orderGiver.Speak(
|
||||||
@@ -1350,7 +1350,7 @@ namespace Barotrauma
|
|||||||
bool hasFires = Character.Controlled.CurrentHull.FireSources.Count > 0;
|
bool hasFires = Character.Controlled.CurrentHull.FireSources.Count > 0;
|
||||||
ToggleReportButton("reportfire", hasFires);
|
ToggleReportButton("reportfire", hasFires);
|
||||||
|
|
||||||
bool hasLeaks = Character.Controlled.CurrentHull.ConnectedGaps.Any(g => !g.IsRoomToRoom && g.Open > 0.0f);
|
bool hasLeaks = Character.Controlled.CurrentHull.Submarine != null && Character.Controlled.CurrentHull.ConnectedGaps.Any(g => !g.IsRoomToRoom && g.Open > 0.0f);
|
||||||
ToggleReportButton("reportbreach", hasLeaks);
|
ToggleReportButton("reportbreach", hasLeaks);
|
||||||
|
|
||||||
bool hasIntruders = Character.CharacterList.Any(c => c.CurrentHull == Character.Controlled.CurrentHull && AIObjectiveFightIntruders.IsValidTarget(Character.Controlled, c));
|
bool hasIntruders = Character.CharacterList.Any(c => c.CurrentHull == Character.Controlled.CurrentHull && AIObjectiveFightIntruders.IsValidTarget(Character.Controlled, c));
|
||||||
|
|||||||
+10
-10
@@ -132,7 +132,7 @@ namespace Barotrauma.Tutorials
|
|||||||
{
|
{
|
||||||
shakeTimer -= 0.1f;
|
shakeTimer -= 0.1f;
|
||||||
GameMain.GameScreen.Cam.Shake = shakeAmount;
|
GameMain.GameScreen.Cam.Shake = shakeAmount;
|
||||||
yield return new WaitForSeconds(0.1f);
|
yield return new WaitForSeconds(0.1f, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Room 2
|
// Room 2
|
||||||
@@ -142,7 +142,7 @@ namespace Barotrauma.Tutorials
|
|||||||
// Room 3
|
// Room 3
|
||||||
do { yield return null; } while (!captain_medicObjectiveSensor.MotionDetected);
|
do { yield return null; } while (!captain_medicObjectiveSensor.MotionDetected);
|
||||||
GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(captain_medic.Info.DisplayName, TextManager.Get("Captain.Radio.Medic"), ChatMessageType.Radio, null);
|
GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(captain_medic.Info.DisplayName, TextManager.Get("Captain.Radio.Medic"), ChatMessageType.Radio, null);
|
||||||
yield return new WaitForSeconds(2f);
|
yield return new WaitForSeconds(2f, false);
|
||||||
GameMain.GameSession.CrewManager.ToggleCrewAreaOpen = true;
|
GameMain.GameSession.CrewManager.ToggleCrewAreaOpen = true;
|
||||||
GameMain.GameSession.CrewManager.AddCharacter(captain_medic);
|
GameMain.GameSession.CrewManager.AddCharacter(captain_medic);
|
||||||
TriggerTutorialSegment(0);
|
TriggerTutorialSegment(0);
|
||||||
@@ -157,7 +157,7 @@ namespace Barotrauma.Tutorials
|
|||||||
|
|
||||||
// Submarine
|
// Submarine
|
||||||
do { yield return null; } while (!captain_enteredSubmarineSensor.MotionDetected);
|
do { yield return null; } while (!captain_enteredSubmarineSensor.MotionDetected);
|
||||||
yield return new WaitForSeconds(3f);
|
yield return new WaitForSeconds(3f, false);
|
||||||
captain_mechanic.AIController.Enabled = captain_security.AIController.Enabled = captain_engineer.AIController.Enabled = true;
|
captain_mechanic.AIController.Enabled = captain_security.AIController.Enabled = captain_engineer.AIController.Enabled = true;
|
||||||
TriggerTutorialSegment(1);
|
TriggerTutorialSegment(1);
|
||||||
GameMain.GameSession.CrewManager.AddCharacter(captain_mechanic);
|
GameMain.GameSession.CrewManager.AddCharacter(captain_mechanic);
|
||||||
@@ -169,7 +169,7 @@ namespace Barotrauma.Tutorials
|
|||||||
}
|
}
|
||||||
while (!HasOrder(captain_mechanic, "repairsystems", "jobspecific"));
|
while (!HasOrder(captain_mechanic, "repairsystems", "jobspecific"));
|
||||||
RemoveCompletedObjective(segments[1]);
|
RemoveCompletedObjective(segments[1]);
|
||||||
yield return new WaitForSeconds(2f);
|
yield return new WaitForSeconds(2f, false);
|
||||||
TriggerTutorialSegment(2);
|
TriggerTutorialSegment(2);
|
||||||
GameMain.GameSession.CrewManager.AddCharacter(captain_security);
|
GameMain.GameSession.CrewManager.AddCharacter(captain_security);
|
||||||
do
|
do
|
||||||
@@ -180,7 +180,7 @@ namespace Barotrauma.Tutorials
|
|||||||
}
|
}
|
||||||
while (!HasOrder(captain_security, "operateweapons", "fireatwill"));
|
while (!HasOrder(captain_security, "operateweapons", "fireatwill"));
|
||||||
RemoveCompletedObjective(segments[2]);
|
RemoveCompletedObjective(segments[2]);
|
||||||
yield return new WaitForSeconds(4f);
|
yield return new WaitForSeconds(4f, false);
|
||||||
TriggerTutorialSegment(3);
|
TriggerTutorialSegment(3);
|
||||||
GameMain.GameSession.CrewManager.AddCharacter(captain_engineer);
|
GameMain.GameSession.CrewManager.AddCharacter(captain_engineer);
|
||||||
do
|
do
|
||||||
@@ -202,10 +202,10 @@ namespace Barotrauma.Tutorials
|
|||||||
do
|
do
|
||||||
{
|
{
|
||||||
//captain_navConsoleCustomInterface.HighlightElement(0, uiHighlightColor, duration: 1.0f, pulsateAmount: 0.0f);
|
//captain_navConsoleCustomInterface.HighlightElement(0, uiHighlightColor, duration: 1.0f, pulsateAmount: 0.0f);
|
||||||
yield return new WaitForSeconds(1.0f);
|
yield return new WaitForSeconds(1.0f, false);
|
||||||
} while (Submarine.MainSub.DockedTo.Count > 0);
|
} while (Submarine.MainSub.DockedTo.Count > 0);
|
||||||
RemoveCompletedObjective(segments[4]);
|
RemoveCompletedObjective(segments[4]);
|
||||||
yield return new WaitForSeconds(2f);
|
yield return new WaitForSeconds(2f, false);
|
||||||
TriggerTutorialSegment(5); // Navigate to destination
|
TriggerTutorialSegment(5); // Navigate to destination
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
@@ -221,15 +221,15 @@ namespace Barotrauma.Tutorials
|
|||||||
} while (!captain_sonar.IsActive);
|
} while (!captain_sonar.IsActive);
|
||||||
do { yield return null; } while (Vector2.Distance(Submarine.MainSub.WorldPosition, Level.Loaded.EndPosition) > 4000f);
|
do { yield return null; } while (Vector2.Distance(Submarine.MainSub.WorldPosition, Level.Loaded.EndPosition) > 4000f);
|
||||||
RemoveCompletedObjective(segments[5]);
|
RemoveCompletedObjective(segments[5]);
|
||||||
yield return new WaitForSeconds(4f);
|
yield return new WaitForSeconds(4f, false);
|
||||||
TriggerTutorialSegment(6); // Docking
|
TriggerTutorialSegment(6); // Docking
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
//captain_navConsoleCustomInterface.HighlightElement(0, uiHighlightColor, duration: 1.0f, pulsateAmount: 0.0f);
|
//captain_navConsoleCustomInterface.HighlightElement(0, uiHighlightColor, duration: 1.0f, pulsateAmount: 0.0f);
|
||||||
yield return new WaitForSeconds(1.0f);
|
yield return new WaitForSeconds(1.0f, false);
|
||||||
} while (!Submarine.MainSub.AtEndPosition || Submarine.MainSub.DockedTo.Count == 0);
|
} while (!Submarine.MainSub.AtEndPosition || Submarine.MainSub.DockedTo.Count == 0);
|
||||||
RemoveCompletedObjective(segments[6]);
|
RemoveCompletedObjective(segments[6]);
|
||||||
yield return new WaitForSeconds(3f);
|
yield return new WaitForSeconds(3f, false);
|
||||||
GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Captain.Radio.Complete").Replace("[OUTPOSTNAME]", GameMain.GameSession.EndLocation.Name), ChatMessageType.Radio, null);
|
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_navConsole.Item, false);
|
||||||
SetHighlight(captain_sonar.Item, false);
|
SetHighlight(captain_sonar.Item, false);
|
||||||
|
|||||||
+52
-45
@@ -21,7 +21,7 @@ namespace Barotrauma.Tutorials
|
|||||||
private ItemContainer doctor_suppliesCabinet;
|
private ItemContainer doctor_suppliesCabinet;
|
||||||
private ItemContainer doctor_medBayCabinet;
|
private ItemContainer doctor_medBayCabinet;
|
||||||
private Character patient1, patient2;
|
private Character patient1, patient2;
|
||||||
private List<Character> subPatients = new List<Character>();
|
private List<Character> subPatients;
|
||||||
private Hull startRoom;
|
private Hull startRoom;
|
||||||
private Hull medBay;
|
private Hull medBay;
|
||||||
|
|
||||||
@@ -38,7 +38,8 @@ namespace Barotrauma.Tutorials
|
|||||||
private LightComponent tutorial_submarineDoorLight;
|
private LightComponent tutorial_submarineDoorLight;
|
||||||
|
|
||||||
// Variables
|
// Variables
|
||||||
private Color doctor_iconColor = new Color(178, 118, 139);
|
private Sprite doctor_firstAidIcon;
|
||||||
|
private Color doctor_firstAidIconColor;
|
||||||
|
|
||||||
public DoctorTutorial(XElement element) : base(element)
|
public DoctorTutorial(XElement element) : base(element)
|
||||||
{
|
{
|
||||||
@@ -47,6 +48,11 @@ namespace Barotrauma.Tutorials
|
|||||||
{
|
{
|
||||||
base.Start();
|
base.Start();
|
||||||
|
|
||||||
|
var firstAidOrder = Order.PrefabList.Find(order => order.AITag == "requestfirstaid");
|
||||||
|
doctor_firstAidIcon = firstAidOrder.SymbolSprite;
|
||||||
|
doctor_firstAidIconColor = firstAidOrder.Color;
|
||||||
|
|
||||||
|
subPatients = new List<Character>();
|
||||||
radioSpeakerName = TextManager.Get("Tutorial.Radio.Speaker");
|
radioSpeakerName = TextManager.Get("Tutorial.Radio.Speaker");
|
||||||
doctor = Character.Controlled;
|
doctor = Character.Controlled;
|
||||||
|
|
||||||
@@ -119,7 +125,7 @@ namespace Barotrauma.Tutorials
|
|||||||
|
|
||||||
// explosions and radio messages ------------------------------------------------------
|
// explosions and radio messages ------------------------------------------------------
|
||||||
|
|
||||||
yield return new WaitForSeconds(3.0f);
|
yield return new WaitForSeconds(3.0f, false);
|
||||||
|
|
||||||
//SoundPlayer.PlayDamageSound("StructureBlunt", 10, Character.Controlled.WorldPosition);
|
//SoundPlayer.PlayDamageSound("StructureBlunt", 10, Character.Controlled.WorldPosition);
|
||||||
//// Room 1
|
//// Room 1
|
||||||
@@ -141,7 +147,7 @@ namespace Barotrauma.Tutorials
|
|||||||
explosion.Explode(Character.Controlled.WorldPosition - Vector2.UnitX * 25, null);
|
explosion.Explode(Character.Controlled.WorldPosition - Vector2.UnitX * 25, null);
|
||||||
SoundPlayer.PlayDamageSound("StructureBlunt", 10, Character.Controlled.WorldPosition - Vector2.UnitX * 25);
|
SoundPlayer.PlayDamageSound("StructureBlunt", 10, Character.Controlled.WorldPosition - Vector2.UnitX * 25);
|
||||||
|
|
||||||
yield return new WaitForSeconds(0.5f);
|
yield return new WaitForSeconds(0.5f, false);
|
||||||
|
|
||||||
doctor.DamageLimb(
|
doctor.DamageLimb(
|
||||||
Character.Controlled.WorldPosition,
|
Character.Controlled.WorldPosition,
|
||||||
@@ -154,15 +160,15 @@ namespace Barotrauma.Tutorials
|
|||||||
{
|
{
|
||||||
shakeTimer -= 0.1f;
|
shakeTimer -= 0.1f;
|
||||||
GameMain.GameScreen.Cam.Shake = shakeAmount;
|
GameMain.GameScreen.Cam.Shake = shakeAmount;
|
||||||
yield return new WaitForSeconds(0.1f);
|
yield return new WaitForSeconds(0.1f, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
yield return new WaitForSeconds(3.0f);
|
yield return new WaitForSeconds(3.0f, false);
|
||||||
GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Doctor.Radio.KnockedDown"), ChatMessageType.Radio, null);
|
GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Doctor.Radio.KnockedDown"), ChatMessageType.Radio, null);
|
||||||
|
|
||||||
// first tutorial segment, get medical supplies ------------------------------------------------------
|
// first tutorial segment, get medical supplies ------------------------------------------------------
|
||||||
|
|
||||||
yield return new WaitForSeconds(1.5f);
|
yield return new WaitForSeconds(1.5f, false);
|
||||||
SetHighlight(doctor_suppliesCabinet.Item, true);
|
SetHighlight(doctor_suppliesCabinet.Item, true);
|
||||||
|
|
||||||
/*while (doctor.CurrentHull != doctor_suppliesCabinet.Item.CurrentHull)
|
/*while (doctor.CurrentHull != doctor_suppliesCabinet.Item.CurrentHull)
|
||||||
@@ -190,22 +196,24 @@ namespace Barotrauma.Tutorials
|
|||||||
}
|
}
|
||||||
yield return null;
|
yield return null;
|
||||||
} while (doctor.Inventory.FindItemByIdentifier("antidama1") == null); // Wait until looted
|
} while (doctor.Inventory.FindItemByIdentifier("antidama1") == null); // Wait until looted
|
||||||
yield return new WaitForSeconds(1.0f);
|
yield return new WaitForSeconds(1.0f, false);
|
||||||
|
|
||||||
SetHighlight(doctor_suppliesCabinet.Item, false);
|
SetHighlight(doctor_suppliesCabinet.Item, false);
|
||||||
RemoveCompletedObjective(segments[0]);
|
RemoveCompletedObjective(segments[0]);
|
||||||
|
|
||||||
yield return new WaitForSeconds(1.0f);
|
yield return new WaitForSeconds(1.0f, false);
|
||||||
|
|
||||||
// 2nd tutorial segment, treat self -------------------------------------------------------------------------
|
// 2nd tutorial segment, treat self -------------------------------------------------------------------------
|
||||||
|
|
||||||
TriggerTutorialSegment(1, GameMain.Config.KeyBind(InputType.Health)); // Open health interface
|
TriggerTutorialSegment(1, GameMain.Config.KeyBind(InputType.Health)); // Open health interface
|
||||||
while (CharacterHealth.OpenHealthWindow == null)
|
while (CharacterHealth.OpenHealthWindow == null)
|
||||||
{
|
{
|
||||||
yield return new WaitForSeconds(1.0f);
|
doctor.CharacterHealth.HealthBarPulsateTimer = 1.0f;
|
||||||
|
yield return null;
|
||||||
}
|
}
|
||||||
|
yield return null;
|
||||||
RemoveCompletedObjective(segments[1]);
|
RemoveCompletedObjective(segments[1]);
|
||||||
|
yield return new WaitForSeconds(1.0f, false);
|
||||||
TriggerTutorialSegment(2); //Treat self
|
TriggerTutorialSegment(2); //Treat self
|
||||||
while (doctor.CharacterHealth.GetAfflictionStrength("damage") > 0.01f)
|
while (doctor.CharacterHealth.GetAfflictionStrength("damage") > 0.01f)
|
||||||
{
|
{
|
||||||
@@ -226,23 +234,22 @@ namespace Barotrauma.Tutorials
|
|||||||
|
|
||||||
while (CharacterHealth.OpenHealthWindow != null)
|
while (CharacterHealth.OpenHealthWindow != null)
|
||||||
{
|
{
|
||||||
yield return new WaitForSeconds(1.0f);
|
yield return new WaitForSeconds(1.0f, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// treat patient --------------------------------------------------------------------------------------------
|
// treat patient --------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
//patient 1 requests first aid
|
//patient 1 requests first aid
|
||||||
patient1.CanSpeak = true;
|
var newOrder = new Order(Order.PrefabList.Find(o => o.AITag == "requestfirstaid"), patient1.CurrentHull, null, orderGiver: patient1);
|
||||||
var newOrder = new Order(Order.PrefabList.Find(o => o.AITag == "requestfirstaid"), patient1.CurrentHull, null);
|
doctor.AddActiveObjectiveEntity(patient1, doctor_firstAidIcon, doctor_firstAidIconColor);
|
||||||
GameMain.GameSession.CrewManager.AddOrder(newOrder, newOrder.FadeOutTime);
|
//GameMain.GameSession.CrewManager.AddOrder(newOrder, newOrder.FadeOutTime);
|
||||||
patient1.Speak(newOrder.GetChatMessage("", patient1.CurrentHull?.RoomName, givingOrderToSelf: false), ChatMessageType.Order);
|
GameMain.GameSession.CrewManager.AddSinglePlayerChatMessage(patient1.Name, newOrder.GetChatMessage("", patient1.CurrentHull?.DisplayName, givingOrderToSelf: false), ChatMessageType.Order, null);
|
||||||
patient1.AIController.Enabled = true;
|
|
||||||
|
|
||||||
while (doctor.CurrentHull != patient1.CurrentHull)
|
while (doctor.CurrentHull != patient1.CurrentHull)
|
||||||
{
|
{
|
||||||
yield return new WaitForSeconds(1.0f);
|
yield return new WaitForSeconds(1.0f, false);
|
||||||
}
|
}
|
||||||
yield return new WaitForSeconds(0.0f);
|
yield return new WaitForSeconds(0.0f, false);
|
||||||
|
|
||||||
GameMain.GameSession.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Doctor.Radio.AssistantBurns"), ChatMessageType.Radio, null);
|
GameMain.GameSession.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Doctor.Radio.AssistantBurns"), ChatMessageType.Radio, null);
|
||||||
GameMain.GameSession.CrewManager.AllowCharacterSwitch = false;
|
GameMain.GameSession.CrewManager.AllowCharacterSwitch = false;
|
||||||
@@ -250,7 +257,9 @@ namespace Barotrauma.Tutorials
|
|||||||
GameMain.GameSession.CrewManager.AddCharacter(patient1);
|
GameMain.GameSession.CrewManager.AddCharacter(patient1);
|
||||||
GameMain.GameSession.CrewManager.ToggleCrewAreaOpen = true;
|
GameMain.GameSession.CrewManager.ToggleCrewAreaOpen = true;
|
||||||
|
|
||||||
yield return new WaitForSeconds(3.0f);
|
yield return new WaitForSeconds(3.0f, false);
|
||||||
|
patient1.AIController.Enabled = true;
|
||||||
|
doctor.RemoveActiveObjectiveEntity(patient1);
|
||||||
TriggerTutorialSegment(3); // Get the patient to medbay
|
TriggerTutorialSegment(3); // Get the patient to medbay
|
||||||
|
|
||||||
while (patient1.CurrentOrder == null || patient1.CurrentOrder.AITag != "follow")
|
while (patient1.CurrentOrder == null || patient1.CurrentOrder.AITag != "follow")
|
||||||
@@ -263,13 +272,13 @@ namespace Barotrauma.Tutorials
|
|||||||
|
|
||||||
while (patient1.CurrentHull != medBay)
|
while (patient1.CurrentHull != medBay)
|
||||||
{
|
{
|
||||||
yield return new WaitForSeconds(1.0f);
|
yield return new WaitForSeconds(1.0f, false);
|
||||||
}
|
}
|
||||||
RemoveCompletedObjective(segments[3]);
|
RemoveCompletedObjective(segments[3]);
|
||||||
SetHighlight(doctor_medBayCabinet.Item, true);
|
SetHighlight(doctor_medBayCabinet.Item, true);
|
||||||
SetDoorAccess(doctor_thirdDoor, doctor_thirdDoorLight, true);
|
SetDoorAccess(doctor_thirdDoor, doctor_thirdDoorLight, true);
|
||||||
|
|
||||||
yield return new WaitForSeconds(2.0f);
|
yield return new WaitForSeconds(2.0f, false);
|
||||||
|
|
||||||
TriggerTutorialSegment(4, GameMain.Config.KeyBind(InputType.Health)); // treat burns
|
TriggerTutorialSegment(4, GameMain.Config.KeyBind(InputType.Health)); // treat burns
|
||||||
|
|
||||||
@@ -309,17 +318,19 @@ namespace Barotrauma.Tutorials
|
|||||||
}
|
}
|
||||||
RemoveCompletedObjective(segments[4]);
|
RemoveCompletedObjective(segments[4]);
|
||||||
SetHighlight(patient1, false);
|
SetHighlight(patient1, false);
|
||||||
yield return new WaitForSeconds(1.0f);
|
yield return new WaitForSeconds(1.0f, false);
|
||||||
|
|
||||||
GameMain.GameSession.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Doctor.Radio.AssistantBurnsHealed"), ChatMessageType.Radio, null);
|
GameMain.GameSession.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Doctor.Radio.AssistantBurnsHealed"), ChatMessageType.Radio, null);
|
||||||
|
|
||||||
// treat unconscious patient ------------------------------------------------------
|
// treat unconscious patient ------------------------------------------------------
|
||||||
|
|
||||||
//patient calls for help
|
//patient calls for help
|
||||||
patient2.CanSpeak = true;
|
//patient2.CanSpeak = true;
|
||||||
newOrder = new Order(Order.PrefabList.Find(o => o.AITag == "requestfirstaid"), patient2.CurrentHull, null);
|
yield return new WaitForSeconds(2.0f, false);
|
||||||
GameMain.GameSession.CrewManager.AddOrder(newOrder, newOrder.FadeOutTime);
|
newOrder = new Order(Order.PrefabList.Find(o => o.AITag == "requestfirstaid"), patient2.CurrentHull, null, orderGiver: patient2);
|
||||||
patient2.Speak(newOrder.GetChatMessage("", patient1.CurrentHull?.RoomName, givingOrderToSelf: false), ChatMessageType.Order);
|
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);
|
||||||
patient2.AIController.Enabled = true;
|
patient2.AIController.Enabled = true;
|
||||||
patient2.Oxygen = -50;
|
patient2.Oxygen = -50;
|
||||||
CoroutineManager.StartCoroutine(KeepPatientAlive(patient2), "KeepPatient2Alive");
|
CoroutineManager.StartCoroutine(KeepPatientAlive(patient2), "KeepPatient2Alive");
|
||||||
@@ -329,7 +340,7 @@ namespace Barotrauma.Tutorials
|
|||||||
yield return new WaitForSeconds(1.0f);
|
yield return new WaitForSeconds(1.0f);
|
||||||
}*/
|
}*/
|
||||||
do { yield return null; } while (!tutorial_upperFinalDoor.IsOpen);
|
do { yield return null; } while (!tutorial_upperFinalDoor.IsOpen);
|
||||||
yield return new WaitForSeconds(2.0f);
|
yield return new WaitForSeconds(2.0f, false);
|
||||||
|
|
||||||
TriggerTutorialSegment(5, GameMain.Config.KeyBind(InputType.Health)); // perform CPR
|
TriggerTutorialSegment(5, GameMain.Config.KeyBind(InputType.Health)); // perform CPR
|
||||||
SetHighlight(patient2, true);
|
SetHighlight(patient2, true);
|
||||||
@@ -344,23 +355,24 @@ namespace Barotrauma.Tutorials
|
|||||||
}
|
}
|
||||||
RemoveCompletedObjective(segments[5]);
|
RemoveCompletedObjective(segments[5]);
|
||||||
SetHighlight(patient2, false);
|
SetHighlight(patient2, false);
|
||||||
|
doctor.RemoveActiveObjectiveEntity(patient2);
|
||||||
CoroutineManager.StopCoroutines("KeepPatient2Alive");
|
CoroutineManager.StopCoroutines("KeepPatient2Alive");
|
||||||
|
|
||||||
SetDoorAccess(tutorial_submarineDoor, tutorial_submarineDoorLight, true);
|
SetDoorAccess(tutorial_submarineDoor, tutorial_submarineDoorLight, true);
|
||||||
|
|
||||||
while (doctor.Submarine != Submarine.MainSub)
|
while (doctor.Submarine != Submarine.MainSub)
|
||||||
{
|
{
|
||||||
yield return new WaitForSeconds(1.0f);
|
yield return new WaitForSeconds(1.0f, false);
|
||||||
}
|
}
|
||||||
yield return new WaitForSeconds(5.0f);
|
yield return new WaitForSeconds(5.0f, false);
|
||||||
GameMain.GameSession.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Doctor.Radio.EnteredSub"), ChatMessageType.Radio, null);
|
GameMain.GameSession.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Doctor.Radio.EnteredSub"), ChatMessageType.Radio, null);
|
||||||
|
|
||||||
yield return new WaitForSeconds(3.0f);
|
yield return new WaitForSeconds(3.0f, false);
|
||||||
TriggerTutorialSegment(6, GameMain.Config.KeyBind(InputType.Health)); // give treatment to anyone in need
|
TriggerTutorialSegment(6, GameMain.Config.KeyBind(InputType.Health)); // give treatment to anyone in need
|
||||||
|
|
||||||
foreach (var patient in subPatients)
|
foreach (var patient in subPatients)
|
||||||
{
|
{
|
||||||
patient.CanSpeak = true;
|
//patient.CanSpeak = true;
|
||||||
patient.AIController.Enabled = true;
|
patient.AIController.Enabled = true;
|
||||||
SetHighlight(patient, true);
|
SetHighlight(patient, true);
|
||||||
}
|
}
|
||||||
@@ -370,6 +382,7 @@ namespace Barotrauma.Tutorials
|
|||||||
double subEnterTime = Timing.TotalTime;
|
double subEnterTime = Timing.TotalTime;
|
||||||
|
|
||||||
bool[] patientCalledHelp = new bool[] { false, false, false };
|
bool[] patientCalledHelp = new bool[] { false, false, false };
|
||||||
|
|
||||||
while (subPatients.Any(p => p.Vitality < p.MaxVitality * 0.9f && !p.IsDead))
|
while (subPatients.Any(p => p.Vitality < p.MaxVitality * 0.9f && !p.IsDead))
|
||||||
{
|
{
|
||||||
for (int i = 0; i < subPatients.Count; i++)
|
for (int i = 0; i < subPatients.Count; i++)
|
||||||
@@ -378,32 +391,26 @@ namespace Barotrauma.Tutorials
|
|||||||
//(within 1 minute intervals of entering the sub)
|
//(within 1 minute intervals of entering the sub)
|
||||||
if (!patientCalledHelp[i] && Timing.TotalTime > subEnterTime + 60 * (i + 1))
|
if (!patientCalledHelp[i] && Timing.TotalTime > subEnterTime + 60 * (i + 1))
|
||||||
{
|
{
|
||||||
newOrder = new Order(Order.PrefabList.Find(o => o.AITag == "requestfirstaid"), subPatients[i].CurrentHull, null);
|
doctor.AddActiveObjectiveEntity(subPatients[i], doctor_firstAidIcon, doctor_firstAidIconColor);
|
||||||
GameMain.GameSession.CrewManager.AddOrder(newOrder, newOrder.FadeOutTime);
|
newOrder = new Order(Order.PrefabList.Find(o => o.AITag == "requestfirstaid"), subPatients[i].CurrentHull, null, orderGiver: subPatients[i]);
|
||||||
|
string message = newOrder.GetChatMessage("", subPatients[i].CurrentHull?.DisplayName, givingOrderToSelf: false);
|
||||||
string message = newOrder.GetChatMessage("", subPatients[i].CurrentHull?.RoomName, 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;
|
patientCalledHelp[i] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (subPatients[i].ExternalHighlight && subPatients[i].Vitality >= subPatients[i].MaxVitality * 0.9f)
|
if (subPatients[i].ExternalHighlight && subPatients[i].Vitality >= subPatients[i].MaxVitality * 0.9f)
|
||||||
{
|
{
|
||||||
|
doctor.RemoveActiveObjectiveEntity(subPatients[i]);
|
||||||
SetHighlight(subPatients[i], false);
|
SetHighlight(subPatients[i], false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
yield return new WaitForSeconds(1.0f);
|
yield return new WaitForSeconds(1.0f, false);
|
||||||
}
|
}
|
||||||
RemoveCompletedObjective(segments[6]);
|
RemoveCompletedObjective(segments[6]);
|
||||||
foreach (var patient in subPatients)
|
foreach (var patient in subPatients)
|
||||||
{
|
{
|
||||||
SetHighlight(patient, false);
|
SetHighlight(patient, false);
|
||||||
|
doctor.RemoveActiveObjectiveEntity(patient);
|
||||||
}
|
}
|
||||||
|
|
||||||
// END TUTORIAL
|
// END TUTORIAL
|
||||||
|
|||||||
+25
-10
@@ -213,7 +213,7 @@ namespace Barotrauma.Tutorials
|
|||||||
{
|
{
|
||||||
shakeTimer -= 0.1f;
|
shakeTimer -= 0.1f;
|
||||||
GameMain.GameScreen.Cam.Shake = shakeAmount;
|
GameMain.GameScreen.Cam.Shake = shakeAmount;
|
||||||
yield return new WaitForSeconds(0.1f);
|
yield return new WaitForSeconds(0.1f, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
//// Remove
|
//// Remove
|
||||||
@@ -231,7 +231,7 @@ namespace Barotrauma.Tutorials
|
|||||||
// Room 2
|
// Room 2
|
||||||
do { yield return null; } while (!engineer_equipmentObjectiveSensor.MotionDetected);
|
do { yield return null; } while (!engineer_equipmentObjectiveSensor.MotionDetected);
|
||||||
GameMain.GameSession.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Engineer.Radio.Equipment"), ChatMessageType.Radio, null);
|
GameMain.GameSession.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Engineer.Radio.Equipment"), ChatMessageType.Radio, null);
|
||||||
yield return new WaitForSeconds(0.5f);
|
yield return new WaitForSeconds(0.5f, false);
|
||||||
TriggerTutorialSegment(0, GameMain.Config.KeyBind(InputType.Select), GameMain.Config.KeyBind(InputType.Deselect)); // Retrieve equipment
|
TriggerTutorialSegment(0, GameMain.Config.KeyBind(InputType.Select), GameMain.Config.KeyBind(InputType.Deselect)); // Retrieve equipment
|
||||||
bool firstSlotRemoved = false;
|
bool firstSlotRemoved = false;
|
||||||
bool secondSlotRemoved = false;
|
bool secondSlotRemoved = false;
|
||||||
@@ -280,7 +280,7 @@ namespace Barotrauma.Tutorials
|
|||||||
|
|
||||||
// Room 3
|
// Room 3
|
||||||
do { yield return null; } while (!IsSelectedItem(engineer_reactor.Item));
|
do { yield return null; } while (!IsSelectedItem(engineer_reactor.Item));
|
||||||
yield return new WaitForSeconds(0.5f);
|
yield return new WaitForSeconds(0.5f, false);
|
||||||
TriggerTutorialSegment(1);
|
TriggerTutorialSegment(1);
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
@@ -326,7 +326,7 @@ namespace Barotrauma.Tutorials
|
|||||||
}
|
}
|
||||||
yield return null;
|
yield return null;
|
||||||
} while (!reactorOperatedProperly);
|
} while (!reactorOperatedProperly);
|
||||||
yield return new WaitForSeconds(2f);
|
yield return new WaitForSeconds(2f, false);
|
||||||
GameMain.GameSession.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Engineer.Radio.ReactorStable"), ChatMessageType.Radio, null);
|
GameMain.GameSession.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Engineer.Radio.ReactorStable"), ChatMessageType.Radio, null);
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
@@ -343,7 +343,7 @@ namespace Barotrauma.Tutorials
|
|||||||
float wait = 1.5f;
|
float wait = 1.5f;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
yield return new WaitForSeconds(0.1f);
|
yield return new WaitForSeconds(0.1f, false);
|
||||||
wait -= 0.1f;
|
wait -= 0.1f;
|
||||||
engineer_reactor.AutoTempSlider.BarScrollValue = 0.0f;
|
engineer_reactor.AutoTempSlider.BarScrollValue = 0.0f;
|
||||||
} while (wait > 0.0f);
|
} while (wait > 0.0f);
|
||||||
@@ -356,9 +356,24 @@ namespace Barotrauma.Tutorials
|
|||||||
|
|
||||||
// Room 4
|
// Room 4
|
||||||
do { yield return null; } while (!engineer_secondDoor.IsOpen);
|
do { yield return null; } while (!engineer_secondDoor.IsOpen);
|
||||||
yield return new WaitForSeconds(1f);
|
yield return new WaitForSeconds(1f, false);
|
||||||
|
Repairable repairableJunctionBoxComponent = engineer_brokenJunctionBox.GetComponent<Repairable>();
|
||||||
TriggerTutorialSegment(2, GameMain.Config.KeyBind(InputType.Select)); // Repair the junction box
|
TriggerTutorialSegment(2, GameMain.Config.KeyBind(InputType.Select)); // Repair the junction box
|
||||||
do { yield return null; } while (!engineer_brokenJunctionBox.IsFullCondition); // Wait until repaired
|
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
|
||||||
SetHighlight(engineer_brokenJunctionBox, false);
|
SetHighlight(engineer_brokenJunctionBox, false);
|
||||||
RemoveCompletedObjective(segments[2]);
|
RemoveCompletedObjective(segments[2]);
|
||||||
SetDoorAccess(engineer_thirdDoor, engineer_thirdDoorLight, true);
|
SetDoorAccess(engineer_thirdDoor, engineer_thirdDoorLight, true);
|
||||||
@@ -370,7 +385,7 @@ namespace Barotrauma.Tutorials
|
|||||||
// Room 5
|
// Room 5
|
||||||
do { yield return null; } while (!engineer_thirdDoor.IsOpen);
|
do { yield return null; } while (!engineer_thirdDoor.IsOpen);
|
||||||
GameMain.GameSession.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Engineer.Radio.FaultyWiring"), ChatMessageType.Radio, null);
|
GameMain.GameSession.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Engineer.Radio.FaultyWiring"), ChatMessageType.Radio, null);
|
||||||
yield return new WaitForSeconds(2f);
|
yield return new WaitForSeconds(2f, false);
|
||||||
TriggerTutorialSegment(3, GameMain.Config.KeyBind(InputType.Use), GameMain.Config.KeyBind(InputType.Deselect)); // Connect the junction boxes
|
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
|
do { CheckGhostWires(); HandleJunctionBoxWiringHighlights(); yield return null; } while (engineer_workingPump.Voltage < engineer_workingPump.MinVoltage); // Wait until connected all the way to the pump
|
||||||
CheckGhostWires();
|
CheckGhostWires();
|
||||||
@@ -387,7 +402,7 @@ namespace Barotrauma.Tutorials
|
|||||||
// Submarine
|
// Submarine
|
||||||
do { yield return null; } while (!tutorial_enteredSubmarineSensor.MotionDetected);
|
do { yield return null; } while (!tutorial_enteredSubmarineSensor.MotionDetected);
|
||||||
GameMain.GameSession.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Engineer.Radio.Submarine"), ChatMessageType.Radio, null);
|
GameMain.GameSession.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Engineer.Radio.Submarine"), ChatMessageType.Radio, null);
|
||||||
yield return new WaitForSeconds(2f);
|
yield return new WaitForSeconds(2f, false);
|
||||||
TriggerTutorialSegment(4); // Repair junction box
|
TriggerTutorialSegment(4); // Repair junction box
|
||||||
while (ContentRunning) yield return null;
|
while (ContentRunning) yield return null;
|
||||||
SetHighlight(engineer_submarineJunctionBox_1, true);
|
SetHighlight(engineer_submarineJunctionBox_1, true);
|
||||||
@@ -443,7 +458,7 @@ namespace Barotrauma.Tutorials
|
|||||||
tutorial_oxygenGenerator.PowerConsumption = reactorLoads[i];
|
tutorial_oxygenGenerator.PowerConsumption = reactorLoads[i];
|
||||||
while (timer > 0)
|
while (timer > 0)
|
||||||
{
|
{
|
||||||
yield return new WaitForSeconds(0.1f);
|
yield return new WaitForSeconds(0.1f, false);
|
||||||
if (IsReactorPoweredUp(engineer_reactor))
|
if (IsReactorPoweredUp(engineer_reactor))
|
||||||
{
|
{
|
||||||
timer -= 0.1f;
|
timer -= 0.1f;
|
||||||
|
|||||||
+27
-18
@@ -230,25 +230,25 @@ namespace Barotrauma.Tutorials
|
|||||||
{
|
{
|
||||||
shakeTimer -= 0.1f;
|
shakeTimer -= 0.1f;
|
||||||
GameMain.GameScreen.Cam.Shake = shakeAmount;
|
GameMain.GameScreen.Cam.Shake = shakeAmount;
|
||||||
yield return new WaitForSeconds(0.1f);
|
yield return new WaitForSeconds(0.1f, false);
|
||||||
}
|
}
|
||||||
yield return new WaitForSeconds(2.5f);
|
yield return new WaitForSeconds(2.5f, false);
|
||||||
|
|
||||||
mechanic_fabricator.RemoveFabricationRecipes(new List<string>() { "extinguisher", "wrench", "weldingtool", "weldingfuel", "divingmask", "railgunshell", "nuclearshell", "uex", "harpoongun" });
|
mechanic_fabricator.RemoveFabricationRecipes(new List<string>() { "extinguisher", "wrench", "weldingtool", "weldingfuel", "divingmask", "railgunshell", "nuclearshell", "uex", "harpoongun" });
|
||||||
GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Mechanic.Radio.WakeUp"), ChatMessageType.Radio, null);
|
GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Mechanic.Radio.WakeUp"), ChatMessageType.Radio, null);
|
||||||
|
|
||||||
yield return new WaitForSeconds(2.5f);
|
yield return new WaitForSeconds(2.5f, false);
|
||||||
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
|
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);
|
yield return new WaitForSeconds(0.0f, false);
|
||||||
SetDoorAccess(mechanic_firstDoor, mechanic_firstDoorLight, true);
|
SetDoorAccess(mechanic_firstDoor, mechanic_firstDoorLight, true);
|
||||||
SetHighlight(mechanic_firstDoor.Item, true);
|
SetHighlight(mechanic_firstDoor.Item, true);
|
||||||
do { yield return null; } while (!mechanic_firstDoor.IsOpen);
|
do { yield return null; } while (!mechanic_firstDoor.IsOpen);
|
||||||
SetHighlight(mechanic_firstDoor.Item, false);
|
SetHighlight(mechanic_firstDoor.Item, false);
|
||||||
yield return new WaitForSeconds(1.5f);
|
yield return new WaitForSeconds(1.5f, false);
|
||||||
RemoveCompletedObjective(segments[0]);
|
RemoveCompletedObjective(segments[0]);
|
||||||
|
|
||||||
// Room 2
|
// Room 2
|
||||||
yield return new WaitForSeconds(0.0f);
|
yield return new WaitForSeconds(0.0f, false);
|
||||||
GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Mechanic.Radio.Equipment"), ChatMessageType.Radio, null);
|
GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Mechanic.Radio.Equipment"), ChatMessageType.Radio, null);
|
||||||
do { yield return null; } while (!mechanic_equipmentObjectiveSensor.MotionDetected);
|
do { yield return null; } while (!mechanic_equipmentObjectiveSensor.MotionDetected);
|
||||||
TriggerTutorialSegment(1, GameMain.Config.KeyBind(InputType.Select), GameMain.Config.KeyBind(InputType.Deselect)); // Equipment & inventory objective
|
TriggerTutorialSegment(1, GameMain.Config.KeyBind(InputType.Select), GameMain.Config.KeyBind(InputType.Deselect)); // Equipment & inventory objective
|
||||||
@@ -287,13 +287,13 @@ namespace Barotrauma.Tutorials
|
|||||||
yield return null;
|
yield return null;
|
||||||
} while (mechanic.Inventory.FindItemByIdentifier("divingmask") == null || mechanic.Inventory.FindItemByIdentifier("weldingtool") == null || mechanic.Inventory.FindItemByIdentifier("wrench") == null); // Wait until looted
|
} while (mechanic.Inventory.FindItemByIdentifier("divingmask") == null || mechanic.Inventory.FindItemByIdentifier("weldingtool") == null || mechanic.Inventory.FindItemByIdentifier("wrench") == null); // Wait until looted
|
||||||
SetHighlight(mechanic_equipmentCabinet.Item, false);
|
SetHighlight(mechanic_equipmentCabinet.Item, false);
|
||||||
yield return new WaitForSeconds(1.5f);
|
yield return new WaitForSeconds(1.5f, false);
|
||||||
RemoveCompletedObjective(segments[1]);
|
RemoveCompletedObjective(segments[1]);
|
||||||
GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Mechanic.Radio.Breach"), ChatMessageType.Radio, null);
|
GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Mechanic.Radio.Breach"), ChatMessageType.Radio, null);
|
||||||
|
|
||||||
// Room 3
|
// Room 3
|
||||||
do { yield return null; } while (!mechanic_weldingObjectiveSensor.MotionDetected);
|
do { yield return null; } while (!mechanic_weldingObjectiveSensor.MotionDetected);
|
||||||
TriggerTutorialSegment(2, GameMain.Config.KeyBind(InputType.Shoot), GameMain.Config.KeyBind(InputType.Aim)); // Welding objective
|
TriggerTutorialSegment(2, GameMain.Config.KeyBind(InputType.Aim), GameMain.Config.KeyBind(InputType.Shoot)); // Welding objective
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
if (!mechanic.HasEquippedItem("divingmask"))
|
if (!mechanic.HasEquippedItem("divingmask"))
|
||||||
@@ -312,13 +312,13 @@ namespace Barotrauma.Tutorials
|
|||||||
do { yield return null; } while (WallHasDamagedSections(mechanic_brokenWall_1)); // Highlight until repaired
|
do { yield return null; } while (WallHasDamagedSections(mechanic_brokenWall_1)); // Highlight until repaired
|
||||||
mechanic.RemoveActiveObjectiveEntity(mechanic_brokenWall_1);
|
mechanic.RemoveActiveObjectiveEntity(mechanic_brokenWall_1);
|
||||||
RemoveCompletedObjective(segments[2]);
|
RemoveCompletedObjective(segments[2]);
|
||||||
yield return new WaitForSeconds(1f);
|
yield return new WaitForSeconds(1f, false);
|
||||||
TriggerTutorialSegment(3, GameMain.Config.KeyBind(InputType.Select)); // Pump objective
|
TriggerTutorialSegment(3, GameMain.Config.KeyBind(InputType.Select)); // Pump objective
|
||||||
SetHighlight(mechanic_workingPump.Item, true);
|
SetHighlight(mechanic_workingPump.Item, true);
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
yield return null;
|
yield return null;
|
||||||
if (IsSelectedItem(mechanic_brokenPump.Item))
|
if (IsSelectedItem(mechanic_workingPump.Item))
|
||||||
{
|
{
|
||||||
if (mechanic_workingPump.IsActiveSlider.FlashTimer <= 0)
|
if (mechanic_workingPump.IsActiveSlider.FlashTimer <= 0)
|
||||||
{
|
{
|
||||||
@@ -330,18 +330,17 @@ namespace Barotrauma.Tutorials
|
|||||||
do { yield return null; } while (mechanic_brokenhull_1.WaterPercentage > waterVolumeBeforeOpening); // Unlock door once drained
|
do { yield return null; } while (mechanic_brokenhull_1.WaterPercentage > waterVolumeBeforeOpening); // Unlock door once drained
|
||||||
RemoveCompletedObjective(segments[3]);
|
RemoveCompletedObjective(segments[3]);
|
||||||
SetDoorAccess(mechanic_thirdDoor, mechanic_thirdDoorLight, true);
|
SetDoorAccess(mechanic_thirdDoor, mechanic_thirdDoorLight, true);
|
||||||
yield return new WaitForSeconds(1.5f);
|
yield return new WaitForSeconds(1.5f, false);
|
||||||
//TriggerTutorialSegment(11, GameMain.Config.KeyBind(InputType.Select), GameMain.Config.KeyBind(InputType.Up), GameMain.Config.KeyBind(InputType.Down), GameMain.Config.KeyBind(InputType.Select)); // Ladder objective
|
//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);
|
//do { yield return null; } while (!mechanic_ladderSensor.MotionDetected);
|
||||||
//RemoveCompletedObjective(segments[11]);
|
//RemoveCompletedObjective(segments[11]);
|
||||||
yield return new WaitForSeconds(2f);
|
|
||||||
GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Mechanic.Radio.News"), ChatMessageType.Radio, null);
|
GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Mechanic.Radio.News"), ChatMessageType.Radio, null);
|
||||||
yield return new WaitForSeconds(1f);
|
yield return new WaitForSeconds(1f, false);
|
||||||
GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Mechanic.Radio.Fire"), ChatMessageType.Radio, null);
|
GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Mechanic.Radio.Fire"), ChatMessageType.Radio, null);
|
||||||
yield return new WaitForSeconds(6f);
|
|
||||||
|
|
||||||
// Room 4
|
// Room 4
|
||||||
do { yield return null; } while (!mechanic_thirdDoor.IsOpen);
|
do { yield return null; } while (!mechanic_thirdDoor.IsOpen);
|
||||||
|
yield return new WaitForSeconds(1f, false);
|
||||||
mechanic_fire = new DummyFireSource(new Vector2(20f, 2f), Item.ItemList.Find(i => i.HasTag("mechanic_fire")).WorldPosition);
|
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);
|
//do { yield return null; } while (!mechanic_craftingObjectiveSensor.MotionDetected);
|
||||||
TriggerTutorialSegment(4); // Deconstruct
|
TriggerTutorialSegment(4); // Deconstruct
|
||||||
@@ -365,7 +364,7 @@ namespace Barotrauma.Tutorials
|
|||||||
}
|
}
|
||||||
yield return null;
|
yield return null;
|
||||||
} while (mechanic.Inventory.FindItemByIdentifier("oxygentank") == null || mechanic.Inventory.FindItemByIdentifier("sodium") == null); // Wait until looted
|
} while (mechanic.Inventory.FindItemByIdentifier("oxygentank") == null || mechanic.Inventory.FindItemByIdentifier("sodium") == null); // Wait until looted
|
||||||
yield return new WaitForSeconds(1.0f);
|
yield return new WaitForSeconds(1.0f, false);
|
||||||
SetHighlight(mechanic_craftingCabinet.Item, false);
|
SetHighlight(mechanic_craftingCabinet.Item, false);
|
||||||
|
|
||||||
SetHighlight(mechanic_deconstructor.Item, true);
|
SetHighlight(mechanic_deconstructor.Item, true);
|
||||||
@@ -410,7 +409,7 @@ namespace Barotrauma.Tutorials
|
|||||||
|
|
||||||
SetHighlight(mechanic_deconstructor.Item, false);
|
SetHighlight(mechanic_deconstructor.Item, false);
|
||||||
RemoveCompletedObjective(segments[4]);
|
RemoveCompletedObjective(segments[4]);
|
||||||
yield return new WaitForSeconds(1f);
|
yield return new WaitForSeconds(1f, false);
|
||||||
TriggerTutorialSegment(5); // Fabricate
|
TriggerTutorialSegment(5); // Fabricate
|
||||||
SetHighlight(mechanic_fabricator.Item, true);
|
SetHighlight(mechanic_fabricator.Item, true);
|
||||||
do
|
do
|
||||||
@@ -466,7 +465,7 @@ namespace Barotrauma.Tutorials
|
|||||||
do { yield return null; } while (!mechanic_fireSensor.MotionDetected);
|
do { yield return null; } while (!mechanic_fireSensor.MotionDetected);
|
||||||
TriggerTutorialSegment(6, GameMain.Config.KeyBind(InputType.Aim), GameMain.Config.KeyBind(InputType.Shoot)); // Using the extinguisher
|
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
|
do { yield return null; } while (!mechanic_fire.Removed); // Wait until extinguished
|
||||||
yield return new WaitForSeconds(3f);
|
yield return new WaitForSeconds(3f, false);
|
||||||
RemoveCompletedObjective(segments[6]);
|
RemoveCompletedObjective(segments[6]);
|
||||||
|
|
||||||
if (mechanic.HasEquippedItem("extinguisher")) // do not trigger if dropped already
|
if (mechanic.HasEquippedItem("extinguisher")) // do not trigger if dropped already
|
||||||
@@ -528,6 +527,16 @@ 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);
|
} while (!mechanic_brokenPump.Item.IsFullCondition || mechanic_brokenPump.FlowPercentage >= 0 || !mechanic_brokenPump.IsActive);
|
||||||
RemoveCompletedObjective(segments[9]);
|
RemoveCompletedObjective(segments[9]);
|
||||||
SetHighlight(mechanic_brokenPump.Item, false);
|
SetHighlight(mechanic_brokenPump.Item, false);
|
||||||
|
|||||||
+12
-11
@@ -197,7 +197,7 @@ namespace Barotrauma.Tutorials
|
|||||||
{
|
{
|
||||||
shakeTimer -= 0.1f;
|
shakeTimer -= 0.1f;
|
||||||
GameMain.GameScreen.Cam.Shake = shakeAmount;
|
GameMain.GameScreen.Cam.Shake = shakeAmount;
|
||||||
yield return new WaitForSeconds(0.1f);
|
yield return new WaitForSeconds(0.1f, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Officer.Radio.WakeUp"), ChatMessageType.Radio, null);
|
GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Officer.Radio.WakeUp"), ChatMessageType.Radio, null);
|
||||||
@@ -205,7 +205,7 @@ namespace Barotrauma.Tutorials
|
|||||||
// Room 2
|
// Room 2
|
||||||
do { yield return null; } while (!officer_equipmentObjectiveSensor.MotionDetected);
|
do { yield return null; } while (!officer_equipmentObjectiveSensor.MotionDetected);
|
||||||
GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Officer.Radio.Equipment"), ChatMessageType.Radio, null);
|
GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Officer.Radio.Equipment"), ChatMessageType.Radio, null);
|
||||||
yield return new WaitForSeconds(3f);
|
yield return new WaitForSeconds(3f, false);
|
||||||
//TriggerTutorialSegment(0, GameMain.Config.KeyBind(InputType.Select), GameMain.Config.KeyBind(InputType.Deselect)); // Retrieve equipment
|
//TriggerTutorialSegment(0, GameMain.Config.KeyBind(InputType.Select), GameMain.Config.KeyBind(InputType.Deselect)); // Retrieve equipment
|
||||||
SetHighlight(officer_equipmentCabinet.Item, true);
|
SetHighlight(officer_equipmentCabinet.Item, true);
|
||||||
bool firstSlotRemoved = false;
|
bool firstSlotRemoved = false;
|
||||||
@@ -259,7 +259,7 @@ namespace Barotrauma.Tutorials
|
|||||||
{
|
{
|
||||||
HighlightInventorySlot(officer.Inventory, "ballistichelmet", highlightColor, .5f, .5f, 0f);
|
HighlightInventorySlot(officer.Inventory, "ballistichelmet", highlightColor, .5f, .5f, 0f);
|
||||||
}
|
}
|
||||||
yield return new WaitForSeconds(1f);
|
yield return new WaitForSeconds(1f, false);
|
||||||
} while (!officer.HasEquippedItem("stunbaton") || !officer.HasEquippedItem("bodyarmor") || !officer.HasEquippedItem("ballistichelmet"));
|
} while (!officer.HasEquippedItem("stunbaton") || !officer.HasEquippedItem("bodyarmor") || !officer.HasEquippedItem("ballistichelmet"));
|
||||||
RemoveCompletedObjective(segments[1]);
|
RemoveCompletedObjective(segments[1]);
|
||||||
SetDoorAccess(officer_firstDoor, officer_firstDoorLight, true);
|
SetDoorAccess(officer_firstDoor, officer_firstDoorLight, true);
|
||||||
@@ -271,7 +271,7 @@ namespace Barotrauma.Tutorials
|
|||||||
do { yield return null; } while (!officer_crawler.IsDead);
|
do { yield return null; } while (!officer_crawler.IsDead);
|
||||||
RemoveCompletedObjective(segments[2]);
|
RemoveCompletedObjective(segments[2]);
|
||||||
Heal(officer);
|
Heal(officer);
|
||||||
yield return new WaitForSeconds(1f);
|
yield return new WaitForSeconds(1f, false);
|
||||||
GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Officer.Radio.CrawlerDead"), ChatMessageType.Radio, null);
|
GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Officer.Radio.CrawlerDead"), ChatMessageType.Radio, null);
|
||||||
SetDoorAccess(officer_secondDoor, officer_secondDoorLight, true);
|
SetDoorAccess(officer_secondDoor, officer_secondDoorLight, true);
|
||||||
|
|
||||||
@@ -296,7 +296,7 @@ namespace Barotrauma.Tutorials
|
|||||||
SetHighlight(officer_ammoShelf_1.Item, false);
|
SetHighlight(officer_ammoShelf_1.Item, false);
|
||||||
SetHighlight(officer_ammoShelf_2.Item, false);
|
SetHighlight(officer_ammoShelf_2.Item, false);
|
||||||
RemoveCompletedObjective(segments[3]);
|
RemoveCompletedObjective(segments[3]);
|
||||||
yield return new WaitForSeconds(2f);
|
yield return new WaitForSeconds(2f, false);
|
||||||
TriggerTutorialSegment(4, GameMain.Config.KeyBind(InputType.Select), GameMain.Config.KeyBind(InputType.Shoot), GameMain.Config.KeyBind(InputType.Deselect)); // Kill hammerhead
|
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 = SpawnMonster(hammerheadCharacterFile, officer_hammerheadSpawnPos);
|
||||||
officer_hammerhead.AIController.SelectTarget(officer.AiTarget);
|
officer_hammerhead.AIController.SelectTarget(officer.AiTarget);
|
||||||
@@ -316,14 +316,14 @@ namespace Barotrauma.Tutorials
|
|||||||
Heal(officer);
|
Heal(officer);
|
||||||
SetHighlight(officer_coilgunPeriscope, false);
|
SetHighlight(officer_coilgunPeriscope, false);
|
||||||
RemoveCompletedObjective(segments[4]);
|
RemoveCompletedObjective(segments[4]);
|
||||||
yield return new WaitForSeconds(1f);
|
yield return new WaitForSeconds(1f, false);
|
||||||
GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Officer.Radio.HammerheadDead"), ChatMessageType.Radio, null);
|
GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Officer.Radio.HammerheadDead"), ChatMessageType.Radio, null);
|
||||||
SetDoorAccess(officer_thirdDoor, officer_thirdDoorLight, true);
|
SetDoorAccess(officer_thirdDoor, officer_thirdDoorLight, true);
|
||||||
|
|
||||||
// Room 5
|
// Room 5
|
||||||
//do { yield return null; } while (!officer_rangedWeaponSensor.MotionDetected);
|
//do { yield return null; } while (!officer_rangedWeaponSensor.MotionDetected);
|
||||||
do { yield return null; } while (!officer_thirdDoor.IsOpen);
|
do { yield return null; } while (!officer_thirdDoor.IsOpen);
|
||||||
yield return new WaitForSeconds(3f);
|
yield return new WaitForSeconds(3f, false);
|
||||||
TriggerTutorialSegment(5, GameMain.Config.KeyBind(InputType.Aim), GameMain.Config.KeyBind(InputType.Shoot)); // Ranged weapons
|
TriggerTutorialSegment(5, GameMain.Config.KeyBind(InputType.Aim), GameMain.Config.KeyBind(InputType.Shoot)); // Ranged weapons
|
||||||
SetHighlight(officer_rangedWeaponHolder.Item, true);
|
SetHighlight(officer_rangedWeaponHolder.Item, true);
|
||||||
do { yield return null; } while (!officer_rangedWeaponHolder.Inventory.IsEmpty()); // Wait until looted
|
do { yield return null; } while (!officer_rangedWeaponHolder.Inventory.IsEmpty()); // Wait until looted
|
||||||
@@ -387,8 +387,9 @@ namespace Barotrauma.Tutorials
|
|||||||
officer.AddActiveObjectiveEntity(officer_subAmmoBox_1, officer_gunIcon, officer_gunIconColor);
|
officer.AddActiveObjectiveEntity(officer_subAmmoBox_1, officer_gunIcon, officer_gunIconColor);
|
||||||
officer.AddActiveObjectiveEntity(officer_subAmmoBox_2, 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_1.Item, officer_gunIcon, officer_gunIconColor);
|
|
||||||
officer.AddActiveObjectiveEntity(officer_subSuperCapacitor_2.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);
|
GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Officer.Radio.Submarine"), ChatMessageType.Radio, null);
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
@@ -409,8 +410,8 @@ namespace Barotrauma.Tutorials
|
|||||||
officer.RemoveActiveObjectiveEntity(officer_subSuperCapacitor_2.Item);
|
officer.RemoveActiveObjectiveEntity(officer_subSuperCapacitor_2.Item);
|
||||||
}
|
}
|
||||||
|
|
||||||
SetHighlight(officer_subAmmoBox_1, officer_subLoader_1.Item.ExternalHighlight || officer_subLoader_2.Item.ExternalHighlight);
|
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_subLoader_1.Item.ExternalHighlight || officer_subLoader_2.Item.ExternalHighlight);
|
SetHighlight(officer_subAmmoBox_2, officer_subAmmoBox_2.ParentInventory != officer_subLoader_1.Inventory && officer_subAmmoBox_2.ParentInventory != officer_subLoader_2.Inventory);
|
||||||
SetHighlight(officer_subAmmoShelf.Item, 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_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);
|
if (officer_subAmmoBox_2.ParentInventory == officer_subLoader_1.Inventory || officer_subAmmoBox_2.ParentInventory == officer_subLoader_2.Inventory) officer.RemoveActiveObjectiveEntity(officer_subAmmoBox_2);
|
||||||
@@ -430,7 +431,7 @@ namespace Barotrauma.Tutorials
|
|||||||
RemoveCompletedObjective(segments[7]);
|
RemoveCompletedObjective(segments[7]);
|
||||||
GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Officer.Radio.Complete"), ChatMessageType.Radio, null);
|
GameMain.GameSession?.CrewManager.AddSinglePlayerChatMessage(radioSpeakerName, TextManager.Get("Officer.Radio.Complete"), ChatMessageType.Radio, null);
|
||||||
|
|
||||||
yield return new WaitForSeconds(4f);
|
yield return new WaitForSeconds(4f, false);
|
||||||
CoroutineManager.StartCoroutine(TutorialCompleted());
|
CoroutineManager.StartCoroutine(TutorialCompleted());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -405,6 +405,7 @@ namespace Barotrauma.Tutorials
|
|||||||
private void ReplaySegmentVideo(TutorialSegment segment)
|
private void ReplaySegmentVideo(TutorialSegment segment)
|
||||||
{
|
{
|
||||||
if (ContentRunning) return;
|
if (ContentRunning) return;
|
||||||
|
Inventory.draggingItem = null;
|
||||||
ContentRunning = true;
|
ContentRunning = true;
|
||||||
LoadVideo(segment);
|
LoadVideo(segment);
|
||||||
//videoPlayer.LoadContent(playableContentPath, new VideoPlayer.VideoSettings(segment.VideoContent), new VideoPlayer.TextSettings(segment.VideoContent), segment.Id, true, callback: () => ContentRunning = false);
|
//videoPlayer.LoadContent(playableContentPath, new VideoPlayer.VideoSettings(segment.VideoContent), new VideoPlayer.TextSettings(segment.VideoContent), segment.Id, true, callback: () => ContentRunning = false);
|
||||||
@@ -526,7 +527,7 @@ namespace Barotrauma.Tutorials
|
|||||||
titleBlock.RectTransform.IsFixedSize = true;
|
titleBlock.RectTransform.IsFixedSize = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
var textBlock = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), infoContent.RectTransform), text, wrap: true);
|
var textBlock = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), infoContent.RectTransform), " " + text, wrap: true);
|
||||||
textBlock.RectTransform.IsFixedSize = true;
|
textBlock.RectTransform.IsFixedSize = true;
|
||||||
|
|
||||||
infoBoxClosedCallback = callback;
|
infoBoxClosedCallback = callback;
|
||||||
|
|||||||
@@ -85,13 +85,6 @@ namespace Barotrauma
|
|||||||
TextManager.Get("Settings"), textAlignment: Alignment.TopLeft, font: GUI.LargeFont)
|
TextManager.Get("Settings"), textAlignment: Alignment.TopLeft, font: GUI.LargeFont)
|
||||||
{ ForceUpperCase = true };
|
{ ForceUpperCase = true };
|
||||||
|
|
||||||
//TODO: enable when new texts can be added
|
|
||||||
/*new GUIButton(new RectTransform(new Vector2(1.0f, 0.75f), settingsTitle.RectTransform, Anchor.CenterRight), style: "GUIBugButton")
|
|
||||||
{
|
|
||||||
ToolTip = "Bug Reporter",
|
|
||||||
OnClicked = (btn, userdata) => { GameMain.Instance.ShowBugReporter(); return true; }
|
|
||||||
};*/
|
|
||||||
|
|
||||||
var generalLayoutGroup = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 1.0f), leftPanel.RectTransform, Anchor.TopLeft));
|
var generalLayoutGroup = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 1.0f), leftPanel.RectTransform, Anchor.TopLeft));
|
||||||
|
|
||||||
new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.05f), generalLayoutGroup.RectTransform), TextManager.Get("ContentPackages"));
|
new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.05f), generalLayoutGroup.RectTransform), TextManager.Get("ContentPackages"));
|
||||||
@@ -178,6 +171,12 @@ namespace Barotrauma
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
new GUIButton(new RectTransform(new Vector2(0.05f, 0.75f), tabButtonHolder.RectTransform, Anchor.BottomRight) { RelativeOffset = new Vector2(0.0f, 0.2f) }, style: "GUIBugButton")
|
||||||
|
{
|
||||||
|
ToolTip = TextManager.Get("bugreportbutton"),
|
||||||
|
OnClicked = (btn, userdata) => { GameMain.Instance.ShowBugReporter(); return true; }
|
||||||
|
};
|
||||||
|
|
||||||
var buttonArea = new GUIFrame(new RectTransform(new Vector2(1.0f, 0.08f), paddedFrame.RectTransform, Anchor.BottomCenter), style: null);
|
var buttonArea = new GUIFrame(new RectTransform(new Vector2(1.0f, 0.08f), paddedFrame.RectTransform, Anchor.BottomCenter), style: null);
|
||||||
|
|
||||||
/// Graphics tab --------------------------------------------------------------
|
/// Graphics tab --------------------------------------------------------------
|
||||||
@@ -478,7 +477,7 @@ namespace Barotrauma
|
|||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(VoiceCaptureDevice)) VoiceCaptureDevice = deviceNames[0];
|
if (string.IsNullOrWhiteSpace(VoiceCaptureDevice)) VoiceCaptureDevice = deviceNames[0];
|
||||||
#if (!OSX)
|
#if (!OSX)
|
||||||
var deviceList = new GUIDropDown(new RectTransform(new Vector2(1.0f, 0.05f), audioSliders.RectTransform), VoiceCaptureDevice, deviceNames.Count);
|
var deviceList = new GUIDropDown(new RectTransform(new Vector2(1.0f, 0.05f), audioSliders.RectTransform), TextManager.EnsureUTF8(VoiceCaptureDevice), deviceNames.Count);
|
||||||
foreach (string name in deviceNames)
|
foreach (string name in deviceNames)
|
||||||
{
|
{
|
||||||
deviceList.AddItem(TextManager.EnsureUTF8(name), name);
|
deviceList.AddItem(TextManager.EnsureUTF8(name), name);
|
||||||
@@ -493,7 +492,7 @@ namespace Barotrauma
|
|||||||
};
|
};
|
||||||
#else
|
#else
|
||||||
var suavemente = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.05f), audioSliders.RectTransform),
|
var suavemente = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.05f), audioSliders.RectTransform),
|
||||||
TextManager.AddPunctuation(':', TextManager.Get("CurrentDevice"), VoiceCaptureDevice))
|
TextManager.AddPunctuation(':', TextManager.Get("CurrentDevice"), TextManager.EnsureUTF8(VoiceCaptureDevice)))
|
||||||
{
|
{
|
||||||
ToolTip = TextManager.Get("CurrentDeviceToolTip.OSX"),
|
ToolTip = TextManager.Get("CurrentDeviceToolTip.OSX"),
|
||||||
TextAlignment = Alignment.CenterX
|
TextAlignment = Alignment.CenterX
|
||||||
@@ -508,7 +507,7 @@ namespace Barotrauma
|
|||||||
if (VoiceCaptureDevice == deviceNames[0]) return true;
|
if (VoiceCaptureDevice == deviceNames[0]) return true;
|
||||||
|
|
||||||
VoipCapture.ChangeCaptureDevice(deviceNames[0]);
|
VoipCapture.ChangeCaptureDevice(deviceNames[0]);
|
||||||
suavemente.Text = TextManager.AddPunctuation(':', TextManager.Get("CurrentDevice"), VoiceCaptureDevice);
|
suavemente.Text = TextManager.AddPunctuation(':', TextManager.Get("CurrentDevice"), TextManager.EnsureUTF8(VoiceCaptureDevice));
|
||||||
suavemente.Flash(Color.Blue);
|
suavemente.Flash(Color.Blue);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -751,7 +750,7 @@ namespace Barotrauma
|
|||||||
OnClicked = (button, data) =>
|
OnClicked = (button, data) =>
|
||||||
{
|
{
|
||||||
// TODO: add a prompt
|
// TODO: add a prompt
|
||||||
LoadDefaultConfig();
|
LoadDefaultConfig(setLanguage: false);
|
||||||
CheckBindings(true);
|
CheckBindings(true);
|
||||||
RefreshItemMessages();
|
RefreshItemMessages();
|
||||||
ApplySettings();
|
ApplySettings();
|
||||||
|
|||||||
@@ -543,7 +543,10 @@ namespace Barotrauma
|
|||||||
//equipped item that can't be put in the inventory, use delayed dropping
|
//equipped item that can't be put in the inventory, use delayed dropping
|
||||||
if (quickUseAction == QuickUseAction.Drop)
|
if (quickUseAction == QuickUseAction.Drop)
|
||||||
{
|
{
|
||||||
slots[i].QuickUseButtonToolTip = "Hold to unequip";
|
slots[i].QuickUseButtonToolTip =
|
||||||
|
TextManager.Get("QuickUseAction.HoldToUnequip", returnNull: true) ??
|
||||||
|
(GameMain.Config.Language == "English" ? "Hold to unequip" : TextManager.Get("QuickUseAction.Unequip"));
|
||||||
|
|
||||||
if (PlayerInput.LeftButtonHeld())
|
if (PlayerInput.LeftButtonHeld())
|
||||||
{
|
{
|
||||||
slots[i].QuickUseTimer = Math.Max(0.1f, slots[i].QuickUseTimer + deltaTime);
|
slots[i].QuickUseTimer = Math.Max(0.1f, slots[i].QuickUseTimer + deltaTime);
|
||||||
|
|||||||
@@ -105,7 +105,8 @@ namespace Barotrauma.Items.Components
|
|||||||
textBlock = new GUITextBlock(new RectTransform(item.Rect.Size), "",
|
textBlock = new GUITextBlock(new RectTransform(item.Rect.Size), "",
|
||||||
textColor: textColor, font: GUI.UnscaledSmallFont, textAlignment: Alignment.Center, wrap: true, style: null)
|
textColor: textColor, font: GUI.UnscaledSmallFont, textAlignment: Alignment.Center, wrap: true, style: null)
|
||||||
{
|
{
|
||||||
TextDepth = item.SpriteDepth - 0.0001f,
|
TextDepth = item.SpriteDepth - 0.00001f,
|
||||||
|
RoundToNearestPixel = false,
|
||||||
TextScale = TextScale
|
TextScale = TextScale
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,7 +36,9 @@ namespace Barotrauma.Items.Components
|
|||||||
RelativeSpacing = 0.05f
|
RelativeSpacing = 0.05f
|
||||||
};
|
};
|
||||||
|
|
||||||
powerIndicator = new GUITickBox(new RectTransform(new Point(30, 30), content.RectTransform),
|
int indicatorSize = (int)(30 * GUI.Scale);
|
||||||
|
|
||||||
|
powerIndicator = new GUITickBox(new RectTransform(new Point(indicatorSize, indicatorSize), content.RectTransform),
|
||||||
TextManager.Get("EnginePowered"), style: "IndicatorLightGreen")
|
TextManager.Get("EnginePowered"), style: "IndicatorLightGreen")
|
||||||
{
|
{
|
||||||
CanBeFocused = false
|
CanBeFocused = false
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ namespace Barotrauma.Items.Components
|
|||||||
|
|
||||||
foreach (FabricationRecipe fi in fabricationRecipes)
|
foreach (FabricationRecipe fi in fabricationRecipes)
|
||||||
{
|
{
|
||||||
GUIFrame frame = new GUIFrame(new RectTransform(new Point(itemList.Rect.Width, 30), itemList.Content.RectTransform), style: null)
|
GUIFrame frame = new GUIFrame(new RectTransform(new Point(itemList.Rect.Width, (int)(30 * GUI.yScale)), itemList.Content.RectTransform), style: null)
|
||||||
{
|
{
|
||||||
UserData = fi,
|
UserData = fi,
|
||||||
HoverColor = Color.Gold * 0.2f,
|
HoverColor = Color.Gold * 0.2f,
|
||||||
@@ -116,7 +116,7 @@ namespace Barotrauma.Items.Components
|
|||||||
ToolTip = fi.TargetItem.Description
|
ToolTip = fi.TargetItem.Description
|
||||||
};
|
};
|
||||||
|
|
||||||
GUITextBlock textBlock = new GUITextBlock(new RectTransform(Vector2.Zero, frame.RectTransform, Anchor.CenterLeft) { AbsoluteOffset = new Point(50, 0) },
|
GUITextBlock textBlock = new GUITextBlock(new RectTransform(Vector2.Zero, frame.RectTransform, Anchor.CenterLeft) { AbsoluteOffset = new Point((int)(50 * GUI.xScale), 0) },
|
||||||
fi.DisplayName)
|
fi.DisplayName)
|
||||||
{
|
{
|
||||||
ToolTip = fi.TargetItem.Description
|
ToolTip = fi.TargetItem.Description
|
||||||
@@ -125,7 +125,7 @@ namespace Barotrauma.Items.Components
|
|||||||
var itemIcon = fi.TargetItem.InventoryIcon ?? fi.TargetItem.sprite;
|
var itemIcon = fi.TargetItem.InventoryIcon ?? fi.TargetItem.sprite;
|
||||||
if (itemIcon != null)
|
if (itemIcon != null)
|
||||||
{
|
{
|
||||||
GUIImage img = new GUIImage(new RectTransform(new Point(30, 30), frame.RectTransform, Anchor.CenterLeft) { AbsoluteOffset = new Point(3, 0) },
|
GUIImage img = new GUIImage(new RectTransform(new Point((int)(30 * GUI.Scale)), frame.RectTransform, Anchor.CenterLeft) { AbsoluteOffset = new Point((int)(3 * GUI.xScale), 0) },
|
||||||
itemIcon, scaleToFit: true)
|
itemIcon, scaleToFit: true)
|
||||||
{
|
{
|
||||||
Color = fi.TargetItem.InventoryIconColor,
|
Color = fi.TargetItem.InventoryIconColor,
|
||||||
|
|||||||
@@ -114,9 +114,9 @@ namespace Barotrauma.Items.Components
|
|||||||
Vector2 textSize = GUI.Font.MeasureString(text);
|
Vector2 textSize = GUI.Font.MeasureString(text);
|
||||||
Vector2 textPos = child.Center;
|
Vector2 textPos = child.Center;
|
||||||
if (textPos.X + textSize.X / 2 > submarineContainer.Rect.Right)
|
if (textPos.X + textSize.X / 2 > submarineContainer.Rect.Right)
|
||||||
textPos.X -= ((textPos.X + textSize.X / 2) - submarineContainer.Rect.Right) + 10;
|
textPos.X -= ((textPos.X + textSize.X / 2) - submarineContainer.Rect.Right) + 10 * GUI.xScale;
|
||||||
if (textPos.X - textSize.X / 2 < submarineContainer.Rect.X)
|
if (textPos.X - textSize.X / 2 < submarineContainer.Rect.X)
|
||||||
textPos.X += (submarineContainer.Rect.X - (textPos.X - textSize.X / 2)) + 10;
|
textPos.X += (submarineContainer.Rect.X - (textPos.X - textSize.X / 2)) + 10 * GUI.xScale;
|
||||||
GUI.DrawString(spriteBatch, textPos - textSize / 2, text,
|
GUI.DrawString(spriteBatch, textPos - textSize / 2, text,
|
||||||
Color.Orange * (float)Math.Abs(Math.Sin(Timing.TotalTime)), Color.Black * 0.8f);
|
Color.Orange * (float)Math.Abs(Math.Sin(Timing.TotalTime)), Color.Black * 0.8f);
|
||||||
break;
|
break;
|
||||||
@@ -269,7 +269,7 @@ namespace Barotrauma.Items.Components
|
|||||||
start.Y = -start.Y;
|
start.Y = -start.Y;
|
||||||
Vector2 end = (sub.HullVertices[(i + 1) % sub.HullVertices.Count] + offset) * displayScale;
|
Vector2 end = (sub.HullVertices[(i + 1) % sub.HullVertices.Count] + offset) * displayScale;
|
||||||
end.Y = -end.Y;
|
end.Y = -end.Y;
|
||||||
GUI.DrawLine(spriteBatch, center + start, center + end, Color.DarkCyan * Rand.Range(0.3f, 0.35f), width: 10);
|
GUI.DrawLine(spriteBatch, center + start, center + end, Color.DarkCyan * Rand.Range(0.3f, 0.35f), width: (int)(10 * GUI.Scale));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ namespace Barotrauma.Items.Components
|
|||||||
|
|
||||||
GUIFrame paddedFrame = new GUIFrame(new RectTransform(new Vector2(0.9f, 0.8f), GuiFrame.RectTransform, Anchor.Center), style: null);
|
GUIFrame paddedFrame = new GUIFrame(new RectTransform(new Vector2(0.9f, 0.8f), GuiFrame.RectTransform, Anchor.Center), style: null);
|
||||||
|
|
||||||
isActiveSlider = new GUIScrollBar(new RectTransform(new Point(50, 100), paddedFrame.RectTransform, Anchor.CenterLeft),
|
isActiveSlider = new GUIScrollBar(new RectTransform(new Point((int)(50 * GUI.Scale), (int)(100 * GUI.Scale)), paddedFrame.RectTransform, Anchor.CenterLeft),
|
||||||
barSize: 0.2f, style: "OnOffLever")
|
barSize: 0.2f, style: "OnOffLever")
|
||||||
{
|
{
|
||||||
IsBooleanSwitch = true,
|
IsBooleanSwitch = true,
|
||||||
@@ -52,7 +52,7 @@ namespace Barotrauma.Items.Components
|
|||||||
MaxValue = 0.75f
|
MaxValue = 0.75f
|
||||||
};
|
};
|
||||||
var sliderHandle = isActiveSlider.GetChild<GUIButton>();
|
var sliderHandle = isActiveSlider.GetChild<GUIButton>();
|
||||||
sliderHandle.RectTransform.NonScaledSize = new Point(84, sliderHandle.Rect.Height);
|
sliderHandle.RectTransform.NonScaledSize = new Point((int)(84 * GUI.Scale), sliderHandle.Rect.Height);
|
||||||
isActiveSlider.OnMoved = (GUIScrollBar scrollBar, float barScroll) =>
|
isActiveSlider.OnMoved = (GUIScrollBar scrollBar, float barScroll) =>
|
||||||
{
|
{
|
||||||
bool active = scrollBar.BarScroll < 0.5f;
|
bool active = scrollBar.BarScroll < 0.5f;
|
||||||
@@ -73,7 +73,7 @@ namespace Barotrauma.Items.Components
|
|||||||
|
|
||||||
var rightArea = new GUILayoutGroup(new RectTransform(new Vector2(0.75f, 1.0f), paddedFrame.RectTransform, Anchor.CenterRight)) { RelativeSpacing = 0.1f };
|
var rightArea = new GUILayoutGroup(new RectTransform(new Vector2(0.75f, 1.0f), paddedFrame.RectTransform, Anchor.CenterRight)) { RelativeSpacing = 0.1f };
|
||||||
|
|
||||||
powerIndicator = new GUITickBox(new RectTransform(new Point(30, 30), rightArea.RectTransform), TextManager.Get("PumpPowered"), style: "IndicatorLightGreen")
|
powerIndicator = new GUITickBox(new RectTransform(new Point((int)(30 * GUI.Scale)), rightArea.RectTransform), TextManager.Get("PumpPowered"), style: "IndicatorLightGreen")
|
||||||
{
|
{
|
||||||
CanBeFocused = false
|
CanBeFocused = false
|
||||||
};
|
};
|
||||||
@@ -89,7 +89,7 @@ namespace Barotrauma.Items.Components
|
|||||||
RelativeSpacing = 0.05f
|
RelativeSpacing = 0.05f
|
||||||
};
|
};
|
||||||
|
|
||||||
new GUITextBlock(new RectTransform(new Vector2(0.15f, 1.0f), sliderArea.RectTransform),
|
var outLabel = new GUITextBlock(new RectTransform(new Vector2(0.3f, 1.0f), sliderArea.RectTransform),
|
||||||
TextManager.Get("PumpOut"), textAlignment: Alignment.Center, wrap: true, font: GUI.SmallFont);
|
TextManager.Get("PumpOut"), textAlignment: Alignment.Center, wrap: true, font: GUI.SmallFont);
|
||||||
pumpSpeedSlider = new GUIScrollBar(new RectTransform(new Vector2(0.8f, 1.0f), sliderArea.RectTransform), barSize: 0.25f, style: "GUISlider")
|
pumpSpeedSlider = new GUIScrollBar(new RectTransform(new Vector2(0.8f, 1.0f), sliderArea.RectTransform), barSize: 0.25f, style: "GUISlider")
|
||||||
{
|
{
|
||||||
@@ -109,9 +109,10 @@ namespace Barotrauma.Items.Components
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
var inLabel = new GUITextBlock(new RectTransform(new Vector2(0.3f, 1.0f), sliderArea.RectTransform),
|
||||||
|
TextManager.Get("PumpIn"), textAlignment: Alignment.Center, wrap: true, font: GUI.SmallFont);
|
||||||
|
|
||||||
new GUITextBlock(new RectTransform(new Vector2(0.15f, 1.0f), sliderArea.RectTransform),
|
GUITextBlock.AutoScaleAndNormalize(outLabel, inLabel);
|
||||||
TextManager.Get("PumpIn"), textAlignment: Alignment.Center, wrap: true, font: GUI.SmallFont);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OnItemLoaded()
|
public override void OnItemLoaded()
|
||||||
|
|||||||
@@ -441,8 +441,8 @@ namespace Barotrauma.Items.Components
|
|||||||
{
|
{
|
||||||
Vector2 sector1 = MathUtils.RotatePointAroundTarget(pingDirection * DisplayRadius, Vector2.Zero, DirectionalPingSector * 0.5f);
|
Vector2 sector1 = MathUtils.RotatePointAroundTarget(pingDirection * DisplayRadius, Vector2.Zero, DirectionalPingSector * 0.5f);
|
||||||
Vector2 sector2 = MathUtils.RotatePointAroundTarget(pingDirection * DisplayRadius, Vector2.Zero, -DirectionalPingSector * 0.5f);
|
Vector2 sector2 = MathUtils.RotatePointAroundTarget(pingDirection * DisplayRadius, Vector2.Zero, -DirectionalPingSector * 0.5f);
|
||||||
DrawLine(spriteBatch, center, center + sector1, Color.LightCyan * 0.2f * directionalPingVisibility, width: 3);
|
DrawLine(spriteBatch, Vector2.Zero, sector1, Color.LightCyan * 0.2f * directionalPingVisibility, width: 3);
|
||||||
DrawLine(spriteBatch, center, center + sector2, Color.LightCyan * 0.2f * directionalPingVisibility, width: 3);
|
DrawLine(spriteBatch, Vector2.Zero, sector2, Color.LightCyan * 0.2f * directionalPingVisibility, width: 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GameMain.DebugDraw)
|
if (GameMain.DebugDraw)
|
||||||
|
|||||||
@@ -14,19 +14,21 @@ namespace Barotrauma.Items.Components
|
|||||||
{
|
{
|
||||||
if (GuiFrame == null) return;
|
if (GuiFrame == null) return;
|
||||||
|
|
||||||
|
Point indicatorSize = new Point((int)(30 * GUI.Scale));
|
||||||
|
|
||||||
var paddedFrame = new GUIFrame(new RectTransform(new Vector2(0.9f, 0.7f), GuiFrame.RectTransform, Anchor.Center), style: null);
|
var paddedFrame = new GUIFrame(new RectTransform(new Vector2(0.9f, 0.7f), GuiFrame.RectTransform, Anchor.Center), style: null);
|
||||||
powerIndicator = new GUITickBox(new RectTransform(new Point(30, 30), paddedFrame.RectTransform),
|
powerIndicator = new GUITickBox(new RectTransform(indicatorSize, paddedFrame.RectTransform),
|
||||||
TextManager.Get("PowerTransferPowered"), style: "IndicatorLightGreen")
|
TextManager.Get("PowerTransferPowered"), style: "IndicatorLightGreen")
|
||||||
{
|
{
|
||||||
Enabled = false
|
Enabled = false
|
||||||
};
|
};
|
||||||
highVoltageIndicator = new GUITickBox(new RectTransform(new Point(30, 30), paddedFrame.RectTransform) { AbsoluteOffset = new Point(0, 40) },
|
highVoltageIndicator = new GUITickBox(new RectTransform(indicatorSize, paddedFrame.RectTransform) { AbsoluteOffset = new Point(0, (int)(40 * GUI.yScale)) },
|
||||||
TextManager.Get("PowerTransferHighVoltage"), style: "IndicatorLightRed")
|
TextManager.Get("PowerTransferHighVoltage"), style: "IndicatorLightRed")
|
||||||
{
|
{
|
||||||
ToolTip = TextManager.Get("PowerTransferTipOvervoltage"),
|
ToolTip = TextManager.Get("PowerTransferTipOvervoltage"),
|
||||||
Enabled = false
|
Enabled = false
|
||||||
};
|
};
|
||||||
lowVoltageIndicator = new GUITickBox(new RectTransform(new Point(30, 30), paddedFrame.RectTransform) { AbsoluteOffset = new Point(0, 80) },
|
lowVoltageIndicator = new GUITickBox(new RectTransform(indicatorSize, paddedFrame.RectTransform) { AbsoluteOffset = new Point(0, (int)(80 * GUI.yScale)) },
|
||||||
TextManager.Get("PowerTransferLowVoltage"), style: "IndicatorLightRed")
|
TextManager.Get("PowerTransferLowVoltage"), style: "IndicatorLightRed")
|
||||||
{
|
{
|
||||||
ToolTip = TextManager.Get("PowerTransferTipLowvoltage"),
|
ToolTip = TextManager.Get("PowerTransferTipLowvoltage"),
|
||||||
|
|||||||
@@ -57,15 +57,15 @@ namespace Barotrauma.Items.Components
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector2 rightPos = new Vector2(x + width - 130, y + 80);
|
Vector2 rightPos = new Vector2(x + width - 130 * GUI.xScale, y + 80 * GUI.yScale);
|
||||||
Vector2 leftPos = new Vector2(x + 130, y + 80);
|
Vector2 leftPos = new Vector2(x + 130 * GUI.xScale, y + 80 * GUI.yScale);
|
||||||
|
|
||||||
Vector2 rightWirePos = new Vector2(x + width - 5, y + 30);
|
Vector2 rightWirePos = new Vector2(x + width - 5 * GUI.xScale, y + 30 * GUI.yScale);
|
||||||
Vector2 leftWirePos = new Vector2(x + 5, y + 30);
|
Vector2 leftWirePos = new Vector2(x + 5 * GUI.xScale, y + 30 * GUI.yScale);
|
||||||
|
|
||||||
int wireInterval = (height - 20) / Math.Max(totalWireCount, 1);
|
int wireInterval = (height - (int)(20 * GUI.yScale)) / Math.Max(totalWireCount, 1);
|
||||||
int connectorIntervalLeft = (height - 100) / Math.Max(panel.Connections.Count(c => c.IsOutput), 1);
|
int connectorIntervalLeft = (height - (int)(100 * GUI.yScale)) / Math.Max(panel.Connections.Count(c => c.IsOutput), 1);
|
||||||
int connectorIntervalRight = (height - 100) / Math.Max(panel.Connections.Count(c => !c.IsOutput), 1);
|
int connectorIntervalRight = (height - (int)(100 * GUI.yScale)) / Math.Max(panel.Connections.Count(c => !c.IsOutput), 1);
|
||||||
|
|
||||||
foreach (Connection c in panel.Connections)
|
foreach (Connection c in panel.Connections)
|
||||||
{
|
{
|
||||||
@@ -84,7 +84,7 @@ namespace Barotrauma.Items.Components
|
|||||||
if (c.IsOutput)
|
if (c.IsOutput)
|
||||||
{
|
{
|
||||||
c.Draw(spriteBatch, panel, rightPos,
|
c.Draw(spriteBatch, panel, rightPos,
|
||||||
new Vector2(rightPos.X - GUI.SmallFont.MeasureString(c.DisplayName).X - 20, rightPos.Y + 3),
|
new Vector2(rightPos.X - GUI.SmallFont.MeasureString(c.DisplayName).X - 20 * GUI.xScale, rightPos.Y + 3 * GUI.yScale),
|
||||||
rightWirePos,
|
rightWirePos,
|
||||||
mouseInRect, equippedWire,
|
mouseInRect, equippedWire,
|
||||||
wireInterval);
|
wireInterval);
|
||||||
@@ -95,7 +95,7 @@ namespace Barotrauma.Items.Components
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
c.Draw(spriteBatch, panel, leftPos,
|
c.Draw(spriteBatch, panel, leftPos,
|
||||||
new Vector2(leftPos.X + 20, leftPos.Y - 12),
|
new Vector2(leftPos.X + 20 * GUI.xScale, leftPos.Y - 12 * GUI.yScale),
|
||||||
leftWirePos,
|
leftWirePos,
|
||||||
mouseInRect, equippedWire,
|
mouseInRect, equippedWire,
|
||||||
wireInterval);
|
wireInterval);
|
||||||
@@ -143,7 +143,7 @@ namespace Barotrauma.Items.Components
|
|||||||
private void Draw(SpriteBatch spriteBatch, ConnectionPanel panel, Vector2 position, Vector2 labelPos, Vector2 wirePosition, bool mouseIn, Wire equippedWire, float wireInterval)
|
private void Draw(SpriteBatch spriteBatch, ConnectionPanel panel, Vector2 position, Vector2 labelPos, Vector2 wirePosition, bool mouseIn, Wire equippedWire, float wireInterval)
|
||||||
{
|
{
|
||||||
//spriteBatch.DrawString(GUI.SmallFont, Name, new Vector2(labelPos.X, labelPos.Y-10), Color.White);
|
//spriteBatch.DrawString(GUI.SmallFont, Name, new Vector2(labelPos.X, labelPos.Y-10), Color.White);
|
||||||
GUI.DrawString(spriteBatch, labelPos, Name, IsPower ? Color.Red : Color.White, Color.Black, 0, GUI.SmallFont);
|
GUI.DrawString(spriteBatch, labelPos, DisplayName, IsPower ? Color.Red : Color.White, Color.Black, 0, GUI.SmallFont);
|
||||||
|
|
||||||
connectionSprite.Draw(spriteBatch, position);
|
connectionSprite.Draw(spriteBatch, position);
|
||||||
|
|
||||||
|
|||||||
@@ -317,7 +317,7 @@ namespace Barotrauma.Items.Components
|
|||||||
|
|
||||||
if (ShowProjectileIndicator)
|
if (ShowProjectileIndicator)
|
||||||
{
|
{
|
||||||
Point slotSize = new Point(60, 30);
|
Point slotSize = new Point((int)(60 * GUI.Scale), (int)(30 * GUI.Scale));
|
||||||
int spacing = 5;
|
int spacing = 5;
|
||||||
int slotsPerRow = Math.Min(availableAmmo.Count, 6);
|
int slotsPerRow = Math.Min(availableAmmo.Count, 6);
|
||||||
int totalWidth = slotSize.X * slotsPerRow + spacing * (slotsPerRow - 1);
|
int totalWidth = slotSize.X * slotsPerRow + spacing * (slotsPerRow - 1);
|
||||||
|
|||||||
@@ -624,10 +624,22 @@ namespace Barotrauma
|
|||||||
|
|
||||||
if (mouseOn && PlayerInput.LeftButtonClicked() && !messageBoxOpen)
|
if (mouseOn && PlayerInput.LeftButtonClicked() && !messageBoxOpen)
|
||||||
{
|
{
|
||||||
//TODO: translate or replace
|
if (TextManager.ContainsTag("centerarealockedheader") && TextManager.ContainsTag("centerarealockedtext") )
|
||||||
var messageBox = new GUIMessageBox("Mysteries lie ahead...", "This area is unreachable in this version of Barotrauma. Please wait for future updates!");
|
{
|
||||||
messageBoxOpen = true;
|
var messageBox = new GUIMessageBox(
|
||||||
CoroutineManager.StartCoroutine(WaitForMessageBoxClosed(messageBox));
|
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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -281,7 +281,8 @@ namespace Barotrauma
|
|||||||
new Vector2(rect.Width, rect.Height),
|
new Vector2(rect.Width, rect.Height),
|
||||||
color: color,
|
color: color,
|
||||||
textureScale: TextureScale * Scale,
|
textureScale: TextureScale * Scale,
|
||||||
startOffset: backGroundOffset);
|
startOffset: backGroundOffset,
|
||||||
|
depth: Math.Max(Prefab.BackgroundSprite.Depth, depth + 0.000001f));
|
||||||
|
|
||||||
if (UseDropShadow)
|
if (UseDropShadow)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -66,13 +66,13 @@ namespace Barotrauma.Networking
|
|||||||
if (order.TargetAllCharacters)
|
if (order.TargetAllCharacters)
|
||||||
{
|
{
|
||||||
GameMain.GameSession?.CrewManager?.AddOrder(
|
GameMain.GameSession?.CrewManager?.AddOrder(
|
||||||
new Order(order.Prefab, targetEntity, (targetEntity as Item)?.Components.FirstOrDefault(ic => ic.GetType() == order.ItemComponentType)),
|
new Order(order.Prefab, targetEntity, (targetEntity as Item)?.Components.FirstOrDefault(ic => ic.GetType() == order.ItemComponentType), orderGiver: senderCharacter),
|
||||||
order.Prefab.FadeOutTime);
|
order.Prefab.FadeOutTime);
|
||||||
}
|
}
|
||||||
else if (targetCharacter != null)
|
else if (targetCharacter != null)
|
||||||
{
|
{
|
||||||
targetCharacter.SetOrder(
|
targetCharacter.SetOrder(
|
||||||
new Order(order.Prefab, targetEntity, (targetEntity as Item)?.Components.FirstOrDefault(ic => ic.GetType() == order.ItemComponentType)),
|
new Order(order.Prefab, targetEntity, (targetEntity as Item)?.Components.FirstOrDefault(ic => ic.GetType() == order.ItemComponentType), orderGiver: senderCharacter),
|
||||||
orderOption, senderCharacter);
|
orderOption, senderCharacter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -921,8 +921,18 @@ namespace Barotrauma.Networking
|
|||||||
msg += TextManager.GetServerMessage(splitMsg[i]);
|
msg += TextManager.GetServerMessage(splitMsg[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var msgBox = new GUIMessageBox(TextManager.Get(allowReconnect ? "ConnectionLost" : "CouldNotConnectToServer"), msg);
|
|
||||||
msgBox.Buttons[0].OnClicked += ReturnToServerList;
|
if (msg == NetConnection.NoResponseMessage)
|
||||||
|
{
|
||||||
|
//display a generic "could not connect" popup if the message is Lidgren's "failed to establish connection"
|
||||||
|
var msgBox = new GUIMessageBox(TextManager.Get("ConnectionFailed"), TextManager.Get(allowReconnect ? "ConnectionLost" : "CouldNotConnectToServer"));
|
||||||
|
msgBox.Buttons[0].OnClicked += ReturnToServerList;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var msgBox = new GUIMessageBox(TextManager.Get(allowReconnect ? "ConnectionLost" : "CouldNotConnectToServer"), msg);
|
||||||
|
msgBox.Buttons[0].OnClicked += ReturnToServerList;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -429,6 +429,12 @@ namespace Barotrauma
|
|||||||
|
|
||||||
string subName = doc.Root.GetAttributeString("submarine", "");
|
string subName = doc.Root.GetAttributeString("submarine", "");
|
||||||
string saveTime = doc.Root.GetAttributeString("savetime", "unknown");
|
string saveTime = doc.Root.GetAttributeString("savetime", "unknown");
|
||||||
|
if (long.TryParse(saveTime, out long unixTime))
|
||||||
|
{
|
||||||
|
DateTime time = ToolBox.Epoch.ToDateTime(unixTime);
|
||||||
|
saveTime = time.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
string mapseed = doc.Root.GetAttributeString("mapseed", "unknown");
|
string mapseed = doc.Root.GetAttributeString("mapseed", "unknown");
|
||||||
|
|
||||||
var saveFileFrame = new GUIFrame(new RectTransform(new Vector2(0.45f, 0.6f), loadGameContainer.RectTransform, Anchor.TopRight)
|
var saveFileFrame = new GUIFrame(new RectTransform(new Vector2(0.45f, 0.6f), loadGameContainer.RectTransform, Anchor.TopRight)
|
||||||
|
|||||||
@@ -74,15 +74,14 @@ namespace Barotrauma
|
|||||||
outpostBtn.TextBlock.Font = GUI.LargeFont;
|
outpostBtn.TextBlock.Font = GUI.LargeFont;
|
||||||
outpostBtn.TextBlock.AutoScale = true;
|
outpostBtn.TextBlock.AutoScale = true;
|
||||||
|
|
||||||
var tabButtonContainer = new GUILayoutGroup(new RectTransform(new Vector2(0.4f, 0.3f), topPanelContent.RectTransform, Anchor.BottomLeft), isHorizontal: true);
|
var tabButtonContainer = new GUILayoutGroup(new RectTransform(new Vector2(0.4f, 0.4f), topPanelContent.RectTransform, Anchor.BottomLeft), isHorizontal: true);
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
var tabValues = Enum.GetValues(typeof(Tab));
|
var tabValues = Enum.GetValues(typeof(Tab));
|
||||||
foreach (Tab tab in tabValues)
|
foreach (Tab tab in tabValues)
|
||||||
{
|
{
|
||||||
var tabButton = new GUIButton(new RectTransform(new Vector2(0.25f, 1.0f), tabButtonContainer.RectTransform),
|
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"))
|
style: i == 0 ? "GUISlopedTabButtonLeft" : (i == tabValues.Length - 1 ? "GUISlopedTabButtonRight" : "GUISlopedTabButtonMid"))
|
||||||
{
|
{
|
||||||
UserData = tab,
|
UserData = tab,
|
||||||
@@ -93,11 +92,32 @@ namespace Barotrauma
|
|||||||
tabButton.RectTransform.MaxSize = new Point(
|
tabButton.RectTransform.MaxSize = new Point(
|
||||||
(int)(tabButton.Rect.Height * (buttonSprite.Sprite.size.X / buttonSprite.Sprite.size.Y)), int.MaxValue);
|
(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);
|
tabButtons.Add(tabButton);
|
||||||
tabButton.Font = GUI.LargeFont;
|
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
GUITextBlock.AutoScaleAndNormalize(tabButtons.Select(t => t.TextBlock));
|
GUITextBlock.AutoScaleAndNormalize(tabButtons.Select(t => t.GetChildByUserData("buttontext") as GUITextBlock));
|
||||||
|
tabButtons.FirstOrDefault().RectTransform.SizeChanged += () =>
|
||||||
|
{
|
||||||
|
GUITextBlock.AutoScaleAndNormalize(tabButtons.Select(t => t.GetChildByUserData("buttontext") as GUITextBlock));
|
||||||
|
};
|
||||||
|
|
||||||
// crew tab -------------------------------------------------------------------------
|
// crew tab -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|||||||
@@ -27,6 +27,9 @@ namespace Barotrauma
|
|||||||
case "text":
|
case "text":
|
||||||
AddTextElement(subElement, listBox.Content.RectTransform);
|
AddTextElement(subElement, listBox.Content.RectTransform);
|
||||||
break;
|
break;
|
||||||
|
case "gridtext":
|
||||||
|
AddGridTextElement(subElement, listBox.Content.RectTransform);
|
||||||
|
break;
|
||||||
case "spacing":
|
case "spacing":
|
||||||
AddSpacingElement(subElement, listBox.Content.RectTransform);
|
AddSpacingElement(subElement, listBox.Content.RectTransform);
|
||||||
break;
|
break;
|
||||||
@@ -38,9 +41,9 @@ namespace Barotrauma
|
|||||||
listBox.UpdateScrollBarSize();
|
listBox.UpdateScrollBarSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AddTextElement(XElement element, RectTransform parent)
|
private GUIComponent AddTextElement(XElement element, RectTransform parent, string overrideText = null, Anchor anchor = Anchor.Center)
|
||||||
{
|
{
|
||||||
var text = element.ElementInnerText().Replace(@"\n", "\n");
|
var text = overrideText ?? element.ElementInnerText().Replace(@"\n", "\n");
|
||||||
Color color = element.GetAttributeColor("color", Color.White);
|
Color color = element.GetAttributeColor("color", Color.White);
|
||||||
float scale = element.GetAttributeFloat("scale", 1.0f);
|
float scale = element.GetAttributeFloat("scale", 1.0f);
|
||||||
Alignment alignment = Alignment.Center;
|
Alignment alignment = Alignment.Center;
|
||||||
@@ -69,7 +72,7 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
|
|
||||||
var textHolder = new GUIFrame(new RectTransform(new Vector2(1.0f, 0.0f), parent), style: null);
|
var textHolder = new GUIFrame(new RectTransform(new Vector2(1.0f, 0.0f), parent), style: null);
|
||||||
var textBlock = new GUITextBlock(new RectTransform(new Vector2(0.5f, 0.0f), textHolder.RectTransform, Anchor.Center),
|
var textBlock = new GUITextBlock(new RectTransform(new Vector2(0.5f, 0.0f), textHolder.RectTransform, anchor),
|
||||||
text,
|
text,
|
||||||
color,
|
color,
|
||||||
font,
|
font,
|
||||||
@@ -81,6 +84,32 @@ namespace Barotrauma
|
|||||||
textBlock.RectTransform.IsFixedSize = textHolder.RectTransform.IsFixedSize = true;
|
textBlock.RectTransform.IsFixedSize = textHolder.RectTransform.IsFixedSize = true;
|
||||||
textBlock.RectTransform.NonScaledSize = new Point(textBlock.Rect.Width, textBlock.Rect.Height);
|
textBlock.RectTransform.NonScaledSize = new Point(textBlock.Rect.Width, textBlock.Rect.Height);
|
||||||
textHolder.RectTransform.NonScaledSize = new Point(textHolder.Rect.Width, textBlock.Rect.Height);
|
textHolder.RectTransform.NonScaledSize = new Point(textHolder.Rect.Width, textBlock.Rect.Height);
|
||||||
|
return textHolder;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AddGridTextElement(XElement element, RectTransform parent)
|
||||||
|
{
|
||||||
|
var text = element.ElementInnerText().Replace(@"\n", "\n");
|
||||||
|
string[] elements = text.Split(',');
|
||||||
|
RectTransform lineContainer = null;
|
||||||
|
for (int i = 0; i < elements.Length; i++)
|
||||||
|
{
|
||||||
|
switch (i % 3)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
lineContainer = AddTextElement(element, parent, elements[i], Anchor.CenterLeft).RectTransform;
|
||||||
|
lineContainer.Anchor = Anchor.TopCenter;
|
||||||
|
lineContainer.Pivot = Pivot.TopCenter;
|
||||||
|
lineContainer.NonScaledSize = new Point((int)(parent.NonScaledSize.X * 0.7f), lineContainer.NonScaledSize.Y);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
AddTextElement(element, lineContainer, elements[i], Anchor.Center).GetChild<GUITextBlock>().TextAlignment = Alignment.Center;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
AddTextElement(element, lineContainer, elements[i], Anchor.CenterRight).GetChild<GUITextBlock>().TextAlignment = Alignment.CenterRight;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AddSpacingElement(XElement element, RectTransform parent)
|
private void AddSpacingElement(XElement element, RectTransform parent)
|
||||||
|
|||||||
@@ -440,9 +440,21 @@ namespace Barotrauma
|
|||||||
GameMain.Config.SettingsFrame.RectTransform.RelativeSize = Vector2.One;
|
GameMain.Config.SettingsFrame.RectTransform.RelativeSize = Vector2.One;
|
||||||
break;
|
break;
|
||||||
case Tab.JoinServer:
|
case Tab.JoinServer:
|
||||||
|
if (!GameMain.Config.CampaignDisclaimerShown)
|
||||||
|
{
|
||||||
|
selectedTab = 0;
|
||||||
|
GameMain.Instance.ShowCampaignDisclaimer(() => { SelectTab(null, Tab.JoinServer); });
|
||||||
|
return true;
|
||||||
|
}
|
||||||
GameMain.ServerListScreen.Select();
|
GameMain.ServerListScreen.Select();
|
||||||
break;
|
break;
|
||||||
case Tab.HostServer:
|
case Tab.HostServer:
|
||||||
|
if (!GameMain.Config.CampaignDisclaimerShown)
|
||||||
|
{
|
||||||
|
selectedTab = 0;
|
||||||
|
GameMain.Instance.ShowCampaignDisclaimer(() => { SelectTab(null, Tab.HostServer); });
|
||||||
|
return true;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case Tab.Tutorials:
|
case Tab.Tutorials:
|
||||||
if (!GameMain.Config.CampaignDisclaimerShown)
|
if (!GameMain.Config.CampaignDisclaimerShown)
|
||||||
@@ -790,6 +802,7 @@ namespace Barotrauma
|
|||||||
for (int i = legalCrap.Length - 1; i >= 0; i--)
|
for (int i = legalCrap.Length - 1; i >= 0; i--)
|
||||||
{
|
{
|
||||||
Vector2 textSize = GUI.SmallFont.MeasureString(legalCrap[i]);
|
Vector2 textSize = GUI.SmallFont.MeasureString(legalCrap[i]);
|
||||||
|
textSize = new Vector2((int)textSize.X, (int)textSize.Y);
|
||||||
bool mouseOn = i == 0 &&
|
bool mouseOn = i == 0 &&
|
||||||
PlayerInput.MousePosition.X > textPos.X - textSize.X && PlayerInput.MousePosition.X < textPos.X &&
|
PlayerInput.MousePosition.X > textPos.X - textSize.X && PlayerInput.MousePosition.X < textPos.X &&
|
||||||
PlayerInput.MousePosition.Y > textPos.Y - textSize.Y && PlayerInput.MousePosition.Y < textPos.Y;
|
PlayerInput.MousePosition.Y > textPos.Y - textSize.Y && PlayerInput.MousePosition.Y < textPos.Y;
|
||||||
|
|||||||
@@ -31,6 +31,8 @@ namespace Barotrauma
|
|||||||
private bool masterServerResponded;
|
private bool masterServerResponded;
|
||||||
private IRestResponse masterServerResponse;
|
private IRestResponse masterServerResponse;
|
||||||
|
|
||||||
|
private GUIButton refreshButton;
|
||||||
|
|
||||||
private float[] columnRelativeWidth;
|
private float[] columnRelativeWidth;
|
||||||
|
|
||||||
//filters
|
//filters
|
||||||
@@ -140,7 +142,7 @@ namespace Barotrauma
|
|||||||
OnClicked = GameMain.MainMenuScreen.ReturnToMainMenu
|
OnClicked = GameMain.MainMenuScreen.ReturnToMainMenu
|
||||||
};
|
};
|
||||||
|
|
||||||
var refreshButton = new GUIButton(new RectTransform(new Vector2(buttonContainer.Rect.Height / (float)buttonContainer.Rect.Width, 0.9f), buttonContainer.RectTransform, Anchor.Center),
|
refreshButton = new GUIButton(new RectTransform(new Vector2(buttonContainer.Rect.Height / (float)buttonContainer.Rect.Width, 0.9f), buttonContainer.RectTransform, Anchor.Center),
|
||||||
"", style: "GUIButtonRefresh") {
|
"", style: "GUIButtonRefresh") {
|
||||||
|
|
||||||
ToolTip = TextManager.Get("ServerListRefresh"),
|
ToolTip = TextManager.Get("ServerListRefresh"),
|
||||||
@@ -200,7 +202,7 @@ namespace Barotrauma
|
|||||||
|
|
||||||
private bool RefreshJoinButtonState(GUIComponent component, object obj)
|
private bool RefreshJoinButtonState(GUIComponent component, object obj)
|
||||||
{
|
{
|
||||||
if (obj == null || waitingForRefresh) return false;
|
if (obj == null || waitingForRefresh) { return false; }
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(clientNameBox.Text) && !string.IsNullOrWhiteSpace(ipBox.Text))
|
if (!string.IsNullOrWhiteSpace(clientNameBox.Text) && !string.IsNullOrWhiteSpace(ipBox.Text))
|
||||||
{
|
{
|
||||||
@@ -216,7 +218,7 @@ namespace Barotrauma
|
|||||||
|
|
||||||
private bool SelectServer(GUIComponent component, object obj)
|
private bool SelectServer(GUIComponent component, object obj)
|
||||||
{
|
{
|
||||||
if (obj == null || waitingForRefresh) return false;
|
if (obj == null || waitingForRefresh) { return false; }
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(clientNameBox.Text))
|
if (!string.IsNullOrWhiteSpace(clientNameBox.Text))
|
||||||
{
|
{
|
||||||
@@ -245,15 +247,18 @@ namespace Barotrauma
|
|||||||
|
|
||||||
private bool RefreshServers(GUIButton button, object obj)
|
private bool RefreshServers(GUIButton button, object obj)
|
||||||
{
|
{
|
||||||
if (waitingForRefresh) return false;
|
if (waitingForRefresh) { return false; }
|
||||||
serverList.ClearChildren();
|
serverList.ClearChildren();
|
||||||
serverPreview.ClearChildren();
|
serverPreview.ClearChildren();
|
||||||
|
|
||||||
ipBox.Text = null;
|
ipBox.Text = null;
|
||||||
joinButton.Enabled = false;
|
joinButton.Enabled = false;
|
||||||
|
|
||||||
new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.05f), serverList.Content.RectTransform),
|
new GUITextBlock(new RectTransform(new Vector2(1.0f, 1.0f), serverList.Content.RectTransform),
|
||||||
TextManager.Get("RefreshingServerList"));
|
TextManager.Get("RefreshingServerList"), textAlignment: Alignment.Center)
|
||||||
|
{
|
||||||
|
CanBeFocused = false
|
||||||
|
};
|
||||||
|
|
||||||
CoroutineManager.StartCoroutine(WaitForRefresh());
|
CoroutineManager.StartCoroutine(WaitForRefresh());
|
||||||
|
|
||||||
@@ -274,17 +279,19 @@ namespace Barotrauma
|
|||||||
if (!SteamManager.GetServers(AddToServerList, UpdateServerInfo, ServerQueryFinished))
|
if (!SteamManager.GetServers(AddToServerList, UpdateServerInfo, ServerQueryFinished))
|
||||||
{
|
{
|
||||||
serverList.ClearChildren();
|
serverList.ClearChildren();
|
||||||
new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.05f), serverList.Content.RectTransform),
|
new GUITextBlock(new RectTransform(new Vector2(1.0f, 1.0f), serverList.Content.RectTransform),
|
||||||
TextManager.Get("ServerListNoSteamConnection"));
|
TextManager.Get("ServerListNoSteamConnection"), textAlignment: Alignment.Center)
|
||||||
|
{
|
||||||
|
CanBeFocused = false
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CoroutineManager.StartCoroutine(SendMasterServerRequest());
|
CoroutineManager.StartCoroutine(SendMasterServerRequest());
|
||||||
|
waitingForRefresh = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
waitingForRefresh = false;
|
|
||||||
|
|
||||||
refreshDisableTimer = DateTime.Now + AllowedRefreshInterval;
|
refreshDisableTimer = DateTime.Now + AllowedRefreshInterval;
|
||||||
|
|
||||||
yield return CoroutineStatus.Success;
|
yield return CoroutineStatus.Success;
|
||||||
@@ -349,8 +356,11 @@ namespace Barotrauma
|
|||||||
serverList.Content.ClearChildren();
|
serverList.Content.ClearChildren();
|
||||||
if (serverInfos.Count() == 0)
|
if (serverInfos.Count() == 0)
|
||||||
{
|
{
|
||||||
new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.05f), serverList.Content.RectTransform),
|
new GUITextBlock(new RectTransform(new Vector2(1.0f, 1.0f), serverList.Content.RectTransform),
|
||||||
TextManager.Get("NoServers"));
|
TextManager.Get("NoServers"), textAlignment: Alignment.Center)
|
||||||
|
{
|
||||||
|
CanBeFocused = false
|
||||||
|
};
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
foreach (ServerInfo serverInfo in serverInfos)
|
foreach (ServerInfo serverInfo in serverInfos)
|
||||||
@@ -490,6 +500,7 @@ namespace Barotrauma
|
|||||||
UserData = "noresults"
|
UserData = "noresults"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
waitingForRefresh = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private IEnumerable<object> SendMasterServerRequest()
|
private IEnumerable<object> SendMasterServerRequest()
|
||||||
|
|||||||
@@ -478,7 +478,7 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var downloadBtn = new GUIButton(new RectTransform(new Point(32, 32), rightColumn.RectTransform), "+", style: null)
|
var downloadBtn = new GUIButton(new RectTransform(new Point((int)(32 * GUI.Scale)), rightColumn.RectTransform), "+", style: null)
|
||||||
{
|
{
|
||||||
Font = GUI.LargeFont,
|
Font = GUI.LargeFont,
|
||||||
Color = new Color(38, 65, 86, 255),
|
Color = new Color(38, 65, 86, 255),
|
||||||
|
|||||||
@@ -294,7 +294,8 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
value = "";
|
value = "";
|
||||||
}
|
}
|
||||||
string displayName = property.GetAttribute<Editable>().DisplayName;
|
string propertyName = (entity.GetType().Name + "." + property.PropertyInfo.Name).ToLowerInvariant();
|
||||||
|
string displayName = TextManager.Get(propertyName, returnNull: true) ?? property.GetAttribute<Editable>().DisplayName;
|
||||||
if (displayName == null)
|
if (displayName == null)
|
||||||
{
|
{
|
||||||
displayName = property.Name.FormatCamelCaseWithSpaces();
|
displayName = property.Name.FormatCamelCaseWithSpaces();
|
||||||
|
|||||||
@@ -133,13 +133,24 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (traitStart == -1)
|
int conversationStart = -1;
|
||||||
|
for (int i = 0; i < csvContent.Length; i++)
|
||||||
|
{
|
||||||
|
if (csvContent[i].StartsWith("Generic"))
|
||||||
|
{
|
||||||
|
conversationStart = i + 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*if (traitStart == -1)
|
||||||
{
|
{
|
||||||
DebugConsole.ThrowError("Invalid formatting of NPCConversations, no traits found!");
|
DebugConsole.ThrowError("Invalid formatting of NPCConversations, no traits found!");
|
||||||
return null;
|
return null;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
for (int i = 0; i < NPCPersonalityTrait.List.Count; i++) // Traits
|
//DebugConsole.NewMessage("Count: " + NPCPersonalityTrait.List.Count);
|
||||||
|
/*for (int i = 0; i < conversationStart; i++) // Traits
|
||||||
{
|
{
|
||||||
//string[] split = SplitCSV(csvContent[traitStart + i].Trim(separator));
|
//string[] split = SplitCSV(csvContent[traitStart + i].Trim(separator));
|
||||||
string[] split = csvContent[traitStart + i].Split(separator);
|
string[] split = csvContent[traitStart + i].Split(separator);
|
||||||
@@ -148,9 +159,9 @@ namespace Barotrauma
|
|||||||
$"{GetVariable("name", split[1])}" +
|
$"{GetVariable("name", split[1])}" +
|
||||||
$"{GetVariable("alloweddialogtags", string.Join(",", NPCPersonalityTrait.List[i].AllowedDialogTags))}" +
|
$"{GetVariable("alloweddialogtags", string.Join(",", NPCPersonalityTrait.List[i].AllowedDialogTags))}" +
|
||||||
$"{GetVariable("commonness", NPCPersonalityTrait.List[i].Commonness.ToString())}/>");
|
$"{GetVariable("commonness", NPCPersonalityTrait.List[i].Commonness.ToString())}/>");
|
||||||
}
|
}*/
|
||||||
|
|
||||||
for (int i = traitStart + NPCPersonalityTrait.List.Count; i < csvContent.Length; i++) // Conversations
|
for (int i = conversationStart; i < csvContent.Length; i++) // Conversations
|
||||||
{
|
{
|
||||||
//string[] presplit = csvContent[i].Split(separator); // Handling speaker index fetching, somehow doesn't work with the regex
|
//string[] presplit = csvContent[i].Split(separator); // Handling speaker index fetching, somehow doesn't work with the regex
|
||||||
//string[] split = SplitCSV(csvContent[i]);
|
//string[] split = SplitCSV(csvContent[i]);
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ namespace Barotrauma
|
|||||||
string currWord = "";
|
string currWord = "";
|
||||||
for (int i = 0; i < text.Length; i++)
|
for (int i = 0; i < text.Length; i++)
|
||||||
{
|
{
|
||||||
if (isCJK.IsMatch(text[i].ToString()))
|
if (TextManager.IsCJK(text[i].ToString()))
|
||||||
{
|
{
|
||||||
if (currWord.Length > 0)
|
if (currWord.Length > 0)
|
||||||
{
|
{
|
||||||
@@ -200,24 +200,13 @@ namespace Barotrauma
|
|||||||
linePos = size.X + spaceSize.X;
|
linePos = size.X + spaceSize.X;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i < words.Count - 1 && !isCJK.IsMatch(words[i]) && !isCJK.IsMatch(words[i + 1]))
|
if (i < words.Count - 1 && !TextManager.IsCJK(words[i]) && !TextManager.IsCJK(words[i + 1]))
|
||||||
{
|
{
|
||||||
wrappedText.Append(" ");
|
wrappedText.Append(" ");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return wrappedText.ToString().Replace(" \n ", "\n");
|
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}");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
Binary file not shown.
Binary file not shown.
+1
@@ -0,0 +1 @@
|
|||||||
|
libvlc.so.5.6.0
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
libvlc.so.5.6.0
|
||||||
Executable
BIN
Binary file not shown.
Executable
+41
@@ -0,0 +1,41 @@
|
|||||||
|
# libvlccore.la - a libtool library file
|
||||||
|
# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-2.1
|
||||||
|
#
|
||||||
|
# Please DO NOT delete this file!
|
||||||
|
# It is necessary for linking the library.
|
||||||
|
|
||||||
|
# The name that we can dlopen(3).
|
||||||
|
dlname='libvlccore.so.9'
|
||||||
|
|
||||||
|
# Names of this library.
|
||||||
|
library_names='libvlccore.so.9.0.0 libvlccore.so.9 libvlccore.so'
|
||||||
|
|
||||||
|
# The name of the static archive.
|
||||||
|
old_library=''
|
||||||
|
|
||||||
|
# Linker flags that cannot go in dependency_libs.
|
||||||
|
inherited_linker_flags=''
|
||||||
|
|
||||||
|
# Libraries that this one depends upon.
|
||||||
|
dependency_libs=' -lidn -lpthread -ldl -lm -ldbus-1'
|
||||||
|
|
||||||
|
# Names of additional weak libraries provided by this library
|
||||||
|
weak_library_names=''
|
||||||
|
|
||||||
|
# Version information for libvlccore.
|
||||||
|
current=9
|
||||||
|
age=0
|
||||||
|
revision=0
|
||||||
|
|
||||||
|
# Is this an already installed library?
|
||||||
|
installed=yes
|
||||||
|
|
||||||
|
# Should we warn about portability when linking against -modules?
|
||||||
|
shouldnotlink=no
|
||||||
|
|
||||||
|
# Files to dlopen/dlpreopen
|
||||||
|
dlopen=''
|
||||||
|
dlpreopen=''
|
||||||
|
|
||||||
|
# Directory that this library needs to be installed in:
|
||||||
|
libdir='/usr/lib'
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
libvlccore.so.9.0.0
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
libvlccore.so.9.0.0
|
||||||
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -31,5 +31,5 @@ using System.Runtime.InteropServices;
|
|||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("0.9.0.1")]
|
[assembly: AssemblyVersion("0.9.0.2")]
|
||||||
[assembly: AssemblyFileVersion("0.9.0.1")]
|
[assembly: AssemblyFileVersion("0.9.0.2")]
|
||||||
|
|||||||
@@ -2408,7 +2408,10 @@ namespace Barotrauma.Networking
|
|||||||
if (senderCharacter != null &&
|
if (senderCharacter != null &&
|
||||||
client.Character != null && !client.Character.IsDead)
|
client.Character != null && !client.Character.IsDead)
|
||||||
{
|
{
|
||||||
modifiedMessage = ChatMessage.ApplyDistanceEffect(message, (ChatMessageType)type, senderCharacter, client.Character);
|
if (senderCharacter != client.Character)
|
||||||
|
{
|
||||||
|
modifiedMessage = ChatMessage.ApplyDistanceEffect(message, (ChatMessageType)type, senderCharacter, client.Character);
|
||||||
|
}
|
||||||
|
|
||||||
//too far to hear the msg -> don't send
|
//too far to hear the msg -> don't send
|
||||||
if (string.IsNullOrWhiteSpace(modifiedMessage)) continue;
|
if (string.IsNullOrWhiteSpace(modifiedMessage)) continue;
|
||||||
@@ -2457,13 +2460,16 @@ namespace Barotrauma.Networking
|
|||||||
if (message.Sender != null &&
|
if (message.Sender != null &&
|
||||||
client.Character != null && !client.Character.IsDead)
|
client.Character != null && !client.Character.IsDead)
|
||||||
{
|
{
|
||||||
modifiedMessage = ChatMessage.ApplyDistanceEffect(message.Text, messageType, message.Sender, client.Character);
|
if (message.Sender != client.Character)
|
||||||
|
{
|
||||||
|
modifiedMessage = ChatMessage.ApplyDistanceEffect(message.Text, messageType, message.Sender, client.Character);
|
||||||
|
}
|
||||||
|
|
||||||
//too far to hear the msg -> don't send
|
//too far to hear the msg -> don't send
|
||||||
if (string.IsNullOrWhiteSpace(modifiedMessage)) continue;
|
if (string.IsNullOrWhiteSpace(modifiedMessage)) continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
SendDirectChatMessage(message, client);
|
SendDirectChatMessage(new OrderChatMessage(message.Order, message.OrderOption, message.TargetEntity, message.TargetCharacter, message.Sender), client);
|
||||||
}
|
}
|
||||||
|
|
||||||
string myReceivedMessage = message.Text;
|
string myReceivedMessage = message.Text;
|
||||||
|
|||||||
@@ -49,6 +49,14 @@ namespace Barotrauma
|
|||||||
|
|
||||||
static void CrashDump(GameMain game, string filePath, Exception exception)
|
static void CrashDump(GameMain game, string filePath, Exception exception)
|
||||||
{
|
{
|
||||||
|
int existingFiles = 0;
|
||||||
|
string originalFilePath = filePath;
|
||||||
|
while (File.Exists(filePath))
|
||||||
|
{
|
||||||
|
existingFiles++;
|
||||||
|
filePath = Path.GetFileNameWithoutExtension(originalFilePath) + " (" + (existingFiles + 1) + ")" + Path.GetExtension(originalFilePath);
|
||||||
|
}
|
||||||
|
|
||||||
StreamWriter sw = new StreamWriter(filePath);
|
StreamWriter sw = new StreamWriter(filePath);
|
||||||
|
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
@@ -56,7 +64,11 @@ namespace Barotrauma
|
|||||||
sb.AppendLine("\n");
|
sb.AppendLine("\n");
|
||||||
sb.AppendLine("Barotrauma seems to have crashed. Sorry for the inconvenience! ");
|
sb.AppendLine("Barotrauma seems to have crashed. Sorry for the inconvenience! ");
|
||||||
sb.AppendLine("\n");
|
sb.AppendLine("\n");
|
||||||
|
#if DEBUG
|
||||||
|
sb.AppendLine("Game version " + GameMain.Version + " (debug build)");
|
||||||
|
#else
|
||||||
sb.AppendLine("Game version " + GameMain.Version);
|
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("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("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 + ")"));
|
sb.AppendLine("Loaded submarine: " + ((Submarine.MainSub == null) ? "None" : Submarine.MainSub.Name + " (" + Submarine.MainSub.MD5Hash + ")"));
|
||||||
|
|||||||
@@ -361,6 +361,9 @@
|
|||||||
<Content Include="$(MSBuildThisFileDirectory)Content\Effects\waterbump.png">
|
<Content Include="$(MSBuildThisFileDirectory)Content\Effects\waterbump.png">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
|
<Content Include="$(MSBuildThisFileDirectory)Content\Fonts\Exo2-SemiBold.otf">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
<Content Include="$(MSBuildThisFileDirectory)Content\Fonts\NotoSans\NotoSansCJKsc-Bold.otf">
|
<Content Include="$(MSBuildThisFileDirectory)Content\Fonts\NotoSans\NotoSansCJKsc-Bold.otf">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
@@ -451,9 +454,15 @@
|
|||||||
<Content Include="$(MSBuildThisFileDirectory)Content\Items\Jobgear\Watchman\watchman_gear.xml">
|
<Content Include="$(MSBuildThisFileDirectory)Content\Items\Jobgear\Watchman\watchman_gear.xml">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
|
<Content Include="$(MSBuildThisFileDirectory)Content\Items\Jobgear\Watchman\watchman_legs_female_2.png">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
<Content Include="$(MSBuildThisFileDirectory)Content\Items\Jobgear\Watchman\watchman_legs_male_2.png">
|
<Content Include="$(MSBuildThisFileDirectory)Content\Items\Jobgear\Watchman\watchman_legs_male_2.png">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
|
<Content Include="$(MSBuildThisFileDirectory)Content\Items\Jobgear\Watchman\watchman_torso_female_2.png">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
<Content Include="$(MSBuildThisFileDirectory)Content\Items\Jobgear\Watchman\watchman_torso_male_2.png">
|
<Content Include="$(MSBuildThisFileDirectory)Content\Items\Jobgear\Watchman\watchman_torso_male_2.png">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
|
|||||||
@@ -543,6 +543,14 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
attackSimPos -= Character.Submarine.SimPosition;
|
attackSimPos -= Character.Submarine.SimPosition;
|
||||||
}
|
}
|
||||||
|
else if (Character.Submarine != SelectedAiTarget.Entity.Submarine)
|
||||||
|
{
|
||||||
|
if (Character.Submarine != null && SelectedAiTarget.Entity.Submarine != null)
|
||||||
|
{
|
||||||
|
Vector2 diff = Character.Submarine.SimPosition - SelectedAiTarget.Entity.Submarine.SimPosition;
|
||||||
|
attackSimPos -= diff;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Math.Abs(Character.AnimController.movement.X) > 0.1f && !Character.AnimController.InWater &&
|
if (Math.Abs(Character.AnimController.movement.X) > 0.1f && !Character.AnimController.InWater &&
|
||||||
|
|||||||
@@ -82,15 +82,23 @@ namespace Barotrauma
|
|||||||
public override void Update(float deltaTime)
|
public override void Update(float deltaTime)
|
||||||
{
|
{
|
||||||
if (DisableCrewAI || Character.IsUnconscious) return;
|
if (DisableCrewAI || Character.IsUnconscious) return;
|
||||||
|
|
||||||
if (Character.Submarine != null || SelectedAiTarget?.Entity?.Submarine != null)
|
float maxDistanceToSub = 3000;
|
||||||
|
if (Character.Submarine != null || SelectedAiTarget?.Entity?.Submarine != null &&
|
||||||
|
Vector2.DistanceSquared(Character.WorldPosition, SelectedAiTarget.Entity.Submarine.WorldPosition) < maxDistanceToSub * maxDistanceToSub)
|
||||||
{
|
{
|
||||||
if (steeringManager != insideSteering) insideSteering.Reset();
|
if (steeringManager != insideSteering)
|
||||||
|
{
|
||||||
|
insideSteering.Reset();
|
||||||
|
}
|
||||||
steeringManager = insideSteering;
|
steeringManager = insideSteering;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (steeringManager != outsideSteering) outsideSteering.Reset();
|
if (steeringManager != outsideSteering)
|
||||||
|
{
|
||||||
|
outsideSteering.Reset();
|
||||||
|
}
|
||||||
steeringManager = outsideSteering;
|
steeringManager = outsideSteering;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -295,7 +303,7 @@ namespace Barotrauma
|
|||||||
if (newOrder == null)
|
if (newOrder == null)
|
||||||
{
|
{
|
||||||
var orderPrefab = Order.PrefabList.Find(o => o.AITag == "reportintruders");
|
var orderPrefab = Order.PrefabList.Find(o => o.AITag == "reportintruders");
|
||||||
newOrder = new Order(orderPrefab, c.CurrentHull, null);
|
newOrder = new Order(orderPrefab, c.CurrentHull, null, orderGiver: Character);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -305,7 +313,7 @@ namespace Barotrauma
|
|||||||
if (newOrder == null)
|
if (newOrder == null)
|
||||||
{
|
{
|
||||||
var orderPrefab = Order.PrefabList.Find(o => o.AITag == "reportfire");
|
var orderPrefab = Order.PrefabList.Find(o => o.AITag == "reportfire");
|
||||||
newOrder = new Order(orderPrefab, hull, null);
|
newOrder = new Order(orderPrefab, hull, null, orderGiver: Character);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
foreach (Character c in Character.CharacterList)
|
foreach (Character c in Character.CharacterList)
|
||||||
@@ -317,7 +325,7 @@ namespace Barotrauma
|
|||||||
if (newOrder == null)
|
if (newOrder == null)
|
||||||
{
|
{
|
||||||
var orderPrefab = Order.PrefabList.Find(o => o.AITag == "requestfirstaid");
|
var orderPrefab = Order.PrefabList.Find(o => o.AITag == "requestfirstaid");
|
||||||
newOrder = new Order(orderPrefab, c.CurrentHull, null);
|
newOrder = new Order(orderPrefab, c.CurrentHull, null, orderGiver: Character);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -329,7 +337,7 @@ namespace Barotrauma
|
|||||||
if (newOrder == null)
|
if (newOrder == null)
|
||||||
{
|
{
|
||||||
var orderPrefab = Order.PrefabList.Find(o => o.AITag == "reportbreach");
|
var orderPrefab = Order.PrefabList.Find(o => o.AITag == "reportbreach");
|
||||||
newOrder = new Order(orderPrefab, hull, null);
|
newOrder = new Order(orderPrefab, hull, null, orderGiver: Character);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -343,7 +351,7 @@ namespace Barotrauma
|
|||||||
if (newOrder == null)
|
if (newOrder == null)
|
||||||
{
|
{
|
||||||
var orderPrefab = Order.PrefabList.Find(o => o.AITag == "reportbrokendevices");
|
var orderPrefab = Order.PrefabList.Find(o => o.AITag == "reportbrokendevices");
|
||||||
newOrder = new Order(orderPrefab, item.CurrentHull, item.Repairables?.FirstOrDefault());
|
newOrder = new Order(orderPrefab, item.CurrentHull, item.Repairables?.FirstOrDefault(), orderGiver: Character);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -354,6 +362,9 @@ namespace Barotrauma
|
|||||||
if (GameMain.GameSession?.CrewManager != null && GameMain.GameSession.CrewManager.AddOrder(newOrder, newOrder.FadeOutTime))
|
if (GameMain.GameSession?.CrewManager != null && GameMain.GameSession.CrewManager.AddOrder(newOrder, newOrder.FadeOutTime))
|
||||||
{
|
{
|
||||||
Character.Speak(newOrder.GetChatMessage("", Character.CurrentHull?.DisplayName, givingOrderToSelf: false), ChatMessageType.Order);
|
Character.Speak(newOrder.GetChatMessage("", Character.CurrentHull?.DisplayName, givingOrderToSelf: false), ChatMessageType.Order);
|
||||||
|
#if SERVER
|
||||||
|
GameMain.Server.SendOrderChatMessage(new OrderChatMessage(newOrder, "", Character.CurrentHull, null, Character));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -474,7 +485,11 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
else if (ObjectiveManager.CurrentOrder is AIObjectiveRescueAll rescueAll && rescueAll.Targets.None())
|
else if (ObjectiveManager.CurrentOrder is AIObjectiveRescueAll rescueAll && rescueAll.Targets.None())
|
||||||
{
|
{
|
||||||
Character.Speak(TextManager.Get("DialogNoRescueTargets"), null, 3.0f, "norescuetargets");
|
//TODO: re-enable on all languages after DialogNoRescueTargets has been translated
|
||||||
|
if (TextManager.Language == "English")
|
||||||
|
{
|
||||||
|
Character.Speak(TextManager.Get("DialogNoRescueTargets"), null, 3.0f, "norescuetargets");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (ObjectiveManager.CurrentOrder is AIObjectivePumpWater pumpWater && pumpWater.Targets.None())
|
else if (ObjectiveManager.CurrentOrder is AIObjectivePumpWater pumpWater && pumpWater.Targets.None())
|
||||||
{
|
{
|
||||||
@@ -525,6 +540,8 @@ namespace Barotrauma
|
|||||||
|
|
||||||
public static bool HasItem(Character character, string tag, string containedTag, float conditionPercentage = 0)
|
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);
|
var item = character.Inventory.FindItemByTag(tag);
|
||||||
return item != null &&
|
return item != null &&
|
||||||
item.ConditionPercentage > conditionPercentage &&
|
item.ConditionPercentage > conditionPercentage &&
|
||||||
@@ -657,7 +674,7 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
CurrentHullSafety = 0;
|
CurrentHullSafety = 0;
|
||||||
}
|
}
|
||||||
return 0;
|
return CurrentHullSafety;
|
||||||
}
|
}
|
||||||
if (character == Character)
|
if (character == Character)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -144,8 +144,9 @@ namespace Barotrauma
|
|||||||
|
|
||||||
protected override Vector2 DoSteeringSeek(Vector2 target, float weight)
|
protected override Vector2 DoSteeringSeek(Vector2 target, float weight)
|
||||||
{
|
{
|
||||||
|
bool needsNewPath = currentPath != null && currentPath.Unreachable || Vector2.DistanceSquared(target, currentTarget) > 1;
|
||||||
//find a new path if one hasn't been found yet or the target is different from the current target
|
//find a new path if one hasn't been found yet or the target is different from the current target
|
||||||
if (currentPath == null || Vector2.DistanceSquared(target, currentTarget) > 1.0f || findPathTimer < -1.0f)
|
if (currentPath == null || needsNewPath || findPathTimer < -1.0f)
|
||||||
{
|
{
|
||||||
IsPathDirty = true;
|
IsPathDirty = true;
|
||||||
|
|
||||||
@@ -162,7 +163,19 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
currentPath = pathFinder.FindPath(pos, target, "(Character: " + character.Name + ")");
|
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)
|
||||||
|
{
|
||||||
|
currentPath = newPath;
|
||||||
|
}
|
||||||
|
|
||||||
findPathTimer = Rand.Range(1.0f, 1.2f);
|
findPathTimer = Rand.Range(1.0f, 1.2f);
|
||||||
|
|
||||||
@@ -401,7 +414,7 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
if (door.HasIntegratedButtons)
|
if (door.HasIntegratedButtons)
|
||||||
{
|
{
|
||||||
door.Item.TryInteract(character, false, true, true);
|
door.Item.TryInteract(character, false, true);
|
||||||
buttonPressCooldown = ButtonPressInterval;
|
buttonPressCooldown = ButtonPressInterval;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -409,7 +422,7 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
if (Vector2.DistanceSquared(closestButton.Item.WorldPosition, character.WorldPosition) < MathUtils.Pow(closestButton.Item.InteractDistance * 2, 2))
|
if (Vector2.DistanceSquared(closestButton.Item.WorldPosition, character.WorldPosition) < MathUtils.Pow(closestButton.Item.InteractDistance * 2, 2))
|
||||||
{
|
{
|
||||||
closestButton.Item.TryInteract(character, false, true, false);
|
closestButton.Item.TryInteract(character, false, true);
|
||||||
buttonPressCooldown = ButtonPressInterval;
|
buttonPressCooldown = ButtonPressInterval;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -419,7 +432,7 @@ namespace Barotrauma
|
|||||||
// It's possible that we could reach another buttons.
|
// It's possible that we could reach another buttons.
|
||||||
// If this becomes an issue, we could go through them here and check if any of them are reachable
|
// If this becomes an issue, we could go through them here and check if any of them are reachable
|
||||||
// (would have to cache a collection of buttons instead of a single reference in the CanAccess filter method above)
|
// (would have to cache a collection of buttons instead of a single reference in the CanAccess filter method above)
|
||||||
currentPath.Unreachable = true;
|
//currentPath.Unreachable = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -128,7 +128,7 @@ namespace Barotrauma
|
|||||||
if (seekAmmunition == null || !subObjectives.Contains(seekAmmunition))
|
if (seekAmmunition == null || !subObjectives.Contains(seekAmmunition))
|
||||||
{
|
{
|
||||||
Move();
|
Move();
|
||||||
if (Weapon != null)
|
if (WeaponComponent != null)
|
||||||
{
|
{
|
||||||
OperateWeapon(deltaTime);
|
OperateWeapon(deltaTime);
|
||||||
}
|
}
|
||||||
@@ -320,7 +320,10 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
retreatTarget = findSafety.FindBestHull(HumanAIController.VisibleHulls);
|
retreatTarget = findSafety.FindBestHull(HumanAIController.VisibleHulls);
|
||||||
}
|
}
|
||||||
TryAddSubObjective(ref retreatObjective, () => new AIObjectiveGoTo(retreatTarget, character, objectiveManager, false, true));
|
if (character.CurrentHull != retreatTarget)
|
||||||
|
{
|
||||||
|
TryAddSubObjective(ref retreatObjective, () => new AIObjectiveGoTo(retreatTarget, character, objectiveManager, false, true));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Engage()
|
private void Engage()
|
||||||
@@ -336,8 +339,7 @@ namespace Barotrauma
|
|||||||
constructor: () => new AIObjectiveGoTo(Enemy, character, objectiveManager, repeat: true, getDivingGearIfNeeded: true)
|
constructor: () => new AIObjectiveGoTo(Enemy, character, objectiveManager, repeat: true, getDivingGearIfNeeded: true)
|
||||||
{
|
{
|
||||||
AllowGoingOutside = true,
|
AllowGoingOutside = true,
|
||||||
IgnoreIfTargetDead = true,
|
IgnoreIfTargetDead = true
|
||||||
CheckVisibility = true
|
|
||||||
},
|
},
|
||||||
onAbandon: () =>
|
onAbandon: () =>
|
||||||
{
|
{
|
||||||
@@ -347,7 +349,7 @@ namespace Barotrauma
|
|||||||
if (followTargetObjective != null && subObjectives.Contains(followTargetObjective))
|
if (followTargetObjective != null && subObjectives.Contains(followTargetObjective))
|
||||||
{
|
{
|
||||||
followTargetObjective.CloseEnough =
|
followTargetObjective.CloseEnough =
|
||||||
WeaponComponent is RangedWeapon ? 3 :
|
WeaponComponent is RangedWeapon ? 300 :
|
||||||
WeaponComponent is MeleeWeapon mw ? mw.Range :
|
WeaponComponent is MeleeWeapon mw ? mw.Range :
|
||||||
WeaponComponent is RepairTool rt ? rt.Range : 50;
|
WeaponComponent is RepairTool rt ? rt.Range : 50;
|
||||||
}
|
}
|
||||||
@@ -437,7 +439,7 @@ namespace Barotrauma
|
|||||||
float squaredDistance = Vector2.DistanceSquared(character.Position, Enemy.Position);
|
float squaredDistance = Vector2.DistanceSquared(character.Position, Enemy.Position);
|
||||||
character.CursorPosition = Enemy.Position;
|
character.CursorPosition = Enemy.Position;
|
||||||
float engageDistance = 500;
|
float engageDistance = 500;
|
||||||
if (squaredDistance > engageDistance * engageDistance) { return; }
|
if (character.CurrentHull != Enemy.CurrentHull && squaredDistance > engageDistance * engageDistance) { return; }
|
||||||
if (!character.CanSeeCharacter(Enemy)) { return; }
|
if (!character.CanSeeCharacter(Enemy)) { return; }
|
||||||
if (Weapon.RequireAimToUse)
|
if (Weapon.RequireAimToUse)
|
||||||
{
|
{
|
||||||
@@ -450,7 +452,7 @@ namespace Barotrauma
|
|||||||
isOperatingButtons = door.HasIntegratedButtons || door.Item.GetConnectedComponents<Controller>(true).Any();
|
isOperatingButtons = door.HasIntegratedButtons || door.Item.GetConnectedComponents<Controller>(true).Any();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!isOperatingButtons && character.SelectedConstruction == null)
|
if (!isOperatingButtons)
|
||||||
{
|
{
|
||||||
character.SetInput(InputType.Aim, false, true);
|
character.SetInput(InputType.Aim, false, true);
|
||||||
}
|
}
|
||||||
|
|||||||
+29
-12
@@ -46,7 +46,7 @@ namespace Barotrauma
|
|||||||
if (character.CurrentHull == null)
|
if (character.CurrentHull == null)
|
||||||
{
|
{
|
||||||
currenthullSafety = 0;
|
currenthullSafety = 0;
|
||||||
Priority = 100;
|
Priority = objectiveManager.CurrentOrder is AIObjectiveGoTo ? 0 : 100;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (character.OxygenAvailable < CharacterHealth.LowOxygenThreshold) { Priority = 100; }
|
if (character.OxygenAvailable < CharacterHealth.LowOxygenThreshold) { Priority = 100; }
|
||||||
@@ -68,6 +68,8 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Hull currentSafeHull;
|
||||||
|
private Hull previousSafeHull;
|
||||||
protected override void Act(float deltaTime)
|
protected override void Act(float deltaTime)
|
||||||
{
|
{
|
||||||
var currentHull = character.AnimController.CurrentHull;
|
var currentHull = character.AnimController.CurrentHull;
|
||||||
@@ -107,15 +109,20 @@ namespace Barotrauma
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
searchHullTimer = SearchHullInterval;
|
searchHullTimer = SearchHullInterval;
|
||||||
var bestHull = FindBestHull();
|
previousSafeHull = currentSafeHull;
|
||||||
if (bestHull != null && bestHull != currentHull)
|
currentSafeHull = FindBestHull();
|
||||||
|
if (currentSafeHull == null)
|
||||||
{
|
{
|
||||||
if (goToObjective?.Target != bestHull)
|
currentSafeHull = previousSafeHull;
|
||||||
|
}
|
||||||
|
if (currentSafeHull != null && currentSafeHull != currentHull)
|
||||||
|
{
|
||||||
|
if (goToObjective?.Target != currentSafeHull)
|
||||||
{
|
{
|
||||||
goToObjective = null;
|
goToObjective = null;
|
||||||
}
|
}
|
||||||
TryAddSubObjective(ref goToObjective,
|
TryAddSubObjective(ref goToObjective,
|
||||||
constructor: () => new AIObjectiveGoTo(bestHull, character, objectiveManager, getDivingGearIfNeeded: false)
|
constructor: () => new AIObjectiveGoTo(currentSafeHull, character, objectiveManager, getDivingGearIfNeeded: false)
|
||||||
{
|
{
|
||||||
// If we need diving gear, we should already have it, if possible.
|
// If we need diving gear, we should already have it, if possible.
|
||||||
AllowGoingOutside = HumanAIController.HasDivingSuit(character)
|
AllowGoingOutside = HumanAIController.HasDivingSuit(character)
|
||||||
@@ -127,7 +134,15 @@ namespace Barotrauma
|
|||||||
goToObjective = null;
|
goToObjective = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (goToObjective != null) { return; }
|
if (goToObjective != null)
|
||||||
|
{
|
||||||
|
if (goToObjective.IsCompleted())
|
||||||
|
{
|
||||||
|
objectiveManager.GetObjective<AIObjectiveIdle>()?.Wander(deltaTime);
|
||||||
|
}
|
||||||
|
Priority = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (currentHull == null) { return; }
|
if (currentHull == null) { return; }
|
||||||
//goto objective doesn't exist (a safe hull not found, or a path to a safe hull not found)
|
//goto objective doesn't exist (a safe hull not found, or a path to a safe hull not found)
|
||||||
// -> attempt to manually steer away from hazards
|
// -> attempt to manually steer away from hazards
|
||||||
@@ -166,7 +181,8 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
character.AIController.SteeringManager.Reset();
|
Priority = 0;
|
||||||
|
objectiveManager.GetObjective<AIObjectiveIdle>()?.Wander(deltaTime);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -179,11 +195,11 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
if (hull.Submarine == null) { continue; }
|
if (hull.Submarine == null) { continue; }
|
||||||
if (ignoredHulls != null && ignoredHulls.Contains(hull)) { continue; }
|
if (ignoredHulls != null && ignoredHulls.Contains(hull)) { continue; }
|
||||||
|
if (unreachable.Contains(hull)) { continue; }
|
||||||
float hullSafety = 0;
|
float hullSafety = 0;
|
||||||
if (character.Submarine != null && SteeringManager == PathSteering)
|
if (character.CurrentHull != null)
|
||||||
{
|
{
|
||||||
// Inside or outside near the sub
|
// Inside
|
||||||
if (unreachable.Contains(hull)) { continue; }
|
|
||||||
if (!character.Submarine.IsConnectedTo(hull.Submarine)) { continue; }
|
if (!character.Submarine.IsConnectedTo(hull.Submarine)) { continue; }
|
||||||
hullSafety = HumanAIController.GetHullSafety(hull, character);
|
hullSafety = HumanAIController.GetHullSafety(hull, character);
|
||||||
// Vertical distance matters more than horizontal (climbing up/down is harder than moving horizontally)
|
// Vertical distance matters more than horizontal (climbing up/down is harder than moving horizontally)
|
||||||
@@ -212,7 +228,7 @@ namespace Barotrauma
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Outside
|
// Outside
|
||||||
if (hull.RoomName?.ToLowerInvariant() == "airlock")
|
if (hull.RoomName != null && hull.RoomName.ToLowerInvariant().Contains("airlock"))
|
||||||
{
|
{
|
||||||
hullSafety = 100;
|
hullSafety = 100;
|
||||||
}
|
}
|
||||||
@@ -221,13 +237,14 @@ namespace Barotrauma
|
|||||||
// TODO: could also target gaps that get us inside?
|
// TODO: could also target gaps that get us inside?
|
||||||
foreach (Item item in Item.ItemList)
|
foreach (Item item in Item.ItemList)
|
||||||
{
|
{
|
||||||
if (item.CurrentHull == hull && item.HasTag("airlock"))
|
if (item.CurrentHull != hull && item.HasTag("airlock"))
|
||||||
{
|
{
|
||||||
hullSafety = 100;
|
hullSafety = 100;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// TODO: could we get a closest door to the outside and target the flowing hull if no airlock is found?
|
||||||
// Huge preference for closer targets
|
// Huge preference for closer targets
|
||||||
float distance = Vector2.DistanceSquared(character.WorldPosition, hull.WorldPosition);
|
float distance = Vector2.DistanceSquared(character.WorldPosition, hull.WorldPosition);
|
||||||
float distanceFactor = MathHelper.Lerp(1, 0.2f, MathUtils.InverseLerp(0, MathUtils.Pow(100000, 2), distance));
|
float distanceFactor = MathHelper.Lerp(1, 0.2f, MathUtils.InverseLerp(0, MathUtils.Pow(100000, 2), distance));
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
using FarseerPhysics;
|
using Microsoft.Xna.Framework;
|
||||||
using Microsoft.Xna.Framework;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
using Barotrauma.Extensions;
|
||||||
|
|
||||||
namespace Barotrauma
|
namespace Barotrauma
|
||||||
{
|
{
|
||||||
@@ -17,17 +16,21 @@ namespace Barotrauma
|
|||||||
|
|
||||||
public Func<bool> customCondition;
|
public Func<bool> customCondition;
|
||||||
|
|
||||||
|
public bool followControlledCharacter;
|
||||||
|
public bool mimic;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Display units
|
/// Display units
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public float CloseEnough { get; set; } = 50;
|
public float CloseEnough { get; set; } = 50;
|
||||||
public bool IgnoreIfTargetDead { get; set; }
|
public bool IgnoreIfTargetDead { get; set; }
|
||||||
public bool AllowGoingOutside { get; set; }
|
public bool AllowGoingOutside { get; set; }
|
||||||
public bool CheckVisibility { get; set; }
|
|
||||||
|
public ISpatialEntity Target { get; private set; }
|
||||||
|
|
||||||
public override float GetPriority()
|
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 (Target is Entity e && e.Removed) { return 0.0f; }
|
||||||
if (IgnoreIfTargetDead && Target is Character character && character.IsDead) { return 0.0f; }
|
if (IgnoreIfTargetDead && Target is Character character && character.IsDead) { return 0.0f; }
|
||||||
if (objectiveManager.CurrentOrder == this)
|
if (objectiveManager.CurrentOrder == this)
|
||||||
@@ -37,23 +40,19 @@ namespace Barotrauma
|
|||||||
return 1.0f;
|
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)
|
public AIObjectiveGoTo(ISpatialEntity target, Character character, AIObjectiveManager objectiveManager, bool repeat = false, bool getDivingGearIfNeeded = true, float priorityModifier = 1)
|
||||||
: base (character, objectiveManager, priorityModifier)
|
: base (character, objectiveManager, priorityModifier)
|
||||||
{
|
{
|
||||||
this.Target = target;
|
this.Target = target;
|
||||||
this.repeat = repeat;
|
this.repeat = repeat;
|
||||||
waitUntilPathUnreachable = 2.0f;
|
waitUntilPathUnreachable = 3.0f;
|
||||||
this.getDivingGearIfNeeded = getDivingGearIfNeeded;
|
this.getDivingGearIfNeeded = getDivingGearIfNeeded;
|
||||||
CalculateCloseEnough();
|
CalculateCloseEnough();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void Act(float deltaTime)
|
protected override void Act(float deltaTime)
|
||||||
{
|
{
|
||||||
if (FollowControlledCharacter)
|
if (followControlledCharacter)
|
||||||
{
|
{
|
||||||
if (Character.Controlled == null)
|
if (Character.Controlled == null)
|
||||||
{
|
{
|
||||||
@@ -92,11 +91,18 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
abandon = true;
|
abandon = true;
|
||||||
}
|
}
|
||||||
else if (!repeat && waitUntilPathUnreachable < 0)
|
else if (waitUntilPathUnreachable < 0)
|
||||||
{
|
{
|
||||||
if (SteeringManager == PathSteering && PathSteering.CurrentPath != null)
|
if (SteeringManager == PathSteering && PathSteering.CurrentPath != null && PathSteering.CurrentPath.Unreachable)
|
||||||
{
|
{
|
||||||
abandon = PathSteering.CurrentPath.Unreachable;
|
if (repeat)
|
||||||
|
{
|
||||||
|
SteeringManager.Reset();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
abandon = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (abandon)
|
if (abandon)
|
||||||
@@ -114,16 +120,33 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
Vector2 currTargetSimPos = Vector2.Zero;
|
Vector2 currTargetSimPos = Vector2.Zero;
|
||||||
currTargetSimPos = Target.SimPosition;
|
currTargetSimPos = Target.SimPosition;
|
||||||
//if character is inside the sub and target isn't, transform the position
|
// Take the sub position into account in the sim pos
|
||||||
if (character.Submarine != null && Target.Submarine == null)
|
if (SteeringManager != PathSteering && character.Submarine == null && Target.Submarine != null)
|
||||||
|
{
|
||||||
|
currTargetSimPos += Target.Submarine.SimPosition;
|
||||||
|
}
|
||||||
|
else if (character.Submarine != null && Target.Submarine == null)
|
||||||
{
|
{
|
||||||
currTargetSimPos -= character.Submarine.SimPosition;
|
currTargetSimPos -= character.Submarine.SimPosition;
|
||||||
}
|
}
|
||||||
|
else if (character.Submarine != Target.Submarine)
|
||||||
|
{
|
||||||
|
if (character.Submarine != null && Target.Submarine != null)
|
||||||
|
{
|
||||||
|
Vector2 diff = character.Submarine.SimPosition - Target.Submarine.SimPosition;
|
||||||
|
currTargetSimPos -= diff;
|
||||||
|
}
|
||||||
|
}
|
||||||
character.AIController.SteeringManager.SteeringSeek(currTargetSimPos);
|
character.AIController.SteeringManager.SteeringSeek(currTargetSimPos);
|
||||||
|
if (SteeringManager != PathSteering)
|
||||||
|
{
|
||||||
|
SteeringManager.SteeringAvoid(deltaTime, lookAheadDistance: 5, weight: 1, heading: VectorExtensions.Forward(character.AnimController.Collider.Rotation));
|
||||||
|
}
|
||||||
if (getDivingGearIfNeeded)
|
if (getDivingGearIfNeeded)
|
||||||
{
|
{
|
||||||
bool needsDivingGear = HumanAIController.NeedsDivingGear(targetHull);
|
Character followTarget = Target as Character;
|
||||||
bool needsDivingSuit = needsDivingGear && (targetHull == null || targetIsOutside || targetHull.WaterPercentage > 90);
|
bool needsDivingGear = HumanAIController.NeedsDivingGear(targetHull) || mimic && HumanAIController.HasDivingMask(followTarget);
|
||||||
|
bool needsDivingSuit = needsDivingGear && (targetHull == null || targetIsOutside || targetHull.WaterPercentage > 90) || mimic && HumanAIController.HasDivingSuit(followTarget);
|
||||||
bool needsEquipment = false;
|
bool needsEquipment = false;
|
||||||
if (needsDivingSuit)
|
if (needsDivingSuit)
|
||||||
{
|
{
|
||||||
@@ -147,7 +170,6 @@ namespace Barotrauma
|
|||||||
// First check the distance
|
// First check the distance
|
||||||
// Then the custom condition
|
// Then the custom condition
|
||||||
// And finally check if can interact (heaviest)
|
// And finally check if can interact (heaviest)
|
||||||
if (repeat) { return false; }
|
|
||||||
if (isCompleted) { return true; }
|
if (isCompleted) { return true; }
|
||||||
if (Target == null)
|
if (Target == null)
|
||||||
{
|
{
|
||||||
@@ -155,7 +177,16 @@ namespace Barotrauma
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
bool closeEnough = Vector2.DistanceSquared(Target.WorldPosition, character.WorldPosition) < CloseEnough * CloseEnough;
|
bool closeEnough = Vector2.DistanceSquared(Target.WorldPosition, character.WorldPosition) < CloseEnough * CloseEnough;
|
||||||
if (closeEnough)
|
if (repeat)
|
||||||
|
{
|
||||||
|
if (closeEnough)
|
||||||
|
{
|
||||||
|
character.AIController.SteeringManager.Reset();
|
||||||
|
character.AnimController.TargetDir = Target.WorldPosition.X > character.WorldPosition.X ? Direction.Right : Direction.Left;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (closeEnough)
|
||||||
{
|
{
|
||||||
if (customCondition == null || customCondition())
|
if (customCondition == null || customCondition())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -81,7 +81,11 @@ namespace Barotrauma
|
|||||||
Item.ItemList.FindAll(it => it.Components.Any(ic => ic.GetType() == orderPrefab.ItemComponentType));
|
Item.ItemList.FindAll(it => it.Components.Any(ic => ic.GetType() == orderPrefab.ItemComponentType));
|
||||||
matchingItems.RemoveAll(it => it.Submarine != character.Submarine);
|
matchingItems.RemoveAll(it => it.Submarine != character.Submarine);
|
||||||
var item = matchingItems.GetRandom();
|
var item = matchingItems.GetRandom();
|
||||||
var order = new Order(orderPrefab, item ?? character.CurrentHull as Entity, item?.Components.FirstOrDefault(ic => ic.GetType() == orderPrefab.ItemComponentType));
|
var order = new Order(
|
||||||
|
orderPrefab,
|
||||||
|
item ?? character.CurrentHull as Entity,
|
||||||
|
item?.Components.FirstOrDefault(ic => ic.GetType() == orderPrefab.ItemComponentType),
|
||||||
|
orderGiver: character);
|
||||||
if (order == null) { continue; }
|
if (order == null) { continue; }
|
||||||
var objective = CreateObjective(order, automaticOrder.option, character, automaticOrder.priorityModifier);
|
var objective = CreateObjective(order, automaticOrder.option, character, automaticOrder.priorityModifier);
|
||||||
if (objective != null)
|
if (objective != null)
|
||||||
@@ -198,6 +202,10 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
CurrentObjective?.TryComplete(deltaTime);
|
CurrentObjective?.TryComplete(deltaTime);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
character.AIController.SteeringManager.Reset();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetOrder(AIObjective objective)
|
public void SetOrder(AIObjective objective)
|
||||||
@@ -231,7 +239,8 @@ namespace Barotrauma
|
|||||||
CloseEnough = 150,
|
CloseEnough = 150,
|
||||||
AllowGoingOutside = true,
|
AllowGoingOutside = true,
|
||||||
IgnoreIfTargetDead = true,
|
IgnoreIfTargetDead = true,
|
||||||
FollowControlledCharacter = orderGiver == character
|
followControlledCharacter = orderGiver == character,
|
||||||
|
mimic = true
|
||||||
};
|
};
|
||||||
break;
|
break;
|
||||||
case "wait":
|
case "wait":
|
||||||
@@ -250,7 +259,7 @@ namespace Barotrauma
|
|||||||
newObjective = new AIObjectiveRescueAll(character, this, priorityModifier);
|
newObjective = new AIObjectiveRescueAll(character, this, priorityModifier);
|
||||||
break;
|
break;
|
||||||
case "repairsystems":
|
case "repairsystems":
|
||||||
newObjective = new AIObjectiveRepairItems(character, this, priorityModifier) { RequireAdequateSkills = option != "all" };
|
newObjective = new AIObjectiveRepairItems(character, this, priorityModifier) { RequireAdequateSkills = option == "jobspecific" };
|
||||||
break;
|
break;
|
||||||
case "pumpwater":
|
case "pumpwater":
|
||||||
newObjective = new AIObjectivePumpWater(character, this, option, priorityModifier: priorityModifier);
|
newObjective = new AIObjectivePumpWater(character, this, option, priorityModifier: priorityModifier);
|
||||||
|
|||||||
@@ -68,6 +68,12 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
if (character.CanInteractWith(target.Item, out _, checkLinked: false))
|
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)
|
if (character.SelectedConstruction != target.Item)
|
||||||
{
|
{
|
||||||
target.Item.TryInteract(character, false, true);
|
target.Item.TryInteract(character, false, true);
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
using Microsoft.Xna.Framework;
|
using Microsoft.Xna.Framework;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
namespace Barotrauma
|
namespace Barotrauma
|
||||||
@@ -17,13 +16,22 @@ namespace Barotrauma
|
|||||||
private readonly Character targetCharacter;
|
private readonly Character targetCharacter;
|
||||||
|
|
||||||
private AIObjectiveGoTo goToObjective;
|
private AIObjectiveGoTo goToObjective;
|
||||||
|
|
||||||
private float treatmentTimer;
|
private float treatmentTimer;
|
||||||
|
private Hull safeHull;
|
||||||
|
|
||||||
public AIObjectiveRescue(Character character, Character targetCharacter, AIObjectiveManager objectiveManager, float priorityModifier = 1)
|
public AIObjectiveRescue(Character character, Character targetCharacter, AIObjectiveManager objectiveManager, float priorityModifier = 1)
|
||||||
: base(character, objectiveManager, priorityModifier)
|
: base(character, objectiveManager, priorityModifier)
|
||||||
{
|
{
|
||||||
if (targetCharacter != character)
|
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)
|
||||||
{
|
{
|
||||||
// TODO: enable healing self too
|
// TODO: enable healing self too
|
||||||
abandon = true;
|
abandon = true;
|
||||||
@@ -40,6 +48,11 @@ namespace Barotrauma
|
|||||||
|
|
||||||
protected override void Act(float deltaTime)
|
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
|
// 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)
|
if (targetCharacter.IsUnconscious && HumanAIController.GetHullSafety(targetCharacter.CurrentHull, targetCharacter) < HumanAIController.HULL_SAFETY_THRESHOLD)
|
||||||
{
|
{
|
||||||
@@ -71,15 +84,22 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
goToObjective = null;
|
goToObjective = null;
|
||||||
}
|
}
|
||||||
var findSafety = objectiveManager.GetObjective<AIObjectiveFindSafety>();
|
if (safeHull == null)
|
||||||
if (findSafety == null)
|
|
||||||
{
|
{
|
||||||
// Ensure that we have the find safety objective (should always be the case)
|
var findSafety = objectiveManager.GetObjective<AIObjectiveFindSafety>();
|
||||||
objectiveManager.AddObjective(new AIObjectiveFindSafety(character, objectiveManager));
|
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));
|
||||||
}
|
}
|
||||||
TryAddSubObjective(ref goToObjective, () => new AIObjectiveGoTo(findSafety.FindBestHull(HumanAIController.VisibleHulls), character, objectiveManager));
|
|
||||||
}
|
}
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (subObjectives.Any()) { return; }
|
if (subObjectives.Any()) { return; }
|
||||||
@@ -207,13 +227,19 @@ namespace Barotrauma
|
|||||||
|
|
||||||
public override bool IsCompleted()
|
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);
|
bool isCompleted = targetCharacter.Bleeding <= 0 && targetCharacter.Vitality / targetCharacter.MaxVitality > AIObjectiveRescueAll.GetVitalityThreshold(objectiveManager);
|
||||||
if (isCompleted)
|
if (isCompleted)
|
||||||
{
|
{
|
||||||
character.Speak(TextManager.Get("DialogTargetHealed").Replace("[targetname]", targetCharacter.Name),
|
character.Speak(TextManager.Get("DialogTargetHealed").Replace("[targetname]", targetCharacter.Name),
|
||||||
null, 1.0f, "targethealed" + targetCharacter.Name, 60.0f);
|
null, 1.0f, "targethealed" + targetCharacter.Name, 60.0f);
|
||||||
}
|
}
|
||||||
return isCompleted || targetCharacter.Removed || targetCharacter.IsDead;
|
return isCompleted || targetCharacter.IsDead;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override float GetPriority()
|
public override float GetPriority()
|
||||||
|
|||||||
@@ -39,7 +39,9 @@ namespace Barotrauma
|
|||||||
public Entity TargetEntity;
|
public Entity TargetEntity;
|
||||||
public ItemComponent TargetItemComponent;
|
public ItemComponent TargetItemComponent;
|
||||||
public readonly bool UseController;
|
public readonly bool UseController;
|
||||||
public Controller ConnectedController;
|
public Controller ConnectedController;
|
||||||
|
|
||||||
|
public Character OrderGiver;
|
||||||
|
|
||||||
public readonly string[] AppropriateJobs;
|
public readonly string[] AppropriateJobs;
|
||||||
public readonly string[] Options;
|
public readonly string[] Options;
|
||||||
@@ -120,7 +122,7 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Order(Order prefab, Entity targetEntity, ItemComponent targetItem)
|
public Order(Order prefab, Entity targetEntity, ItemComponent targetItem, Character orderGiver = null)
|
||||||
{
|
{
|
||||||
Prefab = prefab;
|
Prefab = prefab;
|
||||||
|
|
||||||
@@ -134,6 +136,7 @@ namespace Barotrauma
|
|||||||
TargetAllCharacters = prefab.TargetAllCharacters;
|
TargetAllCharacters = prefab.TargetAllCharacters;
|
||||||
AppropriateJobs = prefab.AppropriateJobs;
|
AppropriateJobs = prefab.AppropriateJobs;
|
||||||
FadeOutTime = prefab.FadeOutTime;
|
FadeOutTime = prefab.FadeOutTime;
|
||||||
|
OrderGiver = orderGiver;
|
||||||
|
|
||||||
TargetEntity = targetEntity;
|
TargetEntity = targetEntity;
|
||||||
if (targetItem != null)
|
if (targetItem != null)
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ namespace Barotrauma
|
|||||||
|
|
||||||
public Vector2 Position
|
public Vector2 Position
|
||||||
{
|
{
|
||||||
get {return position;}
|
get { return position; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public PathNode(WayPoint wayPoint)
|
public PathNode(WayPoint wayPoint)
|
||||||
@@ -165,8 +165,8 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
Vector2 nodePos = node.Position;
|
Vector2 nodePos = node.Position;
|
||||||
|
|
||||||
float xDiff = System.Math.Abs(start.X - nodePos.X);
|
float xDiff = Math.Abs(start.X - nodePos.X);
|
||||||
float yDiff = System.Math.Abs(start.Y - nodePos.Y);
|
float yDiff = Math.Abs(start.Y - nodePos.Y);
|
||||||
|
|
||||||
if (yDiff > 1.0f && node.Waypoint.Ladders == null && node.Waypoint.Stairs == null)
|
if (yDiff > 1.0f && node.Waypoint.Ladders == null && node.Waypoint.Stairs == null)
|
||||||
{
|
{
|
||||||
@@ -190,7 +190,7 @@ namespace Barotrauma
|
|||||||
|
|
||||||
if (body != null)
|
if (body != null)
|
||||||
{
|
{
|
||||||
if (body.UserData is Submarine) continue;
|
//if (body.UserData is Submarine) continue;
|
||||||
if (body.UserData is Structure && !((Structure)body.UserData).IsPlatform) continue;
|
if (body.UserData is Structure && !((Structure)body.UserData).IsPlatform) continue;
|
||||||
if (body.UserData is Item && body.FixtureList[0].CollisionCategories.HasFlag(Physics.CollisionWall)) continue;
|
if (body.UserData is Item && body.FixtureList[0].CollisionCategories.HasFlag(Physics.CollisionWall)) continue;
|
||||||
}
|
}
|
||||||
@@ -216,7 +216,7 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
Vector2 nodePos = node.Position;
|
Vector2 nodePos = node.Position;
|
||||||
|
|
||||||
float dist = Vector2.Distance(end, nodePos);
|
float dist = Vector2.DistanceSquared(end, nodePos);
|
||||||
if (insideSubmarine)
|
if (insideSubmarine)
|
||||||
{
|
{
|
||||||
//much higher cost to waypoints that are outside
|
//much higher cost to waypoints that are outside
|
||||||
@@ -229,19 +229,12 @@ namespace Barotrauma
|
|||||||
//if searching for a path inside the sub, make sure the waypoint is visible
|
//if searching for a path inside the sub, make sure the waypoint is visible
|
||||||
if (insideSubmarine)
|
if (insideSubmarine)
|
||||||
{
|
{
|
||||||
// Doesn't seem to work
|
|
||||||
//var body = Submarine.CheckVisibility(end, node.Waypoint.SimPosition);
|
|
||||||
//if (body != null && body.UserData is Structure)
|
|
||||||
//{
|
|
||||||
// continue;
|
|
||||||
//}
|
|
||||||
|
|
||||||
var body = Submarine.PickBody(end, node.Waypoint.SimPosition, null,
|
var body = Submarine.PickBody(end, node.Waypoint.SimPosition, null,
|
||||||
Physics.CollisionWall | Physics.CollisionLevel | Physics.CollisionStairs );
|
Physics.CollisionWall | Physics.CollisionLevel | Physics.CollisionStairs );
|
||||||
|
|
||||||
if (body != null)
|
if (body != null)
|
||||||
{
|
{
|
||||||
if (body.UserData is Submarine) continue;
|
//if (body.UserData is Submarine) continue;
|
||||||
if (body.UserData is Structure && !((Structure)body.UserData).IsPlatform) continue;
|
if (body.UserData is Structure && !((Structure)body.UserData).IsPlatform) continue;
|
||||||
if (body.UserData is Item && body.FixtureList[0].CollisionCategories.HasFlag(Physics.CollisionWall)) continue;
|
if (body.UserData is Item && body.FixtureList[0].CollisionCategories.HasFlag(Physics.CollisionWall)) continue;
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
using FarseerPhysics.Dynamics;
|
using FarseerPhysics.Dynamics;
|
||||||
using Microsoft.Xna.Framework;
|
using Microsoft.Xna.Framework;
|
||||||
using System;
|
using System;
|
||||||
|
using FarseerPhysics;
|
||||||
|
using Barotrauma.Extensions;
|
||||||
|
|
||||||
namespace Barotrauma
|
namespace Barotrauma
|
||||||
{
|
{
|
||||||
@@ -43,9 +45,9 @@ namespace Barotrauma
|
|||||||
steering += DoSteeringWander(weight);
|
steering += DoSteeringWander(weight);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SteeringAvoid(float deltaTime, float lookAheadDistance, float weight = 1)
|
public void SteeringAvoid(float deltaTime, float lookAheadDistance, float weight = 1, Vector2? heading = null)
|
||||||
{
|
{
|
||||||
steering += DoSteeringAvoid(deltaTime, lookAheadDistance, weight);
|
steering += DoSteeringAvoid(deltaTime, lookAheadDistance, weight, heading);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SteeringManual(float deltaTime, Vector2 velocity)
|
public void SteeringManual(float deltaTime, Vector2 velocity)
|
||||||
@@ -127,10 +129,12 @@ namespace Barotrauma
|
|||||||
return newSteering;
|
return newSteering;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual Vector2 DoSteeringAvoid(float deltaTime, float lookAheadDistance, float weight)
|
protected virtual Vector2 DoSteeringAvoid(float deltaTime, float lookAheadDistance, float weight, Vector2? heading = null)
|
||||||
{
|
{
|
||||||
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;
|
float maxDistance = lookAheadDistance;
|
||||||
if (rayCastTimer <= 0.0f)
|
if (rayCastTimer <= 0.0f)
|
||||||
{
|
{
|
||||||
@@ -144,6 +148,7 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// TODO: Doesn't take items into account (like turrets)
|
||||||
if (closestBody.UserData is Structure closestStructure)
|
if (closestBody.UserData is Structure closestStructure)
|
||||||
{
|
{
|
||||||
Vector2 obstaclePosition = Submarine.LastPickedPosition;
|
Vector2 obstaclePosition = Submarine.LastPickedPosition;
|
||||||
@@ -155,37 +160,45 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
obstaclePosition.X = closestStructure.SimPosition.X;
|
obstaclePosition.X = closestStructure.SimPosition.X;
|
||||||
}
|
}
|
||||||
|
|
||||||
avoidObstaclePos = obstaclePosition;
|
avoidObstaclePos = obstaclePosition;
|
||||||
//avoidSteering = Vector2.Normalize(Submarine.LastPickedPosition - obstaclePosition);
|
|
||||||
}
|
}
|
||||||
/*else if (closestBody.UserData is Item)
|
|
||||||
{
|
|
||||||
avoidSteering = Vector2.Normalize(Submarine.LastPickedPosition - item.SimPosition);
|
|
||||||
}*/
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
avoidObstaclePos = Submarine.LastPickedPosition;
|
avoidObstaclePos = Submarine.LastPickedPosition;
|
||||||
//avoidSteering = Vector2.Normalize(host.SimPosition - Submarine.LastPickedPosition);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rayCastTimer -= deltaTime;
|
rayCastTimer -= deltaTime;
|
||||||
}
|
}
|
||||||
|
if (!avoidObstaclePos.HasValue)
|
||||||
if (!avoidObstaclePos.HasValue) return Vector2.Zero;
|
{
|
||||||
|
return Vector2.Zero;
|
||||||
|
}
|
||||||
Vector2 diff = avoidObstaclePos.Value - host.SimPosition;
|
Vector2 diff = avoidObstaclePos.Value - host.SimPosition;
|
||||||
float dist = diff.Length();
|
float dist = diff.Length();
|
||||||
|
|
||||||
if (dist > maxDistance) return Vector2.Zero;
|
if (dist > maxDistance)
|
||||||
|
{
|
||||||
return -diff * (1.0f - dist / maxDistance) * weight;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1527,7 +1527,7 @@ namespace Barotrauma
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool CanInteractWith(Character c, float maxDist = 200.0f)
|
public bool CanInteractWith(Character c, float maxDist = 200.0f, bool checkVisibility = true)
|
||||||
{
|
{
|
||||||
if (c == this || Removed || !c.Enabled || !c.CanBeSelected) return false;
|
if (c == this || Removed || !c.Enabled || !c.CanBeSelected) return false;
|
||||||
if (!c.CharacterHealth.UseHealthWindow && !c.CanBeDragged && c.onCustomInteract == null) return false;
|
if (!c.CharacterHealth.UseHealthWindow && !c.CanBeDragged && c.onCustomInteract == null) return false;
|
||||||
@@ -1535,7 +1535,7 @@ namespace Barotrauma
|
|||||||
maxDist = ConvertUnits.ToSimUnits(maxDist);
|
maxDist = ConvertUnits.ToSimUnits(maxDist);
|
||||||
if (Vector2.DistanceSquared(SimPosition, c.SimPosition) > maxDist * maxDist) return false;
|
if (Vector2.DistanceSquared(SimPosition, c.SimPosition) > maxDist * maxDist) return false;
|
||||||
|
|
||||||
return true;
|
return checkVisibility ? CanSeeCharacter(c) : true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool CanInteractWith(Item item)
|
public bool CanInteractWith(Item item)
|
||||||
|
|||||||
@@ -240,6 +240,11 @@ namespace Barotrauma
|
|||||||
errorMessages = new List<string>();
|
errorMessages = new List<string>();
|
||||||
foreach (ContentFile file in Files)
|
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))
|
if (!File.Exists(file.Path))
|
||||||
{
|
{
|
||||||
errorMessages.Add("File \"" + file.Path + "\" not found.");
|
errorMessages.Add("File \"" + file.Path + "\" not found.");
|
||||||
|
|||||||
@@ -198,19 +198,26 @@ namespace Barotrauma
|
|||||||
public readonly float TotalTime;
|
public readonly float TotalTime;
|
||||||
|
|
||||||
float timer;
|
float timer;
|
||||||
|
bool ignorePause;
|
||||||
|
|
||||||
public WaitForSeconds(float time)
|
public WaitForSeconds(float time, bool ignorePause = true)
|
||||||
{
|
{
|
||||||
timer = time;
|
timer = time;
|
||||||
TotalTime = time;
|
TotalTime = time;
|
||||||
|
this.ignorePause = ignorePause;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool CheckFinished(float deltaTime)
|
public bool CheckFinished(float deltaTime)
|
||||||
{
|
{
|
||||||
|
#if !SERVER
|
||||||
|
if (ignorePause || !GUI.PauseMenuOpen)
|
||||||
|
{
|
||||||
|
timer -= deltaTime;
|
||||||
|
}
|
||||||
|
#else
|
||||||
timer -= deltaTime;
|
timer -= deltaTime;
|
||||||
return timer<=0.0f;
|
#endif
|
||||||
|
return timer <= 0.0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -83,11 +83,15 @@ namespace Barotrauma
|
|||||||
Commonness = element.GetAttributeInt("commonness", 1);
|
Commonness = element.GetAttributeInt("commonness", 1);
|
||||||
|
|
||||||
SuccessMessage = TextManager.Get("MissionSuccess." + Identifier, true) ?? element.GetAttributeString("successmessage", "Mission completed successfully");
|
SuccessMessage = TextManager.Get("MissionSuccess." + Identifier, true) ?? element.GetAttributeString("successmessage", "Mission completed successfully");
|
||||||
FailureMessage =
|
FailureMessage = TextManager.Get("MissionFailure." + Identifier, true) ?? "";
|
||||||
TextManager.Get("MissionFailure." + Identifier, true) ??
|
if (string.IsNullOrEmpty(FailureMessage) && TextManager.ContainsTag("missionfailed"))
|
||||||
element.GetAttributeString("failuremessage", null) ??
|
{
|
||||||
TextManager.Get("missionfailed", returnNull: true) ??
|
FailureMessage = TextManager.Get("missionfailed", returnNull: true) ?? "";
|
||||||
"";
|
}
|
||||||
|
if (string.IsNullOrEmpty(FailureMessage) && GameMain.Config.Language == "English")
|
||||||
|
{
|
||||||
|
FailureMessage = element.GetAttributeString("failuremessage", "");
|
||||||
|
}
|
||||||
|
|
||||||
SonarLabel = TextManager.Get("MissionSonarLabel." + Identifier, true) ?? element.GetAttributeString("sonarlabel", "");
|
SonarLabel = TextManager.Get("MissionSonarLabel." + Identifier, true) ?? element.GetAttributeString("sonarlabel", "");
|
||||||
|
|
||||||
|
|||||||
@@ -69,6 +69,7 @@ namespace Barotrauma.Extensions
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static Vector2 TransformVector(this Vector2 v, Vector2 up)
|
public static Vector2 TransformVector(this Vector2 v, Vector2 up)
|
||||||
{
|
{
|
||||||
|
up = Vector2.Normalize(up);
|
||||||
return (up * v.Y) + (up.Right() * v.X);
|
return (up * v.Y) + (up.Right() * v.X);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,13 +40,13 @@ namespace Barotrauma
|
|||||||
GameAnalytics.ConfigureBuild(GameMain.Version.ToString()
|
GameAnalytics.ConfigureBuild(GameMain.Version.ToString()
|
||||||
+ (string.IsNullOrEmpty(exeName) ? "Unknown" : exeName) + ":"
|
+ (string.IsNullOrEmpty(exeName) ? "Unknown" : exeName) + ":"
|
||||||
+ ((exeHash?.ShortHash == null) ? "Unknown" : exeHash.ShortHash));
|
+ ((exeHash?.ShortHash == null) ? "Unknown" : exeHash.ShortHash));
|
||||||
|
GameAnalytics.ConfigureAvailableCustomDimensions01("singleplayer", "multiplayer", "editor");
|
||||||
|
|
||||||
|
GameAnalytics.Initialize("a3a073c20982de7c15d21e840e149122", "9010ad9a671233b8d9610d76cec8c897d9ff3ba7");
|
||||||
|
|
||||||
GameAnalytics.AddDesignEvent("Executable:"
|
GameAnalytics.AddDesignEvent("Executable:"
|
||||||
+ (string.IsNullOrEmpty(exeName) ? "Unknown" : exeName) + ":"
|
+ (string.IsNullOrEmpty(exeName) ? "Unknown" : exeName) + ":"
|
||||||
+ ((exeHash?.ShortHash == null) ? "Unknown" : exeHash.ShortHash));
|
+ ((exeHash?.ShortHash == null) ? "Unknown" : exeHash.ShortHash));
|
||||||
|
|
||||||
GameAnalytics.ConfigureAvailableCustomDimensions01("singleplayer", "multiplayer", "editor");
|
|
||||||
GameAnalytics.Initialize("a3a073c20982de7c15d21e840e149122", "9010ad9a671233b8d9610d76cec8c897d9ff3ba7");
|
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ namespace Barotrauma
|
|||||||
|
|
||||||
public bool PauseOnFocusLost { get; set; } = true;
|
public bool PauseOnFocusLost { get; set; } = true;
|
||||||
public bool MuteOnFocusLost { get; set; }
|
public bool MuteOnFocusLost { get; set; }
|
||||||
public bool UseDirectionalVoiceChat { get; set; }
|
public bool UseDirectionalVoiceChat { get; set; } = true;
|
||||||
|
|
||||||
public enum VoiceMode
|
public enum VoiceMode
|
||||||
{
|
{
|
||||||
@@ -206,7 +206,7 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
voiceChatVolume = MathHelper.Clamp(value, 0.0f, 1.0f);
|
voiceChatVolume = MathHelper.Clamp(value, 0.0f, 1.0f);
|
||||||
#if CLIENT
|
#if CLIENT
|
||||||
GameMain.SoundManager?.SetCategoryGainMultiplier("voip", voiceChatVolume);
|
GameMain.SoundManager?.SetCategoryGainMultiplier("voip", voiceChatVolume * 5.0f);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -302,10 +302,6 @@ namespace Barotrauma
|
|||||||
public void SetDefaultBindings(XDocument doc = null, bool legacy = false)
|
public void SetDefaultBindings(XDocument doc = null, bool legacy = false)
|
||||||
{
|
{
|
||||||
keyMapping = new KeyOrMouse[Enum.GetNames(typeof(InputType)).Length];
|
keyMapping = new KeyOrMouse[Enum.GetNames(typeof(InputType)).Length];
|
||||||
keyMapping[(int)InputType.Up] = new KeyOrMouse(Keys.W);
|
|
||||||
keyMapping[(int)InputType.Down] = new KeyOrMouse(Keys.S);
|
|
||||||
keyMapping[(int)InputType.Left] = new KeyOrMouse(Keys.A);
|
|
||||||
keyMapping[(int)InputType.Right] = new KeyOrMouse(Keys.D);
|
|
||||||
keyMapping[(int)InputType.Run] = new KeyOrMouse(Keys.LeftShift);
|
keyMapping[(int)InputType.Run] = new KeyOrMouse(Keys.LeftShift);
|
||||||
keyMapping[(int)InputType.Attack] = new KeyOrMouse(2);
|
keyMapping[(int)InputType.Attack] = new KeyOrMouse(2);
|
||||||
keyMapping[(int)InputType.Crouch] = new KeyOrMouse(Keys.LeftControl);
|
keyMapping[(int)InputType.Crouch] = new KeyOrMouse(Keys.LeftControl);
|
||||||
@@ -319,11 +315,29 @@ namespace Barotrauma
|
|||||||
keyMapping[(int)InputType.RadioChat] = new KeyOrMouse(Keys.R);
|
keyMapping[(int)InputType.RadioChat] = new KeyOrMouse(Keys.R);
|
||||||
keyMapping[(int)InputType.CrewOrders] = new KeyOrMouse(Keys.C);
|
keyMapping[(int)InputType.CrewOrders] = new KeyOrMouse(Keys.C);
|
||||||
|
|
||||||
keyMapping[(int)InputType.SelectNextCharacter] = new KeyOrMouse(Keys.Z);
|
|
||||||
keyMapping[(int)InputType.SelectPreviousCharacter] = new KeyOrMouse(Keys.X);
|
|
||||||
|
|
||||||
keyMapping[(int)InputType.Voice] = new KeyOrMouse(Keys.V);
|
keyMapping[(int)InputType.Voice] = new KeyOrMouse(Keys.V);
|
||||||
|
|
||||||
|
if (Language == "French")
|
||||||
|
{
|
||||||
|
keyMapping[(int)InputType.Up] = new KeyOrMouse(Keys.Z);
|
||||||
|
keyMapping[(int)InputType.Down] = new KeyOrMouse(Keys.S);
|
||||||
|
keyMapping[(int)InputType.Left] = new KeyOrMouse(Keys.Q);
|
||||||
|
keyMapping[(int)InputType.Right] = new KeyOrMouse(Keys.D);
|
||||||
|
|
||||||
|
keyMapping[(int)InputType.SelectNextCharacter] = new KeyOrMouse(Keys.X);
|
||||||
|
keyMapping[(int)InputType.SelectPreviousCharacter] = new KeyOrMouse(Keys.W);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
keyMapping[(int)InputType.Up] = new KeyOrMouse(Keys.W);
|
||||||
|
keyMapping[(int)InputType.Down] = new KeyOrMouse(Keys.S);
|
||||||
|
keyMapping[(int)InputType.Left] = new KeyOrMouse(Keys.A);
|
||||||
|
keyMapping[(int)InputType.Right] = new KeyOrMouse(Keys.D);
|
||||||
|
|
||||||
|
keyMapping[(int)InputType.SelectNextCharacter] = new KeyOrMouse(Keys.Z);
|
||||||
|
keyMapping[(int)InputType.SelectPreviousCharacter] = new KeyOrMouse(Keys.X);
|
||||||
|
}
|
||||||
|
|
||||||
if (legacy)
|
if (legacy)
|
||||||
{
|
{
|
||||||
keyMapping[(int)InputType.Use] = new KeyOrMouse(0);
|
keyMapping[(int)InputType.Use] = new KeyOrMouse(0);
|
||||||
@@ -341,33 +355,15 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
foreach (XElement subElement in doc.Root.Elements())
|
foreach (XElement subElement in doc.Root.Elements())
|
||||||
{
|
{
|
||||||
switch (subElement.Name.ToString().ToLowerInvariant())
|
if (subElement.Name.ToString().ToLowerInvariant() == "keymapping")
|
||||||
{
|
{
|
||||||
case "keymapping":
|
LoadKeyBinds(subElement);
|
||||||
foreach (XAttribute attribute in subElement.Attributes())
|
|
||||||
{
|
|
||||||
if (Enum.TryParse(attribute.Name.ToString(), true, out InputType inputType))
|
|
||||||
{
|
|
||||||
if (int.TryParse(attribute.Value.ToString(), out int mouseButton))
|
|
||||||
{
|
|
||||||
keyMapping[(int)inputType] = new KeyOrMouse(mouseButton);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (Enum.TryParse(attribute.Value.ToString(), true, out Keys key))
|
|
||||||
{
|
|
||||||
keyMapping[(int)inputType] = new KeyOrMouse(key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CheckBindings(bool useDefaults)
|
public void CheckBindings(bool useDefaults)
|
||||||
{
|
{
|
||||||
foreach (InputType inputType in Enum.GetValues(typeof(InputType)))
|
foreach (InputType inputType in Enum.GetValues(typeof(InputType)))
|
||||||
{
|
{
|
||||||
@@ -420,11 +416,14 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
|
|
||||||
#region Load DefaultConfig
|
#region Load DefaultConfig
|
||||||
private void LoadDefaultConfig()
|
private void LoadDefaultConfig(bool setLanguage = true)
|
||||||
{
|
{
|
||||||
XDocument doc = XMLExtensions.TryLoadXml(savePath);
|
XDocument doc = XMLExtensions.TryLoadXml(savePath);
|
||||||
|
|
||||||
Language = doc.Root.GetAttributeString("language", "English");
|
if (setLanguage || string.IsNullOrEmpty(Language))
|
||||||
|
{
|
||||||
|
Language = doc.Root.GetAttributeString("language", "English");
|
||||||
|
}
|
||||||
|
|
||||||
MasterServerUrl = doc.Root.GetAttributeString("masterserverurl", "");
|
MasterServerUrl = doc.Root.GetAttributeString("masterserverurl", "");
|
||||||
|
|
||||||
@@ -505,23 +504,7 @@ namespace Barotrauma
|
|||||||
switch (subElement.Name.ToString().ToLowerInvariant())
|
switch (subElement.Name.ToString().ToLowerInvariant())
|
||||||
{
|
{
|
||||||
case "keymapping":
|
case "keymapping":
|
||||||
foreach (XAttribute attribute in subElement.Attributes())
|
LoadKeyBinds(subElement);
|
||||||
{
|
|
||||||
if (Enum.TryParse(attribute.Name.ToString(), true, out InputType inputType))
|
|
||||||
{
|
|
||||||
if (int.TryParse(attribute.Value.ToString(), out int mouseButton))
|
|
||||||
{
|
|
||||||
keyMapping[(int)inputType] = new KeyOrMouse(mouseButton);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (Enum.TryParse(attribute.Value.ToString(), true, out Keys key))
|
|
||||||
{
|
|
||||||
keyMapping[(int)inputType] = new KeyOrMouse(key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case "gameplay":
|
case "gameplay":
|
||||||
jobPreferences = new List<string>();
|
jobPreferences = new List<string>();
|
||||||
@@ -767,6 +750,7 @@ namespace Barotrauma
|
|||||||
if (!fileFound)
|
if (!fileFound)
|
||||||
{
|
{
|
||||||
ShowLanguageSelectionPrompt = true;
|
ShowLanguageSelectionPrompt = true;
|
||||||
|
ShowUserStatisticsPrompt = true;
|
||||||
SaveNewPlayerConfig();
|
SaveNewPlayerConfig();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -859,23 +843,7 @@ namespace Barotrauma
|
|||||||
switch (subElement.Name.ToString().ToLowerInvariant())
|
switch (subElement.Name.ToString().ToLowerInvariant())
|
||||||
{
|
{
|
||||||
case "keymapping":
|
case "keymapping":
|
||||||
foreach (XAttribute attribute in subElement.Attributes())
|
LoadKeyBinds(subElement);
|
||||||
{
|
|
||||||
if (Enum.TryParse(attribute.Name.ToString(), true, out InputType inputType))
|
|
||||||
{
|
|
||||||
if (int.TryParse(attribute.Value.ToString(), out int mouseButton))
|
|
||||||
{
|
|
||||||
keyMapping[(int)inputType] = new KeyOrMouse(mouseButton);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (Enum.TryParse(attribute.Value.ToString(), true, out Keys key))
|
|
||||||
{
|
|
||||||
keyMapping[(int)inputType] = new KeyOrMouse(key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case "gameplay":
|
case "gameplay":
|
||||||
jobPreferences = new List<string>();
|
jobPreferences = new List<string>();
|
||||||
@@ -1189,6 +1157,26 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
private void LoadKeyBinds(XElement element)
|
||||||
|
{
|
||||||
|
foreach (XAttribute attribute in element.Attributes())
|
||||||
|
{
|
||||||
|
if (!Enum.TryParse(attribute.Name.ToString(), true, out InputType inputType)) { continue; }
|
||||||
|
|
||||||
|
if (int.TryParse(attribute.Value.ToString(), out int mouseButton))
|
||||||
|
{
|
||||||
|
keyMapping[(int)inputType] = new KeyOrMouse(mouseButton);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (Enum.TryParse(attribute.Value.ToString(), true, out Keys key))
|
||||||
|
{
|
||||||
|
keyMapping[(int)inputType] = new KeyOrMouse(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void ResetToDefault()
|
public void ResetToDefault()
|
||||||
{
|
{
|
||||||
LoadDefaultConfig();
|
LoadDefaultConfig();
|
||||||
|
|||||||
@@ -168,7 +168,11 @@ namespace Barotrauma.Items.Components
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
FixBody(user, deltaTime, degreeOfSuccess, Submarine.PickBody(rayStart, rayEnd, ignoredBodies, collisionCategories, ignoreSensors: false, allowInsideFixture: true));
|
FixBody(user, deltaTime, degreeOfSuccess,
|
||||||
|
Submarine.PickBody(rayStart, rayEnd,
|
||||||
|
ignoredBodies, collisionCategories, ignoreSensors: false,
|
||||||
|
customPredicate: (Fixture f) => { return f?.Body?.UserData != null; },
|
||||||
|
allowInsideFixture: true));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ExtinguishAmount > 0.0f && item.CurrentHull != null)
|
if (ExtinguishAmount > 0.0f && item.CurrentHull != null)
|
||||||
|
|||||||
@@ -79,9 +79,10 @@ namespace Barotrauma.Items.Components
|
|||||||
|
|
||||||
wires = new Wire[MaxLinked];
|
wires = new Wire[MaxLinked];
|
||||||
|
|
||||||
IsOutput = (element.Name.ToString() == "output");
|
IsOutput = element.Name.ToString() == "output";
|
||||||
Name = element.GetAttributeString("name", (IsOutput) ? "output" : "input");
|
Name = element.GetAttributeString("name", IsOutput ? "output" : "input");
|
||||||
|
|
||||||
|
string displayNameTag = "", fallbackTag = "";
|
||||||
//if displayname is not present, attempt to find it from the prefab
|
//if displayname is not present, attempt to find it from the prefab
|
||||||
if (element.Attribute("displayname") == null)
|
if (element.Attribute("displayname") == null)
|
||||||
{
|
{
|
||||||
@@ -93,26 +94,44 @@ namespace Barotrauma.Items.Components
|
|||||||
{
|
{
|
||||||
if (connectionElement.Name.ToString() != element.Name.ToString()) { continue; }
|
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)
|
if (prefabConnectionName == Name)
|
||||||
{
|
{
|
||||||
DisplayName = TextManager.GetServerMessage(connectionElement.GetAttributeString("displayname", Name));
|
displayNameTag = connectionElement.GetAttributeString("displayname", "");
|
||||||
|
fallbackTag = connectionElement.GetAttributeString("fallbackdisplayname", "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#if DEBUG
|
|
||||||
if (string.IsNullOrEmpty(DisplayName))
|
|
||||||
{
|
|
||||||
DebugConsole.ThrowError("Missing display name in connection " + item.Name + ": " + Name);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DisplayName = TextManager.GetServerMessage(element.GetAttributeString("displayname", Name));
|
displayNameTag = element.GetAttributeString("displayname", "");
|
||||||
|
fallbackTag = element.GetAttributeString("fallbackdisplayname", null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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";
|
IsPower = Name == "power_in" || Name == "power" || Name == "power_out";
|
||||||
|
|
||||||
|
|||||||
@@ -1641,7 +1641,7 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
if (!ic.HasRequiredContainedItems(user == Character.Controlled)) continue;
|
if (!ic.HasRequiredContainedItems(user == Character.Controlled)) continue;
|
||||||
|
|
||||||
bool success = Rand.Range(0.0f, 1.0f) < ic.DegreeOfSuccess(user);
|
bool success = Rand.Range(0.0f, 0.5f) < ic.DegreeOfSuccess(user);
|
||||||
ActionType actionType = success ? ActionType.OnUse : ActionType.OnFailure;
|
ActionType actionType = success ? ActionType.OnUse : ActionType.OnFailure;
|
||||||
|
|
||||||
#if CLIENT
|
#if CLIENT
|
||||||
|
|||||||
@@ -609,8 +609,7 @@ namespace Barotrauma
|
|||||||
foreach (InterestingPosition pos in positionsOfInterest)
|
foreach (InterestingPosition pos in positionsOfInterest)
|
||||||
{
|
{
|
||||||
if (pos.PositionType != PositionType.MainPath || pos.Position.X < 5000 || pos.Position.X > Size.X - 5000) continue;
|
if (pos.PositionType != PositionType.MainPath || pos.Position.X < 5000 || pos.Position.X > Size.X - 5000) continue;
|
||||||
if (Math.Abs(pos.Position.X - StartPosition.X) < 10000) continue;
|
if (Math.Abs(pos.Position.X - StartPosition.X) < minWidth * 2 || Math.Abs(pos.Position.X - EndPosition.X) < minWidth * 2) continue;
|
||||||
if (Math.Abs(pos.Position.Y - StartPosition.Y) < 10000) continue;
|
|
||||||
if (GetTooCloseCells(pos.Position.ToVector2(), minWidth * 0.7f).Count > 0) continue;
|
if (GetTooCloseCells(pos.Position.ToVector2(), minWidth * 0.7f).Count > 0) continue;
|
||||||
iceChunkPositions.Add(pos.Position);
|
iceChunkPositions.Add(pos.Position);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -300,7 +300,11 @@ namespace Barotrauma
|
|||||||
TextureScale = sp.TextureScale;
|
TextureScale = sp.TextureScale;
|
||||||
#endif
|
#endif
|
||||||
spriteColor = prefab.SpriteColor;
|
spriteColor = prefab.SpriteColor;
|
||||||
if (ResizeHorizontal && !ResizeVertical)
|
if (sp.IsHorizontal.HasValue)
|
||||||
|
{
|
||||||
|
IsHorizontal = sp.IsHorizontal.Value;
|
||||||
|
}
|
||||||
|
else if (ResizeHorizontal && !ResizeVertical)
|
||||||
{
|
{
|
||||||
IsHorizontal = true;
|
IsHorizontal = true;
|
||||||
}
|
}
|
||||||
@@ -345,7 +349,7 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Only add ai targets automatically to submarine/outpost walls
|
// Only add ai targets automatically to submarine/outpost walls
|
||||||
if (aiTarget == null && HasBody && Tags.Contains("wall") && submarine != null)
|
if (aiTarget == null && HasBody && Tags.Contains("wall") && submarine != null && !Prefab.NoAITarget)
|
||||||
{
|
{
|
||||||
aiTarget = new AITarget(this);
|
aiTarget = new AITarget(this);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -86,6 +86,15 @@ namespace Barotrauma
|
|||||||
private set;
|
private set;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// If null, the orientation is determined automatically based on the dimensions of the structure instances
|
||||||
|
/// </summary>
|
||||||
|
public bool? IsHorizontal
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
private set;
|
||||||
|
}
|
||||||
|
|
||||||
[Serialize(Direction.None, false)]
|
[Serialize(Direction.None, false)]
|
||||||
public Direction StairDirection
|
public Direction StairDirection
|
||||||
{
|
{
|
||||||
@@ -93,6 +102,13 @@ namespace Barotrauma
|
|||||||
private set;
|
private set;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Serialize(false, false)]
|
||||||
|
public bool NoAITarget
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
private set;
|
||||||
|
}
|
||||||
|
|
||||||
public bool CanSpriteFlipX
|
public bool CanSpriteFlipX
|
||||||
{
|
{
|
||||||
get { return canSpriteFlipX; }
|
get { return canSpriteFlipX; }
|
||||||
@@ -168,6 +184,11 @@ namespace Barotrauma
|
|||||||
sp.Tags.Add(tag.Trim().ToLowerInvariant());
|
sp.Tags.Add(tag.Trim().ToLowerInvariant());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (element.Attribute("ishorizontal") != null)
|
||||||
|
{
|
||||||
|
sp.IsHorizontal = element.GetAttributeBool("ishorizontal", false);
|
||||||
|
}
|
||||||
|
|
||||||
foreach (XElement subElement in element.Elements())
|
foreach (XElement subElement in element.Elements())
|
||||||
{
|
{
|
||||||
switch (subElement.Name.ToString())
|
switch (subElement.Name.ToString())
|
||||||
|
|||||||
@@ -602,7 +602,7 @@ namespace Barotrauma
|
|||||||
if (ladderItem != null) Ladders = ladderItem.GetComponent<Ladder>();
|
if (ladderItem != null) Ladders = ladderItem.GetComponent<Ladder>();
|
||||||
}
|
}
|
||||||
|
|
||||||
Body pickedBody = Submarine.PickBody(SimPosition, SimPosition - Vector2.UnitY * 2.0f, null, Physics.CollisionWall | Physics.CollisionStairs);
|
Body pickedBody = Submarine.PickBody(SimPosition, SimPosition - Vector2.UnitY * 2.0f, null, Physics.CollisionStairs);
|
||||||
if (pickedBody != null && pickedBody.UserData is Structure)
|
if (pickedBody != null && pickedBody.UserData is Structure)
|
||||||
{
|
{
|
||||||
Structure structure = (Structure)pickedBody.UserData;
|
Structure structure = (Structure)pickedBody.UserData;
|
||||||
|
|||||||
@@ -98,6 +98,11 @@ namespace Barotrauma
|
|||||||
public readonly AttributeCollection Attributes;
|
public readonly AttributeCollection Attributes;
|
||||||
public readonly Type PropertyType;
|
public readonly Type PropertyType;
|
||||||
|
|
||||||
|
public PropertyInfo PropertyInfo
|
||||||
|
{
|
||||||
|
get { return propertyInfo; }
|
||||||
|
}
|
||||||
|
|
||||||
public SerializableProperty(PropertyDescriptor property, object obj)
|
public SerializableProperty(PropertyDescriptor property, object obj)
|
||||||
{
|
{
|
||||||
Name = property.Name;
|
Name = property.Name;
|
||||||
|
|||||||
@@ -119,23 +119,40 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GameMain.GameSession != null && Character.Controlled != null)
|
if (GameMain.GameSession != null)
|
||||||
{
|
{
|
||||||
if (Character.Controlled.HasEquippedItem("clownmask") &&
|
#if CLIENT
|
||||||
Character.Controlled.HasEquippedItem("clowncostume"))
|
if (Character.Controlled != null) { CheckMidRoundAchievements(Character.Controlled); }
|
||||||
|
#else
|
||||||
|
foreach (Client client in GameMain.Server.ConnectedClients)
|
||||||
{
|
{
|
||||||
UnlockAchievement(Character.Controlled, "clowncostume");
|
if (client.Character != null)
|
||||||
}
|
|
||||||
|
|
||||||
if (Submarine.MainSub != null && Character.Controlled.Submarine == null)
|
|
||||||
{
|
|
||||||
float dist = 500 / Physics.DisplayToRealWorldRatio;
|
|
||||||
if (Vector2.DistanceSquared(Character.Controlled.WorldPosition, Submarine.MainSub.WorldPosition) >
|
|
||||||
dist * dist)
|
|
||||||
{
|
{
|
||||||
UnlockAchievement(Character.Controlled, "crewaway");
|
CheckMidRoundAchievements(client.Character);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#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");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -214,7 +231,8 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (character.HasEquippedItem("clownmask") &&
|
if (character.HasEquippedItem("clownmask") &&
|
||||||
character.HasEquippedItem("clowncostume"))
|
character.HasEquippedItem("clowncostume") &&
|
||||||
|
causeOfDeath.Killer != character)
|
||||||
{
|
{
|
||||||
UnlockAchievement(causeOfDeath.Killer, "killclown");
|
UnlockAchievement(causeOfDeath.Killer, "killclown");
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user