diff --git a/Barotrauma/BarotraumaClient/BarotraumaClient.csproj b/Barotrauma/BarotraumaClient/BarotraumaClient.csproj
deleted file mode 100644
index 116f3c867..000000000
--- a/Barotrauma/BarotraumaClient/BarotraumaClient.csproj
+++ /dev/null
@@ -1,507 +0,0 @@
-
-
-
- ReleaseLinux
- x64
- 8.0.30703
- 2.0
- {008C0F83-E914-4966-9135-EA885059EDD8}
- WinExe
- Properties
- Barotrauma
- Barotrauma
- 512
- false
- v4.5
-
- 0.9.0.0
- publish\
- true
- Disk
- false
- Foreground
- 7
- Days
- false
- false
- true
- 0
- 0.1.0.%2a
- false
- true
-
-
-
-
- ..\BarotraumaShared\Icon.ico
-
-
- true
- ..\bin\ReleaseLinux\
- TRACE;LINUX;CLIENT
- true
- pdbonly
- x64
- MinimumRecommendedRules.ruleset
- true
-
-
- true
- ..\bin\DebugLinux\
- TRACE;LINUX;CLIENT;DEBUG
- full
- x64
- MinimumRecommendedRules.ruleset
- true
-
-
- true
- ..\bin\ReleaseMac\
- TRACE;OSX;CLIENT
- true
- pdbonly
- x64
- MinimumRecommendedRules.ruleset
- true
-
-
- true
- ..\bin\DebugMac\
- TRACE;OSX;CLIENT;DEBUG
- full
- x64
- MinimumRecommendedRules.ruleset
- true
-
-
- true
- ..\bin\ReleaseWindows\
- TRACE;WINDOWS;CLIENT
- true
- pdbonly
- x64
- MinimumRecommendedRules.ruleset
- true
-
-
- true
- ..\bin\DebugWindows\
- TRACE;WINDOWS;CLIENT;DEBUG
- full
- x64
- MinimumRecommendedRules.ruleset
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ..\..\Libraries\NuGet\Concentus.1.1.7\lib\portable-net45+win+wpa81+wp80\Concentus.dll
-
-
- ..\..\Libraries\NuGet\GameAnalytics.Mono.SDK.1.1.12\lib\net45\GameAnalytics.Mono.dll
-
-
- ..\..\Libraries\NuGet\MonoGame.Framework.WindowsDX.3.7.1.189\lib\net45\MonoGame.Framework.dll
-
-
- ..\..\Libraries\NuGet\NLog.4.3.8\lib\net45\NLog.dll
-
-
- ..\..\Libraries\NuGet\nVLC.3.0.0\lib\net40\nVLC.dll
-
-
- ..\..\Libraries\NuGet\NVorbis.0.8.6\lib\net35\NVorbis.dll
-
-
- ..\..\Libraries\NuGet\OpenTK.3.0.1\lib\net20\OpenTK.dll
-
-
-
- ..\..\Libraries\NuGet\RestSharp.105.2.3\lib\net45\RestSharp.dll
-
-
- ..\..\Libraries\NuGet\SharpDX.4.2.0\lib\net45\SharpDX.dll
-
-
- ..\..\Libraries\NuGet\SharpDX.Direct2D1.4.2.0\lib\net45\SharpDX.Direct2D1.dll
-
-
- ..\..\Libraries\NuGet\SharpDX.Direct3D11.4.2.0\lib\net45\SharpDX.Direct3D11.dll
-
-
- ..\..\Libraries\NuGet\SharpDX.Direct3D9.4.2.0\lib\net45\SharpDX.Direct3D9.dll
-
-
- ..\..\Libraries\NuGet\SharpDX.DXGI.4.2.0\lib\net45\SharpDX.DXGI.dll
-
-
- ..\..\Libraries\NuGet\SharpDX.Mathematics.4.2.0\lib\net45\SharpDX.Mathematics.dll
-
-
- ..\..\Libraries\NuGet\SharpDX.MediaFoundation.4.2.0\lib\net45\SharpDX.MediaFoundation.dll
-
-
- ..\..\Libraries\NuGet\SharpDX.XAudio2.4.2.0\lib\net45\SharpDX.XAudio2.dll
-
-
- ..\..\Libraries\NuGet\SharpDX.XInput.4.2.0\lib\net45\SharpDX.XInput.dll
-
-
-
-
- ..\..\Libraries\NuGet\GameAnalytics.Mono.SDK.1.1.12\lib\net45\System.Data.SQLite.dll
-
-
-
-
-
-
- ..\..\Libraries\NuGet\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll
-
-
-
-
-
- ..\..\Libraries\NuGet\MonoGame.Framework.DesktopGL.3.7.1.189\lib\net45\MonoGame.Framework.dll
-
-
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
-
-
- False
- Microsoft .NET Framework 4 %28x86 and x64%29
- true
-
-
- False
- .NET Framework 3.5 SP1 Client Profile
- false
-
-
- False
- .NET Framework 3.5 SP1
- false
-
-
- False
- Windows Installer 4.5
- true
-
-
-
-
- {3af0347c-5a9b-4421-868c-8ee3dbfaebc6}
- Facepunch.Steamworks
-
-
- {3b8f9edb-6e5e-450c-abc2-ec49075d0b50}
- Hyper.ComponentModel
-
-
- {49ba1c69-6104-41ac-a5d8-b54fa9f696e8}
- Lidgren.Network
-
-
- {c293db32-fa42-486d-b128-5a12522fae4e}
- SharpFont
-
-
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}
- Farseer Physics MonoGame
-
-
-
-
-
- PreserveNewest
-
-
-
- PreserveNewest
-
-
-
-
-
-
-
-
- This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Barotrauma/BarotraumaClient/BarotraumaClient.csproj.user b/Barotrauma/BarotraumaClient/BarotraumaClient.csproj.user
deleted file mode 100644
index e376804a0..000000000
--- a/Barotrauma/BarotraumaClient/BarotraumaClient.csproj.user
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
- publish\
-
-
-
-
-
- en-US
- false
- ShowAllFiles
-
-
-
-
-
-
- false
-
-
\ No newline at end of file
diff --git a/Barotrauma/BarotraumaClient/ClientCode.projitems b/Barotrauma/BarotraumaClient/ClientCode.projitems
new file mode 100644
index 000000000..0c41252dd
--- /dev/null
+++ b/Barotrauma/BarotraumaClient/ClientCode.projitems
@@ -0,0 +1,222 @@
+
+
+
+ $(MSBuildAllProjects);$(MSBuildThisFileFullPath)
+ true
+ 51aff563-4982-474d-a92f-50b06db05b3d
+
+
+ ClientCode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Barotrauma/BarotraumaClient/ClientCode.shproj b/Barotrauma/BarotraumaClient/ClientCode.shproj
new file mode 100644
index 000000000..11a289545
--- /dev/null
+++ b/Barotrauma/BarotraumaClient/ClientCode.shproj
@@ -0,0 +1,14 @@
+
+
+
+ 51aff563-4982-474d-a92f-50b06db05b3d
+ 14.0
+ 0.9.0.0
+
+
+
+
+
+
+
+
diff --git a/Barotrauma/BarotraumaClient/Content/Content.mgcb b/Barotrauma/BarotraumaClient/Content/Content.mgcb
new file mode 100644
index 000000000..b23f45db0
--- /dev/null
+++ b/Barotrauma/BarotraumaClient/Content/Content.mgcb
@@ -0,0 +1,51 @@
+
+#----------------------------- Global Properties ----------------------------#
+
+/outputDir:bin/$(Platform)
+/intermediateDir:obj/$(Platform)
+/platform:Windows
+/config:
+/profile:Reach
+/compress:False
+
+#-------------------------------- References --------------------------------#
+
+
+#---------------------------------- Content ---------------------------------#
+
+#begin Effects/blurshader.fx
+/importer:EffectImporter
+/processor:EffectProcessor
+/processorParam:DebugMode=Auto
+/build:Effects/blurshader.fx
+
+#begin Effects/damageshader.fx
+/importer:EffectImporter
+/processor:EffectProcessor
+/processorParam:DebugMode=Auto
+/build:Effects/damageshader.fx
+
+#begin Effects/deformshader.fx
+/importer:EffectImporter
+/processor:EffectProcessor
+/processorParam:DebugMode=Auto
+/build:Effects/deformshader.fx
+
+#begin Effects/losshader.fx
+/importer:EffectImporter
+/processor:EffectProcessor
+/processorParam:DebugMode=Auto
+/build:Effects/losshader.fx
+
+#begin Effects/postprocess.fx
+/importer:EffectImporter
+/processor:EffectProcessor
+/processorParam:DebugMode=Auto
+/build:Effects/postprocess.fx
+
+#begin Effects/watershader.fx
+/importer:EffectImporter
+/processor:EffectProcessor
+/processorParam:DebugMode=Auto
+/build:Effects/watershader.fx
+
diff --git a/Barotrauma/BarotraumaClient/Content/Content_opengl.mgcb b/Barotrauma/BarotraumaClient/Content/Content_opengl.mgcb
new file mode 100644
index 000000000..d89dd6e4e
--- /dev/null
+++ b/Barotrauma/BarotraumaClient/Content/Content_opengl.mgcb
@@ -0,0 +1,51 @@
+
+#----------------------------- Global Properties ----------------------------#
+
+/outputDir:bin/$(Platform)
+/intermediateDir:obj/$(Platform)
+/platform:DesktopGL
+/config:
+/profile:Reach
+/compress:False
+
+#-------------------------------- References --------------------------------#
+
+
+#---------------------------------- Content ---------------------------------#
+
+#begin Effects/blurshader_opengl.fx
+/importer:EffectImporter
+/processor:EffectProcessor
+/processorParam:DebugMode=Auto
+/build:Effects/blurshader_opengl.fx
+
+#begin Effects/damageshader_opengl.fx
+/importer:EffectImporter
+/processor:EffectProcessor
+/processorParam:DebugMode=Auto
+/build:Effects/damageshader_opengl.fx
+
+#begin Effects/deformshader_opengl.fx
+/importer:EffectImporter
+/processor:EffectProcessor
+/processorParam:DebugMode=Auto
+/build:Effects/deformshader_opengl.fx
+
+#begin Effects/losshader_opengl.fx
+/importer:EffectImporter
+/processor:EffectProcessor
+/processorParam:DebugMode=Auto
+/build:Effects/losshader_opengl.fx
+
+#begin Effects/postprocess_opengl.fx
+/importer:EffectImporter
+/processor:EffectProcessor
+/processorParam:DebugMode=Auto
+/build:Effects/postprocess_opengl.fx
+
+#begin Effects/watershader_opengl.fx
+/importer:EffectImporter
+/processor:EffectProcessor
+/processorParam:DebugMode=Auto
+/build:Effects/watershader_opengl.fx
+
diff --git a/Barotrauma/BarotraumaClient/Content/Effects/blurshader.fx b/Barotrauma/BarotraumaClient/Content/Effects/blurshader.fx
new file mode 100644
index 000000000..45c4cd015
--- /dev/null
+++ b/Barotrauma/BarotraumaClient/Content/Effects/blurshader.fx
@@ -0,0 +1,33 @@
+// Pixel shader applies a one dimensional gaussian blur filter.
+// This is used twice by the bloom postprocess, first to
+// blur horizontally, and then again to blur vertically.
+
+sampler TextureSampler : register(s0);
+
+#define SAMPLE_COUNT 15
+
+float2 SampleOffsets[SAMPLE_COUNT];
+float SampleWeights[SAMPLE_COUNT];
+
+
+float4 PixelShaderF(float4 position : SV_Position, float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0
+{
+ float4 c = 0;
+
+ // Combine a number of weighted image filter taps.
+ for (int i = 0; i < SAMPLE_COUNT; i++)
+ {
+ c += tex2D(TextureSampler, texCoord + SampleOffsets[i]) * SampleWeights[i];
+ }
+
+ return c;
+}
+
+
+technique GaussianBlur
+{
+ pass Pass1
+ {
+ PixelShader = compile ps_4_0_level_9_1 PixelShaderF();
+ }
+}
\ No newline at end of file
diff --git a/Barotrauma/BarotraumaClient/Content/Effects/blurshader.xnb b/Barotrauma/BarotraumaClient/Content/Effects/blurshader.xnb
new file mode 100644
index 000000000..4ac67c360
Binary files /dev/null and b/Barotrauma/BarotraumaClient/Content/Effects/blurshader.xnb differ
diff --git a/Barotrauma/BarotraumaClient/Content/Effects/blurshader_opengl.fx b/Barotrauma/BarotraumaClient/Content/Effects/blurshader_opengl.fx
new file mode 100644
index 000000000..14aff9d67
--- /dev/null
+++ b/Barotrauma/BarotraumaClient/Content/Effects/blurshader_opengl.fx
@@ -0,0 +1,33 @@
+// Pixel shader applies a one dimensional gaussian blur filter.
+// This is used twice by the bloom postprocess, first to
+// blur horizontally, and then again to blur vertically.
+
+sampler TextureSampler : register(s0);
+
+#define SAMPLE_COUNT 15
+
+float2 SampleOffsets[SAMPLE_COUNT];
+float SampleWeights[SAMPLE_COUNT];
+
+
+float4 PixelShaderF(float4 position : SV_Position, float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0
+{
+ float4 c = 0;
+
+ // Combine a number of weighted image filter taps.
+ for (int i = 0; i < SAMPLE_COUNT; i++)
+ {
+ c += tex2D(TextureSampler, texCoord + SampleOffsets[i]) * SampleWeights[i];
+ }
+
+ return c;
+}
+
+
+technique GaussianBlur
+{
+ pass Pass1
+ {
+ PixelShader = compile ps_2_0 PixelShaderF();
+ }
+}
\ No newline at end of file
diff --git a/Barotrauma/BarotraumaClient/Content/Effects/blurshader_opengl.xnb b/Barotrauma/BarotraumaClient/Content/Effects/blurshader_opengl.xnb
new file mode 100644
index 000000000..f535068e5
Binary files /dev/null and b/Barotrauma/BarotraumaClient/Content/Effects/blurshader_opengl.xnb differ
diff --git a/Barotrauma/BarotraumaClient/Content/Effects/damageshader.fx b/Barotrauma/BarotraumaClient/Content/Effects/damageshader.fx
new file mode 100644
index 000000000..8444fd9c6
--- /dev/null
+++ b/Barotrauma/BarotraumaClient/Content/Effects/damageshader.fx
@@ -0,0 +1,39 @@
+
+Texture2D xTexture;
+sampler TextureSampler : register (s0) = sampler_state { Texture = ; };
+
+Texture2D xStencil;
+sampler StencilSampler = sampler_state { Texture = ; };
+
+float4 inColor;
+
+float aCutoff;
+float aMultiplier;
+
+float cCutoff;
+float cMultiplier;
+
+float4 main(float4 position : SV_Position, float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0
+{
+ float4 c = xTexture.Sample(TextureSampler, texCoord) * inColor;
+
+ float4 stencilColor = xStencil.Sample(StencilSampler, texCoord);
+
+ float aDiff = stencilColor.a - aCutoff;
+
+ clip(aDiff);
+
+ float cDiff = stencilColor.a - cCutoff;
+
+ return float4(
+ lerp(stencilColor.rgb, c.rgb, clamp(cDiff * cMultiplier, 0.0f, 1.0f)),
+ min(aDiff * aMultiplier, c.a));
+}
+
+technique StencilShader
+{
+ pass Pass1
+ {
+ PixelShader = compile ps_4_0_level_9_1 main();
+ }
+}
diff --git a/Barotrauma/BarotraumaClient/Content/Effects/damageshader.xnb b/Barotrauma/BarotraumaClient/Content/Effects/damageshader.xnb
new file mode 100644
index 000000000..37e87a017
Binary files /dev/null and b/Barotrauma/BarotraumaClient/Content/Effects/damageshader.xnb differ
diff --git a/Barotrauma/BarotraumaClient/Content/Effects/damageshader_opengl.fx b/Barotrauma/BarotraumaClient/Content/Effects/damageshader_opengl.fx
new file mode 100644
index 000000000..c50fe7fb9
--- /dev/null
+++ b/Barotrauma/BarotraumaClient/Content/Effects/damageshader_opengl.fx
@@ -0,0 +1,39 @@
+
+Texture xTexture;
+sampler TextureSampler : register (s0) = sampler_state { Texture = ; };
+
+Texture xStencil;
+sampler StencilSampler = sampler_state { Texture = ; };
+
+float4 inColor;
+
+float aCutoff;
+float aMultiplier;
+
+float cCutoff;
+float cMultiplier;
+
+float4 main(float4 position : SV_Position, float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0
+{
+ float4 c = tex2D(TextureSampler, texCoord) * inColor;
+
+ float4 stencilColor = tex2D(StencilSampler, texCoord);
+
+ float aDiff = stencilColor.a - aCutoff;
+
+ clip(aDiff);
+
+ float cDiff = stencilColor.a - cCutoff;
+
+ return float4(
+ lerp(stencilColor.rgb, c.rgb, clamp(cDiff * cMultiplier, 0.0f, 1.0f)),
+ min(aDiff * aMultiplier, c.a));
+}
+
+technique StencilShader
+{
+ pass Pass1
+ {
+ PixelShader = compile ps_2_0 main();
+ }
+}
diff --git a/Barotrauma/BarotraumaClient/Content/Effects/damageshader_opengl.xnb b/Barotrauma/BarotraumaClient/Content/Effects/damageshader_opengl.xnb
new file mode 100644
index 000000000..f51787721
Binary files /dev/null and b/Barotrauma/BarotraumaClient/Content/Effects/damageshader_opengl.xnb differ
diff --git a/Barotrauma/BarotraumaClient/Content/Effects/deformshader.fx b/Barotrauma/BarotraumaClient/Content/Effects/deformshader.fx
new file mode 100644
index 000000000..bf621efe0
--- /dev/null
+++ b/Barotrauma/BarotraumaClient/Content/Effects/deformshader.fx
@@ -0,0 +1,84 @@
+Texture2D xTexture;
+sampler TextureSampler = sampler_state { Texture = ; };
+
+float4x4 xTransform;
+
+const int MaxDeformResolution = 15 * 15;
+
+float2 deformArray[15 * 15];
+
+int deformArrayWidth;
+int deformArrayHeight;
+
+float2 uvTopLeft;
+float2 uvBottomRight;
+
+float4 tintColor;
+
+struct VertexShaderInput
+{
+ float4 Position : SV_POSITION;
+ float4 Color : COLOR0;
+ float2 TexCoords: TEXCOORD0;
+};
+
+struct VertexShaderOutput
+{
+ float4 Position : SV_POSITION;
+ float4 Color : COLOR0;
+ float2 TexCoords: TEXCOORD0;
+};
+
+VertexShaderOutput mainVS(in VertexShaderInput input)
+{
+ VertexShaderOutput output = (VertexShaderOutput)0;
+
+ float2 normalizedUv = (input.TexCoords - uvTopLeft) / (uvBottomRight - uvTopLeft);
+
+ int2 deformIndexTopLeft =
+ {
+ min(floor(normalizedUv.x * (deformArrayWidth - 1)), deformArrayWidth - 1),
+ min(floor(normalizedUv.y * (deformArrayHeight - 1)), deformArrayHeight - 1)
+ };
+ int2 deformIndexBottomRight =
+ {
+ min(deformIndexTopLeft.x + 1, deformArrayWidth - 1),
+ min(deformIndexTopLeft.y + 1, deformArrayHeight - 1)
+ };
+
+ float2 deformTopLeft = deformArray[deformIndexTopLeft.x + deformIndexTopLeft.y * deformArrayWidth];
+ float2 deformTopRight = deformArray[deformIndexBottomRight.x + deformIndexTopLeft.y * deformArrayWidth];
+ float2 deformBottomLeft = deformArray[deformIndexTopLeft.x + deformIndexBottomRight.y * deformArrayWidth];
+ float2 deformBottomRight = deformArray[deformIndexBottomRight.x + deformIndexBottomRight.y * deformArrayWidth];
+
+ float divX = 1.0 / (deformArrayWidth - 1);
+ float divY = 1.0 / (deformArrayHeight - 1);
+
+ float2 vertexOffset =
+ {
+ lerp(
+ lerp(deformTopLeft, deformTopRight, (normalizedUv.x % divX) / divX),
+ lerp(deformBottomLeft, deformBottomRight, (normalizedUv.x % divX) / divX),
+ (normalizedUv.y % divY) / divY)
+ };
+
+ output.Position = mul(input.Position + float4(vertexOffset, 0, 0), xTransform);
+ output.Color = input.Color * tintColor;
+ output.TexCoords = input.TexCoords;
+
+ return output;
+}
+
+float4 mainPS(VertexShaderOutput input) : COLOR
+{
+ return xTexture.Sample(TextureSampler, input.TexCoords) * input.Color;
+}
+
+technique DeformShader
+{
+ pass Pass1
+ {
+ VertexShader = compile vs_4_0_level_9_1 mainVS();
+ PixelShader = compile ps_4_0_level_9_1 mainPS();
+ }
+}
\ No newline at end of file
diff --git a/Barotrauma/BarotraumaClient/Content/Effects/deformshader.xnb b/Barotrauma/BarotraumaClient/Content/Effects/deformshader.xnb
new file mode 100644
index 000000000..d40fbb220
Binary files /dev/null and b/Barotrauma/BarotraumaClient/Content/Effects/deformshader.xnb differ
diff --git a/Barotrauma/BarotraumaClient/Content/Effects/deformshader_opengl.fx b/Barotrauma/BarotraumaClient/Content/Effects/deformshader_opengl.fx
new file mode 100644
index 000000000..fbf640ede
--- /dev/null
+++ b/Barotrauma/BarotraumaClient/Content/Effects/deformshader_opengl.fx
@@ -0,0 +1,84 @@
+Texture2D xTexture;
+sampler TextureSampler = sampler_state { Texture = ; };
+
+float4x4 xTransform;
+
+static const int MaxDeformResolution = 15 * 15;
+
+float2 deformArray[15 * 15];
+
+int deformArrayWidth;
+int deformArrayHeight;
+
+float2 uvTopLeft;
+float2 uvBottomRight;
+
+float4 tintColor;
+
+struct VertexShaderInput
+{
+ float4 Position : SV_POSITION;
+ float4 Color : COLOR0;
+ float2 TexCoords: TEXCOORD0;
+};
+
+struct VertexShaderOutput
+{
+ float4 Position : SV_POSITION;
+ float4 Color : COLOR0;
+ float2 TexCoords: TEXCOORD0;
+};
+
+VertexShaderOutput mainVS(in VertexShaderInput input)
+{
+ VertexShaderOutput output = (VertexShaderOutput)0;
+
+ float2 normalizedUv = (input.TexCoords - uvTopLeft) / (uvBottomRight - uvTopLeft);
+
+ int2 deformIndexTopLeft =
+ {
+ min(floor(normalizedUv.x * (deformArrayWidth - 1)), deformArrayWidth - 1),
+ min(floor(normalizedUv.y * (deformArrayHeight - 1)), deformArrayHeight - 1)
+ };
+ int2 deformIndexBottomRight =
+ {
+ min(deformIndexTopLeft.x + 1, deformArrayWidth - 1),
+ min(deformIndexTopLeft.y + 1, deformArrayHeight - 1)
+ };
+
+ float2 deformTopLeft = deformArray[deformIndexTopLeft.x + deformIndexTopLeft.y * deformArrayWidth];
+ float2 deformTopRight = deformArray[deformIndexBottomRight.x + deformIndexTopLeft.y * deformArrayWidth];
+ float2 deformBottomLeft = deformArray[deformIndexTopLeft.x + deformIndexBottomRight.y * deformArrayWidth];
+ float2 deformBottomRight = deformArray[deformIndexBottomRight.x + deformIndexBottomRight.y * deformArrayWidth];
+
+ float divX = 1.0 / deformArrayWidth;
+ float divY = 1.0 / deformArrayHeight;
+
+ float2 vertexOffset =
+ {
+ lerp(
+ lerp(deformTopLeft, deformTopRight, (normalizedUv.x % divX) / divX),
+ lerp(deformBottomLeft, deformBottomRight, (normalizedUv.x % divX) / divX),
+ (normalizedUv.y % divY) / divY)
+ };
+
+ output.Position = mul(input.Position + float4(vertexOffset, 0, 0), xTransform);
+ output.Color = input.Color * tintColor;
+ output.TexCoords = input.TexCoords;
+
+ return output;
+}
+
+float4 mainPS(VertexShaderOutput input) : COLOR
+{
+ return xTexture.Sample(TextureSampler, input.TexCoords) * input.Color;
+}
+
+technique DeformShader
+{
+ pass Pass1
+ {
+ VertexShader = compile vs_3_0 mainVS();
+ PixelShader = compile ps_3_0 mainPS();
+ }
+}
\ No newline at end of file
diff --git a/Barotrauma/BarotraumaClient/Content/Effects/deformshader_opengl.xnb b/Barotrauma/BarotraumaClient/Content/Effects/deformshader_opengl.xnb
new file mode 100644
index 000000000..8d926c6ea
Binary files /dev/null and b/Barotrauma/BarotraumaClient/Content/Effects/deformshader_opengl.xnb differ
diff --git a/Barotrauma/BarotraumaClient/Content/Effects/losshader.fx b/Barotrauma/BarotraumaClient/Content/Effects/losshader.fx
new file mode 100644
index 000000000..357e2bad9
--- /dev/null
+++ b/Barotrauma/BarotraumaClient/Content/Effects/losshader.fx
@@ -0,0 +1,30 @@
+
+Texture2D xTexture;
+sampler TextureSampler : register (s0) = sampler_state { Texture = ; };
+
+Texture2D xLosTexture;
+sampler LosSampler = sampler_state { Texture = ; };
+
+float4 main(float4 position : SV_Position, float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0
+{
+ float4 sampleColor = xTexture.Sample(TextureSampler, texCoord);
+ float4 losColor = xLosTexture.Sample(LosSampler, texCoord);
+
+ float obscureAmount = 1.0f - losColor.r;
+
+ float4 outColor = float4(
+ sampleColor.r * color.r,
+ sampleColor.g * color.g,
+ sampleColor.b * color.b,
+ obscureAmount);
+
+ return outColor;
+}
+
+technique LosShader
+{
+ pass Pass1
+ {
+ PixelShader = compile ps_4_0_level_9_1 main();
+ }
+}
diff --git a/Barotrauma/BarotraumaClient/Content/Effects/losshader.xnb b/Barotrauma/BarotraumaClient/Content/Effects/losshader.xnb
new file mode 100644
index 000000000..3d0a76ecb
Binary files /dev/null and b/Barotrauma/BarotraumaClient/Content/Effects/losshader.xnb differ
diff --git a/Barotrauma/BarotraumaClient/Content/Effects/losshader_opengl.fx b/Barotrauma/BarotraumaClient/Content/Effects/losshader_opengl.fx
new file mode 100644
index 000000000..98805c7ca
--- /dev/null
+++ b/Barotrauma/BarotraumaClient/Content/Effects/losshader_opengl.fx
@@ -0,0 +1,30 @@
+
+Texture xTexture;
+sampler TextureSampler : register (s0) = sampler_state { Texture = ; };
+
+Texture xLosTexture;
+sampler LosSampler = sampler_state { Texture = ; };
+
+float4 main(float4 position : SV_Position, float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0
+{
+ float4 sampleColor = tex2D(TextureSampler, texCoord);
+ float4 losColor = tex2D(LosSampler, texCoord);
+
+ float obscureAmount = 1.0f - losColor.r;
+
+ float4 outColor = float4(
+ sampleColor.r * color.r,
+ sampleColor.g * color.g,
+ sampleColor.b * color.b,
+ obscureAmount);
+
+ return outColor;
+}
+
+technique LosShader
+{
+ pass Pass1
+ {
+ PixelShader = compile ps_2_0 main();
+ }
+}
diff --git a/Barotrauma/BarotraumaClient/Content/Effects/losshader_opengl.xnb b/Barotrauma/BarotraumaClient/Content/Effects/losshader_opengl.xnb
new file mode 100644
index 000000000..96032c202
Binary files /dev/null and b/Barotrauma/BarotraumaClient/Content/Effects/losshader_opengl.xnb differ
diff --git a/Barotrauma/BarotraumaClient/Content/Effects/postprocess.fx b/Barotrauma/BarotraumaClient/Content/Effects/postprocess.fx
new file mode 100644
index 000000000..214ba721d
--- /dev/null
+++ b/Barotrauma/BarotraumaClient/Content/Effects/postprocess.fx
@@ -0,0 +1,228 @@
+Texture2D xTexture;
+sampler TextureSampler = sampler_state { Texture = ; };
+
+Texture2D xDistortTexture;
+sampler DistortSampler =
+sampler_state
+{
+ Texture = ;
+ MagFilter = LINEAR;
+ MinFilter = LINEAR;
+ MipFilter = LINEAR;
+ AddressU = WRAP;
+ AddressV = WRAP;
+};
+
+float blurDistance;
+
+float2 distortScale;
+float2 distortUvOffset;
+
+float3 chromaticAberrationStrength;
+
+// Apply radial distortion to the given coordinate.
+float2 radialDistortion(float2 coord, float distortion)
+{
+ float2 cc = coord - 0.5;
+ float dist = dot(cc, cc) * distortion;
+ //return coord * (pos + cc * (1.0 + dist) * dist) / pos;
+ return coord + (dist * dist + dist) * cc;
+}
+
+/*float4 sampleWithChromaticAberration(float2 samplePos)
+{
+ return float4(
+ tex2D(TextureSampler, radialDistortion(samplePos, chromaticAberrationStrength.r)).r,
+ tex2D(TextureSampler, radialDistortion(samplePos, chromaticAberrationStrength.g)).g,
+ tex2D(TextureSampler, radialDistortion(samplePos, chromaticAberrationStrength.b)).b,
+ 1);
+}*/
+float3 sampleChannelsSeparately(float2 samplePosR, float2 samplePosG, float2 samplePosB)
+{
+ return float3(
+ tex2D(TextureSampler, samplePosR).r,
+ tex2D(TextureSampler, samplePosG).g,
+ tex2D(TextureSampler, samplePosB).b);
+}
+
+float3 sampleWithChromaticAberration(float2 samplePos)
+{
+ return float3(
+ tex2D(TextureSampler, radialDistortion(samplePos, chromaticAberrationStrength.r)).r,
+ tex2D(TextureSampler, radialDistortion(samplePos, chromaticAberrationStrength.g)).g,
+ tex2D(TextureSampler, radialDistortion(samplePos, chromaticAberrationStrength.b)).b);
+}
+
+float4 blur(float4 position : SV_Position, float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0
+{
+ float4 sample;
+ sample = tex2D(TextureSampler, float2(texCoord.x + blurDistance, texCoord.y + blurDistance));
+ sample += tex2D(TextureSampler, float2(texCoord.x - blurDistance, texCoord.y - blurDistance));
+ sample += tex2D(TextureSampler, float2(texCoord.x + blurDistance, texCoord.y - blurDistance));
+ sample += tex2D(TextureSampler, float2(texCoord.x - blurDistance, texCoord.y + blurDistance));
+ sample = sample * 0.25f;
+
+ return sample;
+}
+
+float4 distort(float4 position : SV_Position, float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0
+{
+ float4 bumpColor = tex2D(DistortSampler, texCoord + distortUvOffset);
+ bumpColor = (bumpColor + tex2D(DistortSampler, texCoord - distortUvOffset * 2.0f)) * 0.5f;
+
+ float2 samplePos = texCoord;
+
+ samplePos.x += (bumpColor.r - 0.5f) * distortScale.x;
+ samplePos.y += (bumpColor.g - 0.5f) * distortScale.y;
+
+ return tex2D(TextureSampler, samplePos);
+}
+
+float4 blurDistort(float4 position : SV_Position, float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0
+{
+ float4 bumpColor = tex2D(DistortSampler, texCoord + distortUvOffset);
+ bumpColor = (bumpColor + tex2D(DistortSampler, texCoord - distortUvOffset * 2.0f)) * 0.5f;
+
+ float2 samplePos = texCoord;
+
+ samplePos.x += (bumpColor.r - 0.5f) * distortScale.x;
+ samplePos.y += (bumpColor.g - 0.5f) * distortScale.y;
+
+ float4 sample;
+ sample = tex2D(TextureSampler, float2(samplePos.x + blurDistance, samplePos.y + blurDistance));
+ sample += tex2D(TextureSampler, float2(samplePos.x - blurDistance, samplePos.y - blurDistance));
+ sample += tex2D(TextureSampler, float2(samplePos.x + blurDistance, samplePos.y - blurDistance));
+ sample += tex2D(TextureSampler, float2(samplePos.x - blurDistance, samplePos.y + blurDistance));
+
+ sample = sample * 0.25f;
+
+ return sample;
+}
+
+float4 chromaticAberration(float4 position : SV_Position, float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0
+{
+ return float4(sampleWithChromaticAberration(texCoord), 1);
+}
+
+float4 chromaticAberrationDistort(float4 position : SV_Position, float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0
+{
+ float4 bumpColor = tex2D(DistortSampler, texCoord + distortUvOffset);
+ bumpColor = (bumpColor + tex2D(DistortSampler, texCoord - distortUvOffset * 2.0f)) * 0.5f;
+
+ float2 samplePos = texCoord;
+
+ samplePos.x += (bumpColor.r - 0.5f) * distortScale.x;
+ samplePos.y += (bumpColor.g - 0.5f) * distortScale.y;
+
+ return float4(sampleWithChromaticAberration(samplePos), 1);
+}
+
+float4 blurChromaticAberration(float4 position : SV_Position, float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0
+{
+ float2 samplePosR = radialDistortion(texCoord, chromaticAberrationStrength.r);
+ float2 samplePosG = radialDistortion(texCoord, chromaticAberrationStrength.g);
+ float2 samplePosB = radialDistortion(texCoord, chromaticAberrationStrength.b);
+
+ float2 blurTopLeft = -blurDistance;
+ float2 blurTopRight = float2(blurDistance, -blurDistance);
+ float2 blurBottomRight = blurDistance;
+ float2 blurBottomLeft = float2(-blurDistance, blurDistance);
+
+ float3 sample;
+ sample = sampleChannelsSeparately(samplePosR + blurTopLeft, samplePosG + blurTopLeft, samplePosB + blurTopLeft);
+ sample += sampleChannelsSeparately(samplePosR + blurTopRight, samplePosG + blurTopRight, samplePosB + blurTopRight);
+ sample += sampleChannelsSeparately(samplePosR + blurBottomRight, samplePosG + blurBottomRight, samplePosB + blurBottomRight);
+ sample += sampleChannelsSeparately(samplePosR + blurBottomLeft, samplePosG + blurBottomLeft, samplePosB + blurBottomLeft);
+
+ sample = sample * 0.25f;
+
+ return float4(sample, 1);
+}
+
+float4 blurChromaticAberrationDistort(float4 position : SV_Position, float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0
+{
+ float4 bumpColor = tex2D(DistortSampler, texCoord + distortUvOffset);
+ bumpColor = (bumpColor + tex2D(DistortSampler, texCoord - distortUvOffset * 2.0f)) * 0.5f;
+
+ float2 samplePos = texCoord;
+
+ samplePos.x += (bumpColor.r - 0.5f) * distortScale.x;
+ samplePos.y += (bumpColor.g - 0.5f) * distortScale.y;
+
+ float2 samplePosR = radialDistortion(samplePos, chromaticAberrationStrength.r);
+ float2 samplePosG = radialDistortion(samplePos, chromaticAberrationStrength.g);
+ float2 samplePosB = radialDistortion(samplePos, chromaticAberrationStrength.b);
+
+ float2 blurTopLeft = -blurDistance;
+ float2 blurTopRight = float2(blurDistance, -blurDistance);
+ float2 blurBottomRight = blurDistance;
+ float2 blurBottomLeft = float2(-blurDistance, blurDistance);
+
+ float3 sample;
+ sample = sampleChannelsSeparately(samplePosR + blurTopLeft, samplePosG + blurTopLeft, samplePosB + blurTopLeft);
+ sample += sampleChannelsSeparately(samplePosR + blurTopRight, samplePosG + blurTopRight, samplePosB + blurTopRight);
+ sample += sampleChannelsSeparately(samplePosR + blurBottomRight, samplePosG + blurBottomRight, samplePosB + blurBottomRight);
+ sample += sampleChannelsSeparately(samplePosR + blurBottomLeft, samplePosG + blurBottomLeft, samplePosB + blurBottomLeft);
+
+ sample = sample * 0.25f;
+
+ return float4(sample, 1);
+}
+
+technique Distort
+{
+ pass Pass1
+ {
+ PixelShader = compile ps_4_0_level_9_1 distort();
+ }
+}
+
+technique Blur
+{
+ pass Pass1
+ {
+ PixelShader = compile ps_4_0_level_9_1 blur();
+ }
+}
+
+technique BlurDistort
+{
+ pass Pass1
+ {
+ PixelShader = compile ps_4_0_level_9_1 blurDistort();
+ }
+}
+
+technique BlurChromaticAberration
+{
+ pass Pass1
+ {
+ PixelShader = compile ps_4_0_level_9_1 blurChromaticAberration();
+ }
+}
+
+
+technique ChromaticAberration
+{
+ pass Pass1
+ {
+ PixelShader = compile ps_4_0_level_9_1 chromaticAberration();
+ }
+}
+
+technique ChromaticAberrationDistort
+{
+ pass Pass1
+ {
+ PixelShader = compile ps_4_0_level_9_1 chromaticAberrationDistort();
+ }
+}
+
+technique BlurChromaticAberrationDistort
+{
+ pass Pass1
+ {
+ PixelShader = compile ps_4_0_level_9_1 blurChromaticAberrationDistort();
+ }
+}
+
diff --git a/Barotrauma/BarotraumaClient/Content/Effects/postprocess.xnb b/Barotrauma/BarotraumaClient/Content/Effects/postprocess.xnb
new file mode 100644
index 000000000..91cf8a795
Binary files /dev/null and b/Barotrauma/BarotraumaClient/Content/Effects/postprocess.xnb differ
diff --git a/Barotrauma/BarotraumaClient/Content/Effects/postprocess_opengl.fx b/Barotrauma/BarotraumaClient/Content/Effects/postprocess_opengl.fx
new file mode 100644
index 000000000..8941d42ef
--- /dev/null
+++ b/Barotrauma/BarotraumaClient/Content/Effects/postprocess_opengl.fx
@@ -0,0 +1,228 @@
+Texture2D xTexture;
+sampler TextureSampler = sampler_state { Texture = ; };
+
+Texture2D xDistortTexture;
+sampler DistortSampler =
+sampler_state
+{
+ Texture = ;
+ MagFilter = LINEAR;
+ MinFilter = LINEAR;
+ MipFilter = LINEAR;
+ AddressU = WRAP;
+ AddressV = WRAP;
+};
+
+float blurDistance;
+
+float2 distortScale;
+float2 distortUvOffset;
+
+float3 chromaticAberrationStrength;
+
+// Apply radial distortion to the given coordinate.
+float2 radialDistortion(float2 coord, float distortion)
+{
+ float2 cc = coord - 0.5;
+ float dist = dot(cc, cc) * distortion;
+ //return coord * (pos + cc * (1.0 + dist) * dist) / pos;
+ return coord + (dist * dist + dist) * cc;
+}
+
+/*float4 sampleWithChromaticAberration(float2 samplePos)
+{
+ return float4(
+ tex2D(TextureSampler, radialDistortion(samplePos, chromaticAberrationStrength.r)).r,
+ tex2D(TextureSampler, radialDistortion(samplePos, chromaticAberrationStrength.g)).g,
+ tex2D(TextureSampler, radialDistortion(samplePos, chromaticAberrationStrength.b)).b,
+ 1);
+}*/
+float3 sampleChannelsSeparately(float2 samplePosR, float2 samplePosG, float2 samplePosB)
+{
+ return float3(
+ tex2D(TextureSampler, samplePosR).r,
+ tex2D(TextureSampler, samplePosG).g,
+ tex2D(TextureSampler, samplePosB).b);
+}
+
+float3 sampleWithChromaticAberration(float2 samplePos)
+{
+ return float3(
+ tex2D(TextureSampler, radialDistortion(samplePos, chromaticAberrationStrength.r)).r,
+ tex2D(TextureSampler, radialDistortion(samplePos, chromaticAberrationStrength.g)).g,
+ tex2D(TextureSampler, radialDistortion(samplePos, chromaticAberrationStrength.b)).b);
+}
+
+float4 blur(float4 position : SV_Position, float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0
+{
+ float4 sample;
+ sample = tex2D(TextureSampler, float2(texCoord.x + blurDistance, texCoord.y + blurDistance));
+ sample += tex2D(TextureSampler, float2(texCoord.x - blurDistance, texCoord.y - blurDistance));
+ sample += tex2D(TextureSampler, float2(texCoord.x + blurDistance, texCoord.y - blurDistance));
+ sample += tex2D(TextureSampler, float2(texCoord.x - blurDistance, texCoord.y + blurDistance));
+ sample = sample * 0.25f;
+
+ return sample;
+}
+
+float4 distort(float4 position : SV_Position, float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0
+{
+ float4 bumpColor = tex2D(DistortSampler, texCoord + distortUvOffset);
+ bumpColor = (bumpColor + tex2D(DistortSampler, texCoord - distortUvOffset * 2.0f)) * 0.5f;
+
+ float2 samplePos = texCoord;
+
+ samplePos.x += (bumpColor.r - 0.5f) * distortScale.x;
+ samplePos.y += (bumpColor.g - 0.5f) * distortScale.y;
+
+ return tex2D(TextureSampler, samplePos);
+}
+
+float4 blurDistort(float4 position : SV_Position, float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0
+{
+ float4 bumpColor = tex2D(DistortSampler, texCoord + distortUvOffset);
+ bumpColor = (bumpColor + tex2D(DistortSampler, texCoord - distortUvOffset * 2.0f)) * 0.5f;
+
+ float2 samplePos = texCoord;
+
+ samplePos.x += (bumpColor.r - 0.5f) * distortScale.x;
+ samplePos.y += (bumpColor.g - 0.5f) * distortScale.y;
+
+ float4 sample;
+ sample = tex2D(TextureSampler, float2(samplePos.x + blurDistance, samplePos.y + blurDistance));
+ sample += tex2D(TextureSampler, float2(samplePos.x - blurDistance, samplePos.y - blurDistance));
+ sample += tex2D(TextureSampler, float2(samplePos.x + blurDistance, samplePos.y - blurDistance));
+ sample += tex2D(TextureSampler, float2(samplePos.x - blurDistance, samplePos.y + blurDistance));
+
+ sample = sample * 0.25f;
+
+ return sample;
+}
+
+float4 chromaticAberration(float4 position : SV_Position, float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0
+{
+ return float4(sampleWithChromaticAberration(texCoord), 1);
+}
+
+float4 chromaticAberrationDistort(float4 position : SV_Position, float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0
+{
+ float4 bumpColor = tex2D(DistortSampler, texCoord + distortUvOffset);
+ bumpColor = (bumpColor + tex2D(DistortSampler, texCoord - distortUvOffset * 2.0f)) * 0.5f;
+
+ float2 samplePos = texCoord;
+
+ samplePos.x += (bumpColor.r - 0.5f) * distortScale.x;
+ samplePos.y += (bumpColor.g - 0.5f) * distortScale.y;
+
+ return float4(sampleWithChromaticAberration(samplePos), 1);
+}
+
+float4 blurChromaticAberration(float4 position : SV_Position, float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0
+{
+ float2 samplePosR = radialDistortion(texCoord, chromaticAberrationStrength.r);
+ float2 samplePosG = radialDistortion(texCoord, chromaticAberrationStrength.g);
+ float2 samplePosB = radialDistortion(texCoord, chromaticAberrationStrength.b);
+
+ float2 blurTopLeft = -blurDistance;
+ float2 blurTopRight = float2(blurDistance, -blurDistance);
+ float2 blurBottomRight = blurDistance;
+ float2 blurBottomLeft = float2(-blurDistance, blurDistance);
+
+ float3 sample;
+ sample = sampleChannelsSeparately(samplePosR + blurTopLeft, samplePosG + blurTopLeft, samplePosB + blurTopLeft);
+ sample += sampleChannelsSeparately(samplePosR + blurTopRight, samplePosG + blurTopRight, samplePosB + blurTopRight);
+ sample += sampleChannelsSeparately(samplePosR + blurBottomRight, samplePosG + blurBottomRight, samplePosB + blurBottomRight);
+ sample += sampleChannelsSeparately(samplePosR + blurBottomLeft, samplePosG + blurBottomLeft, samplePosB + blurBottomLeft);
+
+ sample = sample * 0.25f;
+
+ return float4(sample, 1);
+}
+
+float4 blurChromaticAberrationDistort(float4 position : SV_Position, float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0
+{
+ float4 bumpColor = tex2D(DistortSampler, texCoord + distortUvOffset);
+ bumpColor = (bumpColor + tex2D(DistortSampler, texCoord - distortUvOffset * 2.0f)) * 0.5f;
+
+ float2 samplePos = texCoord;
+
+ samplePos.x += (bumpColor.r - 0.5f) * distortScale.x;
+ samplePos.y += (bumpColor.g - 0.5f) * distortScale.y;
+
+ float2 samplePosR = radialDistortion(samplePos, chromaticAberrationStrength.r);
+ float2 samplePosG = radialDistortion(samplePos, chromaticAberrationStrength.g);
+ float2 samplePosB = radialDistortion(samplePos, chromaticAberrationStrength.b);
+
+ float2 blurTopLeft = -blurDistance;
+ float2 blurTopRight = float2(blurDistance, -blurDistance);
+ float2 blurBottomRight = blurDistance;
+ float2 blurBottomLeft = float2(-blurDistance, blurDistance);
+
+ float3 sample;
+ sample = sampleChannelsSeparately(samplePosR + blurTopLeft, samplePosG + blurTopLeft, samplePosB + blurTopLeft);
+ sample += sampleChannelsSeparately(samplePosR + blurTopRight, samplePosG + blurTopRight, samplePosB + blurTopRight);
+ sample += sampleChannelsSeparately(samplePosR + blurBottomRight, samplePosG + blurBottomRight, samplePosB + blurBottomRight);
+ sample += sampleChannelsSeparately(samplePosR + blurBottomLeft, samplePosG + blurBottomLeft, samplePosB + blurBottomLeft);
+
+ sample = sample * 0.25f;
+
+ return float4(sample, 1);
+}
+
+technique Distort
+{
+ pass Pass1
+ {
+ PixelShader = compile ps_3_0 distort();
+ }
+}
+
+technique Blur
+{
+ pass Pass1
+ {
+ PixelShader = compile ps_3_0 blur();
+ }
+}
+
+technique BlurDistort
+{
+ pass Pass1
+ {
+ PixelShader = compile ps_3_0 blurDistort();
+ }
+}
+
+technique BlurChromaticAberration
+{
+ pass Pass1
+ {
+ PixelShader = compile ps_3_0 blurChromaticAberration();
+ }
+}
+
+
+technique ChromaticAberration
+{
+ pass Pass1
+ {
+ PixelShader = compile ps_3_0 chromaticAberration();
+ }
+}
+
+technique ChromaticAberrationDistort
+{
+ pass Pass1
+ {
+ PixelShader = compile ps_3_0 chromaticAberrationDistort();
+ }
+}
+
+technique BlurChromaticAberrationDistort
+{
+ pass Pass1
+ {
+ PixelShader = compile ps_3_0 blurChromaticAberrationDistort();
+ }
+}
+
diff --git a/Barotrauma/BarotraumaClient/Content/Effects/postprocess_opengl.xnb b/Barotrauma/BarotraumaClient/Content/Effects/postprocess_opengl.xnb
new file mode 100644
index 000000000..8c8308fcc
Binary files /dev/null and b/Barotrauma/BarotraumaClient/Content/Effects/postprocess_opengl.xnb differ
diff --git a/Barotrauma/BarotraumaClient/Content/Effects/watershader.fx b/Barotrauma/BarotraumaClient/Content/Effects/watershader.fx
new file mode 100644
index 000000000..331e860ec
--- /dev/null
+++ b/Barotrauma/BarotraumaClient/Content/Effects/watershader.fx
@@ -0,0 +1,143 @@
+float xBlurDistance;
+
+Texture2D xWaterBumpMap;
+sampler WaterBumpSampler =
+sampler_state
+{
+ Texture = ;
+ MagFilter = LINEAR;
+ MinFilter = LINEAR;
+ MipFilter = LINEAR;
+ AddressU = WRAP;
+ AddressV = WRAP;
+};
+
+Texture2D xTexture;
+sampler TextureSampler = sampler_state { Texture = ; };
+
+float4x4 xTransform;
+float4x4 xUvTransform;
+
+struct VertexShaderInput
+{
+ float4 Position : SV_POSITION;
+ float4 Color : COLOR0;
+ float2 TexCoords: TEXCOORD0; // added
+};
+
+struct VertexShaderOutput
+{
+ float4 Position : SV_POSITION;
+ float4 Color : COLOR0;
+ float2 TexCoords: TEXCOORD0; // added
+};
+
+
+float xWaveWidth;
+float xWaveHeight;
+float2 xBumpPos;
+float2 xBumpScale;
+
+float2 xUvOffset;
+
+float4 waterColor;
+
+VertexShaderOutput mainVS(in VertexShaderInput input)
+{
+ VertexShaderOutput output = (VertexShaderOutput)0;
+
+ output.Position = mul(input.Position, xTransform);
+ output.Color = input.Color;
+ output.TexCoords = mul(input.Position, xUvTransform).xy;
+
+ return output;
+}
+
+float4 mainPS(VertexShaderOutput input) : COLOR
+{
+ float4 bumpColor = xWaterBumpMap.Sample(WaterBumpSampler, xUvOffset + (input.TexCoords+xBumpPos) * xBumpScale);
+ bumpColor = (bumpColor + xWaterBumpMap.Sample(WaterBumpSampler, xUvOffset + (input.TexCoords-xBumpPos*2) * xBumpScale)) * 0.5f;
+
+ float2 samplePos = input.TexCoords;
+
+ samplePos.x += (bumpColor.r - 0.5f) * xWaveWidth * input.Color.r;
+ samplePos.y += (bumpColor.g - 0.5f) * xWaveHeight * input.Color.g;
+
+ float4 sample = xTexture.Sample(TextureSampler, samplePos);
+
+ sample.a = input.Color.a;
+ sample = lerp(sample, sample * waterColor, input.Color.b);
+
+ return sample;
+}
+
+float4 mainPSBlurred(VertexShaderOutput input) : COLOR
+{
+ float4 bumpColor = xWaterBumpMap.Sample(WaterBumpSampler, xUvOffset + (input.TexCoords + xBumpPos) * xBumpScale);
+ bumpColor = (bumpColor + xWaterBumpMap.Sample(WaterBumpSampler, xUvOffset + (input.TexCoords - xBumpPos * 2) * xBumpScale)) * 0.5f;
+
+ float2 samplePos = input.TexCoords;
+
+ samplePos.x += (bumpColor.r - 0.5f) * xWaveWidth * input.Color.r;
+ samplePos.y += (bumpColor.g - 0.5f) * xWaveHeight * input.Color.g;
+
+ float4 sample;
+ sample = xTexture.Sample(TextureSampler, float2(samplePos.x + xBlurDistance, samplePos.y + xBlurDistance));
+ sample += xTexture.Sample(TextureSampler, float2(samplePos.x - xBlurDistance, samplePos.y - xBlurDistance));
+ sample += xTexture.Sample(TextureSampler, float2(samplePos.x + xBlurDistance, samplePos.y - xBlurDistance));
+ sample += xTexture.Sample(TextureSampler, float2(samplePos.x - xBlurDistance, samplePos.y + xBlurDistance));
+
+ sample = sample * 0.25;
+
+ sample.a = input.Color.a;
+ sample = lerp(sample, sample * waterColor, input.Color.b);
+
+ return sample;
+}
+
+float4 mainPostProcess(float4 position : SV_Position, float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0
+{
+ float4 bumpColor = tex2D(WaterBumpSampler, texCoord + xUvOffset + xBumpPos);
+ bumpColor = (bumpColor + tex2D(WaterBumpSampler, texCoord - xUvOffset * 2.0f + xBumpPos)) * 0.5f;
+
+ float2 samplePos = texCoord;
+
+ samplePos.x += (bumpColor.r - 0.5f) * xWaveWidth;
+ samplePos.y += (bumpColor.g - 0.5f) * xWaveHeight;
+
+ float4 sample;
+ sample = tex2D(TextureSampler, float2(samplePos.x + xBlurDistance, samplePos.y + xBlurDistance));
+ sample += tex2D(TextureSampler, float2(samplePos.x - xBlurDistance, samplePos.y - xBlurDistance));
+ sample += tex2D(TextureSampler, float2(samplePos.x + xBlurDistance, samplePos.y - xBlurDistance));
+ sample += tex2D(TextureSampler, float2(samplePos.x - xBlurDistance, samplePos.y + xBlurDistance));
+
+ sample = sample * 0.25;
+
+ return sample;
+}
+
+technique WaterShader
+{
+ pass Pass1
+ {
+ VertexShader = compile vs_4_0_level_9_1 mainVS();
+ PixelShader = compile ps_4_0_level_9_1 mainPS();
+ }
+}
+
+technique WaterShaderBlurred
+{
+ pass Pass1
+ {
+ VertexShader = compile vs_4_0_level_9_1 mainVS();
+ PixelShader = compile ps_4_0_level_9_1 mainPSBlurred();
+ }
+}
+
+technique WaterShaderPostProcess
+{
+ pass Pass1
+ {
+ PixelShader = compile ps_4_0_level_9_1 mainPostProcess();
+ }
+}
diff --git a/Barotrauma/BarotraumaClient/Content/Effects/watershader.xnb b/Barotrauma/BarotraumaClient/Content/Effects/watershader.xnb
new file mode 100644
index 000000000..680d837b5
Binary files /dev/null and b/Barotrauma/BarotraumaClient/Content/Effects/watershader.xnb differ
diff --git a/Barotrauma/BarotraumaClient/Content/Effects/watershader_opengl.fx b/Barotrauma/BarotraumaClient/Content/Effects/watershader_opengl.fx
new file mode 100644
index 000000000..ddef6b01e
--- /dev/null
+++ b/Barotrauma/BarotraumaClient/Content/Effects/watershader_opengl.fx
@@ -0,0 +1,150 @@
+float xBlurDistance;
+
+Texture xWaterBumpMap;
+sampler WaterBumpSampler =
+sampler_state
+{
+ Texture = ;
+ MagFilter = LINEAR;
+ MinFilter = LINEAR;
+ MipFilter = LINEAR;
+ AddressU = WRAP;
+ AddressV = WRAP;
+};
+
+Texture xTexture;
+sampler TextureSampler = sampler_state { Texture = ; };
+
+float4x4 xTransform;
+float4x4 xUvTransform;
+
+struct VertexShaderInput
+{
+ float4 Position : SV_POSITION;
+ float4 Color : COLOR0;
+ float2 TexCoords: TEXCOORD0; // added
+};
+
+struct VertexShaderOutput
+{
+ float4 Position : SV_POSITION;
+ float4 Color : COLOR0;
+ float2 TexCoords: TEXCOORD0; // added
+};
+
+
+float xWaveWidth;
+float xWaveHeight;
+float2 xBumpPos;
+float2 xBumpScale;
+
+float2 xUvOffset;
+
+float4 waterColor;
+
+VertexShaderOutput mainVS(in VertexShaderInput input)
+{
+ VertexShaderOutput output = (VertexShaderOutput)0;
+
+ output.Position = mul(input.Position, xTransform);
+ output.Color = input.Color;
+ float4 texCoords = mul(input.Position, xUvTransform);
+ float2 texCoords2D = texCoords.xy;
+ //This is to stop the HLSL compiler from optimizing xUvTransform since that crashes MonoGame
+ //Seems to be a known bug, see https://github.com/MonoGame/MonoGame/issues/5628
+ //We should probably send this to them so they have more to work with
+ texCoords2D.x += floor(texCoords.w*0.001);
+ //--------
+ output.TexCoords = texCoords2D;
+
+ return output;
+}
+
+float4 mainPS(VertexShaderOutput input) : COLOR
+{
+ float4 bumpColor = tex2D(WaterBumpSampler, xUvOffset + (input.TexCoords+xBumpPos) * xBumpScale);
+ bumpColor = (bumpColor + tex2D(WaterBumpSampler, xUvOffset + (input.TexCoords-xBumpPos*2) * xBumpScale)) * 0.5f;
+
+ float2 samplePos = input.TexCoords;
+
+ samplePos.x += (bumpColor.r - 0.5f) * xWaveWidth * input.Color.r;
+ samplePos.y += (bumpColor.g - 0.5f) * xWaveHeight * input.Color.g;
+
+ float4 sample = tex2D(TextureSampler, samplePos);
+
+ sample.a = input.Color.a;
+ sample = lerp(sample, sample * waterColor, input.Color.b);
+
+ return sample;
+}
+
+float4 mainPSBlurred(VertexShaderOutput input) : COLOR
+{
+ float4 bumpColor = tex2D(WaterBumpSampler, xUvOffset + (input.TexCoords + xBumpPos) * xBumpScale);
+ bumpColor = (bumpColor + tex2D(WaterBumpSampler, xUvOffset + (input.TexCoords - xBumpPos * 2) * xBumpScale)) * 0.5f;
+
+ float2 samplePos = input.TexCoords;
+
+ samplePos.x += (bumpColor.r - 0.5f) * xWaveWidth * input.Color.r;
+ samplePos.y += (bumpColor.g - 0.5f) * xWaveHeight * input.Color.g;
+
+ float4 sample;
+ sample = tex2D(TextureSampler, float2(samplePos.x + xBlurDistance, samplePos.y + xBlurDistance));
+ sample += tex2D(TextureSampler, float2(samplePos.x - xBlurDistance, samplePos.y - xBlurDistance));
+ sample += tex2D(TextureSampler, float2(samplePos.x + xBlurDistance, samplePos.y - xBlurDistance));
+ sample += tex2D(TextureSampler, float2(samplePos.x - xBlurDistance, samplePos.y + xBlurDistance));
+
+ sample = sample * 0.25;
+
+ sample.a = input.Color.a;
+ sample = lerp(sample, sample * waterColor, input.Color.b);
+
+ return sample;
+}
+
+float4 mainPostProcess(float4 position : SV_Position, float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0
+{
+ float4 bumpColor = tex2D(WaterBumpSampler, texCoord + xUvOffset + xBumpPos);
+ bumpColor = (bumpColor + tex2D(WaterBumpSampler, texCoord - xUvOffset * 2.0f + xBumpPos)) * 0.5f;
+
+ float2 samplePos = texCoord;
+
+ samplePos.x += (bumpColor.r - 0.5f) * xWaveWidth;
+ samplePos.y += (bumpColor.g - 0.5f) * xWaveHeight;
+
+ float4 sample;
+ sample = tex2D(TextureSampler, float2(samplePos.x + xBlurDistance, samplePos.y + xBlurDistance));
+ sample += tex2D(TextureSampler, float2(samplePos.x - xBlurDistance, samplePos.y - xBlurDistance));
+ sample += tex2D(TextureSampler, float2(samplePos.x + xBlurDistance, samplePos.y - xBlurDistance));
+ sample += tex2D(TextureSampler, float2(samplePos.x - xBlurDistance, samplePos.y + xBlurDistance));
+
+ sample = sample * 0.25;
+
+ return sample;
+}
+
+technique WaterShader
+{
+ pass Pass1
+ {
+ VertexShader = compile vs_3_0 mainVS();
+ PixelShader = compile ps_3_0 mainPS();
+ }
+}
+
+technique WaterShaderBlurred
+{
+ pass Pass1
+ {
+ VertexShader = compile vs_3_0 mainVS();
+ PixelShader = compile ps_3_0 mainPSBlurred();
+ }
+}
+
+technique WaterShaderPostProcess
+{
+ pass Pass1
+ {
+ PixelShader = compile ps_3_0 mainPostProcess();
+ }
+}
diff --git a/Barotrauma/BarotraumaClient/Content/Effects/watershader_opengl.xnb b/Barotrauma/BarotraumaClient/Content/Effects/watershader_opengl.xnb
new file mode 100644
index 000000000..eb876abcb
Binary files /dev/null and b/Barotrauma/BarotraumaClient/Content/Effects/watershader_opengl.xnb differ
diff --git a/Barotrauma/BarotraumaClient/LinuxClient.csproj b/Barotrauma/BarotraumaClient/LinuxClient.csproj
new file mode 100644
index 000000000..fe0c40067
--- /dev/null
+++ b/Barotrauma/BarotraumaClient/LinuxClient.csproj
@@ -0,0 +1,203 @@
+
+
+
+ ReleaseLinux
+ x64
+ 8.0.30703
+ 2.0
+ {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}
+ WinExe
+ Properties
+ Barotrauma
+ Barotrauma
+ 512
+ false
+ v4.5
+
+ 0.9.0.0
+ publish\
+ true
+ Disk
+ false
+ Foreground
+ 7
+ Days
+ false
+ false
+ true
+ 0
+ 0.1.0.%2a
+ false
+ true
+
+
+
+
+ ..\BarotraumaShared\Icon.ico
+
+
+ true
+ ..\bin\ReleaseLinux\
+ TRACE;LINUX;CLIENT
+ true
+ pdbonly
+ x64
+ MinimumRecommendedRules.ruleset
+ true
+
+
+ true
+ ..\bin\DebugLinux\
+ TRACE;DEBUG;LINUX;CLIENT
+ full
+ x64
+ MinimumRecommendedRules.ruleset
+ true
+ 0
+
+
+
+
+
+
+ ..\..\Libraries\NuGet\Concentus.1.1.7\lib\portable-net45+win+wpa81+wp80\Concentus.dll
+
+
+ ..\..\Libraries\NuGet\GameAnalytics.Mono.SDK.1.1.12\lib\net45\GameAnalytics.Mono.dll
+
+
+ ..\..\Libraries\NuGet\MonoGame.Framework.DesktopGL.3.7.1.189\lib\net45\MonoGame.Framework.dll
+
+
+ ..\..\Libraries\NuGet\NLog.4.3.8\lib\net45\NLog.dll
+
+
+ ..\..\Libraries\NuGet\nVLC.3.0.0\lib\net40\nVLC.dll
+
+
+ ..\..\Libraries\NuGet\OpenTK.3.0.1\lib\net20\OpenTK.dll
+
+
+ ..\..\Libraries\NuGet\RestSharp.105.2.3\lib\net45\RestSharp.dll
+
+
+
+
+ ..\..\Libraries\NuGet\GameAnalytics.Mono.SDK.1.1.12\lib\net45\System.Data.SQLite.dll
+
+
+
+
+
+
+ ..\..\Libraries\NuGet\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll
+
+
+
+
+
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+
+
+ False
+ Microsoft .NET Framework 4 %28x86 and x64%29
+ true
+
+
+ False
+ .NET Framework 3.5 SP1 Client Profile
+ false
+
+
+ False
+ .NET Framework 3.5 SP1
+ false
+
+
+ False
+ Windows Installer 4.5
+ true
+
+
+
+
+ {3af0347c-5a9b-4421-868c-8ee3dbfaebc6}
+ Facepunch.Steamworks
+
+
+ {0aad36e3-51a5-4a07-ab60-5c8a66bd38b7}
+ Farseer Physics MonoGame DesktopGL
+
+
+ {3b8f9edb-6e5e-450c-abc2-ec49075d0b50}
+ Hyper.ComponentModel
+
+
+ {49ba1c69-6104-41ac-a5d8-b54fa9f696e8}
+ Lidgren.Network
+
+
+ {c293db32-fa42-486d-b128-5a12522fae4e}
+ SharpFont
+
+
+
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+
+
+
+
+
+
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Barotrauma/BarotraumaClient/MacClient.csproj b/Barotrauma/BarotraumaClient/MacClient.csproj
new file mode 100644
index 000000000..a12706abe
--- /dev/null
+++ b/Barotrauma/BarotraumaClient/MacClient.csproj
@@ -0,0 +1,203 @@
+
+
+
+ ReleaseMac
+ x64
+ 8.0.30703
+ 2.0
+ {CC996BB6-3781-4868-B996-07F9CDC936ED}
+ WinExe
+ Properties
+ Barotrauma
+ Barotrauma
+ 512
+ false
+ v4.5
+
+ 0.9.0.0
+ publish\
+ true
+ Disk
+ false
+ Foreground
+ 7
+ Days
+ false
+ false
+ true
+ 0
+ 0.1.0.%2a
+ false
+ true
+
+
+
+
+ ..\BarotraumaShared\Icon.ico
+
+
+ true
+ ..\bin\ReleaseMac\
+ TRACE;OSX;CLIENT
+ true
+ pdbonly
+ x64
+ MinimumRecommendedRules.ruleset
+ true
+
+
+ true
+ ..\bin\DebugMac\
+ TRACE;DEBUG;OSX;CLIENT
+ full
+ x64
+ MinimumRecommendedRules.ruleset
+ true
+ 0
+
+
+
+
+
+
+ ..\..\Libraries\NuGet\Concentus.1.1.7\lib\portable-net45+win+wpa81+wp80\Concentus.dll
+
+
+ ..\..\Libraries\NuGet\GameAnalytics.Mono.SDK.1.1.12\lib\net45\GameAnalytics.Mono.dll
+
+
+ ..\..\Libraries\NuGet\MonoGame.Framework.DesktopGL.3.7.1.189\lib\net45\MonoGame.Framework.dll
+
+
+ ..\..\Libraries\NuGet\NLog.4.3.8\lib\net45\NLog.dll
+
+
+ ..\..\Libraries\NuGet\nVLC.3.0.0\lib\net40\nVLC.dll
+
+
+ ..\..\Libraries\NuGet\OpenTK.3.0.1\lib\net20\OpenTK.dll
+
+
+ ..\..\Libraries\NuGet\RestSharp.105.2.3\lib\net45\RestSharp.dll
+
+
+
+
+ ..\..\Libraries\NuGet\GameAnalytics.Mono.SDK.1.1.12\lib\net45\System.Data.SQLite.dll
+
+
+
+
+
+
+ ..\..\Libraries\NuGet\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll
+
+
+
+
+
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+
+
+ False
+ Microsoft .NET Framework 4 %28x86 and x64%29
+ true
+
+
+ False
+ .NET Framework 3.5 SP1 Client Profile
+ false
+
+
+ False
+ .NET Framework 3.5 SP1
+ false
+
+
+ False
+ Windows Installer 4.5
+ true
+
+
+
+
+ {3af0347c-5a9b-4421-868c-8ee3dbfaebc6}
+ Facepunch.Steamworks
+
+
+ {0aad36e3-51a5-4a07-ab60-5c8a66bd38b7}
+ Farseer Physics MonoGame DesktopGL
+
+
+ {3b8f9edb-6e5e-450c-abc2-ec49075d0b50}
+ Hyper.ComponentModel
+
+
+ {49ba1c69-6104-41ac-a5d8-b54fa9f696e8}
+ Lidgren.Network
+
+
+ {c293db32-fa42-486d-b128-5a12522fae4e}
+ SharpFont
+
+
+
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+
+
+
+
+
+
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Barotrauma/BarotraumaClient/Source/Characters/Animation/HumanoidAnimParams.cs b/Barotrauma/BarotraumaClient/Source/Characters/Animation/HumanoidAnimParams.cs
index 235ca3035..74de4a791 100644
--- a/Barotrauma/BarotraumaClient/Source/Characters/Animation/HumanoidAnimParams.cs
+++ b/Barotrauma/BarotraumaClient/Source/Characters/Animation/HumanoidAnimParams.cs
@@ -26,6 +26,8 @@ namespace Barotrauma
}
}
+#if FALSE
+ //TODO: fix
public void Save()
{
XDocument doc = XMLExtensions.TryLoadXml(filePath);
@@ -44,5 +46,6 @@ namespace Barotrauma
writer.Flush();
}
}
+#endif
}
}
diff --git a/Barotrauma/BarotraumaClient/Source/Characters/Character.cs b/Barotrauma/BarotraumaClient/Source/Characters/Character.cs
index 672fd2872..390c10936 100644
--- a/Barotrauma/BarotraumaClient/Source/Characters/Character.cs
+++ b/Barotrauma/BarotraumaClient/Source/Characters/Character.cs
@@ -119,7 +119,8 @@ namespace Barotrauma
switch (subElement.Name.ToString().ToLowerInvariant())
{
case "sound":
- sounds.Add(new CharacterSound(subElement));
+ var characterSound = new CharacterSound(subElement);
+ if (characterSound.Sound != null) { sounds.Add(characterSound); }
break;
case "damageemitter":
damageEmitters.Add(new ParticleEmitter(subElement));
diff --git a/Barotrauma/BarotraumaClient/Source/Characters/CharacterSound.cs b/Barotrauma/BarotraumaClient/Source/Characters/CharacterSound.cs
index 469e7944e..776525329 100644
--- a/Barotrauma/BarotraumaClient/Source/Characters/CharacterSound.cs
+++ b/Barotrauma/BarotraumaClient/Source/Characters/CharacterSound.cs
@@ -25,7 +25,7 @@ namespace Barotrauma
}
public Sound Sound
{
- get { return roundSound.Sound; }
+ get { return roundSound?.Sound; }
}
public readonly Gender Gender;
diff --git a/Barotrauma/BarotraumaClient/Source/DebugConsole.cs b/Barotrauma/BarotraumaClient/Source/DebugConsole.cs
index 1e124efe2..4ab36dc55 100644
--- a/Barotrauma/BarotraumaClient/Source/DebugConsole.cs
+++ b/Barotrauma/BarotraumaClient/Source/DebugConsole.cs
@@ -2514,6 +2514,555 @@ namespace Barotrauma
TextManager.WriteToCSV();
NPCConversation.WriteToCSV();
}));
+#endif
+
+ commands.Add(new Command("cleanbuild", "", (string[] args) =>
+ {
+ GameMain.Config.MusicVolume = 0.5f;
+ GameMain.Config.SoundVolume = 0.5f;
+ NewMessage("Music and sound volume set to 0.5", Color.Green);
+
+ commands.Add(new Command("camerasettings", "camerasettings [defaultzoom] [zoomsmoothness] [movesmoothness] [minzoom] [maxzoom]: debug command for testing camera settings. The values default to 1.1, 8.0, 8.0, 0.1 and 2.0.", (string[] args) =>
+ {
+ float defaultZoom = Screen.Selected.Cam.DefaultZoom;
+ if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out defaultZoom);
+
+ float zoomSmoothness = Screen.Selected.Cam.ZoomSmoothness;
+ if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out zoomSmoothness);
+ float moveSmoothness = Screen.Selected.Cam.MoveSmoothness;
+ if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out moveSmoothness);
+
+ float minZoom = Screen.Selected.Cam.MinZoom;
+ if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out minZoom);
+ float maxZoom = Screen.Selected.Cam.MaxZoom;
+ if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out maxZoom);
+
+ Screen.Selected.Cam.DefaultZoom = defaultZoom;
+ Screen.Selected.Cam.ZoomSmoothness = zoomSmoothness;
+ Screen.Selected.Cam.MoveSmoothness = moveSmoothness;
+ Screen.Selected.Cam.MinZoom = minZoom;
+ Screen.Selected.Cam.MaxZoom = maxZoom;
+ }));
+
+ commands.Add(new Command("waterparams", "waterparams [distortionscalex] [distortionscaley] [distortionstrengthx] [distortionstrengthy] [bluramount]: default 0.5 0.5 0.5 0.5 1", (string[] args) =>
+ {
+ float distortScaleX = 0.5f, distortScaleY = 0.5f;
+ float distortStrengthX = 0.5f, distortStrengthY = 0.5f;
+ float blurAmount = 0.0f;
+ if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleX);
+ if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleY);
+ if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthX);
+ if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthY);
+ if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out blurAmount);
+ WaterRenderer.DistortionScale = new Vector2(distortScaleX, distortScaleY);
+ WaterRenderer.DistortionStrength = new Vector2(distortStrengthX, distortStrengthY);
+ WaterRenderer.BlurAmount = blurAmount;
+ }));
+
+
+ commands.Add(new Command("refreshrect", "Updates the dimensions of the selected items to match the ones defined in the prefab. Applied only in the subeditor.", (string[] args) =>
+ {
+ //TODO: maybe do this automatically during loading when possible?
+ if (Screen.Selected == GameMain.SubEditorScreen)
+ {
+ if (!MapEntity.SelectedAny)
+ {
+ ThrowError("You have to select item(s) first!");
+ }
+ else
+ {
+ foreach (var mapEntity in MapEntity.SelectedList)
+ {
+ if (mapEntity is Item item)
+ {
+ item.Rect = new Rectangle(item.Rect.X, item.Rect.Y,
+ (int)(item.Prefab.sprite.size.X * item.Prefab.Scale),
+ (int)(item.Prefab.sprite.size.Y * item.Prefab.Scale));
+ }
+ else if (mapEntity is Structure structure)
+ {
+ if (!structure.ResizeHorizontal)
+ {
+ structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y,
+ (int)structure.Prefab.ScaledSize.X,
+ structure.Rect.Height);
+ }
+ if (!structure.ResizeVertical)
+ {
+ structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y,
+ structure.Rect.Width,
+ (int)structure.Prefab.ScaledSize.Y);
+ }
+ }
+ }
+ }
+ }
+ }, isCheat: false));
+#endif
+
+ GameMain.Config.SaveNewPlayerConfig();
+
+ commands.Add(new Command("loadtexts", "loadtexts [sourcefile] [destinationfile]: Loads all lines of text from a given .txt file and inserts them sequientially into the elements of an xml file. If the file paths are omitted, EnglishVanilla.txt and EnglishVanilla.xml are used.", (string[] args) =>
+ {
+ string sourcePath = args.Length > 0 ? args[0] : "Content/Texts/EnglishVanilla.txt";
+ string destinationPath = args.Length > 1 ? args[1] : "Content/Texts/EnglishVanilla.xml";
+
+ string[] lines;
+ try
+ {
+ lines = File.ReadAllLines(sourcePath);
+ }
+ catch (Exception e)
+ {
+ ThrowError("Reading the file \"" + sourcePath + "\" failed.", e);
+ return;
+ }
+ var doc = XMLExtensions.TryLoadXml(destinationPath);
+ int i = 0;
+ foreach (XElement element in doc.Root.Elements())
+ {
+ if (i >= lines.Length)
+ {
+ ThrowError("Error while loading texts to the xml file. The xml has more elements than the number of lines in the text file.");
+ return;
+ }
+ element.Value = lines[i];
+ i++;
+ }
+ doc.Save(destinationPath);
+ },
+ () =>
+ {
+ var files = TextManager.GetTextFiles().Select(f => f.Replace("\\", "/"));
+ return new string[][]
+ {
+ files.Where(f => Path.GetExtension(f)==".txt").ToArray(),
+ files.Where(f => Path.GetExtension(f)==".xml").ToArray()
+ };
+ }));
+
+ commands.Add(new Command("updatetextfile", "updatetextfile [sourcefile] [destinationfile]: Inserts all the xml elements that are only present in the source file into the destination file. Can be used to update outdated translation files more easily.", (string[] args) =>
+ {
+ if (args.Length < 2) return;
+ string sourcePath = args[0];
+ string destinationPath = args[1];
+
+ var sourceDoc = XMLExtensions.TryLoadXml(sourcePath);
+ var destinationDoc = XMLExtensions.TryLoadXml(destinationPath);
+
+ XElement destinationElement = destinationDoc.Root.Elements().First();
+ foreach (XElement element in sourceDoc.Root.Elements())
+ {
+ if (destinationDoc.Root.Element(element.Name) == null)
+ {
+ element.Value = "!!!!!!!!!!!!!" + element.Value;
+ destinationElement.AddAfterSelf(element);
+ }
+ XNode nextNode = destinationElement.NextNode;
+ while ((!(nextNode is XElement) || nextNode == element) && nextNode != null) nextNode = nextNode.NextNode;
+ destinationElement = nextNode as XElement;
+ }
+ destinationDoc.Save(destinationPath);
+ },
+ () =>
+ {
+ var files = TextManager.GetTextFiles().Where(f => Path.GetExtension(f) == ".xml").Select(f => f.Replace("\\", "/")).ToArray();
+ return new string[][]
+ {
+ files,
+ files
+ };
+ }));
+
+ commands.Add(new Command("dumpentitytexts", "dumpentitytexts [filepath]: gets the names and descriptions of all entity prefabs and writes them into a file along with xml tags that can be used in translation files. If the filepath is omitted, the file is written to Content/Texts/EntityTexts.txt", (string[] args) =>
+ {
+ string filePath = args.Length > 0 ? args[0] : "Content/Texts/EntityTexts.txt";
+ List lines = new List();
+ foreach (MapEntityPrefab me in MapEntityPrefab.List)
+ {
+ lines.Add("" + me.Name + "" + me.Identifier + ".Name>");
+ lines.Add("" + me.Description + "" + me.Identifier + ".Description>");
+ }
+ File.WriteAllLines(filePath, lines);
+ }));
+#if DEBUG
+ commands.Add(new Command("checkduplicates", "Checks the given language for duplicate translation keys and writes to file.", (string[] args) =>
+ {
+ if (args.Length != 1) return;
+ TextManager.CheckForDuplicates(args[0]);
+ }));
+
+ commands.Add(new Command("writetocsv", "Writes the default language (English) to a .csv file.", (string[] args) =>
+ {
+ TextManager.WriteToCSV();
+ NPCConversation.WriteToCSV();
+ }));
+#endif
+
+ commands.Add(new Command("cleanbuild", "", (string[] args) =>
+ {
+ GameMain.Config.MusicVolume = 0.5f;
+ GameMain.Config.SoundVolume = 0.5f;
+ NewMessage("Music and sound volume set to 0.5", Color.Green);
+
+ commands.Add(new Command("camerasettings", "camerasettings [defaultzoom] [zoomsmoothness] [movesmoothness] [minzoom] [maxzoom]: debug command for testing camera settings. The values default to 1.1, 8.0, 8.0, 0.1 and 2.0.", (string[] args) =>
+ {
+ float defaultZoom = Screen.Selected.Cam.DefaultZoom;
+ if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out defaultZoom);
+
+ float zoomSmoothness = Screen.Selected.Cam.ZoomSmoothness;
+ if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out zoomSmoothness);
+ float moveSmoothness = Screen.Selected.Cam.MoveSmoothness;
+ if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out moveSmoothness);
+
+ float minZoom = Screen.Selected.Cam.MinZoom;
+ if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out minZoom);
+ float maxZoom = Screen.Selected.Cam.MaxZoom;
+ if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out maxZoom);
+
+ Screen.Selected.Cam.DefaultZoom = defaultZoom;
+ Screen.Selected.Cam.ZoomSmoothness = zoomSmoothness;
+ Screen.Selected.Cam.MoveSmoothness = moveSmoothness;
+ Screen.Selected.Cam.MinZoom = minZoom;
+ Screen.Selected.Cam.MaxZoom = maxZoom;
+ }));
+
+ commands.Add(new Command("waterparams", "waterparams [distortionscalex] [distortionscaley] [distortionstrengthx] [distortionstrengthy] [bluramount]: default 0.5 0.5 0.5 0.5 1", (string[] args) =>
+ {
+ float distortScaleX = 0.5f, distortScaleY = 0.5f;
+ float distortStrengthX = 0.5f, distortStrengthY = 0.5f;
+ float blurAmount = 0.0f;
+ if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleX);
+ if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleY);
+ if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthX);
+ if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthY);
+ if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out blurAmount);
+ WaterRenderer.DistortionScale = new Vector2(distortScaleX, distortScaleY);
+ WaterRenderer.DistortionStrength = new Vector2(distortStrengthX, distortStrengthY);
+ WaterRenderer.BlurAmount = blurAmount;
+ }));
+
+
+ commands.Add(new Command("refreshrect", "Updates the dimensions of the selected items to match the ones defined in the prefab. Applied only in the subeditor.", (string[] args) =>
+ {
+ //TODO: maybe do this automatically during loading when possible?
+ if (Screen.Selected == GameMain.SubEditorScreen)
+ {
+ if (!MapEntity.SelectedAny)
+ {
+ ThrowError("You have to select item(s) first!");
+ }
+ else
+ {
+ foreach (var mapEntity in MapEntity.SelectedList)
+ {
+ if (mapEntity is Item item)
+ {
+ item.Rect = new Rectangle(item.Rect.X, item.Rect.Y,
+ (int)(item.Prefab.sprite.size.X * item.Prefab.Scale),
+ (int)(item.Prefab.sprite.size.Y * item.Prefab.Scale));
+ }
+ else if (mapEntity is Structure structure)
+ {
+ if (!structure.ResizeHorizontal)
+ {
+ structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y,
+ (int)structure.Prefab.ScaledSize.X,
+ structure.Rect.Height);
+ }
+ if (!structure.ResizeVertical)
+ {
+ structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y,
+ structure.Rect.Width,
+ (int)structure.Prefab.ScaledSize.Y);
+ }
+ }
+ }
+ }
+ }
+ }, isCheat: false));
+#endif
+
+ GameMain.Config.SaveNewPlayerConfig();
+
+ commands.Add(new Command("loadtexts", "loadtexts [sourcefile] [destinationfile]: Loads all lines of text from a given .txt file and inserts them sequientially into the elements of an xml file. If the file paths are omitted, EnglishVanilla.txt and EnglishVanilla.xml are used.", (string[] args) =>
+ {
+ string sourcePath = args.Length > 0 ? args[0] : "Content/Texts/EnglishVanilla.txt";
+ string destinationPath = args.Length > 1 ? args[1] : "Content/Texts/EnglishVanilla.xml";
+
+ string[] lines;
+ try
+ {
+ lines = File.ReadAllLines(sourcePath);
+ }
+ catch (Exception e)
+ {
+ ThrowError("Reading the file \"" + sourcePath + "\" failed.", e);
+ return;
+ }
+ var doc = XMLExtensions.TryLoadXml(destinationPath);
+ int i = 0;
+ foreach (XElement element in doc.Root.Elements())
+ {
+ if (i >= lines.Length)
+ {
+ ThrowError("Error while loading texts to the xml file. The xml has more elements than the number of lines in the text file.");
+ return;
+ }
+ element.Value = lines[i];
+ i++;
+ }
+ doc.Save(destinationPath);
+ },
+ () =>
+ {
+ var files = TextManager.GetTextFiles().Select(f => f.Replace("\\", "/"));
+ return new string[][]
+ {
+ files.Where(f => Path.GetExtension(f)==".txt").ToArray(),
+ files.Where(f => Path.GetExtension(f)==".xml").ToArray()
+ };
+ }));
+
+ commands.Add(new Command("updatetextfile", "updatetextfile [sourcefile] [destinationfile]: Inserts all the xml elements that are only present in the source file into the destination file. Can be used to update outdated translation files more easily.", (string[] args) =>
+ {
+ if (args.Length < 2) return;
+ string sourcePath = args[0];
+ string destinationPath = args[1];
+
+ var sourceDoc = XMLExtensions.TryLoadXml(sourcePath);
+ var destinationDoc = XMLExtensions.TryLoadXml(destinationPath);
+
+ XElement destinationElement = destinationDoc.Root.Elements().First();
+ foreach (XElement element in sourceDoc.Root.Elements())
+ {
+ if (destinationDoc.Root.Element(element.Name) == null)
+ {
+ element.Value = "!!!!!!!!!!!!!" + element.Value;
+ destinationElement.AddAfterSelf(element);
+ }
+ XNode nextNode = destinationElement.NextNode;
+ while ((!(nextNode is XElement) || nextNode == element) && nextNode != null) nextNode = nextNode.NextNode;
+ destinationElement = nextNode as XElement;
+ }
+ destinationDoc.Save(destinationPath);
+ },
+ () =>
+ {
+ var files = TextManager.GetTextFiles().Where(f => Path.GetExtension(f) == ".xml").Select(f => f.Replace("\\", "/")).ToArray();
+ return new string[][]
+ {
+ files,
+ files
+ };
+ }));
+
+ commands.Add(new Command("dumpentitytexts", "dumpentitytexts [filepath]: gets the names and descriptions of all entity prefabs and writes them into a file along with xml tags that can be used in translation files. If the filepath is omitted, the file is written to Content/Texts/EntityTexts.txt", (string[] args) =>
+ {
+ string filePath = args.Length > 0 ? args[0] : "Content/Texts/EntityTexts.txt";
+ List lines = new List();
+ foreach (MapEntityPrefab me in MapEntityPrefab.List)
+ {
+ lines.Add("" + me.Name + "" + me.Identifier + ".Name>");
+ lines.Add("" + me.Description + "" + me.Identifier + ".Description>");
+ }
+ File.WriteAllLines(filePath, lines);
+ }));
+#if DEBUG
+ commands.Add(new Command("checkduplicates", "Checks the given language for duplicate translation keys and writes to file.", (string[] args) =>
+ {
+ if (args.Length != 1) return;
+ TextManager.CheckForDuplicates(args[0]);
+ }));
+
+ commands.Add(new Command("writetocsv", "Writes the default language (English) to a .csv file.", (string[] args) =>
+ {
+ TextManager.WriteToCSV();
+ NPCConversation.WriteToCSV();
+ }));
+#endif
+
+ commands.Add(new Command("cleanbuild", "", (string[] args) =>
+ {
+ GameMain.Config.MusicVolume = 0.5f;
+ GameMain.Config.SoundVolume = 0.5f;
+ NewMessage("Music and sound volume set to 0.5", Color.Green);
+
+ commands.Add(new Command("camerasettings", "camerasettings [defaultzoom] [zoomsmoothness] [movesmoothness] [minzoom] [maxzoom]: debug command for testing camera settings. The values default to 1.1, 8.0, 8.0, 0.1 and 2.0.", (string[] args) =>
+ {
+ float defaultZoom = Screen.Selected.Cam.DefaultZoom;
+ if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out defaultZoom);
+
+ float zoomSmoothness = Screen.Selected.Cam.ZoomSmoothness;
+ if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out zoomSmoothness);
+ float moveSmoothness = Screen.Selected.Cam.MoveSmoothness;
+ if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out moveSmoothness);
+
+ float minZoom = Screen.Selected.Cam.MinZoom;
+ if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out minZoom);
+ float maxZoom = Screen.Selected.Cam.MaxZoom;
+ if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out maxZoom);
+
+ Screen.Selected.Cam.DefaultZoom = defaultZoom;
+ Screen.Selected.Cam.ZoomSmoothness = zoomSmoothness;
+ Screen.Selected.Cam.MoveSmoothness = moveSmoothness;
+ Screen.Selected.Cam.MinZoom = minZoom;
+ Screen.Selected.Cam.MaxZoom = maxZoom;
+ }));
+
+ commands.Add(new Command("waterparams", "waterparams [distortionscalex] [distortionscaley] [distortionstrengthx] [distortionstrengthy] [bluramount]: default 0.5 0.5 0.5 0.5 1", (string[] args) =>
+ {
+ float distortScaleX = 0.5f, distortScaleY = 0.5f;
+ float distortStrengthX = 0.5f, distortStrengthY = 0.5f;
+ float blurAmount = 0.0f;
+ if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleX);
+ if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleY);
+ if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthX);
+ if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthY);
+ if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out blurAmount);
+ WaterRenderer.DistortionScale = new Vector2(distortScaleX, distortScaleY);
+ WaterRenderer.DistortionStrength = new Vector2(distortStrengthX, distortStrengthY);
+ WaterRenderer.BlurAmount = blurAmount;
+ }));
+
+
+ commands.Add(new Command("refreshrect", "Updates the dimensions of the selected items to match the ones defined in the prefab. Applied only in the subeditor.", (string[] args) =>
+ {
+ //TODO: maybe do this automatically during loading when possible?
+ if (Screen.Selected == GameMain.SubEditorScreen)
+ {
+ if (!MapEntity.SelectedAny)
+ {
+ ThrowError("You have to select item(s) first!");
+ }
+ else
+ {
+ foreach (var mapEntity in MapEntity.SelectedList)
+ {
+ if (mapEntity is Item item)
+ {
+ item.Rect = new Rectangle(item.Rect.X, item.Rect.Y,
+ (int)(item.Prefab.sprite.size.X * item.Prefab.Scale),
+ (int)(item.Prefab.sprite.size.Y * item.Prefab.Scale));
+ }
+ else if (mapEntity is Structure structure)
+ {
+ if (!structure.ResizeHorizontal)
+ {
+ structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y,
+ (int)structure.Prefab.ScaledSize.X,
+ structure.Rect.Height);
+ }
+ if (!structure.ResizeVertical)
+ {
+ structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y,
+ structure.Rect.Width,
+ (int)structure.Prefab.ScaledSize.Y);
+ }
+ }
+ }
+ }
+ }
+ }, isCheat: false));
+#endif
+
+ GameMain.Config.SaveNewPlayerConfig();
+
+ commands.Add(new Command("loadtexts", "loadtexts [sourcefile] [destinationfile]: Loads all lines of text from a given .txt file and inserts them sequientially into the elements of an xml file. If the file paths are omitted, EnglishVanilla.txt and EnglishVanilla.xml are used.", (string[] args) =>
+ {
+ string sourcePath = args.Length > 0 ? args[0] : "Content/Texts/EnglishVanilla.txt";
+ string destinationPath = args.Length > 1 ? args[1] : "Content/Texts/EnglishVanilla.xml";
+
+ string[] lines;
+ try
+ {
+ lines = File.ReadAllLines(sourcePath);
+ }
+ catch (Exception e)
+ {
+ ThrowError("Reading the file \"" + sourcePath + "\" failed.", e);
+ return;
+ }
+ var doc = XMLExtensions.TryLoadXml(destinationPath);
+ int i = 0;
+ foreach (XElement element in doc.Root.Elements())
+ {
+ if (i >= lines.Length)
+ {
+ ThrowError("Error while loading texts to the xml file. The xml has more elements than the number of lines in the text file.");
+ return;
+ }
+ element.Value = lines[i];
+ i++;
+ }
+ doc.Save(destinationPath);
+ },
+ () =>
+ {
+ var files = TextManager.GetTextFiles().Select(f => f.Replace("\\", "/"));
+ return new string[][]
+ {
+ files.Where(f => Path.GetExtension(f)==".txt").ToArray(),
+ files.Where(f => Path.GetExtension(f)==".xml").ToArray()
+ };
+ }));
+
+ commands.Add(new Command("updatetextfile", "updatetextfile [sourcefile] [destinationfile]: Inserts all the xml elements that are only present in the source file into the destination file. Can be used to update outdated translation files more easily.", (string[] args) =>
+ {
+ if (args.Length < 2) return;
+ string sourcePath = args[0];
+ string destinationPath = args[1];
+
+ var sourceDoc = XMLExtensions.TryLoadXml(sourcePath);
+ var destinationDoc = XMLExtensions.TryLoadXml(destinationPath);
+
+ XElement destinationElement = destinationDoc.Root.Elements().First();
+ foreach (XElement element in sourceDoc.Root.Elements())
+ {
+ if (destinationDoc.Root.Element(element.Name) == null)
+ {
+ element.Value = "!!!!!!!!!!!!!" + element.Value;
+ destinationElement.AddAfterSelf(element);
+ }
+ XNode nextNode = destinationElement.NextNode;
+ while ((!(nextNode is XElement) || nextNode == element) && nextNode != null) nextNode = nextNode.NextNode;
+ destinationElement = nextNode as XElement;
+ }
+ destinationDoc.Save(destinationPath);
+ },
+ () =>
+ {
+ var files = TextManager.GetTextFiles().Where(f => Path.GetExtension(f) == ".xml").Select(f => f.Replace("\\", "/")).ToArray();
+ return new string[][]
+ {
+ files,
+ files
+ };
+ }));
+
+ commands.Add(new Command("dumpentitytexts", "dumpentitytexts [filepath]: gets the names and descriptions of all entity prefabs and writes them into a file along with xml tags that can be used in translation files. If the filepath is omitted, the file is written to Content/Texts/EntityTexts.txt", (string[] args) =>
+ {
+ string filePath = args.Length > 0 ? args[0] : "Content/Texts/EntityTexts.txt";
+ List lines = new List();
+ foreach (MapEntityPrefab me in MapEntityPrefab.List)
+ {
+ lines.Add("" + me.Name + "" + me.Identifier + ".Name>");
+ lines.Add("" + me.Description + "" + me.Identifier + ".Description>");
+ }
+ File.WriteAllLines(filePath, lines);
+ }));
+#if DEBUG
+ commands.Add(new Command("checkduplicates", "Checks the given language for duplicate translation keys and writes to file.", (string[] args) =>
+ {
+ if (args.Length != 1) return;
+ TextManager.CheckForDuplicates(args[0]);
+ }));
+
+ commands.Add(new Command("writetocsv", "Writes the default language (English) to a .csv file.", (string[] args) =>
+ {
+ TextManager.WriteToCSV();
+ NPCConversation.WriteToCSV();
+ }));
commands.Add(new Command("loadtexts", "loadtexts [sourcefile] [destinationfile]: Loads all lines of text from a given .txt file and inserts them sequientially into the elements of an xml file. If the file paths are omitted, EnglishVanilla.txt and EnglishVanilla.xml are used.", (string[] args) =>
{
diff --git a/Barotrauma/BarotraumaClient/Source/GUI/GUI.cs b/Barotrauma/BarotraumaClient/Source/GUI/GUI.cs
index 3b01f8020..7d0daa696 100644
--- a/Barotrauma/BarotraumaClient/Source/GUI/GUI.cs
+++ b/Barotrauma/BarotraumaClient/Source/GUI/GUI.cs
@@ -1580,12 +1580,12 @@ namespace Barotrauma
public static void PlayUISound(GUISoundType soundType)
{
- if (sounds == null) return;
+ if (sounds == null) { return; }
int soundIndex = (int)soundType;
- if (soundIndex < 0 || soundIndex >= sounds.Length) return;
+ if (soundIndex < 0 || soundIndex >= sounds.Length) { return; }
- sounds[soundIndex].Play(null, "ui");
+ sounds[soundIndex]?.Play(null, "ui");
}
#endregion
}
diff --git a/Barotrauma/BarotraumaClient/Source/GameSession/CrewManager.cs b/Barotrauma/BarotraumaClient/Source/GameSession/CrewManager.cs
index 870f3d553..bb67baa90 100644
--- a/Barotrauma/BarotraumaClient/Source/GameSession/CrewManager.cs
+++ b/Barotrauma/BarotraumaClient/Source/GameSession/CrewManager.cs
@@ -95,21 +95,54 @@ namespace Barotrauma
}
}
+ var reports = Order.PrefabList.FindAll(o => o.TargetAllCharacters && o.SymbolSprite != null);
+ reportButtonFrame = new GUILayoutGroup(new RectTransform(
+ new Point((HUDLayoutSettings.CrewArea.Height - (int)((reports.Count - 1) * 5 * GUI.Scale)) / reports.Count, HUDLayoutSettings.CrewArea.Height), guiFrame.RectTransform))
+ {
+ AbsoluteSpacing = (int)(5 * GUI.Scale),
+ UserData = "reportbuttons",
+ CanBeFocused = false
+ };
+
+ //report buttons
+ foreach (Order order in reports)
+ {
+ if (!order.TargetAllCharacters || order.SymbolSprite == null) continue;
+ var btn = new GUIButton(new RectTransform(new Point(reportButtonFrame.Rect.Width), reportButtonFrame.RectTransform), style: null)
+ {
+ OnClicked = (GUIButton button, object userData) =>
+ {
+ if (Character.Controlled == null || Character.Controlled.SpeechImpediment >= 100.0f) return false;
+ SetCharacterOrder(null, order, null, Character.Controlled);
+ return true;
+ },
+ UserData = order,
+ ToolTip = order.Name
+ };
+
+ new GUIFrame(new RectTransform(new Vector2(1.5f), btn.RectTransform, Anchor.Center), "OuterGlow")
+ {
+ Color = Color.Red * 0.8f,
+ HoverColor = Color.Red * 1.0f,
+ PressedColor = Color.Red * 0.6f,
+ UserData = "highlighted",
+ CanBeFocused = false,
+ Visible = false
+ };
+
+ var img = new GUIImage(new RectTransform(Vector2.One, btn.RectTransform), order.Prefab.SymbolSprite, scaleToFit: true)
+ {
+ Color = order.Color,
+ HoverColor = Color.Lerp(order.Color, Color.White, 0.5f),
+ ToolTip = order.Name
+ };
+ }
+
screenResolution = new Point(GameMain.GraphicsWidth, GameMain.GraphicsHeight);
prevUIScale = GUI.Scale;
}
-
- #endregion
-
- #region Character list management
-
- public Rectangle GetCharacterListArea()
- {
- return characterListBox.Rect;
- }
-
partial void InitProjectSpecific()
{
guiFrame = new GUIFrame(new RectTransform(Vector2.One, GUICanvas.Instance), null, Color.Transparent)
@@ -1296,6 +1329,31 @@ namespace Barotrauma
if (GameMain.NetworkMember != null) GameMain.Client.SelectCrewCharacter(character, previewPlayer);
+ ToggleReportButton("reportintruders", hasIntruders);
+
+ foreach (GUIComponent reportButton in reportButtonFrame.Children)
+ {
+ var highlight = reportButton.GetChildByUserData("highlighted");
+ if (highlight.Visible)
+ {
+ highlight.RectTransform.LocalScale = new Vector2(1.25f + (float)Math.Sin(Timing.TotalTime * 5.0f) * 0.25f);
+ }
+ }
+ }
+ else
+ {
+ reportButtonFrame.Visible = false;
+ }
+ }
+
+ ///
+ /// Should report buttons be visible on the screen atm?
+ ///
+ private bool ReportButtonsVisible()
+ {
+ return CharacterHealth.OpenHealthWindow == null;
+ }
+
private bool ReportButtonClicked(GUIButton button, object userData)
{
//order targeted to all characters
diff --git a/Barotrauma/BarotraumaClient/Source/GameSettings.cs b/Barotrauma/BarotraumaClient/Source/GameSettings.cs
index a111ddc03..00085898f 100644
--- a/Barotrauma/BarotraumaClient/Source/GameSettings.cs
+++ b/Barotrauma/BarotraumaClient/Source/GameSettings.cs
@@ -626,28 +626,6 @@ namespace Barotrauma
new GUIMessageBox(TextManager.Get("RestartRequiredLabel"), TextManager.Get("RestartRequiredLanguage"));
- return true;
- };
-
- //spacing
- new GUIFrame(new RectTransform(new Vector2(1.0f, 0.02f), generalLayoutGroup.RectTransform), style: null);
-
- new GUIButton(new RectTransform(new Vector2(0.4f, 1.0f), buttonArea.RectTransform, Anchor.BottomLeft),
- TextManager.Get("Cancel"))
- {
- IgnoreLayoutGroups = true,
- OnClicked = (x, y) =>
- {
- if (UnsavedSettings)
- {
- LoadPlayerConfig();
- }
- if (Screen.Selected == GameMain.MainMenuScreen) GameMain.MainMenuScreen.ReturnToMainMenu(null, null);
- GUI.SettingsMenuOpen = false;
- return true;
- }
- };
-
//spacing
new GUIFrame(new RectTransform(new Vector2(1.0f, 0.02f), generalLayoutGroup.RectTransform), style: null);
diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/ItemComponent.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/ItemComponent.cs
index 94a9eee32..72589ccf5 100644
--- a/Barotrauma/BarotraumaClient/Source/Items/Components/ItemComponent.cs
+++ b/Barotrauma/BarotraumaClient/Source/Items/Components/ItemComponent.cs
@@ -184,63 +184,6 @@ namespace Barotrauma.Items.Components
}
}
}
-
- public void ApplyTo(RectTransform target)
- {
- if (RelativeOffset.HasValue)
- {
- target.RelativeOffset = RelativeOffset.Value;
- }
- else if (AbsoluteOffset.HasValue)
- {
- target.AbsoluteOffset = AbsoluteOffset.Value;
- }
- if (RelativeSize.HasValue)
- {
- target.RelativeSize = RelativeSize.Value;
- }
- else if (AbsoluteSize.HasValue)
- {
- target.NonScaledSize = AbsoluteSize.Value;
- }
- if (Anchor.HasValue)
- {
- target.Anchor = Anchor.Value;
- }
- if (Pivot.HasValue)
- {
- target.Pivot = Pivot.Value;
- }
- else
- {
- target.Pivot = RectTransform.MatchPivotToAnchor(target.Anchor);
- }
- target.RecalculateChildren(true, true);
- }
- }
-
- public GUIFrame GuiFrame { get; protected set; }
-
- [Serialize(false, false)]
- public bool AllowUIOverlap
- {
- get;
- set;
- }
-
- private ItemComponent linkToUIComponent;
- [Serialize("", false)]
- public string LinkUIToComponent
- {
- get;
- set;
- }
-
- [Serialize(0, false)]
- public int HudPriority
- {
- get;
- private set;
}
private bool shouldMuffleLooping;
diff --git a/Barotrauma/BarotraumaClient/Source/Items/Item.cs b/Barotrauma/BarotraumaClient/Source/Items/Item.cs
index 52860e886..cdda06bfc 100644
--- a/Barotrauma/BarotraumaClient/Source/Items/Item.cs
+++ b/Barotrauma/BarotraumaClient/Source/Items/Item.cs
@@ -597,8 +597,9 @@ namespace Barotrauma
if (HasInGameEditableProperties ||
Screen.Selected == GameMain.SubEditorScreen)
{
+ GUIComponent prevEditingHUD = editingHUD;
UpdateEditing(cam);
- editingHUDCreated = editingHUD != null;
+ editingHUDCreated = editingHUD != null && editingHUD != prevEditingHUD;
}
List prevActiveHUDs = new List(activeHUDs);
diff --git a/Barotrauma/BarotraumaClient/Source/Map/Submarine.cs b/Barotrauma/BarotraumaClient/Source/Map/Submarine.cs
index 7b46856e1..982066597 100644
--- a/Barotrauma/BarotraumaClient/Source/Map/Submarine.cs
+++ b/Barotrauma/BarotraumaClient/Source/Map/Submarine.cs
@@ -39,7 +39,7 @@ namespace Barotrauma
public Sprite PreviewImage;
private static List roundSounds = null;
- public static RoundSound LoadRoundSound(XElement element, bool stream=false)
+ public static RoundSound LoadRoundSound(XElement element, bool stream = false)
{
string filename = element.GetAttributeString("file", "");
if (string.IsNullOrEmpty(filename)) filename = element.GetAttributeString("sound", "");
@@ -66,6 +66,7 @@ namespace Barotrauma
try
{
existingSound = GameMain.SoundManager.LoadSound(filename, stream);
+ if (existingSound == null) { return null; }
}
catch (FileNotFoundException e)
{
diff --git a/Barotrauma/BarotraumaClient/Source/Networking/GameClient.cs b/Barotrauma/BarotraumaClient/Source/Networking/GameClient.cs
index 06a90d84c..1abfdefb6 100644
--- a/Barotrauma/BarotraumaClient/Source/Networking/GameClient.cs
+++ b/Barotrauma/BarotraumaClient/Source/Networking/GameClient.cs
@@ -814,7 +814,7 @@ namespace Barotrauma.Networking
steamAuthTicket = null;
string disconnectMsg = inc.ReadString();
- string[] splitMsg = disconnectMsg.Split(';');
+ string[] splitMsg = disconnectMsg.Split('/');
DisconnectReason disconnectReason = DisconnectReason.Unknown;
if (splitMsg.Length > 0) Enum.TryParse(splitMsg[0], out disconnectReason);
@@ -1110,7 +1110,7 @@ namespace Barotrauma.Networking
GameMain.GameScreen.Select();
- AddChatMessage($"ServerMessage.HowToCommunicate_[chatbutton]={GameMain.Config.KeyBind(InputType.Chat).ToString()}_[radiobutton]={GameMain.Config.KeyBind(InputType.RadioChat).ToString()}", ChatMessageType.Server);
+ AddChatMessage($"ServerMessage.HowToCommunicate~[chatbutton]={GameMain.Config.KeyBind(InputType.Chat).ToString()}~[radiobutton]={GameMain.Config.KeyBind(InputType.RadioChat).ToString()}", ChatMessageType.Server);
yield return CoroutineStatus.Success;
}
diff --git a/Barotrauma/BarotraumaClient/Source/Networking/Voip/VoipCapture.cs b/Barotrauma/BarotraumaClient/Source/Networking/Voip/VoipCapture.cs
index 6acc1821a..2f85beaf6 100644
--- a/Barotrauma/BarotraumaClient/Source/Networking/Voip/VoipCapture.cs
+++ b/Barotrauma/BarotraumaClient/Source/Networking/Voip/VoipCapture.cs
@@ -1,6 +1,7 @@
using Lidgren.Network;
using OpenTK.Audio.OpenAL;
using System;
+using System.Linq;
using System.Runtime.InteropServices;
using System.Threading;
@@ -66,7 +67,14 @@ namespace Barotrauma.Networking
if (captureDevice == IntPtr.Zero)
{
- new GUIMessageBox(TextManager.Get("Error"), TextManager.Get("VoipCaptureDeviceNotFound"));
+ if (!GUIMessageBox.MessageBoxes.Any(mb => mb.UserData as string == "capturedevicenotfound"))
+ {
+ new GUIMessageBox(TextManager.Get("Error"), TextManager.Get("VoipCaptureDeviceNotFound"))
+ {
+ UserData = "capturedevicenotfound"
+ };
+ }
+ GameMain.Config.VoiceSetting = GameSettings.VoiceMode.Disabled;
Instance?.Dispose();
Instance = null;
return;
diff --git a/Barotrauma/BarotraumaClient/Source/Screens/CharacterEditorScreen.cs b/Barotrauma/BarotraumaClient/Source/Screens/CharacterEditorScreen.cs
index f75d58b4d..fd3e9fedc 100644
--- a/Barotrauma/BarotraumaClient/Source/Screens/CharacterEditorScreen.cs
+++ b/Barotrauma/BarotraumaClient/Source/Screens/CharacterEditorScreen.cs
@@ -401,43 +401,6 @@ namespace Barotrauma
UpdateSourceRect(limb, newRect);
}
}
- UpdateJointCreation();
- if (PlayerInput.KeyHit(Keys.Left))
- {
- foreach (var limb in selectedLimbs)
- {
- var newRect = limb.ActiveSprite.SourceRect;
- newRect.X--;
- UpdateSourceRect(limb, newRect);
- }
- }
- if (PlayerInput.KeyHit(Keys.Right))
- {
- foreach (var limb in selectedLimbs)
- {
- var newRect = limb.ActiveSprite.SourceRect;
- newRect.X++;
- UpdateSourceRect(limb, newRect);
- }
- }
- if (PlayerInput.KeyHit(Keys.Down))
- {
- foreach (var limb in selectedLimbs)
- {
- var newRect = limb.ActiveSprite.SourceRect;
- newRect.Y++;
- UpdateSourceRect(limb, newRect);
- }
- }
- if (PlayerInput.KeyHit(Keys.Up))
- {
- foreach (var limb in selectedLimbs)
- {
- var newRect = limb.ActiveSprite.SourceRect;
- newRect.Y--;
- UpdateSourceRect(limb, newRect);
- }
- }
}
if (!isFreezed)
{
diff --git a/Barotrauma/BarotraumaClient/Source/Screens/MainMenuScreen.cs b/Barotrauma/BarotraumaClient/Source/Screens/MainMenuScreen.cs
index 3dabc833a..487aaffec 100644
--- a/Barotrauma/BarotraumaClient/Source/Screens/MainMenuScreen.cs
+++ b/Barotrauma/BarotraumaClient/Source/Screens/MainMenuScreen.cs
@@ -505,7 +505,7 @@ namespace Barotrauma
" -ownerkey " + ownerKey.ToString();
string filename = "DedicatedServer.exe";
-#if LINUX
+#if LINUX || OSX
filename = "mono";
arguments = "./DedicatedServer.exe " + arguments;
#endif
diff --git a/Barotrauma/BarotraumaClient/Source/Screens/NetLobbyScreen.cs b/Barotrauma/BarotraumaClient/Source/Screens/NetLobbyScreen.cs
index d965fd46a..b84cbd3ac 100644
--- a/Barotrauma/BarotraumaClient/Source/Screens/NetLobbyScreen.cs
+++ b/Barotrauma/BarotraumaClient/Source/Screens/NetLobbyScreen.cs
@@ -440,15 +440,7 @@ namespace Barotrauma
{
OnSelected = VotableClicked
};
-
-#if !DEBUG
- new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.05f), midInfoColumn.RectTransform),
- "Coming up: Multiplayer campaign", textAlignment: Alignment.Center, style: "ListBoxElement")
- {
- ToolTip = "Multiplayer campaign mode is not available in this version of Barotrauma. Coming up in the Early Access release!"
- };
-#endif
-
+
voteText = new GUITextBlock(new RectTransform(new Vector2(0.5f, 1.0f), modeLabel.RectTransform, Anchor.TopRight),
TextManager.Get("Votes"), textAlignment: Alignment.CenterRight)
{
diff --git a/Barotrauma/BarotraumaClient/Source/Sounds/SoundManager.cs b/Barotrauma/BarotraumaClient/Source/Sounds/SoundManager.cs
index ffb734935..549648e81 100644
--- a/Barotrauma/BarotraumaClient/Source/Sounds/SoundManager.cs
+++ b/Barotrauma/BarotraumaClient/Source/Sounds/SoundManager.cs
@@ -12,6 +12,12 @@ namespace Barotrauma.Sounds
public class SoundManager : IDisposable
{
public const int SOURCE_COUNT = 32;
+
+ public bool Disabled
+ {
+ Default = 0,
+ Voice = 1
+ }
private IntPtr alcDevice;
private OpenTK.ContextHandle alcContext;
@@ -21,7 +27,7 @@ namespace Barotrauma.Sounds
Default = 0,
Voice = 1
}
- private SoundSourcePool[] sourcePools;
+ private readonly SoundSourcePool[] sourcePools;
private List loadedSounds;
private readonly SoundChannel[][] playingChannels = new SoundChannel[2][];
@@ -34,6 +40,7 @@ namespace Barotrauma.Sounds
get { return listenerPosition; }
set
{
+ if (Disabled) { return; }
listenerPosition = value;
AL.Listener(ALListener3f.Position,value.X,value.Y,value.Z);
ALError alError = AL.GetError();
@@ -44,12 +51,13 @@ namespace Barotrauma.Sounds
}
}
- private float[] listenerOrientation;
+ private float[] listenerOrientation = new float[6];
public Vector3 ListenerTargetVector
{
get { return new Vector3(listenerOrientation[0], listenerOrientation[1], listenerOrientation[2]); }
set
{
+ if (Disabled) { return; }
listenerOrientation[0] = value.X; listenerOrientation[1] = value.Y; listenerOrientation[2] = value.Z;
AL.Listener(ALListenerfv.Orientation, ref listenerOrientation);
ALError alError = AL.GetError();
@@ -64,6 +72,7 @@ namespace Barotrauma.Sounds
get { return new Vector3(listenerOrientation[3], listenerOrientation[4], listenerOrientation[5]); }
set
{
+ if (Disabled) { return; }
listenerOrientation[3] = value.X; listenerOrientation[4] = value.Y; listenerOrientation[5] = value.Z;
AL.Listener(ALListenerfv.Orientation, ref listenerOrientation);
ALError alError = AL.GetError();
@@ -80,6 +89,7 @@ namespace Barotrauma.Sounds
get { return listenerGain; }
set
{
+ if (Disabled) { return; }
if (Math.Abs(ListenerGain - value) < 0.001f) { return; }
listenerGain = value;
AL.Listener(ALListenerf.Gain, listenerGain);
@@ -100,20 +110,20 @@ namespace Barotrauma.Sounds
get { return loadedSounds.Select(s => s.Filename).Distinct().Count(); }
}
- private Dictionary> categoryModifiers;
+ private Dictionary> categoryModifiers;
public SoundManager()
{
loadedSounds = new List();
-
streamingThread = null;
-
categoryModifiers = null;
alcDevice = Alc.OpenDevice(null);
if (alcDevice == null)
{
- throw new Exception("Failed to open an ALC device!");
+ DebugConsole.ThrowError("Failed to open an ALC device! Disabling audio playback...");
+ Disabled = true;
+ return;
}
AlcError alcError = Alc.GetError(alcDevice);
@@ -122,13 +132,15 @@ namespace Barotrauma.Sounds
//The audio device probably wasn't ready, this happens quite often
//Just wait a while and try again
Thread.Sleep(100);
-
+
alcDevice = Alc.OpenDevice(null);
alcError = Alc.GetError(alcDevice);
if (alcError != AlcError.NoError)
{
- throw new Exception("Error initializing ALC device: " + alcError.ToString());
+ DebugConsole.ThrowError("Error initializing ALC device: " + alcError.ToString() + ". Disabling audio playback...");
+ Disabled = true;
+ return;
}
}
@@ -136,18 +148,24 @@ namespace Barotrauma.Sounds
alcContext = Alc.CreateContext(alcDevice, alcContextAttrs);
if (alcContext == null)
{
- throw new Exception("Failed to create an ALC context! (error code: "+Alc.GetError(alcDevice).ToString()+")");
+ DebugConsole.ThrowError("Failed to create an ALC context! (error code: " + Alc.GetError(alcDevice).ToString() + "). Disabling audio playback...");
+ Disabled = true;
+ return;
}
-
+
if (!Alc.MakeContextCurrent(alcContext))
{
- throw new Exception("Failed to assign the current ALC context! (error code: " + Alc.GetError(alcDevice).ToString() + ")");
+ DebugConsole.ThrowError("Failed to assign the current ALC context! (error code: " + Alc.GetError(alcDevice).ToString() + "). Disabling audio playback...");
+ Disabled = true;
+ return;
}
-
+
alcError = Alc.GetError(alcDevice);
if (alcError != AlcError.NoError)
{
- throw new Exception("Error after assigning ALC context: " + alcError.ToString());
+ DebugConsole.ThrowError("Error after assigning ALC context: " + alcError.ToString() + ". Disabling audio playback...");
+ Disabled = true;
+ return;
}
ALError alError = ALError.NoError;
@@ -164,10 +182,11 @@ namespace Barotrauma.Sounds
alError = AL.GetError();
if (alError != ALError.NoError)
{
- throw new Exception("Error setting distance model: " + AL.GetErrorString(alError));
+ DebugConsole.ThrowError("Error setting distance model: " + AL.GetErrorString(alError) + ". Disabling audio playback...");
+ Disabled = true;
+ return;
}
-
- listenerOrientation = new float[6];
+
ListenerPosition = Vector3.Zero;
ListenerTargetVector = new Vector3(0.0f, 0.0f, 1.0f);
ListenerUpVector = new Vector3(0.0f, -1.0f, 0.0f);
@@ -175,6 +194,8 @@ namespace Barotrauma.Sounds
public Sound LoadSound(string filename, bool stream = false)
{
+ if (Disabled) { return null; }
+
if (!File.Exists(filename))
{
throw new FileNotFoundException("Sound file \"" + filename + "\" doesn't exist!");
@@ -187,6 +208,8 @@ namespace Barotrauma.Sounds
public Sound LoadSound(XElement element, bool stream = false)
{
+ if (Disabled) { return null; }
+
string filePath = element.GetAttributeString("file", "");
if (!File.Exists(filePath))
{
@@ -208,13 +231,13 @@ namespace Barotrauma.Sounds
public SoundChannel GetSoundChannelFromIndex(SourcePoolIndex poolIndex, int ind)
{
- if (ind < 0 || ind >= playingChannels[(int)poolIndex].Length) return null;
+ if (Disabled || ind < 0 || ind >= playingChannels[(int)poolIndex].Length) return null;
return playingChannels[(int)poolIndex][ind];
}
public uint GetSourceFromIndex(SourcePoolIndex poolIndex, int srcInd)
{
- if (srcInd < 0 || srcInd >= sourcePools[(int)poolIndex].ALSources.Length) return 0;
+ if (Disabled || srcInd < 0 || srcInd >= sourcePools[(int)poolIndex].ALSources.Length) return 0;
if (!AL.IsSource(sourcePools[(int)poolIndex].ALSources[srcInd]))
{
@@ -226,6 +249,8 @@ namespace Barotrauma.Sounds
public int AssignFreeSourceToChannel(SoundChannel newChannel)
{
+ if (Disabled) { return -1; }
+
lock (playingChannels)
{
//remove a channel that has stopped
@@ -244,7 +269,6 @@ namespace Barotrauma.Sounds
//we couldn't get a free source to assign to this channel!
return -1;
}
- }
#if DEBUG
public void DebugSource(int ind)
@@ -259,6 +283,7 @@ namespace Barotrauma.Sounds
public bool IsPlaying(Sound sound)
{
+ if (Disabled) { return false; }
lock (playingChannels)
{
for (int i = 0; i < playingChannels[(int)sound.SourcePoolIndex].Length; i++)
@@ -275,6 +300,7 @@ namespace Barotrauma.Sounds
public int CountPlayingInstances(Sound sound)
{
+ if (Disabled) { return 0; }
int count = 0;
lock (playingChannels)
{
@@ -289,9 +315,11 @@ namespace Barotrauma.Sounds
}
return count;
}
+#endif
public SoundChannel GetChannelFromSound(Sound sound)
{
+ if (Disabled) { return null; }
lock (playingChannels)
{
for (int i = 0; i < playingChannels[(int)sound.SourcePoolIndex].Length; i++)
@@ -308,6 +336,7 @@ namespace Barotrauma.Sounds
public void KillChannels(Sound sound)
{
+ if (Disabled) { return; }
lock (playingChannels)
{
for (int i = 0; i < playingChannels[(int)sound.SourcePoolIndex].Length; i++)
@@ -335,6 +364,7 @@ namespace Barotrauma.Sounds
public void SetCategoryGainMultiplier(string category, float gain)
{
+ if (Disabled) { return; }
category = category.ToLower();
if (categoryModifiers == null) categoryModifiers = new Dictionary>();
if (!categoryModifiers.ContainsKey(category))
@@ -362,6 +392,7 @@ namespace Barotrauma.Sounds
public float GetCategoryGainMultiplier(string category)
{
+ if (Disabled) { return 0.0f; }
category = category.ToLower();
if (categoryModifiers == null || !categoryModifiers.ContainsKey(category)) return 1.0f;
return categoryModifiers[category].First;
@@ -369,6 +400,8 @@ namespace Barotrauma.Sounds
public void SetCategoryMuffle(string category,bool muffle)
{
+ if (Disabled) { return; }
+
category = category.ToLower();
if (categoryModifiers == null) categoryModifiers = new Dictionary>();
@@ -380,6 +413,7 @@ namespace Barotrauma.Sounds
{
categoryModifiers[category].Second = muffle;
}
+ }
for (int i = 0; i < playingChannels.Length; i++)
{
@@ -395,6 +429,8 @@ namespace Barotrauma.Sounds
public bool GetCategoryMuffle(string category)
{
+ if (Disabled) { return false; }
+
category = category.ToLower();
if (categoryModifiers == null || !categoryModifiers.ContainsKey(category)) return false;
return categoryModifiers[category].Second;
@@ -402,6 +438,7 @@ namespace Barotrauma.Sounds
public void InitStreamThread()
{
+ if (Disabled) { return; }
if (streamingThread == null || streamingThread.ThreadState.HasFlag(ThreadState.Stopped))
{
streamingThread = new Thread(UpdateStreaming)
@@ -446,6 +483,8 @@ namespace Barotrauma.Sounds
public void Dispose()
{
+ if (Disabled) { return; }
+
lock (playingChannels)
{
for (int i = 0; i < playingChannels.Length; i++)
@@ -464,8 +503,8 @@ namespace Barotrauma.Sounds
{
loadedSounds[i].Dispose();
}
- sourcePools[(int)SourcePoolIndex.Default].Dispose();
- sourcePools[(int)SourcePoolIndex.Voice].Dispose();
+ sourcePools[(int)SourcePoolIndex.Default]?.Dispose();
+ sourcePools[(int)SourcePoolIndex.Voice]?.Dispose();
if (!Alc.MakeContextCurrent(OpenTK.ContextHandle.Zero))
{
diff --git a/Barotrauma/BarotraumaClient/Source/Sounds/SoundPlayer.cs b/Barotrauma/BarotraumaClient/Source/Sounds/SoundPlayer.cs
index 5889231e3..6d34dd17e 100644
--- a/Barotrauma/BarotraumaClient/Source/Sounds/SoundPlayer.cs
+++ b/Barotrauma/BarotraumaClient/Source/Sounds/SoundPlayer.cs
@@ -126,7 +126,7 @@ namespace Barotrauma
if (startUpSoundElement != null)
{
startUpSound = GameMain.SoundManager.LoadSound(startUpSoundElement, false);
- startUpSound.Play();
+ startUpSound?.Play();
}
yield return CoroutineStatus.Running;
@@ -144,23 +144,22 @@ namespace Barotrauma
switch (soundElement.Name.ToString().ToLowerInvariant())
{
case "music":
- musicClips.Add(new BackgroundMusic(soundElement));
+ musicClips.AddIfNotNull(new BackgroundMusic(soundElement));
break;
case "splash":
- SplashSounds.Add(GameMain.SoundManager.LoadSound(soundElement, false));
+ SplashSounds.AddIfNotNull(GameMain.SoundManager.LoadSound(soundElement, false));
break;
case "flow":
- FlowSounds.Add(GameMain.SoundManager.LoadSound(soundElement, false));
+ FlowSounds.AddIfNotNull(GameMain.SoundManager.LoadSound(soundElement, false));
break;
case "waterambience":
- waterAmbiences.Add(GameMain.SoundManager.LoadSound(soundElement, false));
+ waterAmbiences.AddIfNotNull(GameMain.SoundManager.LoadSound(soundElement, false));
break;
case "damagesound":
Sound damageSound = GameMain.SoundManager.LoadSound(soundElement, false);
- if (damageSound == null) continue;
+ if (damageSound == null) { continue; }
string damageSoundType = soundElement.GetAttributeString("damagesoundtype", "None");
-
damageSounds.Add(new DamageSound(
damageSound,
soundElement.GetAttributeVector2("damagerange", Vector2.Zero),
@@ -174,7 +173,6 @@ namespace Barotrauma
{
miscSoundList.Add(new KeyValuePair(soundElement.Name.ToString().ToLowerInvariant(), sound));
}
-
break;
}
}
@@ -481,7 +479,7 @@ namespace Barotrauma
private static void UpdateMusic(float deltaTime)
{
- if (musicClips == null) return;
+ if (musicClips == null || GameMain.SoundManager.Disabled) { return; }
if (OverrideMusicType != null && OverrideMusicDuration.HasValue)
{
diff --git a/Barotrauma/BarotraumaClient/WindowsClient.csproj b/Barotrauma/BarotraumaClient/WindowsClient.csproj
new file mode 100644
index 000000000..0ace19fec
--- /dev/null
+++ b/Barotrauma/BarotraumaClient/WindowsClient.csproj
@@ -0,0 +1,275 @@
+
+
+
+ ReleaseWindows
+ x64
+ 8.0.30703
+ 2.0
+ {008C0F83-E914-4966-9135-EA885059EDD8}
+ WinExe
+ Properties
+ Barotrauma
+ Barotrauma
+ 512
+ false
+ v4.5
+
+ 0.9.0.0
+ publish\
+ true
+ Disk
+ false
+ Foreground
+ 7
+ Days
+ false
+ false
+ true
+ 0
+ 0.1.0.%2a
+ false
+ true
+
+
+
+
+ ..\BarotraumaShared\Icon.ico
+
+
+ true
+ ..\bin\ReleaseWindows\
+ TRACE;WINDOWS;CLIENT
+ true
+ pdbonly
+ x64
+ MinimumRecommendedRules.ruleset
+ true
+
+
+ true
+ ..\bin\DebugWindows\
+ TRACE;WINDOWS;CLIENT;DEBUG
+ full
+ x64
+ MinimumRecommendedRules.ruleset
+ true
+
+
+
+
+
+
+ ..\..\Libraries\NuGet\Concentus.1.1.7\lib\portable-net45+win+wpa81+wp80\Concentus.dll
+
+
+ ..\..\Libraries\NuGet\GameAnalytics.Mono.SDK.1.1.12\lib\net45\GameAnalytics.Mono.dll
+
+
+ ..\..\Libraries\NuGet\MonoGame.Framework.WindowsDX.3.7.1.189\lib\net45\MonoGame.Framework.dll
+
+
+ ..\..\Libraries\NuGet\NLog.4.3.8\lib\net45\NLog.dll
+
+
+ ..\..\Libraries\NuGet\nVLC.3.0.0\lib\net40\nVLC.dll
+
+
+ ..\..\Libraries\NuGet\NVorbis.0.8.6\lib\net35\NVorbis.dll
+
+
+ ..\..\Libraries\NuGet\OpenTK.3.0.1\lib\net20\OpenTK.dll
+
+
+
+ ..\..\Libraries\NuGet\RestSharp.105.2.3\lib\net45\RestSharp.dll
+
+
+ ..\..\Libraries\NuGet\SharpDX.4.2.0\lib\net45\SharpDX.dll
+
+
+ ..\..\Libraries\NuGet\SharpDX.Direct2D1.4.2.0\lib\net45\SharpDX.Direct2D1.dll
+
+
+ ..\..\Libraries\NuGet\SharpDX.Direct3D11.4.2.0\lib\net45\SharpDX.Direct3D11.dll
+
+
+ ..\..\Libraries\NuGet\SharpDX.Direct3D9.4.2.0\lib\net45\SharpDX.Direct3D9.dll
+
+
+ ..\..\Libraries\NuGet\SharpDX.DXGI.4.2.0\lib\net45\SharpDX.DXGI.dll
+
+
+ ..\..\Libraries\NuGet\SharpDX.Mathematics.4.2.0\lib\net45\SharpDX.Mathematics.dll
+
+
+ ..\..\Libraries\NuGet\SharpDX.MediaFoundation.4.2.0\lib\net45\SharpDX.MediaFoundation.dll
+
+
+ ..\..\Libraries\NuGet\SharpDX.XAudio2.4.2.0\lib\net45\SharpDX.XAudio2.dll
+
+
+ ..\..\Libraries\NuGet\SharpDX.XInput.4.2.0\lib\net45\SharpDX.XInput.dll
+
+
+
+
+ ..\..\Libraries\NuGet\GameAnalytics.Mono.SDK.1.1.12\lib\net45\System.Data.SQLite.dll
+
+
+
+
+
+
+ ..\..\Libraries\NuGet\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll
+
+
+
+
+
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+
+
+ False
+ Microsoft .NET Framework 4 %28x86 and x64%29
+ true
+
+
+ False
+ .NET Framework 3.5 SP1 Client Profile
+ false
+
+
+ False
+ .NET Framework 3.5 SP1
+ false
+
+
+ False
+ Windows Installer 4.5
+ true
+
+
+
+
+ {3af0347c-5a9b-4421-868c-8ee3dbfaebc6}
+ Facepunch.Steamworks
+
+
+ {830461aa-3e2e-4bde-9b27-1b3280836521}
+ Farseer Physics MonoGame WindowsDX
+
+
+ {3b8f9edb-6e5e-450c-abc2-ec49075d0b50}
+ Hyper.ComponentModel
+
+
+ {49ba1c69-6104-41ac-a5d8-b54fa9f696e8}
+ Lidgren.Network
+
+
+ {c293db32-fa42-486d-b128-5a12522fae4e}
+ SharpFont
+
+
+
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+
+
+
+
+
+
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Barotrauma/BarotraumaClient/libopenal.1.dylib b/Barotrauma/BarotraumaClient/libopenal.1.dylib
deleted file mode 100644
index df9570d57..000000000
Binary files a/Barotrauma/BarotraumaClient/libopenal.1.dylib and /dev/null differ
diff --git a/Barotrauma/BarotraumaClient/libopenal.so.1 b/Barotrauma/BarotraumaClient/libopenal.so.1
new file mode 100644
index 000000000..af45fd0c2
Binary files /dev/null and b/Barotrauma/BarotraumaClient/libopenal.so.1 differ
diff --git a/Barotrauma/BarotraumaClient/libsteam_api.dylib b/Barotrauma/BarotraumaClient/libsteam_api.dylib
new file mode 100644
index 000000000..6e2309a81
Binary files /dev/null and b/Barotrauma/BarotraumaClient/libsteam_api.dylib differ
diff --git a/Barotrauma/BarotraumaClient/libsteam_api64.so b/Barotrauma/BarotraumaClient/libsteam_api64.so
new file mode 100644
index 000000000..edcda830f
Binary files /dev/null and b/Barotrauma/BarotraumaClient/libsteam_api64.so differ
diff --git a/Barotrauma/BarotraumaClient/packages.config b/Barotrauma/BarotraumaClient/packages.config
index 9a52393de..695edea35 100644
--- a/Barotrauma/BarotraumaClient/packages.config
+++ b/Barotrauma/BarotraumaClient/packages.config
@@ -1,52 +1,52 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Barotrauma/BarotraumaClient/steam_api64.dll b/Barotrauma/BarotraumaClient/steam_api64.dll
new file mode 100644
index 000000000..00132885c
Binary files /dev/null and b/Barotrauma/BarotraumaClient/steam_api64.dll differ
diff --git a/Barotrauma/BarotraumaServer/BarotraumaServer.csproj.user b/Barotrauma/BarotraumaServer/BarotraumaServer.csproj.user
deleted file mode 100644
index 1991869a0..000000000
--- a/Barotrauma/BarotraumaServer/BarotraumaServer.csproj.user
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
- ShowAllFiles
- publish\
-
-
-
-
-
- en-US
- false
-
-
\ No newline at end of file
diff --git a/Barotrauma/BarotraumaServer/BarotraumaServer.csproj b/Barotrauma/BarotraumaServer/Server.csproj
similarity index 85%
rename from Barotrauma/BarotraumaServer/BarotraumaServer.csproj
rename to Barotrauma/BarotraumaServer/Server.csproj
index d25ec8474..34d9a0dc1 100644
--- a/Barotrauma/BarotraumaServer/BarotraumaServer.csproj
+++ b/Barotrauma/BarotraumaServer/Server.csproj
@@ -92,22 +92,29 @@
true
-
- ..\..\Libraries\NuGet\GameAnalytics.Mono.SDK.1.1.12\lib\net45\GameAnalytics.Mono.dll
-
-
- ..\..\Libraries\NuGet\NLog.4.3.8\lib\net45\NLog.dll
-
-
- False
- ..\..\Libraries\NuGet\RestSharp.105.2.3\lib\net45\RestSharp.dll
-
-
- ..\..\Libraries\NuGet\GameAnalytics.Mono.SDK.1.1.12\lib\net45\System.Data.SQLite.dll
-
+
+
+
+
+
+
+
+
+
+ ..\..\Libraries\NuGet\NLog.4.3.8\lib\net45\NLog.dll
+
+
+ ..\..\Libraries\NuGet\GameAnalytics.Mono.SDK.1.1.12\lib\net45\GameAnalytics.Mono.dll
+
+
+ ..\..\Libraries\NuGet\GameAnalytics.Mono.SDK.1.1.12\lib\net45\System.Data.SQLite.dll
+
+
+ ..\..\Libraries\NuGet\RestSharp.105.2.3\lib\net45\RestSharp.dll
+
@@ -120,8 +127,8 @@
-
+
@@ -206,24 +213,12 @@
+
-
-
+
+
-
-
- This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
-
-
-
-
\ No newline at end of file
diff --git a/Barotrauma/BarotraumaServer/Source/Networking/GameServer.cs b/Barotrauma/BarotraumaServer/Source/Networking/GameServer.cs
index 7e8ed91bd..cbf3b4c60 100644
--- a/Barotrauma/BarotraumaServer/Source/Networking/GameServer.cs
+++ b/Barotrauma/BarotraumaServer/Source/Networking/GameServer.cs
@@ -531,7 +531,7 @@ namespace Barotrauma.Networking
*/
if (connectedClient != null)
{
- DisconnectClient(inc.SenderConnection, $"ServerMessage.HasDisconnected_[client]={connectedClient.Name}");
+ DisconnectClient(inc.SenderConnection, $"ServerMessage.HasDisconnected~[client]={connectedClient.Name}");
}
else
{
@@ -963,7 +963,7 @@ namespace Barotrauma.Networking
if (kickedClient != null)
{
Log("Client \"" + sender.Name + "\" kicked \"" + kickedClient.Name + "\".", ServerLog.MessageType.ServerMessage);
- KickClient(kickedClient, string.IsNullOrEmpty(kickReason) ? $"ServerMessage.KickedBy_[initiator]={sender.Name}" : kickReason);
+ KickClient(kickedClient, string.IsNullOrEmpty(kickReason) ? $"ServerMessage.KickedBy~[initiator]={sender.Name}" : kickReason);
}
break;
case ClientPermissions.Ban:
@@ -978,11 +978,11 @@ namespace Barotrauma.Networking
Log("Client \"" + sender.Name + "\" banned \"" + bannedClient.Name + "\".", ServerLog.MessageType.ServerMessage);
if (durationSeconds > 0)
{
- BanClient(bannedClient, string.IsNullOrEmpty(banReason) ? $"ServerMessage.BannedBy_[initiator]={sender.Name}" : banReason, range, TimeSpan.FromSeconds(durationSeconds));
+ BanClient(bannedClient, string.IsNullOrEmpty(banReason) ? $"ServerMessage.BannedBy~[initiator]={sender.Name}" : banReason, range, TimeSpan.FromSeconds(durationSeconds));
}
else
{
- BanClient(bannedClient, string.IsNullOrEmpty(banReason) ? $"ServerMessage.BannedBy_[initiator]={sender.Name}" : banReason, range);
+ BanClient(bannedClient, string.IsNullOrEmpty(banReason) ? $"ServerMessage.BannedBy~[initiator]={sender.Name}" : banReason, range);
}
}
break;
@@ -1932,7 +1932,7 @@ namespace Barotrauma.Networking
if (client == null || client.Connection == OwnerConnection) return;
string msg = DisconnectReason.Kicked.ToString();
- string logMsg = $"ServerMessage.KickedFromServer_[client]={client.Name}";
+ string logMsg = $"ServerMessage.KickedFromServer~[client]={client.Name}";
DisconnectClient(client, logMsg, msg, reason);
}
@@ -1959,7 +1959,7 @@ namespace Barotrauma.Networking
if (client.Connection == OwnerConnection) return;
string msg = DisconnectReason.Banned.ToString();
- DisconnectClient(client, $"ServerMessage.BannedFromServer_[client]={client.Name}", msg, reason);
+ DisconnectClient(client, $"ServerMessage.BannedFromServer~[client]={client.Name}", msg, reason);
if (client.SteamID == 0 || range)
{
@@ -2015,12 +2015,12 @@ namespace Barotrauma.Networking
client.HasSpawned = false;
client.InGame = false;
- if (string.IsNullOrWhiteSpace(msg)) msg = $"ServerMessage.ClientLeftServer_[client]={client.Name}";
+ if (string.IsNullOrWhiteSpace(msg)) msg = $"ServerMessage.ClientLeftServer~[client]={client.Name}";
if (string.IsNullOrWhiteSpace(targetmsg)) targetmsg = "ServerMessage.YouLeftServer";
if (!string.IsNullOrWhiteSpace(reason))
{
- msg += $"; ;ServerMessage.Reason;: ;{reason}";
- targetmsg += $";\n;ServerMessage.Reason;: ;{reason}";
+ msg += $"/ /ServerMessage.Reason/: /{reason}";
+ targetmsg += $"/\n/ServerMessage.Reason/: /{reason}";
}
Log(msg, ServerLog.MessageType.ServerMessage);
@@ -2118,7 +2118,7 @@ namespace Barotrauma.Networking
if (senderClient != null)
{
var chatMsg = ChatMessage.Create(
- "", $"ServerMessage.PlayerNotFound_[player]={command}",
+ "", $"ServerMessage.PlayerNotFound~[player]={command}",
ChatMessageType.Error, null);
chatMsg.NetStateID = senderClient.ChatMsgQueue.Count > 0 ?
@@ -2130,7 +2130,7 @@ namespace Barotrauma.Networking
}
else
{
- AddChatMessage($"ServerMessage.PlayerNotFound_[player]={command}", ChatMessageType.Error);
+ AddChatMessage($"ServerMessage.PlayerNotFound~[player]={command}", ChatMessageType.Error);
}
return;
@@ -2350,7 +2350,7 @@ namespace Barotrauma.Networking
c.KickVoteCount >= connectedClients.Count * serverSettings.KickVoteRequiredRatio);
foreach (Client c in clientsToKick)
{
- SendChatMessage($"ServerMessage.KickedFromServer_[client]={c.Name}", ChatMessageType.Server, null);
+ SendChatMessage($"ServerMessage.KickedFromServer~[client]={c.Name}", ChatMessageType.Server, null);
KickClient(c, "ServerMessage.KickedByVote");
BanClient(c, "ServerMessage.KickedByVoteAutoBan", duration: TimeSpan.FromSeconds(serverSettings.AutoBanTime));
}
diff --git a/Barotrauma/BarotraumaServer/Source/Networking/GameServerLogin.cs b/Barotrauma/BarotraumaServer/Source/Networking/GameServerLogin.cs
index e6c23011f..e657f8a7f 100644
--- a/Barotrauma/BarotraumaServer/Source/Networking/GameServerLogin.cs
+++ b/Barotrauma/BarotraumaServer/Source/Networking/GameServerLogin.cs
@@ -481,7 +481,7 @@ namespace Barotrauma.Networking
GameMain.Server.SendConsoleMessage("Granted all permissions to " + newClient.Name + ".", newClient);
}
- GameMain.Server.SendChatMessage($"ServerMessage.JoinedServer_[client]={clName}", ChatMessageType.Server, null);
+ GameMain.Server.SendChatMessage($"ServerMessage.JoinedServer~[client]={clName}", ChatMessageType.Server, null);
var savedPermissions = serverSettings.ClientPermissions.Find(cp =>
cp.SteamID > 0 ?
diff --git a/Barotrauma/BarotraumaServer/Source/Networking/Voting.cs b/Barotrauma/BarotraumaServer/Source/Networking/Voting.cs
index 86a6ea443..6aa489dc4 100644
--- a/Barotrauma/BarotraumaServer/Source/Networking/Voting.cs
+++ b/Barotrauma/BarotraumaServer/Source/Networking/Voting.cs
@@ -67,7 +67,7 @@ namespace Barotrauma
kicked.AddKickVote(sender);
Client.UpdateKickVotes(GameMain.Server.ConnectedClients);
- GameMain.Server.SendChatMessage($"ServerMessage.HasVotedToKick_[initiator]={sender.Name}_[target]={kicked.Name}", ChatMessageType.Server, null);
+ GameMain.Server.SendChatMessage($"ServerMessage.HasVotedToKick~[initiator]={sender.Name}~[target]={kicked.Name}", ChatMessageType.Server, null);
}
break;
diff --git a/Barotrauma/BarotraumaShared/SharedCode.projitems b/Barotrauma/BarotraumaShared/SharedCode.projitems
new file mode 100644
index 000000000..73a0eb8dd
--- /dev/null
+++ b/Barotrauma/BarotraumaShared/SharedCode.projitems
@@ -0,0 +1,271 @@
+
+
+
+ $(MSBuildAllProjects);$(MSBuildThisFileFullPath)
+ true
+ 561357c2-db28-4e01-b275-6bf545f70491
+
+
+ BarotraumaShared
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Barotrauma/BarotraumaShared/BarotraumaShared.shproj b/Barotrauma/BarotraumaShared/SharedCode.shproj
similarity index 94%
rename from Barotrauma/BarotraumaShared/BarotraumaShared.shproj
rename to Barotrauma/BarotraumaShared/SharedCode.shproj
index 59d44d93c..a3b43c605 100644
--- a/Barotrauma/BarotraumaShared/BarotraumaShared.shproj
+++ b/Barotrauma/BarotraumaShared/SharedCode.shproj
@@ -9,6 +9,6 @@
-
+
\ No newline at end of file
diff --git a/Barotrauma/BarotraumaShared/BarotraumaShared.shproj.user b/Barotrauma/BarotraumaShared/SharedCode.shproj.user
similarity index 100%
rename from Barotrauma/BarotraumaShared/BarotraumaShared.shproj.user
rename to Barotrauma/BarotraumaShared/SharedCode.shproj.user
diff --git a/Barotrauma/BarotraumaShared/BarotraumaShared.projitems b/Barotrauma/BarotraumaShared/SharedContent.projitems
similarity index 85%
rename from Barotrauma/BarotraumaShared/BarotraumaShared.projitems
rename to Barotrauma/BarotraumaShared/SharedContent.projitems
index 90a029cbf..ffaadaf7a 100644
--- a/Barotrauma/BarotraumaShared/BarotraumaShared.projitems
+++ b/Barotrauma/BarotraumaShared/SharedContent.projitems
@@ -3,10 +3,10 @@
$(MSBuildAllProjects);$(MSBuildThisFileFullPath)
true
- 561357c2-db28-4e01-b275-6bf545f70491
+ a67d00eb-8f3d-49c9-9e01-94ed90b6bf2b
- BarotraumaShared
+ SharedContent
@@ -23,11 +23,9 @@
-
-
@@ -339,6 +337,12 @@
PreserveNewest
+
+ PreserveNewest
+
+
+ PreserveNewest
+
PreserveNewest
@@ -1067,10 +1071,6 @@
PreserveNewest
-
-
- PreserveNewest
-
PreserveNewest
@@ -1808,9 +1808,6 @@
PreserveNewest
-
- PreserveNewest
-
PreserveNewest
@@ -2231,12 +2228,6 @@
PreserveNewest
-
- PreserveNewest
-
-
- PreserveNewest
-
PreserveNewest
@@ -2324,28 +2315,9 @@
PreserveNewest
-
- PreserveNewest
-
-
- PreserveNewest
-
-
-
- PreserveNewest
-
PreserveNewest
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
PreserveNewest
@@ -2580,12 +2552,6 @@
PreserveNewest
-
- PreserveNewest
-
-
- PreserveNewest
-
PreserveNewest
@@ -3007,18 +2973,9 @@
PreserveNewest
-
- PreserveNewest
-
-
- PreserveNewest
-
PreserveNewest
-
- PreserveNewest
-
PreserveNewest
@@ -3047,24 +3004,6 @@
PreserveNewest
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
PreserveNewest
@@ -3078,257 +3017,4 @@
PreserveNewest
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
diff --git a/Barotrauma/BarotraumaShared/SharedContent.shproj b/Barotrauma/BarotraumaShared/SharedContent.shproj
new file mode 100644
index 000000000..b9f5395f7
--- /dev/null
+++ b/Barotrauma/BarotraumaShared/SharedContent.shproj
@@ -0,0 +1,14 @@
+
+
+
+ a67d00eb-8f3d-49c9-9e01-94ed90b6bf2b
+ 14.0
+ 0.9.0.0
+
+
+
+
+
+
+
+
diff --git a/Barotrauma/BarotraumaShared/SharedContent.shproj.user b/Barotrauma/BarotraumaShared/SharedContent.shproj.user
new file mode 100644
index 000000000..5bc13ae87
--- /dev/null
+++ b/Barotrauma/BarotraumaShared/SharedContent.shproj.user
@@ -0,0 +1,6 @@
+
+
+
+ true
+
+
\ No newline at end of file
diff --git a/Barotrauma/BarotraumaShared/Source/Extensions/IEnumerableExtensions.cs b/Barotrauma/BarotraumaShared/Source/Extensions/IEnumerableExtensions.cs
index c7d039da5..b7b05fbe1 100644
--- a/Barotrauma/BarotraumaShared/Source/Extensions/IEnumerableExtensions.cs
+++ b/Barotrauma/BarotraumaShared/Source/Extensions/IEnumerableExtensions.cs
@@ -89,5 +89,10 @@ namespace Barotrauma.Extensions
}
return result.Concat(result.SelectManyRecursive(selector));
}
+
+ public static void AddIfNotNull(this IList source, T value)
+ {
+ if (value != null) { source.Add(value); }
+ }
}
}
diff --git a/Barotrauma/BarotraumaShared/Source/GameSession/GameModes/GameModePreset.cs b/Barotrauma/BarotraumaShared/Source/GameSession/GameModes/GameModePreset.cs
index 29c5df39e..3b56a2b70 100644
--- a/Barotrauma/BarotraumaShared/Source/GameSession/GameModes/GameModePreset.cs
+++ b/Barotrauma/BarotraumaShared/Source/GameSession/GameModes/GameModePreset.cs
@@ -86,9 +86,7 @@ namespace Barotrauma
+ "when the task is completed or everyone in the crew has died."
};
-#if DEBUG
new GameModePreset("multiplayercampaign", typeof(MultiPlayerCampaign), false, false);
-#endif
}
}
}
diff --git a/Barotrauma/BarotraumaShared/Source/GameSettings.cs b/Barotrauma/BarotraumaShared/Source/GameSettings.cs
index 56a40ffce..586ed84fa 100644
--- a/Barotrauma/BarotraumaShared/Source/GameSettings.cs
+++ b/Barotrauma/BarotraumaShared/Source/GameSettings.cs
@@ -65,12 +65,6 @@ namespace Barotrauma
public int ParticleLimit { get; set; }
- public int ParticleLimit { get; set; }
-
- public int ParticleLimit { get; set; }
-
- public int ParticleLimit { get; set; }
-
public float LightMapScale { get; set; }
public bool SpecularityEnabled { get; set; }
public bool ChromaticAberrationEnabled { get; set; }
@@ -403,8 +397,6 @@ namespace Barotrauma
AimAssistAmount = doc.Root.GetAttributeFloat("aimassistamount", 0.5f);
- AimAssistAmount = doc.Root.GetAttributeFloat("aimassistamount", 0.5f);
-
AimAssistAmount = doc.Root.GetAttributeFloat("aimassistamount", 0.5f);
keyMapping = new KeyOrMouse[Enum.GetNames(typeof(InputType)).Length];
@@ -582,6 +574,106 @@ namespace Barotrauma
}
}
+ TextManager.LoadTextPacks(SelectedContentPackages);
+
+ //display error messages after all content packages have been loaded
+ //to make sure the package that contains text files has been loaded before we attempt to use TextManager
+ foreach (string missingPackagePath in missingPackagePaths)
+ {
+ DebugConsole.ThrowError(TextManager.Get("ContentPackageNotFound").Replace("[packagepath]", missingPackagePath));
+ }
+ foreach (ContentPackage incompatiblePackage in incompatiblePackages)
+ {
+ DebugConsole.ThrowError(TextManager.Get(incompatiblePackage.GameVersion <= new Version(0, 0, 0, 0) ? "IncompatibleContentPackageUnknownVersion" : "IncompatibleContentPackage")
+ .Replace("[packagename]", incompatiblePackage.Name)
+ .Replace("[packageversion]", incompatiblePackage.GameVersion.ToString())
+ .Replace("[gameversion]", GameMain.Version.ToString()));
+ }
+ foreach (ContentPackage contentPackage in SelectedContentPackages)
+ {
+ foreach (ContentFile file in contentPackage.Files)
+ {
+ if (!System.IO.File.Exists(file.Path))
+ {
+ DebugConsole.ThrowError("Error in content package \"" + contentPackage.Name + "\" - file \"" + file.Path + "\" not found.");
+ continue;
+ }
+ ToolBox.IsProperFilenameCase(file.Path);
+ }
+ }
+ if (!SelectedContentPackages.Any())
+ {
+ var availablePackage = ContentPackage.List.FirstOrDefault(cp => cp.IsCompatible() && cp.CorePackage);
+ if (availablePackage != null)
+ {
+ SelectedContentPackages.Add(availablePackage);
+ }
+ }
+
+ TextManager.LoadTextPacks(SelectedContentPackages);
+
+ //display error messages after all content packages have been loaded
+ //to make sure the package that contains text files has been loaded before we attempt to use TextManager
+ foreach (string missingPackagePath in missingPackagePaths)
+ {
+ DebugConsole.ThrowError(TextManager.Get("ContentPackageNotFound").Replace("[packagepath]", missingPackagePath));
+ }
+ foreach (ContentPackage incompatiblePackage in incompatiblePackages)
+ {
+ DebugConsole.ThrowError(TextManager.Get(incompatiblePackage.GameVersion <= new Version(0, 0, 0, 0) ? "IncompatibleContentPackageUnknownVersion" : "IncompatibleContentPackage")
+ .Replace("[packagename]", incompatiblePackage.Name)
+ .Replace("[packageversion]", incompatiblePackage.GameVersion.ToString())
+ .Replace("[gameversion]", GameMain.Version.ToString()));
+ }
+ foreach (ContentPackage contentPackage in SelectedContentPackages)
+ {
+ foreach (ContentFile file in contentPackage.Files)
+ {
+ if (!System.IO.File.Exists(file.Path))
+ {
+ DebugConsole.ThrowError("Error in content package \"" + contentPackage.Name + "\" - file \"" + file.Path + "\" not found.");
+ continue;
+ }
+ ToolBox.IsProperFilenameCase(file.Path);
+ }
+ }
+
+ TextManager.LoadTextPacks(SelectedContentPackages);
+
+ //display error messages after all content packages have been loaded
+ //to make sure the package that contains text files has been loaded before we attempt to use TextManager
+ foreach (string missingPackagePath in missingPackagePaths)
+ {
+ DebugConsole.ThrowError(TextManager.Get("ContentPackageNotFound").Replace("[packagepath]", missingPackagePath));
+ }
+ foreach (ContentPackage incompatiblePackage in incompatiblePackages)
+ {
+ DebugConsole.ThrowError(TextManager.Get(incompatiblePackage.GameVersion <= new Version(0, 0, 0, 0) ? "IncompatibleContentPackageUnknownVersion" : "IncompatibleContentPackage")
+ .Replace("[packagename]", incompatiblePackage.Name)
+ .Replace("[packageversion]", incompatiblePackage.GameVersion.ToString())
+ .Replace("[gameversion]", GameMain.Version.ToString()));
+ }
+ foreach (ContentPackage contentPackage in SelectedContentPackages)
+ {
+ foreach (ContentFile file in contentPackage.Files)
+ {
+ if (!System.IO.File.Exists(file.Path))
+ {
+ DebugConsole.ThrowError("Error in content package \"" + contentPackage.Name + "\" - file \"" + file.Path + "\" not found.");
+ continue;
+ }
+ ToolBox.IsProperFilenameCase(file.Path);
+ }
+ }
+ if (!SelectedContentPackages.Any())
+ {
+ var availablePackage = ContentPackage.List.FirstOrDefault(cp => cp.IsCompatible() && cp.CorePackage);
+ if (availablePackage != null)
+ {
+ SelectedContentPackages.Add(availablePackage);
+ }
+ }
+
//save to get rid of the invalid selected packages in the config file
if (missingPackagePaths.Count > 0 || incompatiblePackages.Count > 0) { SaveNewPlayerConfig(); }
}
@@ -991,7 +1083,369 @@ namespace Barotrauma
gMode = new XElement("graphicsmode");
doc.Root.Add(gMode);
}
+ if (GraphicsWidth == 0 || GraphicsHeight == 0)
+ {
+ gMode.ReplaceAttributes(new XAttribute("displaymode", windowMode));
+ }
+ else
+ {
+ gMode.ReplaceAttributes(
+ new XAttribute("width", GraphicsWidth),
+ new XAttribute("height", GraphicsHeight),
+ new XAttribute("vsync", VSyncEnabled),
+ new XAttribute("displaymode", windowMode));
+ }
+ XElement gSettings = doc.Root.Element("graphicssettings");
+ if (gSettings == null)
+ {
+ gSettings = new XElement("graphicssettings");
+ doc.Root.Add(gSettings);
+ }
+
+ gSettings.ReplaceAttributes(
+ new XAttribute("particlelimit", ParticleLimit),
+ new XAttribute("lightmapscale", LightMapScale),
+ new XAttribute("specularity", SpecularityEnabled),
+ new XAttribute("chromaticaberration", ChromaticAberrationEnabled),
+ new XAttribute("losmode", LosMode),
+ new XAttribute("hudscale", HUDScale),
+ new XAttribute("inventoryscale", InventoryScale));
+
+ foreach (ContentPackage contentPackage in SelectedContentPackages)
+ {
+ if (contentPackage.Path.Contains(vanillaContentPackagePath))
+ {
+ doc.Root.Add(new XElement("contentpackage", new XAttribute("path", contentPackage.Path)));
+ break;
+ }
+ }
+
+ var keyMappingElement = new XElement("keymapping");
+ doc.Root.Add(keyMappingElement);
+ for (int i = 0; i < keyMapping.Length; i++)
+ {
+ if (keyMapping[i].MouseButton == null)
+ {
+ keyMappingElement.Add(new XAttribute(((InputType)i).ToString(), keyMapping[i].Key));
+ }
+ else
+ {
+ keyMappingElement.Add(new XAttribute(((InputType)i).ToString(), keyMapping[i].MouseButton));
+ }
+ }
+
+ var gameplay = new XElement("gameplay");
+ var jobPreferences = new XElement("jobpreferences");
+ foreach (string jobName in JobPreferences)
+ {
+ jobPreferences.Add(new XElement("job", new XAttribute("identifier", jobName)));
+ }
+ gameplay.Add(jobPreferences);
+ doc.Root.Add(gameplay);
+
+ var playerElement = new XElement("player",
+ new XAttribute("name", defaultPlayerName ?? ""),
+ new XAttribute("headindex", CharacterHeadIndex),
+ new XAttribute("gender", CharacterGender),
+ new XAttribute("race", CharacterRace),
+ new XAttribute("hairindex", CharacterHairIndex),
+ new XAttribute("beardindex", CharacterBeardIndex),
+ new XAttribute("moustacheindex", CharacterMoustacheIndex),
+ new XAttribute("faceattachmentindex", CharacterFaceAttachmentIndex));
+ doc.Root.Add(playerElement);
+
+ XmlWriterSettings settings = new XmlWriterSettings
+ {
+ Indent = true,
+ OmitXmlDeclaration = true,
+ NewLineOnAttributes = true
+ };
+
+ try
+ {
+ using (var writer = XmlWriter.Create(savePath, settings))
+ {
+ doc.WriteTo(writer);
+ writer.Flush();
+ }
+ }
+ catch (Exception e)
+ {
+ DebugConsole.ThrowError("Saving game settings failed.", e);
+ GameAnalyticsManager.AddErrorEventOnce("GameSettings.Save:SaveFailed", GameAnalyticsSDK.Net.EGAErrorSeverity.Error,
+ "Saving game settings failed.\n" + e.Message + "\n" + e.StackTrace);
+ }
+ }
+ #endregion
+
+ #region Load PlayerConfig
+ // TODO: DRY
+ public void LoadPlayerConfig()
+ {
+ XDocument doc = XMLExtensions.LoadXml(playerSavePath);
+
+ if (doc == null || doc.Root == null)
+ {
+ ShowUserStatisticsPrompt = true;
+ SaveNewPlayerConfig();
+ return;
+ }
+
+ Language = doc.Root.GetAttributeString("language", Language);
+ AutoCheckUpdates = doc.Root.GetAttributeBool("autocheckupdates", AutoCheckUpdates);
+ sendUserStatistics = doc.Root.GetAttributeBool("senduserstatistics", true);
+
+ XElement graphicsMode = doc.Root.Element("graphicsmode");
+ GraphicsWidth = graphicsMode.GetAttributeInt("width", GraphicsWidth);
+ GraphicsHeight = graphicsMode.GetAttributeInt("height", GraphicsHeight);
+ VSyncEnabled = graphicsMode.GetAttributeBool("vsync", VSyncEnabled);
+
+ XElement graphicsSettings = doc.Root.Element("graphicssettings");
+ ParticleLimit = graphicsSettings.GetAttributeInt("particlelimit", ParticleLimit);
+ LightMapScale = MathHelper.Clamp(graphicsSettings.GetAttributeFloat("lightmapscale", LightMapScale), 0.1f, 1.0f);
+ SpecularityEnabled = graphicsSettings.GetAttributeBool("specularity", SpecularityEnabled);
+ ChromaticAberrationEnabled = graphicsSettings.GetAttributeBool("chromaticaberration", ChromaticAberrationEnabled);
+ HUDScale = graphicsSettings.GetAttributeFloat("hudscale", HUDScale);
+ InventoryScale = graphicsSettings.GetAttributeFloat("inventoryscale", InventoryScale);
+ var losModeStr = graphicsSettings.GetAttributeString("losmode", "Transparent");
+ if (!Enum.TryParse(losModeStr, out losMode))
+ {
+ losMode = LosMode.Transparent;
+ }
+
+#if CLIENT
+ if (GraphicsWidth == 0 || GraphicsHeight == 0)
+ {
+ GraphicsWidth = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width;
+ GraphicsHeight = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height;
+ }
+#endif
+
+ var windowModeStr = graphicsMode.GetAttributeString("displaymode", "Fullscreen");
+ if (!Enum.TryParse(windowModeStr, out windowMode))
+ {
+ windowMode = WindowMode.Fullscreen;
+ }
+
+ XElement audioSettings = doc.Root.Element("audio");
+ if (audioSettings != null)
+ {
+ SoundVolume = audioSettings.GetAttributeFloat("soundvolume", SoundVolume);
+ MusicVolume = audioSettings.GetAttributeFloat("musicvolume", MusicVolume);
+ VoiceChatVolume = audioSettings.GetAttributeFloat("voicechatvolume", VoiceChatVolume);
+ string voiceSettingStr = audioSettings.GetAttributeString("voicesetting", "Disabled");
+ VoiceCaptureDevice = audioSettings.GetAttributeString("voicecapturedevice", "");
+ NoiseGateThreshold = audioSettings.GetAttributeFloat("noisegatethreshold", -45);
+ var voiceSetting = VoiceMode.Disabled;
+ if (Enum.TryParse(voiceSettingStr, out voiceSetting))
+ {
+ VoiceSetting = voiceSetting;
+ }
+ }
+
+ useSteamMatchmaking = doc.Root.GetAttributeBool("usesteammatchmaking", useSteamMatchmaking);
+ requireSteamAuthentication = doc.Root.GetAttributeBool("requiresteamauthentication", requireSteamAuthentication);
+
+ EnableSplashScreen = doc.Root.GetAttributeBool("enablesplashscreen", EnableSplashScreen);
+
+ AimAssistAmount = doc.Root.GetAttributeFloat("aimassistamount", AimAssistAmount);
+
+ foreach (XElement subElement in doc.Root.Elements())
+ {
+ switch (subElement.Name.ToString().ToLowerInvariant())
+ {
+ case "keymapping":
+ 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;
+ case "gameplay":
+ jobPreferences = new List();
+ foreach (XElement ele in subElement.Element("jobpreferences").Elements("job"))
+ {
+ string jobIdentifier = ele.GetAttributeString("identifier", "");
+ if (string.IsNullOrEmpty(jobIdentifier)) continue;
+ jobPreferences.Add(jobIdentifier);
+ }
+ break;
+ case "player":
+ defaultPlayerName = subElement.GetAttributeString("name", defaultPlayerName);
+ CharacterHeadIndex = subElement.GetAttributeInt("headindex", CharacterHeadIndex);
+ if (Enum.TryParse(subElement.GetAttributeString("gender", "none"), true, out Gender g))
+ {
+ CharacterGender = g;
+ }
+ if (Enum.TryParse(subElement.GetAttributeString("race", "white"), true, out Race r))
+ {
+ CharacterRace = r;
+ }
+ else
+ {
+ CharacterRace = Race.White;
+ }
+ CharacterHairIndex = subElement.GetAttributeInt("hairindex", CharacterHairIndex);
+ CharacterBeardIndex = subElement.GetAttributeInt("beardindex", CharacterBeardIndex);
+ CharacterMoustacheIndex = subElement.GetAttributeInt("moustacheindex", CharacterMoustacheIndex);
+ CharacterFaceAttachmentIndex = subElement.GetAttributeInt("faceattachmentindex", CharacterFaceAttachmentIndex);
+ break;
+ case "tutorials":
+ foreach (XElement tutorialElement in subElement.Elements())
+ {
+ CompletedTutorialNames.Add(tutorialElement.GetAttributeString("name", ""));
+ }
+ break;
+ }
+ }
+
+ foreach (InputType inputType in Enum.GetValues(typeof(InputType)))
+ {
+ if (keyMapping[(int)inputType] == null)
+ {
+ DebugConsole.ThrowError("Key binding for the input type \"" + inputType + " not set!");
+ keyMapping[(int)inputType] = new KeyOrMouse(Keys.D1);
+ }
+ }
+
+ UnsavedSettings = false;
+
+ selectedContentPackagePaths = new HashSet();
+
+ foreach (XElement subElement in doc.Root.Elements())
+ {
+ switch (subElement.Name.ToString().ToLowerInvariant())
+ {
+ case "contentpackage":
+ string path = System.IO.Path.GetFullPath(subElement.GetAttributeString("path", ""));
+ selectedContentPackagePaths.Add(path);
+ break;
+ }
+ }
+
+ LoadContentPackages(selectedContentPackagePaths);
+ }
+
+ public void ReloadContentPackages()
+ {
+ LoadContentPackages(selectedContentPackagePaths);
+ }
+
+ private void LoadContentPackages(IEnumerable contentPackagePaths)
+ {
+ var missingPackagePaths = new List();
+ var incompatiblePackages = new List();
+ SelectedContentPackages.Clear();
+ foreach (string path in contentPackagePaths)
+ {
+ var matchingContentPackage = ContentPackage.List.Find(cp => System.IO.Path.GetFullPath(cp.Path) == path);
+
+ if (matchingContentPackage == null)
+ {
+ missingPackagePaths.Add(path);
+ }
+ else if (!matchingContentPackage.IsCompatible())
+ {
+ incompatiblePackages.Add(matchingContentPackage);
+ }
+ else
+ {
+ SelectedContentPackages.Add(matchingContentPackage);
+ }
+ }
+
+ TextManager.LoadTextPacks(SelectedContentPackages);
+
+ foreach (ContentPackage contentPackage in SelectedContentPackages)
+ {
+ foreach (ContentFile file in contentPackage.Files)
+ {
+ if (!System.IO.File.Exists(file.Path))
+ {
+ DebugConsole.ThrowError("Error in content package \"" + contentPackage.Name + "\" - file \"" + file.Path + "\" not found.");
+ continue;
+ }
+ ToolBox.IsProperFilenameCase(file.Path);
+ }
+ }
+ if (!SelectedContentPackages.Any())
+ {
+ var availablePackage = ContentPackage.List.FirstOrDefault(cp => cp.IsCompatible() && cp.CorePackage);
+ if (availablePackage != null)
+ {
+ SelectedContentPackages.Add(availablePackage);
+ }
+ }
+
+ //save to get rid of the invalid selected packages in the config file
+ if (missingPackagePaths.Count > 0 || incompatiblePackages.Count > 0) { SaveNewPlayerConfig(); }
+
+ //display error messages after all content packages have been loaded
+ //to make sure the package that contains text files has been loaded before we attempt to use TextManager
+ foreach (string missingPackagePath in missingPackagePaths)
+ {
+ DebugConsole.ThrowError(TextManager.Get("ContentPackageNotFound").Replace("[packagepath]", missingPackagePath));
+ }
+ foreach (ContentPackage incompatiblePackage in incompatiblePackages)
+ {
+ DebugConsole.ThrowError(TextManager.Get(incompatiblePackage.GameVersion <= new Version(0, 0, 0, 0) ? "IncompatibleContentPackageUnknownVersion" : "IncompatibleContentPackage")
+ .Replace("[packagename]", incompatiblePackage.Name)
+ .Replace("[packageversion]", incompatiblePackage.GameVersion.ToString())
+ .Replace("[gameversion]", GameMain.Version.ToString()));
+ }
+ }
+ #endregion
+
+ #region Save PlayerConfig
+ public void SaveNewPlayerConfig()
+ {
+ XDocument doc = new XDocument();
+ UnsavedSettings = false;
+
+ if (doc.Root == null)
+ {
+ doc.Add(new XElement("config"));
+ }
+
+ doc.Root.Add(
+ new XAttribute("language", TextManager.Language),
+ new XAttribute("masterserverurl", MasterServerUrl),
+ new XAttribute("autocheckupdates", AutoCheckUpdates),
+ new XAttribute("musicvolume", musicVolume),
+ new XAttribute("soundvolume", soundVolume),
+ new XAttribute("verboselogging", VerboseLogging),
+ new XAttribute("savedebugconsolelogs", SaveDebugConsoleLogs),
+ new XAttribute("enablesplashscreen", EnableSplashScreen),
+ new XAttribute("usesteammatchmaking", useSteamMatchmaking),
+ new XAttribute("quickstartsub", QuickStartSubmarineName),
+ new XAttribute("requiresteamauthentication", requireSteamAuthentication),
+ new XAttribute("autoupdateworkshopitems", AutoUpdateWorkshopItems),
+ new XAttribute("aimassistamount", aimAssistAmount));
+
+ if (!ShowUserStatisticsPrompt)
+ {
+ doc.Root.Add(new XAttribute("senduserstatistics", sendUserStatistics));
+ }
+
+ XElement gMode = doc.Root.Element("graphicsmode");
+ if (gMode == null)
+ {
+ gMode = new XElement("graphicsmode");
+ doc.Root.Add(gMode);
+ }
if (GraphicsWidth == 0 || GraphicsHeight == 0)
{
gMode.ReplaceAttributes(new XAttribute("displaymode", windowMode));
@@ -1073,266 +1527,6 @@ namespace Barotrauma
new XAttribute("moustacheindex", CharacterMoustacheIndex),
new XAttribute("faceattachmentindex", CharacterFaceAttachmentIndex));
doc.Root.Add(playerElement);
-
-#if CLIENT
- if (Tutorial.Tutorials != null)
- {
- foreach (Tutorial tutorial in Tutorial.Tutorials)
- {
- if (tutorial.Completed && !CompletedTutorialNames.Contains(tutorial.Name))
- {
- CompletedTutorialNames.Add(tutorial.Name);
- }
- }
- }
-#endif
- var tutorialElement = new XElement("tutorials");
- foreach (string tutorialName in CompletedTutorialNames)
- {
- tutorialElement.Add(new XElement("Tutorial", new XAttribute("name", tutorialName)));
- }
- doc.Root.Add(tutorialElement);
-
- XmlWriterSettings settings = new XmlWriterSettings
- {
- Indent = true,
- OmitXmlDeclaration = true,
- NewLineOnAttributes = true
- };
-
-#if CLIENT
- if (Tutorial.Tutorials != null)
- {
- foreach (Tutorial tutorial in Tutorial.Tutorials)
- {
- if (tutorial.Completed && !CompletedTutorialNames.Contains(tutorial.Name))
- {
- CompletedTutorialNames.Add(tutorial.Name);
- }
- }
- }
-#endif
- var tutorialElement = new XElement("tutorials");
- foreach (string tutorialName in CompletedTutorialNames)
- {
- tutorialElement.Add(new XElement("Tutorial", new XAttribute("name", tutorialName)));
- }
- doc.Root.Add(tutorialElement);
-
- XmlWriterSettings settings = new XmlWriterSettings
- {
- Indent = true,
- OmitXmlDeclaration = true,
- NewLineOnAttributes = true
- };
-
-#if CLIENT
- if (Tutorial.Tutorials != null)
- {
- foreach (Tutorial tutorial in Tutorial.Tutorials)
- {
- if (tutorial.Completed && !CompletedTutorialNames.Contains(tutorial.Name))
- {
- CompletedTutorialNames.Add(tutorial.Name);
- }
- }
- }
-#endif
- var tutorialElement = new XElement("tutorials");
- foreach (string tutorialName in CompletedTutorialNames)
- {
- tutorialElement.Add(new XElement("Tutorial", new XAttribute("name", tutorialName)));
- }
- doc.Root.Add(tutorialElement);
-
- XmlWriterSettings settings = new XmlWriterSettings
- {
- Indent = true,
- OmitXmlDeclaration = true,
- NewLineOnAttributes = true
- };
-
-#if CLIENT
- if (Tutorial.Tutorials != null)
- {
- foreach (Tutorial tutorial in Tutorial.Tutorials)
- {
- if (tutorial.Completed && !CompletedTutorialNames.Contains(tutorial.Name))
- {
- CompletedTutorialNames.Add(tutorial.Name);
- }
- }
- }
-#endif
- var tutorialElement = new XElement("tutorials");
- foreach (string tutorialName in CompletedTutorialNames)
- {
- tutorialElement.Add(new XElement("Tutorial", new XAttribute("name", tutorialName)));
- }
- doc.Root.Add(tutorialElement);
-
- XmlWriterSettings settings = new XmlWriterSettings
- {
- Indent = true,
- OmitXmlDeclaration = true,
- NewLineOnAttributes = true
- };
-
-#if CLIENT
- if (Tutorial.Tutorials != null)
- {
- foreach (Tutorial tutorial in Tutorial.Tutorials)
- {
- if (tutorial.Completed && !CompletedTutorialNames.Contains(tutorial.Name))
- {
- CompletedTutorialNames.Add(tutorial.Name);
- }
- }
- }
-#endif
- var tutorialElement = new XElement("tutorials");
- foreach (string tutorialName in CompletedTutorialNames)
- {
- tutorialElement.Add(new XElement("Tutorial", new XAttribute("name", tutorialName)));
- }
- doc.Root.Add(tutorialElement);
-
- XmlWriterSettings settings = new XmlWriterSettings
- {
- Indent = true,
- OmitXmlDeclaration = true,
- NewLineOnAttributes = true
- };
-
-#if CLIENT
- if (Tutorial.Tutorials != null)
- {
- foreach (Tutorial tutorial in Tutorial.Tutorials)
- {
- if (tutorial.Completed && !CompletedTutorialNames.Contains(tutorial.Name))
- {
- CompletedTutorialNames.Add(tutorial.Name);
- }
- }
- }
-#endif
- var tutorialElement = new XElement("tutorials");
- foreach (string tutorialName in CompletedTutorialNames)
- {
- tutorialElement.Add(new XElement("Tutorial", new XAttribute("name", tutorialName)));
- }
- doc.Root.Add(tutorialElement);
-
- XmlWriterSettings settings = new XmlWriterSettings
- {
- Indent = true,
- OmitXmlDeclaration = true,
- NewLineOnAttributes = true
- };
-
-#if CLIENT
- if (Tutorial.Tutorials != null)
- {
- foreach (Tutorial tutorial in Tutorial.Tutorials)
- {
- if (tutorial.Completed && !CompletedTutorialNames.Contains(tutorial.Name))
- {
- CompletedTutorialNames.Add(tutorial.Name);
- }
- }
- }
-#endif
- var tutorialElement = new XElement("tutorials");
- foreach (string tutorialName in CompletedTutorialNames)
- {
- tutorialElement.Add(new XElement("Tutorial", new XAttribute("name", tutorialName)));
- }
- doc.Root.Add(tutorialElement);
-
- XmlWriterSettings settings = new XmlWriterSettings
- {
- Indent = true,
- OmitXmlDeclaration = true,
- NewLineOnAttributes = true
- };
-
-#if CLIENT
- if (Tutorial.Tutorials != null)
- {
- foreach (Tutorial tutorial in Tutorial.Tutorials)
- {
- if (tutorial.Completed && !CompletedTutorialNames.Contains(tutorial.Name))
- {
- CompletedTutorialNames.Add(tutorial.Name);
- }
- }
- }
-#endif
- var tutorialElement = new XElement("tutorials");
- foreach (string tutorialName in CompletedTutorialNames)
- {
- tutorialElement.Add(new XElement("Tutorial", new XAttribute("name", tutorialName)));
- }
- doc.Root.Add(tutorialElement);
-
- XmlWriterSettings settings = new XmlWriterSettings
- {
- Indent = true,
- OmitXmlDeclaration = true,
- NewLineOnAttributes = true
- };
-
-#if CLIENT
- if (Tutorial.Tutorials != null)
- {
- foreach (Tutorial tutorial in Tutorial.Tutorials)
- {
- if (tutorial.Completed && !CompletedTutorialNames.Contains(tutorial.Name))
- {
- CompletedTutorialNames.Add(tutorial.Name);
- }
- }
- }
-#endif
- var tutorialElement = new XElement("tutorials");
- foreach (string tutorialName in CompletedTutorialNames)
- {
- tutorialElement.Add(new XElement("Tutorial", new XAttribute("name", tutorialName)));
- }
- doc.Root.Add(tutorialElement);
-
- XmlWriterSettings settings = new XmlWriterSettings
- {
- Indent = true,
- OmitXmlDeclaration = true,
- NewLineOnAttributes = true
- };
-
-#if CLIENT
- if (Tutorial.Tutorials != null)
- {
- foreach (Tutorial tutorial in Tutorial.Tutorials)
- {
- if (tutorial.Completed && !CompletedTutorialNames.Contains(tutorial.Name))
- {
- CompletedTutorialNames.Add(tutorial.Name);
- }
- }
- }
-#endif
- var tutorialElement = new XElement("tutorials");
- foreach (string tutorialName in CompletedTutorialNames)
- {
- tutorialElement.Add(new XElement("Tutorial", new XAttribute("name", tutorialName)));
- }
- doc.Root.Add(tutorialElement);
-
- XmlWriterSettings settings = new XmlWriterSettings
- {
- Indent = true,
- OmitXmlDeclaration = true,
- NewLineOnAttributes = true
- };
#if CLIENT
if (Tutorial.Tutorials != null)
diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Power/PowerContainer.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Power/PowerContainer.cs
index c5d01cc58..7d1175df3 100644
--- a/Barotrauma/BarotraumaShared/Source/Items/Components/Power/PowerContainer.cs
+++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Power/PowerContainer.cs
@@ -3,6 +3,7 @@ using Lidgren.Network;
using Microsoft.Xna.Framework;
using System;
using System.Collections.Generic;
+using System.Globalization;
using System.Xml.Linq;
namespace Barotrauma.Items.Components
@@ -204,6 +205,15 @@ namespace Barotrauma.Items.Components
Charge -= CurrPowerOutput / 3600.0f;
}
+ item.SendSignal(0, Charge.ToString(), "charge", null);
+ item.SendSignal(0, ((Charge / capacity) * 100).ToString(), "charge_%", null);
+ item.SendSignal(0, ((RechargeSpeed / maxRechargeSpeed) * 100).ToString(), "charge_rate", null);
+
+ foreach (Pair connected in directlyConnected)
+ {
+ connected.First.ReceiveSignal(0, "", connected.Second, source: item, sender: null,
+ power: gridLoad <= 0.0f ? 1.0f : CurrPowerOutput / gridLoad);
+ }
foreach (Pair connected in directlyConnected)
{
@@ -259,6 +269,15 @@ namespace Barotrauma.Items.Components
public override void ReceiveSignal(int stepsTaken, string signal, Connection connection, Item source, Character sender, float power, float signalStrength = 1.0f)
{
+ if (connection.Name == "set_rate")
+ {
+ float tempSpeed;
+ if (float.TryParse(signal, NumberStyles.Any, CultureInfo.InvariantCulture, out tempSpeed))
+ {
+ if (!MathUtils.IsValid(tempSpeed)) return;
+ RechargeSpeed = MathHelper.Clamp(tempSpeed / 100.0f, 0.0f, 1.0f) * MaxRechargeSpeed;
+ }
+ }
if (!connection.IsPower) return;
if (connection.Name == "power_in")
diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/AdderComponent.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/AdderComponent.cs
index 00756bb85..bd7133478 100644
--- a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/AdderComponent.cs
+++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/AdderComponent.cs
@@ -1,4 +1,5 @@
-using System;
+using Microsoft.Xna.Framework;
+using System;
using System.Globalization;
using System.Xml.Linq;
@@ -10,11 +11,24 @@ namespace Barotrauma.Items.Components
protected float[] timeSinceReceived;
protected float[] receivedSignal;
-
-
+
//the output is sent if both inputs have received a signal within the timeframe
protected float timeFrame;
-
+
+ [InGameEditable(MinValueFloat = -999999.0f, MaxValueFloat = 999999.0f), Serialize(999999.0f, true)]
+ public float ClampMax
+ {
+ get;
+ set;
+ }
+
+ [InGameEditable(MinValueFloat = -999999.0f, MaxValueFloat = 999999.0f), Serialize(-999999.0f, true)]
+ public float ClampMin
+ {
+ get;
+ set;
+ }
+
[InGameEditable(DecimalCount = 2), Serialize(0.0f, true)]
public float TimeFrame
{
@@ -43,7 +57,8 @@ namespace Barotrauma.Items.Components
}
if (sendOutput)
{
- item.SendSignal(0, (receivedSignal[0] + receivedSignal[1]).ToString(), "signal_out", null);
+ float output = receivedSignal[0] + receivedSignal[1];
+ item.SendSignal(0, MathHelper.Clamp(output, ClampMin, ClampMax).ToString("G", CultureInfo.InvariantCulture), "signal_out", null);
}
}
diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/ColorComponent.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/ColorComponent.cs
new file mode 100644
index 000000000..55a681c57
--- /dev/null
+++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/ColorComponent.cs
@@ -0,0 +1,56 @@
+using System;
+using System.Globalization;
+using System.Xml.Linq;
+
+namespace Barotrauma.Items.Components
+{
+ class ColorComponent : ItemComponent
+ {
+ protected float[] receivedSignal;
+
+ private string output = "0,0,0,0";
+
+ public ColorComponent(Item item, XElement element)
+ : base(item, element)
+ {
+ receivedSignal = new float[4];
+ IsActive = true;
+ }
+
+ public override void Update(float deltaTime, Camera cam)
+ {
+ item.SendSignal(0, output, "signal_out", null);
+ }
+
+ private void UpdateOutput()
+ {
+ output = receivedSignal[0].ToString("G", CultureInfo.InvariantCulture);
+ output += "," + receivedSignal[1].ToString("G", CultureInfo.InvariantCulture);
+ output += "," + receivedSignal[2].ToString("G", CultureInfo.InvariantCulture);
+ output += "," + receivedSignal[3].ToString("G", CultureInfo.InvariantCulture);
+ }
+
+ public override void ReceiveSignal(int stepsTaken, string signal, Connection connection, Item source, Character sender, float power = 0.0f, float signalStrength = 1.0f)
+ {
+ switch (connection.Name)
+ {
+ case "signal_r":
+ float.TryParse(signal, NumberStyles.Float, CultureInfo.InvariantCulture, out receivedSignal[0]);
+ UpdateOutput();
+ break;
+ case "signal_g":
+ float.TryParse(signal, NumberStyles.Float, CultureInfo.InvariantCulture, out receivedSignal[1]);
+ UpdateOutput();
+ break;
+ case "signal_b":
+ float.TryParse(signal, NumberStyles.Float, CultureInfo.InvariantCulture, out receivedSignal[2]);
+ UpdateOutput();
+ break;
+ case "signal_a":
+ float.TryParse(signal, NumberStyles.Float, CultureInfo.InvariantCulture, out receivedSignal[3]);
+ UpdateOutput();
+ break;
+ }
+ }
+ }
+}
diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/DivideComponent.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/DivideComponent.cs
new file mode 100644
index 000000000..0074db2ed
--- /dev/null
+++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/DivideComponent.cs
@@ -0,0 +1,29 @@
+using System;
+using System.Globalization;
+using System.Xml.Linq;
+
+namespace Barotrauma.Items.Components
+{
+ class DivideComponent : AdderComponent
+ {
+ public DivideComponent(Item item, XElement element)
+ : base(item, element)
+ {
+ IsActive = true;
+ }
+
+ public override void Update(float deltaTime, Camera cam)
+ {
+ bool sendOutput = true;
+ for (int i = 0; i < timeSinceReceived.Length; i++)
+ {
+ if (timeSinceReceived[i] > timeFrame) sendOutput = false;
+ timeSinceReceived[i] += deltaTime;
+ }
+ if (sendOutput)
+ {
+ item.SendSignal(0, (receivedSignal[0] / receivedSignal[1]).ToString("G", CultureInfo.InvariantCulture), "signal_out", null);
+ }
+ }
+ }
+}
diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/EqualsComponent.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/EqualsComponent.cs
new file mode 100644
index 000000000..a406d0609
--- /dev/null
+++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/EqualsComponent.cs
@@ -0,0 +1,83 @@
+using System;
+using System.Xml.Linq;
+
+namespace Barotrauma.Items.Components
+{
+ class EqualsComponent : ItemComponent
+ {
+ protected string output, falseOutput;
+
+ //an array to keep track of how long ago a signal was received on both inputs
+ protected float[] timeSinceReceived;
+
+ protected string[] receivedSignal;
+
+ //the output is sent if both inputs have received a signal within the timeframe
+ protected float timeFrame;
+
+ [InGameEditable, Serialize("1", true)]
+ public string Output
+ {
+ get { return output; }
+ set { output = value; }
+ }
+
+ [InGameEditable, Serialize("", true)]
+ public string FalseOutput
+ {
+ get { return falseOutput; }
+ set { falseOutput = value; }
+ }
+
+ [InGameEditable(DecimalCount = 2), Serialize(0.0f, true)]
+ public float TimeFrame
+ {
+ get { return timeFrame; }
+ set
+ {
+ timeFrame = Math.Max(0.0f, value);
+ }
+ }
+
+ public EqualsComponent(Item item, XElement element)
+ : base(item, element)
+ {
+ timeSinceReceived = new float[] { Math.Max(timeFrame * 2.0f, 0.1f), Math.Max(timeFrame * 2.0f, 0.1f) };
+ receivedSignal = new string[2];
+ IsActive = true;
+ }
+
+ public override void Update(float deltaTime, Camera cam)
+ {
+ bool sendOutput = false;
+ for (int i = 0; i < timeSinceReceived.Length; i++)
+ {
+ if (timeSinceReceived[i] <= timeFrame) sendOutput = true;
+ timeSinceReceived[i] += deltaTime;
+ }
+
+ if (sendOutput)
+ {
+ string signalOut = receivedSignal[0] == receivedSignal[1] ? output : falseOutput;
+ if (string.IsNullOrEmpty(signalOut)) return;
+
+ item.SendSignal(0, signalOut, "signal_out", null);
+ }
+ }
+
+ public override void ReceiveSignal(int stepsTaken, string signal, Connection connection, Item source, Character sender, float power = 0.0f, float signalStrength = 1.0f)
+ {
+ switch (connection.Name)
+ {
+ case "signal_in1":
+ receivedSignal[0] = signal;
+ timeSinceReceived[0] = 0.0f;
+ break;
+ case "signal_in2":
+ receivedSignal[1] = signal;
+ timeSinceReceived[1] = 0.0f;
+ break;
+ }
+ }
+ }
+}
diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/GreaterComponent.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/GreaterComponent.cs
new file mode 100644
index 000000000..25794cb16
--- /dev/null
+++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/GreaterComponent.cs
@@ -0,0 +1,41 @@
+using System.Globalization;
+using System.Xml.Linq;
+
+namespace Barotrauma.Items.Components
+{
+ class GreaterComponent : EqualsComponent
+ {
+ private float val1, val2;
+
+ public GreaterComponent(Item item, XElement element)
+ : base(item, element)
+ {
+ IsActive = true;
+ }
+
+ public override void Update(float deltaTime, Camera cam)
+ {
+ bool sendOutput = false;
+ for (int i = 0; i < timeSinceReceived.Length; i++)
+ {
+ if (timeSinceReceived[i] <= timeFrame) sendOutput = true;
+ timeSinceReceived[i] += deltaTime;
+ }
+
+ if (sendOutput)
+ {
+ string signalOut = val1 > val2 ? output : falseOutput;
+ if (string.IsNullOrEmpty(signalOut)) return;
+
+ item.SendSignal(0, signalOut, "signal_out", null);
+ }
+ }
+
+ public override void ReceiveSignal(int stepsTaken, string signal, Connection connection, Item source, Character sender, float power = 0.0f, float signalStrength = 1.0f)
+ {
+ base.ReceiveSignal(stepsTaken, signal, connection, source, sender, power, signalStrength);
+ float.TryParse(receivedSignal[0], NumberStyles.Float, CultureInfo.InvariantCulture, out val1);
+ float.TryParse(receivedSignal[1], NumberStyles.Float, CultureInfo.InvariantCulture, out val2);
+ }
+ }
+}
diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/MemoryComponent.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/MemoryComponent.cs
new file mode 100644
index 000000000..4113a5d88
--- /dev/null
+++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/MemoryComponent.cs
@@ -0,0 +1,40 @@
+using System.Xml.Linq;
+
+namespace Barotrauma.Items.Components
+{
+ class MemoryComponent : ItemComponent
+ {
+ [InGameEditable, Serialize("", true)]
+ public string Value
+ {
+ get;
+ set;
+ }
+
+ protected bool writeable = true;
+
+ public MemoryComponent(Item item, XElement element)
+ : base(item, element)
+ {
+ IsActive = true;
+ }
+
+ public override void Update(float deltaTime, Camera cam)
+ {
+ item.SendSignal(0, Value, "signal_out", null);
+ }
+
+ public override void ReceiveSignal(int stepsTaken, string signal, Connection connection, Item source, Character sender, float power = 0.0f, float signalStrength = 1.0f)
+ {
+ switch (connection.Name)
+ {
+ case "signal_in":
+ if (writeable) { Value = signal; }
+ break;
+ case "signal_store":
+ writeable = (signal == "1");
+ break;
+ }
+ }
+ }
+}
diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/MultiplyComponent.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/MultiplyComponent.cs
new file mode 100644
index 000000000..30f508836
--- /dev/null
+++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/MultiplyComponent.cs
@@ -0,0 +1,28 @@
+using System.Globalization;
+using System.Xml.Linq;
+
+namespace Barotrauma.Items.Components
+{
+ class MultiplyComponent : AdderComponent
+ {
+ public MultiplyComponent(Item item, XElement element)
+ : base(item, element)
+ {
+ IsActive = true;
+ }
+
+ public override void Update(float deltaTime, Camera cam)
+ {
+ bool sendOutput = true;
+ for (int i = 0; i < timeSinceReceived.Length; i++)
+ {
+ if (timeSinceReceived[i] > timeFrame) sendOutput = false;
+ timeSinceReceived[i] += deltaTime;
+ }
+ if (sendOutput)
+ {
+ item.SendSignal(0, (receivedSignal[0] * receivedSignal[1]).ToString("G", CultureInfo.InvariantCulture), "signal_out", null);
+ }
+ }
+ }
+}
diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/SubtractComponent.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/SubtractComponent.cs
new file mode 100644
index 000000000..cf86359e5
--- /dev/null
+++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/SubtractComponent.cs
@@ -0,0 +1,28 @@
+using System.Globalization;
+using System.Xml.Linq;
+
+namespace Barotrauma.Items.Components
+{
+ class SubtractComponent : AdderComponent
+ {
+ public SubtractComponent(Item item, XElement element)
+ : base(item, element)
+ {
+ IsActive = true;
+ }
+
+ public override void Update(float deltaTime, Camera cam)
+ {
+ bool sendOutput = true;
+ for (int i = 0; i < timeSinceReceived.Length; i++)
+ {
+ if (timeSinceReceived[i] > timeFrame) sendOutput = false;
+ timeSinceReceived[i] += deltaTime;
+ }
+ if (sendOutput)
+ {
+ item.SendSignal(0, (receivedSignal[0] - receivedSignal[1]).ToString("G", CultureInfo.InvariantCulture), "signal_out", null);
+ }
+ }
+ }
+}
diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/XorComponent.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/XorComponent.cs
new file mode 100644
index 000000000..d6504c6a3
--- /dev/null
+++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/XorComponent.cs
@@ -0,0 +1,28 @@
+using System.Xml.Linq;
+
+namespace Barotrauma.Items.Components
+{
+ class XorComponent : AndComponent
+ {
+ public XorComponent(Item item, XElement element)
+ : base(item, element)
+ {
+ IsActive = true;
+ }
+
+ public override void Update(float deltaTime, Camera cam)
+ {
+ int sendOutput = 0;
+ for (int i = 0; i < timeSinceReceived.Length; i++)
+ {
+ if (timeSinceReceived[i] <= timeFrame) sendOutput += 1;
+ timeSinceReceived[i] += deltaTime;
+ }
+
+ string signalOut = sendOutput == 1 ? output : falseOutput;
+ if (string.IsNullOrEmpty(signalOut)) return;
+
+ item.SendSignal(0, signalOut, "signal_out", null);
+ }
+ }
+}
diff --git a/Barotrauma/BarotraumaShared/Source/Map/Map/Map.cs b/Barotrauma/BarotraumaShared/Source/Map/Map/Map.cs
index 5e0b5c4dc..c3d5d2926 100644
--- a/Barotrauma/BarotraumaShared/Source/Map/Map/Map.cs
+++ b/Barotrauma/BarotraumaShared/Source/Map/Map/Map.cs
@@ -430,13 +430,6 @@ namespace Barotrauma
}
CurrentLocation.SelectedMissionIndex = missionIndex;
- //the destination must be the same as the destination of the mission
- if (CurrentLocation.SelectedMission != null &&
- CurrentLocation.SelectedMission.Locations[1] != SelectedLocation)
- {
- SelectLocation(CurrentLocation.SelectedMission.Locations[1]);
- }
-
SelectedLocation = location;
SelectedConnection = connections.Find(c => c.Locations.Contains(CurrentLocation) && c.Locations.Contains(SelectedLocation));
OnLocationSelected?.Invoke(SelectedLocation, SelectedConnection);
diff --git a/Barotrauma/BarotraumaShared/Source/PlayerInput.cs b/Barotrauma/BarotraumaShared/Source/PlayerInput.cs
index fc56c8fc7..dac0e7d44 100644
--- a/Barotrauma/BarotraumaShared/Source/PlayerInput.cs
+++ b/Barotrauma/BarotraumaShared/Source/PlayerInput.cs
@@ -160,16 +160,6 @@ namespace Barotrauma
}
#endif
- public void SetState()
- {
- hit = binding.IsHit();
- if (hit) hitQueue = true;
-
- held = binding.IsDown();
- if (held) heldQueue = true;
- }
-#endif
-
public bool Hit
{
get
diff --git a/Barotrauma/BarotraumaShared/Source/TextManager.cs b/Barotrauma/BarotraumaShared/Source/TextManager.cs
index e14874f1d..2cadb1070 100644
--- a/Barotrauma/BarotraumaShared/Source/TextManager.cs
+++ b/Barotrauma/BarotraumaShared/Source/TextManager.cs
@@ -12,6 +12,8 @@ namespace Barotrauma
//key = language
private static Dictionary> textPacks = new Dictionary>();
+ private static string[] serverMessageCharacters = new string[] { "~", "[", "]", "=" };
+
public static string Language;
private static HashSet availableLanguages = new HashSet();
@@ -136,9 +138,11 @@ namespace Barotrauma
return string.Format(text, args);
}
- // Format: ServerMessage.Identifier1;ServerMessage.Indentifier2_[variable1]=value_[variable2]=value
+ // Format: ServerMessage.Identifier1/ServerMessage.Indentifier2~[variable1]=value~[variable2]=value
public static string GetServerMessage(string serverMessage)
{
+ if (serverMessage.Contains(" ")) return serverMessage; // Spaces found, do not translate
+
if (!textPacks.ContainsKey(Language))
{
DebugConsole.ThrowError("No text packs available for the selected language (" + Language + ")! Switching to English...");
@@ -149,11 +153,11 @@ namespace Barotrauma
}
}
- string[] messages = serverMessage.Split(';');
+ string[] messages = serverMessage.Split('/');
for (int i = 0; i < messages.Length; i++)
{
- if (!messages[i].Contains("_")) // No variables, just translate
+ if (!IsServerMessageWithVariables(messages[i])) // No variables, try to translate
{
string msg = Get(messages[i], true);
@@ -164,13 +168,17 @@ namespace Barotrauma
}
else
{
- string[] messageWithVariables = messages[i].Split('_');
+ string[] messageWithVariables = messages[i].Split('~');
string msg = Get(messageWithVariables[0], true);
if (msg != null) // If a translation was found, otherwise use the original
{
messages[i] = msg;
}
+ else
+ {
+ continue; // No translation found, probably caused by player input -> skip variable handling
+ }
// First index is always the message identifier -> start at 1
for (int j = 1; j < messageWithVariables.Length; j++)
@@ -190,6 +198,16 @@ namespace Barotrauma
return translatedServerMessage;
}
+ public static bool IsServerMessageWithVariables(string message)
+ {
+ for (int i = 0; i < serverMessageCharacters.Length; i++)
+ {
+ if (!message.Contains(serverMessageCharacters[i])) return false;
+ }
+
+ return true;
+ }
+
public static List GetAll(string textTag)
{
if (!textPacks.ContainsKey(Language))
diff --git a/Barotrauma/BarotraumaShared/libSDL2-2.0.0.dylib b/Barotrauma/BarotraumaShared/libSDL2-2.0.0.dylib
deleted file mode 100644
index 11f29935e..000000000
Binary files a/Barotrauma/BarotraumaShared/libSDL2-2.0.0.dylib and /dev/null differ
diff --git a/Barotrauma_Solution.sln b/Barotrauma_Solution.sln
index 7168b9dce..c35da4735 100644
--- a/Barotrauma_Solution.sln
+++ b/Barotrauma_Solution.sln
@@ -3,17 +3,13 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27130.2010
MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BarotraumaClient", "Barotrauma\BarotraumaClient\BarotraumaClient.csproj", "{008C0F83-E914-4966-9135-EA885059EDD8}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowsClient", "Barotrauma\BarotraumaClient\WindowsClient.csproj", "{008C0F83-E914-4966-9135-EA885059EDD8}"
ProjectSection(ProjectDependencies) = postProject
{85232B20-074D-4723-B0C6-91495391E448} = {85232B20-074D-4723-B0C6-91495391E448}
EndProjectSection
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Farseer Physics MonoGame", "Libraries\Farseer Physics Engine 3.5\Farseer Physics MonoGame.csproj", "{0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lidgren.Network", "Libraries\Lidgren.Network\Lidgren.Network.csproj", "{49BA1C69-6104-41AC-A5D8-B54FA9F696E8}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Launcher", "Barotrauma\Launcher\Launcher.csproj", "{251AAFE1-F24B-4837-9128-9D04FCBFD528}"
-EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{D32A29D8-AC7B-4189-B734-8ED9EB4120D0}"
ProjectSection(SolutionItems) = preProject
NuGet.Config = NuGet.Config
@@ -25,9 +21,9 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpFont", "Libraries\Shar
EndProject
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "SharpFontShared", "Libraries\SharpFont\Source\SharpFontShared\SharpFontShared.shproj", "{2E4773B7-961A-4328-9D77-9749F9071CA2}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BarotraumaServer", "Barotrauma\BarotraumaServer\BarotraumaServer.csproj", "{85232B20-074D-4723-B0C6-91495391E448}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Server", "Barotrauma\BarotraumaServer\Server.csproj", "{85232B20-074D-4723-B0C6-91495391E448}"
EndProject
-Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "BarotraumaShared", "Barotrauma\BarotraumaShared\BarotraumaShared.shproj", "{561357C2-DB28-4E01-B275-6BF545F70491}"
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "SharedCode", "Barotrauma\BarotraumaShared\SharedCode.shproj", "{561357C2-DB28-4E01-B275-6BF545F70491}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Barotrauma", "Barotrauma", "{F35DF9BF-0BED-4FEF-A51C-DD83C531882F}"
EndProject
@@ -35,458 +31,330 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Farseer Physics", "Libraries\Farseer Physics Engine 3.5\Farseer Physics.csproj", "{A4610E4C-DD34-428B-BABB-779CA0B5993A}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Facepunch.Steamworks", "Libraries\Facepunch.Steamworks\Facepunch.Steamworks.csproj", "{3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Facepunch.Steamworks", "Libraries\Facepunch.Steamworks\Facepunch.Steamworks.csproj", "{3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Windows", "Windows", "{78A9F0AA-5519-407A-9B72-2A09F5DF7068}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Code", "Code", "{19BDB9C9-49DA-4157-9801-21F39930D106}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Content", "Content", "{3503EDE6-A1D7-446C-BF3E-CA218547B254}"
+EndProject
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "ClientCode", "Barotrauma\BarotraumaClient\ClientCode.shproj", "{51AFF563-4982-474D-A92F-50B06DB05B3D}"
+EndProject
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "SharedContent", "Barotrauma\BarotraumaShared\SharedContent.shproj", "{A67D00EB-8F3D-49C9-9E01-94ED90B6BF2B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Farseer Physics MonoGame DesktopGL", "Libraries\Farseer Physics Engine 3.5\Farseer Physics MonoGame DesktopGL.csproj", "{0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Farseer Physics MonoGame WindowsDX", "Libraries\Farseer Physics Engine 3.5\Farseer Physics MonoGame WindowsDX.csproj", "{830461AA-3E2E-4BDE-9B27-1B3280836521}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Linux", "Linux", "{B2C129F2-8E5C-419A-98EB-161AA5B5FC71}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LinuxClient", "Barotrauma\BarotraumaClient\LinuxClient.csproj", "{D7F9FDD3-AF03-46AD-A2C2-F590899712B7}"
+ ProjectSection(ProjectDependencies) = postProject
+ {85232B20-074D-4723-B0C6-91495391E448} = {85232B20-074D-4723-B0C6-91495391E448}
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Mac", "Mac", "{DBCF6FF0-3DE9-11E9-B3EF-63280FDBDA4A}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MacClient", "Barotrauma\BarotraumaClient\MacClient.csproj", "{CC996BB6-3781-4868-B996-07F9CDC936ED}"
+ ProjectSection(ProjectDependencies) = postProject
+ {85232B20-074D-4723-B0C6-91495391E448} = {85232B20-074D-4723-B0C6-91495391E448}
+ EndProjectSection
EndProject
Global
GlobalSection(SharedMSBuildProjectFiles) = preSolution
- Barotrauma\BarotraumaShared\BarotraumaShared.projitems*{008c0f83-e914-4966-9135-ea885059edd8}*SharedItemsImports = 4
+ Barotrauma\BarotraumaClient\ClientCode.projitems*{008c0f83-e914-4966-9135-ea885059edd8}*SharedItemsImports = 4
+ Barotrauma\BarotraumaShared\SharedCode.projitems*{008c0f83-e914-4966-9135-ea885059edd8}*SharedItemsImports = 4
+ Barotrauma\BarotraumaShared\SharedContent.projitems*{008c0f83-e914-4966-9135-ea885059edd8}*SharedItemsImports = 4
Libraries\SharpFont\Source\SharpFontShared\SharpFontShared.projitems*{2e4773b7-961a-4328-9d77-9749f9071ca2}*SharedItemsImports = 13
- Barotrauma\BarotraumaShared\BarotraumaShared.projitems*{561357c2-db28-4e01-b275-6bf545f70491}*SharedItemsImports = 13
- Barotrauma\BarotraumaShared\BarotraumaShared.projitems*{85232b20-074d-4723-b0c6-91495391e448}*SharedItemsImports = 4
+ Barotrauma\BarotraumaClient\ClientCode.projitems*{51aff563-4982-474d-a92f-50b06db05b3d}*SharedItemsImports = 13
+ Barotrauma\BarotraumaShared\SharedCode.projitems*{561357c2-db28-4e01-b275-6bf545f70491}*SharedItemsImports = 13
+ Barotrauma\BarotraumaShared\SharedCode.projitems*{85232b20-074d-4723-b0c6-91495391e448}*SharedItemsImports = 4
+ Barotrauma\BarotraumaShared\SharedContent.projitems*{85232b20-074d-4723-b0c6-91495391e448}*SharedItemsImports = 4
+ Barotrauma\BarotraumaShared\SharedContent.projitems*{a67d00eb-8f3d-49c9-9e01-94ed90b6bf2b}*SharedItemsImports = 13
Libraries\SharpFont\Source\SharpFontShared\SharpFontShared.projitems*{c293db32-fa42-486d-b128-5a12522fae4e}*SharedItemsImports = 4
+ Barotrauma\BarotraumaClient\ClientCode.projitems*{cc996bb6-3781-4868-b996-07f9cdc936ed}*SharedItemsImports = 4
+ Barotrauma\BarotraumaShared\SharedCode.projitems*{cc996bb6-3781-4868-b996-07f9cdc936ed}*SharedItemsImports = 4
+ Barotrauma\BarotraumaShared\SharedContent.projitems*{cc996bb6-3781-4868-b996-07f9cdc936ed}*SharedItemsImports = 4
+ Barotrauma\BarotraumaClient\ClientCode.projitems*{d7f9fdd3-af03-46ad-a2c2-f590899712b7}*SharedItemsImports = 4
+ Barotrauma\BarotraumaShared\SharedCode.projitems*{d7f9fdd3-af03-46ad-a2c2-f590899712b7}*SharedItemsImports = 4
+ Barotrauma\BarotraumaShared\SharedContent.projitems*{d7f9fdd3-af03-46ad-a2c2-f590899712b7}*SharedItemsImports = 4
EndGlobalSection
GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Debug|x64 = Debug|x64
- Debug|x86 = Debug|x86
DebugLinux|Any CPU = DebugLinux|Any CPU
DebugLinux|x64 = DebugLinux|x64
- DebugLinux|x86 = DebugLinux|x86
DebugMac|Any CPU = DebugMac|Any CPU
DebugMac|x64 = DebugMac|x64
- DebugMac|x86 = DebugMac|x86
DebugWindows|Any CPU = DebugWindows|Any CPU
DebugWindows|x64 = DebugWindows|x64
- DebugWindows|x86 = DebugWindows|x86
- Release|Any CPU = Release|Any CPU
- Release|x64 = Release|x64
- Release|x86 = Release|x86
ReleaseLinux|Any CPU = ReleaseLinux|Any CPU
ReleaseLinux|x64 = ReleaseLinux|x64
- ReleaseLinux|x86 = ReleaseLinux|x86
ReleaseMac|Any CPU = ReleaseMac|Any CPU
ReleaseMac|x64 = ReleaseMac|x64
- ReleaseMac|x86 = ReleaseMac|x86
ReleaseWindows|Any CPU = ReleaseWindows|Any CPU
ReleaseWindows|x64 = ReleaseWindows|x64
- ReleaseWindows|x86 = ReleaseWindows|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {008C0F83-E914-4966-9135-EA885059EDD8}.Debug|Any CPU.ActiveCfg = ReleaseWindows|x64
- {008C0F83-E914-4966-9135-EA885059EDD8}.Debug|Any CPU.Build.0 = ReleaseWindows|x64
- {008C0F83-E914-4966-9135-EA885059EDD8}.Debug|x64.ActiveCfg = DebugWindows|x64
- {008C0F83-E914-4966-9135-EA885059EDD8}.Debug|x64.Build.0 = DebugWindows|x64
- {008C0F83-E914-4966-9135-EA885059EDD8}.Debug|x86.ActiveCfg = ReleaseWindows|x64
- {008C0F83-E914-4966-9135-EA885059EDD8}.Debug|x86.Build.0 = ReleaseWindows|x64
- {008C0F83-E914-4966-9135-EA885059EDD8}.DebugLinux|Any CPU.ActiveCfg = DebugLinux|x64
- {008C0F83-E914-4966-9135-EA885059EDD8}.DebugLinux|x64.ActiveCfg = DebugLinux|x64
- {008C0F83-E914-4966-9135-EA885059EDD8}.DebugLinux|x64.Build.0 = DebugLinux|x64
- {008C0F83-E914-4966-9135-EA885059EDD8}.DebugLinux|x86.ActiveCfg = DebugLinux|x64
- {008C0F83-E914-4966-9135-EA885059EDD8}.DebugMac|Any CPU.ActiveCfg = DebugMac|x64
- {008C0F83-E914-4966-9135-EA885059EDD8}.DebugMac|x64.ActiveCfg = DebugMac|x64
- {008C0F83-E914-4966-9135-EA885059EDD8}.DebugMac|x64.Build.0 = DebugMac|x64
- {008C0F83-E914-4966-9135-EA885059EDD8}.DebugMac|x86.ActiveCfg = DebugMac|x64
+ {008C0F83-E914-4966-9135-EA885059EDD8}.DebugLinux|Any CPU.ActiveCfg = DebugWindows|x64
+ {008C0F83-E914-4966-9135-EA885059EDD8}.DebugLinux|Any CPU.Build.0 = DebugWindows|x64
+ {008C0F83-E914-4966-9135-EA885059EDD8}.DebugLinux|x64.ActiveCfg = DebugWindows|x64
+ {008C0F83-E914-4966-9135-EA885059EDD8}.DebugMac|Any CPU.ActiveCfg = DebugWindows|x64
+ {008C0F83-E914-4966-9135-EA885059EDD8}.DebugMac|Any CPU.Build.0 = DebugWindows|x64
+ {008C0F83-E914-4966-9135-EA885059EDD8}.DebugMac|x64.ActiveCfg = DebugWindows|x64
{008C0F83-E914-4966-9135-EA885059EDD8}.DebugWindows|Any CPU.ActiveCfg = DebugWindows|x64
{008C0F83-E914-4966-9135-EA885059EDD8}.DebugWindows|x64.ActiveCfg = DebugWindows|x64
{008C0F83-E914-4966-9135-EA885059EDD8}.DebugWindows|x64.Build.0 = DebugWindows|x64
- {008C0F83-E914-4966-9135-EA885059EDD8}.DebugWindows|x86.ActiveCfg = DebugWindows|x64
- {008C0F83-E914-4966-9135-EA885059EDD8}.Release|Any CPU.ActiveCfg = ReleaseWindows|x64
- {008C0F83-E914-4966-9135-EA885059EDD8}.Release|Any CPU.Build.0 = ReleaseWindows|x64
- {008C0F83-E914-4966-9135-EA885059EDD8}.Release|x64.ActiveCfg = ReleaseWindows|x64
- {008C0F83-E914-4966-9135-EA885059EDD8}.Release|x64.Build.0 = ReleaseWindows|x64
- {008C0F83-E914-4966-9135-EA885059EDD8}.Release|x86.ActiveCfg = ReleaseWindows|x64
- {008C0F83-E914-4966-9135-EA885059EDD8}.Release|x86.Build.0 = ReleaseWindows|x64
- {008C0F83-E914-4966-9135-EA885059EDD8}.ReleaseLinux|Any CPU.ActiveCfg = ReleaseLinux|x64
- {008C0F83-E914-4966-9135-EA885059EDD8}.ReleaseLinux|x64.ActiveCfg = ReleaseLinux|x64
- {008C0F83-E914-4966-9135-EA885059EDD8}.ReleaseLinux|x64.Build.0 = ReleaseLinux|x64
- {008C0F83-E914-4966-9135-EA885059EDD8}.ReleaseLinux|x86.ActiveCfg = ReleaseLinux|x64
- {008C0F83-E914-4966-9135-EA885059EDD8}.ReleaseMac|Any CPU.ActiveCfg = ReleaseMac|x64
- {008C0F83-E914-4966-9135-EA885059EDD8}.ReleaseMac|x64.ActiveCfg = ReleaseMac|x64
- {008C0F83-E914-4966-9135-EA885059EDD8}.ReleaseMac|x64.Build.0 = ReleaseMac|x64
- {008C0F83-E914-4966-9135-EA885059EDD8}.ReleaseMac|x86.ActiveCfg = ReleaseMac|x64
+ {008C0F83-E914-4966-9135-EA885059EDD8}.ReleaseLinux|Any CPU.ActiveCfg = DebugWindows|x64
+ {008C0F83-E914-4966-9135-EA885059EDD8}.ReleaseLinux|Any CPU.Build.0 = DebugWindows|x64
+ {008C0F83-E914-4966-9135-EA885059EDD8}.ReleaseLinux|x64.ActiveCfg = ReleaseWindows|x64
+ {008C0F83-E914-4966-9135-EA885059EDD8}.ReleaseMac|Any CPU.ActiveCfg = DebugWindows|x64
+ {008C0F83-E914-4966-9135-EA885059EDD8}.ReleaseMac|Any CPU.Build.0 = DebugWindows|x64
+ {008C0F83-E914-4966-9135-EA885059EDD8}.ReleaseMac|x64.ActiveCfg = ReleaseWindows|x64
{008C0F83-E914-4966-9135-EA885059EDD8}.ReleaseWindows|Any CPU.ActiveCfg = ReleaseWindows|x64
{008C0F83-E914-4966-9135-EA885059EDD8}.ReleaseWindows|x64.ActiveCfg = ReleaseWindows|x64
{008C0F83-E914-4966-9135-EA885059EDD8}.ReleaseWindows|x64.Build.0 = ReleaseWindows|x64
- {008C0F83-E914-4966-9135-EA885059EDD8}.ReleaseWindows|x86.ActiveCfg = ReleaseWindows|x64
- {008C0F83-E914-4966-9135-EA885059EDD8}.DebugLinux|Any CPU.Build.0 = DebugLinux|x64
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.Debug|Any CPU.ActiveCfg = DebugWindows|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.Debug|Any CPU.Build.0 = DebugWindows|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.Debug|x64.ActiveCfg = DebugWindows|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.Debug|x64.Build.0 = DebugWindows|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.Debug|x86.ActiveCfg = DebugWindows|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.Debug|x86.Build.0 = DebugWindows|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugLinux|Any CPU.ActiveCfg = DebugLinux|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugLinux|Any CPU.Build.0 = DebugLinux|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugLinux|x64.ActiveCfg = DebugLinux|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugLinux|x64.Build.0 = DebugLinux|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugLinux|x86.ActiveCfg = DebugLinux|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugLinux|x86.Build.0 = DebugLinux|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugMac|Any CPU.ActiveCfg = DebugMac|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugMac|Any CPU.Build.0 = DebugMac|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugMac|x64.ActiveCfg = DebugMac|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugMac|x64.Build.0 = DebugMac|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugMac|x86.ActiveCfg = DebugMac|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugMac|x86.Build.0 = DebugMac|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugWindows|Any CPU.ActiveCfg = DebugWindows|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugWindows|Any CPU.Build.0 = DebugWindows|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugWindows|x64.ActiveCfg = DebugWindows|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugWindows|x64.Build.0 = DebugWindows|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugWindows|x86.ActiveCfg = DebugWindows|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugWindows|x86.Build.0 = DebugWindows|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.Release|Any CPU.ActiveCfg = ReleaseWindows|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.Release|Any CPU.Build.0 = ReleaseWindows|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.Release|x64.ActiveCfg = ReleaseWindows|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.Release|x64.Build.0 = ReleaseWindows|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.Release|x86.ActiveCfg = ReleaseWindows|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.Release|x86.Build.0 = ReleaseWindows|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseLinux|Any CPU.ActiveCfg = ReleaseLinux|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseLinux|Any CPU.Build.0 = ReleaseLinux|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseLinux|x64.ActiveCfg = ReleaseLinux|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseLinux|x64.Build.0 = ReleaseLinux|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseLinux|x86.ActiveCfg = ReleaseLinux|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseLinux|x86.Build.0 = ReleaseLinux|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseMac|Any CPU.ActiveCfg = ReleaseMac|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseMac|Any CPU.Build.0 = ReleaseMac|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseMac|x64.ActiveCfg = ReleaseMac|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseMac|x64.Build.0 = ReleaseMac|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseMac|x86.ActiveCfg = ReleaseMac|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseMac|x86.Build.0 = ReleaseMac|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseWindows|Any CPU.ActiveCfg = ReleaseWindows|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseWindows|Any CPU.Build.0 = ReleaseWindows|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseWindows|x64.ActiveCfg = ReleaseWindows|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseWindows|x64.Build.0 = ReleaseWindows|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseWindows|x86.ActiveCfg = ReleaseWindows|Any CPU
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseWindows|x86.Build.0 = ReleaseWindows|Any CPU
- {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.Debug|x64.ActiveCfg = Debug|Any CPU
- {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.Debug|x64.Build.0 = Debug|Any CPU
- {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.Debug|x86.ActiveCfg = Debug|Any CPU
- {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.Debug|x86.Build.0 = Debug|Any CPU
{49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.DebugLinux|Any CPU.ActiveCfg = Debug|Any CPU
{49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.DebugLinux|Any CPU.Build.0 = Debug|Any CPU
{49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.DebugLinux|x64.ActiveCfg = Debug|Any CPU
{49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.DebugLinux|x64.Build.0 = Debug|Any CPU
- {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.DebugLinux|x86.ActiveCfg = Debug|Any CPU
- {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.DebugLinux|x86.Build.0 = Debug|Any CPU
{49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.DebugMac|x64.ActiveCfg = Debug|Any CPU
{49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.DebugMac|x64.Build.0 = Debug|Any CPU
- {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.DebugMac|x86.ActiveCfg = Debug|Any CPU
- {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.DebugMac|x86.Build.0 = Debug|Any CPU
{49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.DebugWindows|Any CPU.ActiveCfg = Debug|Any CPU
{49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.DebugWindows|Any CPU.Build.0 = Debug|Any CPU
{49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.DebugWindows|x64.ActiveCfg = Debug|Any CPU
{49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.DebugWindows|x64.Build.0 = Debug|Any CPU
- {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.DebugWindows|x86.ActiveCfg = Debug|Any CPU
- {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.DebugWindows|x86.Build.0 = Debug|Any CPU
- {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.Release|Any CPU.Build.0 = Release|Any CPU
- {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.Release|x64.ActiveCfg = Release|Any CPU
- {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.Release|x64.Build.0 = Release|Any CPU
- {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.Release|x86.ActiveCfg = Release|Any CPU
- {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.Release|x86.Build.0 = Release|Any CPU
{49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.ReleaseLinux|Any CPU.ActiveCfg = Release|Any CPU
{49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.ReleaseLinux|Any CPU.Build.0 = Release|Any CPU
{49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.ReleaseLinux|x64.ActiveCfg = Release|Any CPU
{49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.ReleaseLinux|x64.Build.0 = Release|Any CPU
- {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.ReleaseLinux|x86.ActiveCfg = Release|Any CPU
- {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.ReleaseLinux|x86.Build.0 = Release|Any CPU
{49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
{49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
{49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.ReleaseMac|x64.ActiveCfg = Release|Any CPU
{49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.ReleaseMac|x64.Build.0 = Release|Any CPU
- {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.ReleaseMac|x86.ActiveCfg = Release|Any CPU
- {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.ReleaseMac|x86.Build.0 = Release|Any CPU
{49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.ReleaseWindows|Any CPU.ActiveCfg = Release|Any CPU
{49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.ReleaseWindows|Any CPU.Build.0 = Release|Any CPU
{49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.ReleaseWindows|x64.ActiveCfg = Release|Any CPU
{49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.ReleaseWindows|x64.Build.0 = Release|Any CPU
- {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.ReleaseWindows|x86.ActiveCfg = Release|Any CPU
- {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.ReleaseWindows|x86.Build.0 = Release|Any CPU
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.Debug|Any CPU.ActiveCfg = ReleaseWindows|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.Debug|Any CPU.Build.0 = ReleaseWindows|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.Debug|x64.ActiveCfg = DebugWindows|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.Debug|x64.Build.0 = DebugWindows|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.Debug|x86.ActiveCfg = ReleaseWindows|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.Debug|x86.Build.0 = ReleaseWindows|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.DebugLinux|Any CPU.ActiveCfg = DebugLinux|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.DebugLinux|x64.ActiveCfg = DebugLinux|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.DebugLinux|x64.Build.0 = DebugLinux|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.DebugLinux|x86.ActiveCfg = DebugLinux|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.DebugMac|Any CPU.ActiveCfg = DebugMac|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.DebugMac|x64.ActiveCfg = DebugMac|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.DebugMac|x64.Build.0 = DebugMac|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.DebugMac|x86.ActiveCfg = DebugMac|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.DebugWindows|Any CPU.ActiveCfg = DebugWindows|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.DebugWindows|x64.ActiveCfg = DebugWindows|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.DebugWindows|x64.Build.0 = DebugWindows|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.DebugWindows|x86.ActiveCfg = DebugWindows|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.Release|Any CPU.ActiveCfg = ReleaseWindows|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.Release|Any CPU.Build.0 = ReleaseWindows|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.Release|x64.ActiveCfg = ReleaseWindows|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.Release|x64.Build.0 = ReleaseWindows|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.Release|x86.ActiveCfg = ReleaseWindows|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.Release|x86.Build.0 = ReleaseWindows|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.ReleaseLinux|Any CPU.ActiveCfg = ReleaseLinux|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.ReleaseLinux|x64.ActiveCfg = ReleaseLinux|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.ReleaseLinux|x64.Build.0 = ReleaseLinux|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.ReleaseLinux|x86.ActiveCfg = ReleaseLinux|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.ReleaseMac|Any CPU.ActiveCfg = ReleaseMac|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.ReleaseMac|x64.ActiveCfg = ReleaseMac|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.ReleaseMac|x64.Build.0 = ReleaseMac|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.ReleaseMac|x86.ActiveCfg = ReleaseMac|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.ReleaseWindows|Any CPU.ActiveCfg = ReleaseWindows|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.ReleaseWindows|x64.ActiveCfg = ReleaseWindows|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.ReleaseWindows|x64.Build.0 = ReleaseWindows|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.ReleaseWindows|x86.ActiveCfg = ReleaseWindows|x64
- {251AAFE1-F24B-4837-9128-9D04FCBFD528}.DebugLinux|Any CPU.Build.0 = DebugLinux|x64
- {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Debug|x64.ActiveCfg = Debug|Any CPU
- {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Debug|x64.Build.0 = Debug|Any CPU
- {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Debug|x86.ActiveCfg = Debug|Any CPU
- {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Debug|x86.Build.0 = Debug|Any CPU
{3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.DebugLinux|Any CPU.ActiveCfg = Debug|Any CPU
{3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.DebugLinux|Any CPU.Build.0 = Debug|Any CPU
{3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.DebugLinux|x64.ActiveCfg = Debug|Any CPU
{3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.DebugLinux|x64.Build.0 = Debug|Any CPU
- {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.DebugLinux|x86.ActiveCfg = Debug|Any CPU
- {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.DebugLinux|x86.Build.0 = Debug|Any CPU
{3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.DebugMac|x64.ActiveCfg = Debug|Any CPU
{3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.DebugMac|x64.Build.0 = Debug|Any CPU
- {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.DebugMac|x86.ActiveCfg = Debug|Any CPU
- {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.DebugMac|x86.Build.0 = Debug|Any CPU
{3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.DebugWindows|Any CPU.ActiveCfg = Debug|Any CPU
{3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.DebugWindows|Any CPU.Build.0 = Debug|Any CPU
{3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.DebugWindows|x64.ActiveCfg = Debug|Any CPU
{3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.DebugWindows|x64.Build.0 = Debug|Any CPU
- {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.DebugWindows|x86.ActiveCfg = Debug|Any CPU
- {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.DebugWindows|x86.Build.0 = Debug|Any CPU
- {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Release|Any CPU.Build.0 = Release|Any CPU
- {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Release|x64.ActiveCfg = Release|Any CPU
- {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Release|x64.Build.0 = Release|Any CPU
- {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Release|x86.ActiveCfg = Release|Any CPU
- {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Release|x86.Build.0 = Release|Any CPU
{3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.ReleaseLinux|Any CPU.ActiveCfg = Release|Any CPU
{3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.ReleaseLinux|Any CPU.Build.0 = Release|Any CPU
{3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.ReleaseLinux|x64.ActiveCfg = Release|Any CPU
{3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.ReleaseLinux|x64.Build.0 = Release|Any CPU
- {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.ReleaseLinux|x86.ActiveCfg = Release|Any CPU
- {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.ReleaseLinux|x86.Build.0 = Release|Any CPU
{3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
{3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
{3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.ReleaseMac|x64.ActiveCfg = Release|Any CPU
{3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.ReleaseMac|x64.Build.0 = Release|Any CPU
- {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.ReleaseMac|x86.ActiveCfg = Release|Any CPU
- {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.ReleaseMac|x86.Build.0 = Release|Any CPU
{3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.ReleaseWindows|Any CPU.ActiveCfg = Release|Any CPU
{3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.ReleaseWindows|Any CPU.Build.0 = Release|Any CPU
{3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.ReleaseWindows|x64.ActiveCfg = Release|Any CPU
{3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.ReleaseWindows|x64.Build.0 = Release|Any CPU
- {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.ReleaseWindows|x86.ActiveCfg = Release|Any CPU
- {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.ReleaseWindows|x86.Build.0 = Release|Any CPU
- {C293DB32-FA42-486D-B128-5A12522FAE4E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {C293DB32-FA42-486D-B128-5A12522FAE4E}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {C293DB32-FA42-486D-B128-5A12522FAE4E}.Debug|x64.ActiveCfg = Debug|Any CPU
- {C293DB32-FA42-486D-B128-5A12522FAE4E}.Debug|x64.Build.0 = Debug|Any CPU
- {C293DB32-FA42-486D-B128-5A12522FAE4E}.Debug|x86.ActiveCfg = Debug|Any CPU
- {C293DB32-FA42-486D-B128-5A12522FAE4E}.Debug|x86.Build.0 = Debug|Any CPU
{C293DB32-FA42-486D-B128-5A12522FAE4E}.DebugLinux|Any CPU.ActiveCfg = Debug|Any CPU
{C293DB32-FA42-486D-B128-5A12522FAE4E}.DebugLinux|Any CPU.Build.0 = Debug|Any CPU
{C293DB32-FA42-486D-B128-5A12522FAE4E}.DebugLinux|x64.ActiveCfg = Debug|Any CPU
{C293DB32-FA42-486D-B128-5A12522FAE4E}.DebugLinux|x64.Build.0 = Debug|Any CPU
- {C293DB32-FA42-486D-B128-5A12522FAE4E}.DebugLinux|x86.ActiveCfg = Debug|Any CPU
- {C293DB32-FA42-486D-B128-5A12522FAE4E}.DebugLinux|x86.Build.0 = Debug|Any CPU
{C293DB32-FA42-486D-B128-5A12522FAE4E}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{C293DB32-FA42-486D-B128-5A12522FAE4E}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{C293DB32-FA42-486D-B128-5A12522FAE4E}.DebugMac|x64.ActiveCfg = Debug|Any CPU
{C293DB32-FA42-486D-B128-5A12522FAE4E}.DebugMac|x64.Build.0 = Debug|Any CPU
- {C293DB32-FA42-486D-B128-5A12522FAE4E}.DebugMac|x86.ActiveCfg = Debug|Any CPU
- {C293DB32-FA42-486D-B128-5A12522FAE4E}.DebugMac|x86.Build.0 = Debug|Any CPU
{C293DB32-FA42-486D-B128-5A12522FAE4E}.DebugWindows|Any CPU.ActiveCfg = Debug|Any CPU
{C293DB32-FA42-486D-B128-5A12522FAE4E}.DebugWindows|Any CPU.Build.0 = Debug|Any CPU
{C293DB32-FA42-486D-B128-5A12522FAE4E}.DebugWindows|x64.ActiveCfg = Debug|Any CPU
{C293DB32-FA42-486D-B128-5A12522FAE4E}.DebugWindows|x64.Build.0 = Debug|Any CPU
- {C293DB32-FA42-486D-B128-5A12522FAE4E}.DebugWindows|x86.ActiveCfg = Debug|Any CPU
- {C293DB32-FA42-486D-B128-5A12522FAE4E}.DebugWindows|x86.Build.0 = Debug|Any CPU
- {C293DB32-FA42-486D-B128-5A12522FAE4E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {C293DB32-FA42-486D-B128-5A12522FAE4E}.Release|Any CPU.Build.0 = Release|Any CPU
- {C293DB32-FA42-486D-B128-5A12522FAE4E}.Release|x64.ActiveCfg = Release|Any CPU
- {C293DB32-FA42-486D-B128-5A12522FAE4E}.Release|x64.Build.0 = Release|Any CPU
- {C293DB32-FA42-486D-B128-5A12522FAE4E}.Release|x86.ActiveCfg = Release|Any CPU
- {C293DB32-FA42-486D-B128-5A12522FAE4E}.Release|x86.Build.0 = Release|Any CPU
{C293DB32-FA42-486D-B128-5A12522FAE4E}.ReleaseLinux|Any CPU.ActiveCfg = Release|Any CPU
{C293DB32-FA42-486D-B128-5A12522FAE4E}.ReleaseLinux|Any CPU.Build.0 = Release|Any CPU
{C293DB32-FA42-486D-B128-5A12522FAE4E}.ReleaseLinux|x64.ActiveCfg = Release|Any CPU
{C293DB32-FA42-486D-B128-5A12522FAE4E}.ReleaseLinux|x64.Build.0 = Release|Any CPU
- {C293DB32-FA42-486D-B128-5A12522FAE4E}.ReleaseLinux|x86.ActiveCfg = Release|Any CPU
- {C293DB32-FA42-486D-B128-5A12522FAE4E}.ReleaseLinux|x86.Build.0 = Release|Any CPU
{C293DB32-FA42-486D-B128-5A12522FAE4E}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
{C293DB32-FA42-486D-B128-5A12522FAE4E}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
{C293DB32-FA42-486D-B128-5A12522FAE4E}.ReleaseMac|x64.ActiveCfg = Release|Any CPU
{C293DB32-FA42-486D-B128-5A12522FAE4E}.ReleaseMac|x64.Build.0 = Release|Any CPU
- {C293DB32-FA42-486D-B128-5A12522FAE4E}.ReleaseMac|x86.ActiveCfg = Release|Any CPU
- {C293DB32-FA42-486D-B128-5A12522FAE4E}.ReleaseMac|x86.Build.0 = Release|Any CPU
{C293DB32-FA42-486D-B128-5A12522FAE4E}.ReleaseWindows|Any CPU.ActiveCfg = Release|Any CPU
{C293DB32-FA42-486D-B128-5A12522FAE4E}.ReleaseWindows|Any CPU.Build.0 = Release|Any CPU
{C293DB32-FA42-486D-B128-5A12522FAE4E}.ReleaseWindows|x64.ActiveCfg = Release|Any CPU
{C293DB32-FA42-486D-B128-5A12522FAE4E}.ReleaseWindows|x64.Build.0 = Release|Any CPU
- {C293DB32-FA42-486D-B128-5A12522FAE4E}.ReleaseWindows|x86.ActiveCfg = Release|Any CPU
- {C293DB32-FA42-486D-B128-5A12522FAE4E}.ReleaseWindows|x86.Build.0 = Release|Any CPU
- {85232B20-074D-4723-B0C6-91495391E448}.Debug|Any CPU.ActiveCfg = ReleaseWindows|x64
- {85232B20-074D-4723-B0C6-91495391E448}.Debug|Any CPU.Build.0 = ReleaseWindows|x64
- {85232B20-074D-4723-B0C6-91495391E448}.Debug|x64.ActiveCfg = DebugWindows|x64
- {85232B20-074D-4723-B0C6-91495391E448}.Debug|x64.Build.0 = DebugWindows|x64
- {85232B20-074D-4723-B0C6-91495391E448}.Debug|x86.ActiveCfg = ReleaseWindows|x64
- {85232B20-074D-4723-B0C6-91495391E448}.Debug|x86.Build.0 = ReleaseWindows|x64
{85232B20-074D-4723-B0C6-91495391E448}.DebugLinux|Any CPU.ActiveCfg = DebugLinux|x64
+ {85232B20-074D-4723-B0C6-91495391E448}.DebugLinux|Any CPU.Build.0 = DebugLinux|x64
{85232B20-074D-4723-B0C6-91495391E448}.DebugLinux|x64.ActiveCfg = DebugLinux|x64
{85232B20-074D-4723-B0C6-91495391E448}.DebugLinux|x64.Build.0 = DebugLinux|x64
- {85232B20-074D-4723-B0C6-91495391E448}.DebugLinux|x86.ActiveCfg = DebugLinux|x64
{85232B20-074D-4723-B0C6-91495391E448}.DebugMac|Any CPU.ActiveCfg = DebugMac|x64
{85232B20-074D-4723-B0C6-91495391E448}.DebugMac|x64.ActiveCfg = DebugMac|x64
{85232B20-074D-4723-B0C6-91495391E448}.DebugMac|x64.Build.0 = DebugMac|x64
- {85232B20-074D-4723-B0C6-91495391E448}.DebugMac|x86.ActiveCfg = DebugMac|x64
{85232B20-074D-4723-B0C6-91495391E448}.DebugWindows|Any CPU.ActiveCfg = DebugWindows|x64
{85232B20-074D-4723-B0C6-91495391E448}.DebugWindows|x64.ActiveCfg = DebugWindows|x64
{85232B20-074D-4723-B0C6-91495391E448}.DebugWindows|x64.Build.0 = DebugWindows|x64
- {85232B20-074D-4723-B0C6-91495391E448}.DebugWindows|x86.ActiveCfg = DebugWindows|x64
- {85232B20-074D-4723-B0C6-91495391E448}.Release|Any CPU.ActiveCfg = ReleaseWindows|x64
- {85232B20-074D-4723-B0C6-91495391E448}.Release|Any CPU.Build.0 = ReleaseWindows|x64
- {85232B20-074D-4723-B0C6-91495391E448}.Release|x64.ActiveCfg = ReleaseWindows|x64
- {85232B20-074D-4723-B0C6-91495391E448}.Release|x64.Build.0 = ReleaseWindows|x64
- {85232B20-074D-4723-B0C6-91495391E448}.Release|x86.ActiveCfg = ReleaseWindows|x64
- {85232B20-074D-4723-B0C6-91495391E448}.Release|x86.Build.0 = ReleaseWindows|x64
{85232B20-074D-4723-B0C6-91495391E448}.ReleaseLinux|Any CPU.ActiveCfg = ReleaseLinux|x64
{85232B20-074D-4723-B0C6-91495391E448}.ReleaseLinux|x64.ActiveCfg = ReleaseLinux|x64
{85232B20-074D-4723-B0C6-91495391E448}.ReleaseLinux|x64.Build.0 = ReleaseLinux|x64
- {85232B20-074D-4723-B0C6-91495391E448}.ReleaseLinux|x86.ActiveCfg = ReleaseLinux|x64
{85232B20-074D-4723-B0C6-91495391E448}.ReleaseMac|Any CPU.ActiveCfg = ReleaseMac|x64
{85232B20-074D-4723-B0C6-91495391E448}.ReleaseMac|x64.ActiveCfg = ReleaseMac|x64
{85232B20-074D-4723-B0C6-91495391E448}.ReleaseMac|x64.Build.0 = ReleaseMac|x64
- {85232B20-074D-4723-B0C6-91495391E448}.ReleaseMac|x86.ActiveCfg = ReleaseMac|x64
{85232B20-074D-4723-B0C6-91495391E448}.ReleaseWindows|Any CPU.ActiveCfg = ReleaseWindows|x64
{85232B20-074D-4723-B0C6-91495391E448}.ReleaseWindows|x64.ActiveCfg = ReleaseWindows|x64
{85232B20-074D-4723-B0C6-91495391E448}.ReleaseWindows|x64.Build.0 = ReleaseWindows|x64
- {85232B20-074D-4723-B0C6-91495391E448}.ReleaseWindows|x86.ActiveCfg = ReleaseWindows|x64
- {85232B20-074D-4723-B0C6-91495391E448}.DebugLinux|Any CPU.Build.0 = DebugLinux|x64
- {A4610E4C-DD34-428B-BABB-779CA0B5993A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {A4610E4C-DD34-428B-BABB-779CA0B5993A}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {A4610E4C-DD34-428B-BABB-779CA0B5993A}.Debug|x64.ActiveCfg = Debug|Any CPU
- {A4610E4C-DD34-428B-BABB-779CA0B5993A}.Debug|x64.Build.0 = Debug|Any CPU
- {A4610E4C-DD34-428B-BABB-779CA0B5993A}.Debug|x86.ActiveCfg = Debug|Any CPU
- {A4610E4C-DD34-428B-BABB-779CA0B5993A}.Debug|x86.Build.0 = Debug|Any CPU
{A4610E4C-DD34-428B-BABB-779CA0B5993A}.DebugLinux|Any CPU.ActiveCfg = Debug|Any CPU
{A4610E4C-DD34-428B-BABB-779CA0B5993A}.DebugLinux|Any CPU.Build.0 = Debug|Any CPU
{A4610E4C-DD34-428B-BABB-779CA0B5993A}.DebugLinux|x64.ActiveCfg = Debug|Any CPU
{A4610E4C-DD34-428B-BABB-779CA0B5993A}.DebugLinux|x64.Build.0 = Debug|Any CPU
- {A4610E4C-DD34-428B-BABB-779CA0B5993A}.DebugLinux|x86.ActiveCfg = Debug|Any CPU
- {A4610E4C-DD34-428B-BABB-779CA0B5993A}.DebugLinux|x86.Build.0 = Debug|Any CPU
{A4610E4C-DD34-428B-BABB-779CA0B5993A}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{A4610E4C-DD34-428B-BABB-779CA0B5993A}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{A4610E4C-DD34-428B-BABB-779CA0B5993A}.DebugMac|x64.ActiveCfg = Debug|Any CPU
{A4610E4C-DD34-428B-BABB-779CA0B5993A}.DebugMac|x64.Build.0 = Debug|Any CPU
- {A4610E4C-DD34-428B-BABB-779CA0B5993A}.DebugMac|x86.ActiveCfg = Debug|Any CPU
- {A4610E4C-DD34-428B-BABB-779CA0B5993A}.DebugMac|x86.Build.0 = Debug|Any CPU
{A4610E4C-DD34-428B-BABB-779CA0B5993A}.DebugWindows|Any CPU.ActiveCfg = Debug|Any CPU
{A4610E4C-DD34-428B-BABB-779CA0B5993A}.DebugWindows|Any CPU.Build.0 = Debug|Any CPU
{A4610E4C-DD34-428B-BABB-779CA0B5993A}.DebugWindows|x64.ActiveCfg = Debug|Any CPU
{A4610E4C-DD34-428B-BABB-779CA0B5993A}.DebugWindows|x64.Build.0 = Debug|Any CPU
- {A4610E4C-DD34-428B-BABB-779CA0B5993A}.DebugWindows|x86.ActiveCfg = Debug|Any CPU
- {A4610E4C-DD34-428B-BABB-779CA0B5993A}.DebugWindows|x86.Build.0 = Debug|Any CPU
- {A4610E4C-DD34-428B-BABB-779CA0B5993A}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {A4610E4C-DD34-428B-BABB-779CA0B5993A}.Release|Any CPU.Build.0 = Release|Any CPU
- {A4610E4C-DD34-428B-BABB-779CA0B5993A}.Release|x64.ActiveCfg = Release|Any CPU
- {A4610E4C-DD34-428B-BABB-779CA0B5993A}.Release|x64.Build.0 = Release|Any CPU
- {A4610E4C-DD34-428B-BABB-779CA0B5993A}.Release|x86.ActiveCfg = Release|Any CPU
- {A4610E4C-DD34-428B-BABB-779CA0B5993A}.Release|x86.Build.0 = Release|Any CPU
{A4610E4C-DD34-428B-BABB-779CA0B5993A}.ReleaseLinux|Any CPU.ActiveCfg = Release|Any CPU
{A4610E4C-DD34-428B-BABB-779CA0B5993A}.ReleaseLinux|Any CPU.Build.0 = Release|Any CPU
{A4610E4C-DD34-428B-BABB-779CA0B5993A}.ReleaseLinux|x64.ActiveCfg = Release|Any CPU
{A4610E4C-DD34-428B-BABB-779CA0B5993A}.ReleaseLinux|x64.Build.0 = Release|Any CPU
- {A4610E4C-DD34-428B-BABB-779CA0B5993A}.ReleaseLinux|x86.ActiveCfg = Release|Any CPU
- {A4610E4C-DD34-428B-BABB-779CA0B5993A}.ReleaseLinux|x86.Build.0 = Release|Any CPU
{A4610E4C-DD34-428B-BABB-779CA0B5993A}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
{A4610E4C-DD34-428B-BABB-779CA0B5993A}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
{A4610E4C-DD34-428B-BABB-779CA0B5993A}.ReleaseMac|x64.ActiveCfg = Release|Any CPU
{A4610E4C-DD34-428B-BABB-779CA0B5993A}.ReleaseMac|x64.Build.0 = Release|Any CPU
- {A4610E4C-DD34-428B-BABB-779CA0B5993A}.ReleaseMac|x86.ActiveCfg = Release|Any CPU
- {A4610E4C-DD34-428B-BABB-779CA0B5993A}.ReleaseMac|x86.Build.0 = Release|Any CPU
{A4610E4C-DD34-428B-BABB-779CA0B5993A}.ReleaseWindows|Any CPU.ActiveCfg = Release|Any CPU
{A4610E4C-DD34-428B-BABB-779CA0B5993A}.ReleaseWindows|Any CPU.Build.0 = Release|Any CPU
{A4610E4C-DD34-428B-BABB-779CA0B5993A}.ReleaseWindows|x64.ActiveCfg = Release|Any CPU
{A4610E4C-DD34-428B-BABB-779CA0B5993A}.ReleaseWindows|x64.Build.0 = Release|Any CPU
- {A4610E4C-DD34-428B-BABB-779CA0B5993A}.ReleaseWindows|x86.ActiveCfg = Release|Any CPU
- {A4610E4C-DD34-428B-BABB-779CA0B5993A}.ReleaseWindows|x86.Build.0 = Release|Any CPU
- {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.Debug|x64.ActiveCfg = Debug|Any CPU
- {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.Debug|x64.Build.0 = Debug|Any CPU
- {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.Debug|x86.ActiveCfg = Debug|Any CPU
- {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.Debug|x86.Build.0 = Debug|Any CPU
{3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.DebugLinux|Any CPU.ActiveCfg = Debug|Any CPU
{3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.DebugLinux|Any CPU.Build.0 = Debug|Any CPU
{3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.DebugLinux|x64.ActiveCfg = Debug|Any CPU
{3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.DebugLinux|x64.Build.0 = Debug|Any CPU
- {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.DebugLinux|x86.ActiveCfg = Debug|Any CPU
- {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.DebugLinux|x86.Build.0 = Debug|Any CPU
{3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
{3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
{3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.DebugMac|x64.ActiveCfg = Debug|Any CPU
{3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.DebugMac|x64.Build.0 = Debug|Any CPU
- {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.DebugMac|x86.ActiveCfg = Debug|Any CPU
- {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.DebugMac|x86.Build.0 = Debug|Any CPU
{3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.DebugWindows|Any CPU.ActiveCfg = Debug|Any CPU
{3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.DebugWindows|Any CPU.Build.0 = Debug|Any CPU
{3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.DebugWindows|x64.ActiveCfg = Debug|Any CPU
{3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.DebugWindows|x64.Build.0 = Debug|Any CPU
- {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.DebugWindows|x86.ActiveCfg = Debug|Any CPU
- {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.DebugWindows|x86.Build.0 = Debug|Any CPU
- {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.Release|Any CPU.Build.0 = Release|Any CPU
- {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.Release|x64.ActiveCfg = Release|Any CPU
- {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.Release|x64.Build.0 = Release|Any CPU
- {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.Release|x86.ActiveCfg = Release|Any CPU
- {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.Release|x86.Build.0 = Release|Any CPU
{3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.ReleaseLinux|Any CPU.ActiveCfg = Release|Any CPU
{3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.ReleaseLinux|Any CPU.Build.0 = Release|Any CPU
{3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.ReleaseLinux|x64.ActiveCfg = Release|Any CPU
{3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.ReleaseLinux|x64.Build.0 = Release|Any CPU
- {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.ReleaseLinux|x86.ActiveCfg = Release|Any CPU
- {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.ReleaseLinux|x86.Build.0 = Release|Any CPU
{3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
{3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
{3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.ReleaseMac|x64.ActiveCfg = Release|Any CPU
{3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.ReleaseMac|x64.Build.0 = Release|Any CPU
- {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.ReleaseMac|x86.ActiveCfg = Release|Any CPU
- {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.ReleaseMac|x86.Build.0 = Release|Any CPU
{3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.ReleaseWindows|Any CPU.ActiveCfg = Release|Any CPU
{3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.ReleaseWindows|Any CPU.Build.0 = Release|Any CPU
{3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.ReleaseWindows|x64.ActiveCfg = Release|Any CPU
{3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.ReleaseWindows|x64.Build.0 = Release|Any CPU
- {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.ReleaseWindows|x86.ActiveCfg = Release|Any CPU
- {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.ReleaseWindows|x86.Build.0 = Release|Any CPU
+ {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugLinux|Any CPU.ActiveCfg = DebugLinux|Any CPU
+ {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugLinux|Any CPU.Build.0 = DebugLinux|Any CPU
+ {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugLinux|x64.ActiveCfg = DebugLinux|Any CPU
+ {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugLinux|x64.Build.0 = DebugLinux|Any CPU
+ {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugMac|Any CPU.ActiveCfg = DebugMac|Any CPU
+ {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugMac|Any CPU.Build.0 = DebugMac|Any CPU
+ {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugMac|x64.ActiveCfg = DebugMac|Any CPU
+ {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugMac|x64.Build.0 = DebugMac|Any CPU
+ {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugWindows|Any CPU.ActiveCfg = DebugWindows|Any CPU
+ {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugWindows|Any CPU.Build.0 = DebugWindows|Any CPU
+ {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugWindows|x64.ActiveCfg = DebugWindows|Any CPU
+ {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseLinux|Any CPU.ActiveCfg = ReleaseLinux|Any CPU
+ {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseLinux|Any CPU.Build.0 = ReleaseLinux|Any CPU
+ {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseLinux|x64.ActiveCfg = ReleaseLinux|Any CPU
+ {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseLinux|x64.Build.0 = ReleaseLinux|Any CPU
+ {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseMac|Any CPU.ActiveCfg = ReleaseMac|Any CPU
+ {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseMac|Any CPU.Build.0 = ReleaseMac|Any CPU
+ {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseMac|x64.ActiveCfg = ReleaseMac|Any CPU
+ {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseMac|x64.Build.0 = ReleaseMac|Any CPU
+ {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseWindows|Any CPU.ActiveCfg = ReleaseWindows|Any CPU
+ {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseWindows|Any CPU.Build.0 = ReleaseWindows|Any CPU
+ {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseWindows|x64.ActiveCfg = ReleaseWindows|Any CPU
+ {830461AA-3E2E-4BDE-9B27-1B3280836521}.DebugLinux|Any CPU.ActiveCfg = DebugLinux|Any CPU
+ {830461AA-3E2E-4BDE-9B27-1B3280836521}.DebugLinux|Any CPU.Build.0 = DebugLinux|Any CPU
+ {830461AA-3E2E-4BDE-9B27-1B3280836521}.DebugLinux|x64.ActiveCfg = DebugLinux|Any CPU
+ {830461AA-3E2E-4BDE-9B27-1B3280836521}.DebugMac|Any CPU.ActiveCfg = DebugMac|Any CPU
+ {830461AA-3E2E-4BDE-9B27-1B3280836521}.DebugMac|Any CPU.Build.0 = DebugMac|Any CPU
+ {830461AA-3E2E-4BDE-9B27-1B3280836521}.DebugMac|x64.ActiveCfg = DebugMac|Any CPU
+ {830461AA-3E2E-4BDE-9B27-1B3280836521}.DebugWindows|Any CPU.ActiveCfg = DebugWindows|Any CPU
+ {830461AA-3E2E-4BDE-9B27-1B3280836521}.DebugWindows|Any CPU.Build.0 = DebugWindows|Any CPU
+ {830461AA-3E2E-4BDE-9B27-1B3280836521}.DebugWindows|x64.ActiveCfg = DebugWindows|Any CPU
+ {830461AA-3E2E-4BDE-9B27-1B3280836521}.DebugWindows|x64.Build.0 = DebugWindows|Any CPU
+ {830461AA-3E2E-4BDE-9B27-1B3280836521}.ReleaseLinux|Any CPU.ActiveCfg = ReleaseLinux|Any CPU
+ {830461AA-3E2E-4BDE-9B27-1B3280836521}.ReleaseLinux|Any CPU.Build.0 = ReleaseLinux|Any CPU
+ {830461AA-3E2E-4BDE-9B27-1B3280836521}.ReleaseLinux|x64.ActiveCfg = ReleaseLinux|Any CPU
+ {830461AA-3E2E-4BDE-9B27-1B3280836521}.ReleaseMac|Any CPU.ActiveCfg = ReleaseMac|Any CPU
+ {830461AA-3E2E-4BDE-9B27-1B3280836521}.ReleaseMac|Any CPU.Build.0 = ReleaseMac|Any CPU
+ {830461AA-3E2E-4BDE-9B27-1B3280836521}.ReleaseMac|x64.ActiveCfg = ReleaseMac|Any CPU
+ {830461AA-3E2E-4BDE-9B27-1B3280836521}.ReleaseWindows|Any CPU.ActiveCfg = ReleaseWindows|Any CPU
+ {830461AA-3E2E-4BDE-9B27-1B3280836521}.ReleaseWindows|Any CPU.Build.0 = ReleaseWindows|Any CPU
+ {830461AA-3E2E-4BDE-9B27-1B3280836521}.ReleaseWindows|x64.ActiveCfg = ReleaseWindows|Any CPU
+ {830461AA-3E2E-4BDE-9B27-1B3280836521}.ReleaseWindows|x64.Build.0 = ReleaseWindows|Any CPU
+ {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.DebugLinux|Any CPU.ActiveCfg = DebugLinux|x64
+ {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.DebugLinux|x64.ActiveCfg = DebugLinux|x64
+ {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.DebugLinux|x64.Build.0 = DebugLinux|x64
+ {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.DebugMac|Any CPU.ActiveCfg = DebugLinux|x64
+ {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.DebugMac|Any CPU.Build.0 = DebugLinux|x64
+ {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.DebugMac|x64.ActiveCfg = DebugLinux|x64
+ {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.DebugWindows|Any CPU.ActiveCfg = DebugLinux|x64
+ {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.DebugWindows|Any CPU.Build.0 = DebugLinux|x64
+ {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.DebugWindows|x64.ActiveCfg = DebugLinux|x64
+ {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.ReleaseLinux|Any CPU.ActiveCfg = ReleaseLinux|x64
+ {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.ReleaseLinux|x64.ActiveCfg = ReleaseLinux|x64
+ {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.ReleaseLinux|x64.Build.0 = ReleaseLinux|x64
+ {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.ReleaseMac|Any CPU.ActiveCfg = DebugLinux|x64
+ {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.ReleaseMac|Any CPU.Build.0 = DebugLinux|x64
+ {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.ReleaseMac|x64.ActiveCfg = ReleaseLinux|x64
+ {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.ReleaseWindows|Any CPU.ActiveCfg = DebugLinux|x64
+ {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.ReleaseWindows|Any CPU.Build.0 = DebugLinux|x64
+ {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.ReleaseWindows|x64.ActiveCfg = ReleaseLinux|x64
+ {CC996BB6-3781-4868-B996-07F9CDC936ED}.DebugLinux|Any CPU.ActiveCfg = DebugMac|x64
+ {CC996BB6-3781-4868-B996-07F9CDC936ED}.DebugLinux|x64.ActiveCfg = DebugMac|x64
+ {CC996BB6-3781-4868-B996-07F9CDC936ED}.DebugMac|Any CPU.ActiveCfg = DebugMac|x64
+ {CC996BB6-3781-4868-B996-07F9CDC936ED}.DebugMac|Any CPU.Build.0 = DebugMac|x64
+ {CC996BB6-3781-4868-B996-07F9CDC936ED}.DebugMac|x64.ActiveCfg = DebugMac|x64
+ {CC996BB6-3781-4868-B996-07F9CDC936ED}.DebugMac|x64.Build.0 = DebugMac|x64
+ {CC996BB6-3781-4868-B996-07F9CDC936ED}.DebugWindows|Any CPU.ActiveCfg = DebugMac|x64
+ {CC996BB6-3781-4868-B996-07F9CDC936ED}.DebugWindows|Any CPU.Build.0 = DebugMac|x64
+ {CC996BB6-3781-4868-B996-07F9CDC936ED}.DebugWindows|x64.ActiveCfg = DebugMac|x64
+ {CC996BB6-3781-4868-B996-07F9CDC936ED}.ReleaseLinux|Any CPU.ActiveCfg = ReleaseMac|x64
+ {CC996BB6-3781-4868-B996-07F9CDC936ED}.ReleaseLinux|x64.ActiveCfg = ReleaseMac|x64
+ {CC996BB6-3781-4868-B996-07F9CDC936ED}.ReleaseMac|Any CPU.ActiveCfg = DebugMac|x64
+ {CC996BB6-3781-4868-B996-07F9CDC936ED}.ReleaseMac|Any CPU.Build.0 = DebugMac|x64
+ {CC996BB6-3781-4868-B996-07F9CDC936ED}.ReleaseMac|x64.ActiveCfg = ReleaseMac|x64
+ {CC996BB6-3781-4868-B996-07F9CDC936ED}.ReleaseMac|x64.Build.0 = ReleaseMac|x64
+ {CC996BB6-3781-4868-B996-07F9CDC936ED}.ReleaseWindows|Any CPU.ActiveCfg = DebugMac|x64
+ {CC996BB6-3781-4868-B996-07F9CDC936ED}.ReleaseWindows|Any CPU.Build.0 = DebugMac|x64
+ {CC996BB6-3781-4868-B996-07F9CDC936ED}.ReleaseWindows|x64.ActiveCfg = ReleaseMac|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
- {008C0F83-E914-4966-9135-EA885059EDD8} = {F35DF9BF-0BED-4FEF-A51C-DD83C531882F}
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7} = {DE36F45F-F09E-4719-B953-00D148F7722A}
+ {008C0F83-E914-4966-9135-EA885059EDD8} = {78A9F0AA-5519-407A-9B72-2A09F5DF7068}
{49BA1C69-6104-41AC-A5D8-B54FA9F696E8} = {DE36F45F-F09E-4719-B953-00D148F7722A}
- {251AAFE1-F24B-4837-9128-9D04FCBFD528} = {F35DF9BF-0BED-4FEF-A51C-DD83C531882F}
{3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50} = {DE36F45F-F09E-4719-B953-00D148F7722A}
{C293DB32-FA42-486D-B128-5A12522FAE4E} = {DE36F45F-F09E-4719-B953-00D148F7722A}
{2E4773B7-961A-4328-9D77-9749F9071CA2} = {DE36F45F-F09E-4719-B953-00D148F7722A}
{85232B20-074D-4723-B0C6-91495391E448} = {F35DF9BF-0BED-4FEF-A51C-DD83C531882F}
- {561357C2-DB28-4E01-B275-6BF545F70491} = {F35DF9BF-0BED-4FEF-A51C-DD83C531882F}
+ {561357C2-DB28-4E01-B275-6BF545F70491} = {19BDB9C9-49DA-4157-9801-21F39930D106}
{A4610E4C-DD34-428B-BABB-779CA0B5993A} = {DE36F45F-F09E-4719-B953-00D148F7722A}
{3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6} = {DE36F45F-F09E-4719-B953-00D148F7722A}
+ {78A9F0AA-5519-407A-9B72-2A09F5DF7068} = {F35DF9BF-0BED-4FEF-A51C-DD83C531882F}
+ {19BDB9C9-49DA-4157-9801-21F39930D106} = {F35DF9BF-0BED-4FEF-A51C-DD83C531882F}
+ {3503EDE6-A1D7-446C-BF3E-CA218547B254} = {F35DF9BF-0BED-4FEF-A51C-DD83C531882F}
+ {51AFF563-4982-474D-A92F-50B06DB05B3D} = {19BDB9C9-49DA-4157-9801-21F39930D106}
+ {A67D00EB-8F3D-49C9-9E01-94ED90B6BF2B} = {3503EDE6-A1D7-446C-BF3E-CA218547B254}
+ {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7} = {DE36F45F-F09E-4719-B953-00D148F7722A}
+ {830461AA-3E2E-4BDE-9B27-1B3280836521} = {DE36F45F-F09E-4719-B953-00D148F7722A}
+ {B2C129F2-8E5C-419A-98EB-161AA5B5FC71} = {F35DF9BF-0BED-4FEF-A51C-DD83C531882F}
+ {D7F9FDD3-AF03-46AD-A2C2-F590899712B7} = {B2C129F2-8E5C-419A-98EB-161AA5B5FC71}
+ {DBCF6FF0-3DE9-11E9-B3EF-63280FDBDA4A} = {F35DF9BF-0BED-4FEF-A51C-DD83C531882F}
+ {CC996BB6-3781-4868-B996-07F9CDC936ED} = {DBCF6FF0-3DE9-11E9-B3EF-63280FDBDA4A}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {17032EAB-554B-4B44-A4F6-EFB177ACAB7A}
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index b8ac18d03..25fbbf2f3 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -12,21 +12,33 @@ If you've encountered a bug, you can report it in the [issue tracker](https://gi
Before you start doing modifications to the code or submitting pull requests to the repository, it is important that you've read and understood (at least the human-readable summary part) of [our EULA](https://github.com/Regalis11/Barotrauma/blob/master/EULA.txt). To sum it up, Barotrauma is not an open source project in the sense of free, open source software that you can freely distribute or reuse. Even though the early versions of the game have been available for free, the game will eventually have a price tag. If you're not comfortable with your contributions potentially being used in a commercial product, do not submit pull requests to the repository.
### Getting started
-Installing Visual Studio
+#### Windows
You need a version of Visual Studio that supports C# 6.0 to compile game. If you don't have a compatible version of Visual Studio installed, you can get Visual Studio Community 2017 from the following link: https://visualstudio.microsoft.com/downloads/
Make sure you select ".NET desktop development" during the install process to make sure you have the required features to work with Barotrauma.
+#### Linux
+All that is required to build Barotrauma on Linux is the `mono-devel` package that you can install by following the instructions on the following page: https://www.mono-project.com/download/stable/#download-lin
+
+You may optionally install [MonoDevelop](https://www.monodevelop.com/) to navigate and modify the solution.
+
### Installing dependencies
We use NuGet to make the solution download most of the required libraries and dependencies automatically, but you also need to make sure you have the OpenAL audio library installed.
-You can get OpenAL from the following link: https://www.openal.org/downloads/oalinst.zip
+
+If you're on Windows, you can get OpenAL from the following link: https://www.openal.org/downloads/oalinst.zip
+
+### Modifying the source code
+Barotrauma's source code is split up into three projects: `ClientCode`, `Server` and `SharedCode`. The non-code assets (i.e. textures, sound files, miscellaneous XML) are mainly found in the `SharedContent` project.
+
+The client project includes the code only required by the client executable: graphics-related code, audio, particle effects and such. The server project includes logic that's only needed by the dedicated server executable. The shared project contains most of the gameplay, physics and networking logic and everything else that's needed by both the client executable and the dedicated server.
### Building the game
-The Barotrauma_Solution.sln solution includes 3 important projects: BarotraumaClient, BarotraumaServer and BarotraumaShared. The client project includes the code only required by the client executable: graphics-related code, audio, particle effects and such. The server project includes logic that's only needed by the dedicated server executable. The shared project contains most of the gameplay, physics and networking logic and everything else that's needed by both the client executable and the dedicated server.
+Before building, you should choose the build configuration. The available configurations are `DebugWindows`, `DebugMac`, `DebugLinux`, `ReleaseWindows`, `ReleaseMac` and `ReleaseLinux`. Additionally, unless you want to work on the dedicated server, you may want to make sure `WindowsClient`, `MacClient` or `LinuxClient` are selected as the startup project.
-Unless you want to work on the dedicated server, you should make sure BarotraumaClient is selected as the startup project.
+The debug build configurations include some features that make debugging and testing a little easier: things such as additional console commands, being able to move the submarine with the IJKL keys and allowing clients to use any console command in multiplayer. The debug builds don't create crash reports when an unhandled exception occurs - the intention behind this is to allow exceptions to be caught by the debugger instead of having the game close and write a report.
-Next you should choose the build configuration. When developing on Windows, choose either DebugWindows or ReleaseWindows. The debug build configuration includes some features that make debugging and testing a little easier: things such as additional console commands, being able to move the submarine with the IJKL keys and allowing clients to use any console command in multiplayer. The debug builds don't create crash reports when an unhandled exception occurs - the intention behind this is to allow exceptions to be caught by the debugger instead of having the game close and write a report.
+To build through the command line (recommended if you're on Linux), use the following command:
+`msbuild Barotrauma_Solution.sln /property:Configuration=CONFIGURATION /property:Platform=x64`
### Programming guidelines
We (loosely) follow the C# naming and coding conventions recommended by Microsoft.
diff --git a/Libraries/Facepunch.Steamworks/Facepunch.Steamworks.csproj b/Libraries/Facepunch.Steamworks/Facepunch.Steamworks.csproj
index bd698e75f..09072c596 100644
--- a/Libraries/Facepunch.Steamworks/Facepunch.Steamworks.csproj
+++ b/Libraries/Facepunch.Steamworks/Facepunch.Steamworks.csproj
@@ -2,7 +2,7 @@
- net45;net35;net40
+ net45
true
Facepunch.Steamworks
diff --git a/Libraries/Farseer Physics Engine 3.5/Farseer Physics MonoGame DesktopGL.csproj b/Libraries/Farseer Physics Engine 3.5/Farseer Physics MonoGame DesktopGL.csproj
new file mode 100644
index 000000000..d2b9e150e
--- /dev/null
+++ b/Libraries/Farseer Physics Engine 3.5/Farseer Physics MonoGame DesktopGL.csproj
@@ -0,0 +1,214 @@
+
+
+
+ ReleaseWindows
+ AnyCPU
+ 8.0.30703
+ 2.0
+ {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}
+ Library
+ Properties
+ FarseerPhysics
+ FarseerPhysics MonoGame
+ 512
+
+
+
+
+
+
+
+
+ v4.5
+
+
+ 0.9.0.0
+
+
+
+
+
+
+
+
+
+ true
+ pdbonly
+ true
+ ReleaseWindows\
+ TRACE;WINDOWS
+ AnyCPU
+
+
+ true
+ pdbonly
+ true
+ ReleaseLinux\
+ TRACE;LINUX
+ AnyCPU
+
+
+ true
+ pdbonly
+ true
+ ReleaseMac\
+ TRACE;OSX
+ AnyCPU
+
+
+ true
+ full
+ DebugWindows\
+ TRACE;DEBUG;WINDOWS
+ AnyCPU
+
+
+ true
+ full
+ false
+ DebugLinux\
+ TRACE;DEBUG;LINUX
+ 4
+ AnyCPU
+
+
+ true
+ full
+ false
+ DebugMac\
+ TRACE;DEBUG;OSX
+ 4
+ AnyCPU
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ..\NuGet\MonoGame.Framework.DesktopGL.3.7.1.189\lib\net45\MonoGame.Framework.dll
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Libraries/Farseer Physics Engine 3.5/Farseer Physics MonoGame.csproj b/Libraries/Farseer Physics Engine 3.5/Farseer Physics MonoGame WindowsDX.csproj
similarity index 95%
rename from Libraries/Farseer Physics Engine 3.5/Farseer Physics MonoGame.csproj
rename to Libraries/Farseer Physics Engine 3.5/Farseer Physics MonoGame WindowsDX.csproj
index 35640cf47..dad71b62a 100644
--- a/Libraries/Farseer Physics Engine 3.5/Farseer Physics MonoGame.csproj
+++ b/Libraries/Farseer Physics Engine 3.5/Farseer Physics MonoGame WindowsDX.csproj
@@ -1,220 +1,219 @@
-
-
-
- ReleaseWindows
- AnyCPU
- 8.0.30703
- 2.0
- {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}
- Library
- Properties
- FarseerPhysics
- FarseerPhysics MonoGame
- 512
-
-
-
-
-
-
-
-
- v4.5
-
-
- 0.9.0.0
-
-
-
-
-
-
-
-
-
- true
- pdbonly
- true
- ReleaseWindows\
- TRACE;WINDOWS
- AnyCPU
-
-
- true
- pdbonly
- true
- ReleaseLinux\
- TRACE;LINUX
- AnyCPU
-
-
- true
- pdbonly
- true
- ReleaseMac\
- TRACE;OSX
- AnyCPU
-
-
- true
- full
- DebugWindows\
- TRACE;DEBUG;WINDOWS
- AnyCPU
-
-
- true
- full
- false
- DebugLinux\
- TRACE;DEBUG;LINUX
- 4
- AnyCPU
-
-
- true
- full
- false
- DebugMac\
- TRACE;DEBUG;OSX
- 4
- AnyCPU
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ..\NuGet\MonoGame.Framework.WindowsDX.3.7.1.189\lib\net45\MonoGame.Framework.dll
-
-
- ..\NuGet\SharpDX.4.2.0\lib\net45\SharpDX.dll
-
-
- ..\NuGet\MonoGame.Framework.DesktopGL.3.7.1.189\lib\net45\MonoGame.Framework.dll
-
-
-
-
-
+
+
+
+ ReleaseWindows
+ AnyCPU
+ 8.0.30703
+ 2.0
+ {830461AA-3E2E-4BDE-9B27-1B3280836521}
+ Library
+ Properties
+ FarseerPhysics
+ FarseerPhysics MonoGame
+ 512
+
+
+
+
+
+
+
+
+ v4.5
+
+
+ 0.9.0.0
+
+
+
+
+
+
+
+
+
+ true
+ pdbonly
+ true
+ ReleaseWindows\
+ TRACE;WINDOWS
+ AnyCPU
+
+
+ true
+ pdbonly
+ true
+ ReleaseLinux\
+ TRACE;LINUX
+ AnyCPU
+
+
+ true
+ pdbonly
+ true
+ ReleaseMac\
+ TRACE;OSX
+ AnyCPU
+
+
+ true
+ full
+ DebugWindows\
+ TRACE;DEBUG;WINDOWS
+ AnyCPU
+
+
+ true
+ full
+ false
+ DebugLinux\
+ TRACE;DEBUG;LINUX
+ 4
+ AnyCPU
+
+
+ true
+ full
+ false
+ DebugMac\
+ TRACE;DEBUG;OSX
+ 4
+ AnyCPU
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ..\NuGet\MonoGame.Framework.WindowsDX.3.7.1.189\lib\net45\MonoGame.Framework.dll
+
+
+ ..\NuGet\SharpDX.4.2.0\lib\net45\SharpDX.dll
+
+
+
+
+
\ No newline at end of file
diff --git a/README.md b/README.md
index 32a4a8a1d..873837ee7 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
# Barotrauma
-Copyright © Undertow Games 2017-2018
+Copyright © Undertow Games 2017-2019
Before downloading the source code, please read the [EULA](EULA.txt).
@@ -20,8 +20,7 @@ If you're interested in working on the code, either to develop mods or to contri
### Windows
- [Visual Studio](https://www.visualstudio.com/vs/community/) with C# 7.0 support (VS 2017 or later recommended)
### Linux
-- [Mono 5.16](http://www.mono-project.com)
-- [MonoDevelop 7.5](http://www.monodevelop.com/)
+- [mono-devel 5.18](http://www.mono-project.com)
### macOS
-- [Mono 5.8](http://www.mono-project.com)
-- [Visual Studio](https://www.visualstudio.com/vs/community/)
\ No newline at end of file
+- [Mono 5.16](http://www.mono-project.com)
+- [Visual Studio](https://www.visualstudio.com/vs/community/)