From b3462b24b41ed82bb6a841f3cd159c236fb11560 Mon Sep 17 00:00:00 2001 From: Regalis Date: Fri, 23 Oct 2015 00:10:27 +0300 Subject: [PATCH] Reliablesender exception handling, buttons crashing multiplayer, using screwdrivers/wrenches with left click, RestoreCollision exception handling, nerfed c4, UpdateLimbCollisionCategories fix --- Subsurface/Barotrauma.csproj.user | 2 +- .../TigerThresher/tigerthresher.xml | 2 +- Subsurface/Content/Items/Button/button.xml | 4 +- Subsurface/Content/Items/Door/doors.xml | 4 +- .../Content/Items/Electricity/lights.xml | 2 +- .../Content/Items/Electricity/poweritems.xml | 6 +- .../Content/Items/Electricity/signalitems.xml | 32 +++++------ Subsurface/Content/Items/Engine/engine.xml | 23 +++++++- Subsurface/Content/Items/MiniMap/item.xml | 2 +- .../Items/OxygenGenerator/oxygengenerator.xml | 2 +- Subsurface/Content/Items/Pump/pump.xml | 2 +- Subsurface/Content/Items/Reactor/reactor.xml | 2 +- .../Content/Items/Weapons/explosives.xml | 6 +- Subsurface/Properties/AssemblyInfo.cs | 4 +- Subsurface/Source/Characters/AICharacter.cs | 6 +- Subsurface/Source/Characters/Character.cs | 36 ++++++++---- Subsurface/Source/Characters/Ragdoll.cs | 10 +++- Subsurface/Source/Events/Quests/Quest.cs | 10 ++-- Subsurface/Source/GUI/GUIComponent.cs | 6 +- Subsurface/Source/GameMain.cs | 7 ++- .../GameSession/GameModes/TutorialMode.cs | 2 +- .../Items/Components/Holdable/Holdable.cs | 2 +- .../Items/Components/Holdable/Pickable.cs | 2 +- .../Source/Items/Components/ItemComponent.cs | 46 ++++++++++------ .../Source/Items/Components/Machines/Radar.cs | 2 +- .../Source/Items/Components/Projectile.cs | 24 +++++++- .../Source/Items/Components/Signal/Wire.cs | 8 ++- Subsurface/Source/Items/Inventory.cs | 19 ++++--- Subsurface/Source/Items/Item.cs | 52 +++++++++++++++--- Subsurface/Source/Networking/GameClient.cs | 11 ++-- Subsurface/Source/Networking/GameServer.cs | 3 +- .../Source/Networking/ReliableSender.cs | 28 ++++++++-- Subsurface/Source/Screens/MainMenuScreen.cs | 2 +- Subsurface_Solution.v12.suo | Bin 784896 -> 835584 bytes 34 files changed, 256 insertions(+), 113 deletions(-) diff --git a/Subsurface/Barotrauma.csproj.user b/Subsurface/Barotrauma.csproj.user index 1782abafa..df35fcf91 100644 --- a/Subsurface/Barotrauma.csproj.user +++ b/Subsurface/Barotrauma.csproj.user @@ -9,7 +9,7 @@ en-US false - ShowAllFiles + ProjectFiles diff --git a/Subsurface/Content/Characters/TigerThresher/tigerthresher.xml b/Subsurface/Content/Characters/TigerThresher/tigerthresher.xml index ad1761c38..c401e5d51 100644 --- a/Subsurface/Content/Characters/TigerThresher/tigerthresher.xml +++ b/Subsurface/Content/Characters/TigerThresher/tigerthresher.xml @@ -30,7 +30,7 @@ - + diff --git a/Subsurface/Content/Items/Button/button.xml b/Subsurface/Content/Items/Button/button.xml index 47510268a..e89794e0d 100644 --- a/Subsurface/Content/Items/Button/button.xml +++ b/Subsurface/Content/Items/Button/button.xml @@ -15,12 +15,12 @@ - + - diff --git a/Subsurface/Content/Items/Door/doors.xml b/Subsurface/Content/Items/Door/doors.xml index 7e1d1e859..298acf04d 100644 --- a/Subsurface/Content/Items/Door/doors.xml +++ b/Subsurface/Content/Items/Door/doors.xml @@ -19,7 +19,7 @@ - + @@ -48,7 +48,7 @@ - + diff --git a/Subsurface/Content/Items/Electricity/lights.xml b/Subsurface/Content/Items/Electricity/lights.xml index 34d48a133..85da571ab 100644 --- a/Subsurface/Content/Items/Electricity/lights.xml +++ b/Subsurface/Content/Items/Electricity/lights.xml @@ -11,7 +11,7 @@ - + diff --git a/Subsurface/Content/Items/Electricity/poweritems.xml b/Subsurface/Content/Items/Electricity/poweritems.xml index 7f58f6b74..52f63dcc0 100644 --- a/Subsurface/Content/Items/Electricity/poweritems.xml +++ b/Subsurface/Content/Items/Electricity/poweritems.xml @@ -17,7 +17,7 @@ - + @@ -45,7 +45,7 @@ - + @@ -69,7 +69,7 @@ - + diff --git a/Subsurface/Content/Items/Electricity/signalitems.xml b/Subsurface/Content/Items/Electricity/signalitems.xml index 6f4f3ea07..9e138f855 100644 --- a/Subsurface/Content/Items/Electricity/signalitems.xml +++ b/Subsurface/Content/Items/Electricity/signalitems.xml @@ -80,13 +80,13 @@ - - + @@ -108,12 +108,12 @@ - - + @@ -135,12 +135,12 @@ - - + @@ -163,11 +163,11 @@ - + - + @@ -188,12 +188,12 @@ - - + @@ -212,12 +212,12 @@ - - + @@ -239,12 +239,12 @@ - - + @@ -264,12 +264,12 @@ - - + diff --git a/Subsurface/Content/Items/Engine/engine.xml b/Subsurface/Content/Items/Engine/engine.xml index c1daaaa47..a14c67887 100644 --- a/Subsurface/Content/Items/Engine/engine.xml +++ b/Subsurface/Content/Items/Engine/engine.xml @@ -13,7 +13,7 @@ - + @@ -38,7 +38,7 @@ - + @@ -46,4 +46,23 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Subsurface/Content/Items/MiniMap/item.xml b/Subsurface/Content/Items/MiniMap/item.xml index b898d70f4..463c391d3 100644 --- a/Subsurface/Content/Items/MiniMap/item.xml +++ b/Subsurface/Content/Items/MiniMap/item.xml @@ -10,7 +10,7 @@ - + diff --git a/Subsurface/Content/Items/OxygenGenerator/oxygengenerator.xml b/Subsurface/Content/Items/OxygenGenerator/oxygengenerator.xml index 96501ab14..1fc53de08 100644 --- a/Subsurface/Content/Items/OxygenGenerator/oxygengenerator.xml +++ b/Subsurface/Content/Items/OxygenGenerator/oxygengenerator.xml @@ -17,7 +17,7 @@ - + diff --git a/Subsurface/Content/Items/Pump/pump.xml b/Subsurface/Content/Items/Pump/pump.xml index 782671806..8ce2ecfdb 100644 --- a/Subsurface/Content/Items/Pump/pump.xml +++ b/Subsurface/Content/Items/Pump/pump.xml @@ -10,7 +10,7 @@ - + diff --git a/Subsurface/Content/Items/Reactor/reactor.xml b/Subsurface/Content/Items/Reactor/reactor.xml index c23c90635..7ace14c21 100644 --- a/Subsurface/Content/Items/Reactor/reactor.xml +++ b/Subsurface/Content/Items/Reactor/reactor.xml @@ -31,7 +31,7 @@ - + diff --git a/Subsurface/Content/Items/Weapons/explosives.xml b/Subsurface/Content/Items/Weapons/explosives.xml index f23a12245..b5f5c269a 100644 --- a/Subsurface/Content/Items/Weapons/explosives.xml +++ b/Subsurface/Content/Items/Weapons/explosives.xml @@ -12,7 +12,7 @@ - + @@ -27,7 +27,7 @@ - + @@ -35,7 +35,7 @@ - + diff --git a/Subsurface/Properties/AssemblyInfo.cs b/Subsurface/Properties/AssemblyInfo.cs index 61b22b369..caaef8883 100644 --- a/Subsurface/Properties/AssemblyInfo.cs +++ b/Subsurface/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.0.0.1")] -[assembly: AssemblyFileVersion("0.0.0.1")] +[assembly: AssemblyVersion("0.2.3.0")] +[assembly: AssemblyFileVersion("0.2.3.0")] diff --git a/Subsurface/Source/Characters/AICharacter.cs b/Subsurface/Source/Characters/AICharacter.cs index 442662e78..6ea38dab6 100644 --- a/Subsurface/Source/Characters/AICharacter.cs +++ b/Subsurface/Source/Characters/AICharacter.cs @@ -165,8 +165,8 @@ namespace Barotrauma try { targetDir = message.ReadBoolean(); - targetMovement.X = message.ReadRangedSingle(-10.0f, 10.0f, 8); - targetMovement.Y = message.ReadRangedSingle(-10.0f, 10.0f, 8); + targetMovement.X = message.ReadRangedSingle(-10.0f, 10.0f, 16); + targetMovement.Y = message.ReadRangedSingle(-10.0f, 10.0f, 16); } catch @@ -236,7 +236,7 @@ namespace Barotrauma catch { return; } - + //error AnimController.RefLimb.body.TargetPosition = pos; AnimController.RefLimb.body.TargetVelocity = vel; diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index d310dfcab..d8e9835a5 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -626,8 +626,7 @@ namespace Barotrauma selectedCharacter = null; - if (createNetworkEvent) - new NetworkEvent(NetworkEventType.SelectCharacter, ID, true, 0); + if (createNetworkEvent) new NetworkEvent(NetworkEventType.SelectCharacter, ID, true, (ushort)0); } /// @@ -723,9 +722,10 @@ namespace Barotrauma if (closestItem != null) { closestItem.IsHighlighted = true; - if (GetInputState(InputType.Select) && closestItem.Pick(this, false)) + if (closestItem.Pick(this)) { - new NetworkEvent(NetworkEventType.PickItem, ID, true, closestItem.ID); + new NetworkEvent(NetworkEventType.PickItem, ID, true, + new int[] { closestItem.ID, GetInputState(InputType.Select) ? 1 : 0, GetInputState(InputType.ActionHit) ? 1 : 0 }); } } } @@ -801,7 +801,7 @@ namespace Barotrauma if (!(this is AICharacter)) Control(deltaTime, cam); UpdateSightRange(); - aiTarget.SoundRange = 0.0f; + if (aiTarget != null) aiTarget.SoundRange = 0.0f; lowPassMultiplier = MathHelper.Lerp(lowPassMultiplier, 1.0f, 0.1f); @@ -830,6 +830,8 @@ namespace Barotrauma private void UpdateSightRange() { + if (aiTarget == null) return; + aiTarget.SightRange = 0.0f; //distance is approximated based on the mass of the character @@ -1088,10 +1090,17 @@ namespace Barotrauma { if (type == NetworkEventType.PickItem) { - message.Write((ushort)data); + int[] pickData = (int[])data; + if (pickData.Length != 3) return false; + + message.Write((ushort)pickData[0]); + message.Write((int)pickData[1] == 1); + message.Write((int)pickData[2] == 1); + message.WritePadBits(); + return true; } - else if (type== NetworkEventType.SelectCharacter) + else if (type == NetworkEventType.SelectCharacter) { message.Write((ushort)data); return true; @@ -1193,12 +1202,15 @@ namespace Barotrauma itemId = message.ReadUInt16(); + bool pickHit = message.ReadBoolean(); + bool actionHit = message.ReadBoolean(); + System.Diagnostics.Debug.WriteLine("item id: "+itemId); Item item = FindEntityByID(itemId) as Item; if (item != null) { - item.Pick(this); + item.Pick(this, false, pickHit, actionHit); } return; @@ -1249,9 +1261,9 @@ namespace Barotrauma bool hasInputs = message.ReadBoolean(); sendingTime = message.ReadFloat(); - if (!hasInputs && sendingTime > LastNetworkUpdate) + if (!hasInputs) { - ClearInputs(); + if (sendingTime > LastNetworkUpdate) ClearInputs(); return; } @@ -1266,7 +1278,7 @@ namespace Barotrauma runState = message.ReadBoolean(); } - catch + catch (Exception e) { return; } @@ -1310,7 +1322,7 @@ namespace Barotrauma } if (secondaryKeyState) { - cursorPosition = cursorPos; + cursorPosition = MathUtils.IsValid(cursorPos) ? cursorPos : Vector2.Zero; } else { diff --git a/Subsurface/Source/Characters/Ragdoll.cs b/Subsurface/Source/Characters/Ragdoll.cs index d36eb7595..b2cd94834 100644 --- a/Subsurface/Source/Characters/Ragdoll.cs +++ b/Subsurface/Source/Characters/Ragdoll.cs @@ -531,7 +531,15 @@ namespace Barotrauma { if (limb.ignoreCollisions) continue; - limb.body.CollidesWith = collisionCategory; + try + { + limb.body.CollidesWith = collisionCategory; + } + catch (Exception e) + { + DebugConsole.ThrowError("Failed to update ragdoll limb collisioncategories", e); + } + } } diff --git a/Subsurface/Source/Events/Quests/Quest.cs b/Subsurface/Source/Events/Quests/Quest.cs index ed5475533..3e21fab28 100644 --- a/Subsurface/Source/Events/Quests/Quest.cs +++ b/Subsurface/Source/Events/Quests/Quest.cs @@ -159,15 +159,15 @@ namespace Barotrauma public void GiveReward() { + if (!string.IsNullOrWhiteSpace(successMessage)) + { + new GUIMessageBox("Quest completed successfully", successMessage); + } + var mode = GameMain.GameSession.gameMode as SinglePlayerMode; if (mode == null) return; mode.Money += reward; - - if (!string.IsNullOrWhiteSpace(successMessage)) - { - new GUIMessageBox("Quest completed", successMessage); - } } } } diff --git a/Subsurface/Source/GUI/GUIComponent.cs b/Subsurface/Source/GUI/GUIComponent.cs index 0e749962f..b793b4d3b 100644 --- a/Subsurface/Source/GUI/GUIComponent.cs +++ b/Subsurface/Source/GUI/GUIComponent.cs @@ -185,10 +185,10 @@ namespace Barotrauma public bool IsParentOf(GUIComponent component) { - foreach (GUIComponent child in children) + for(int i = children.Count - 1; i >= 0; i--) { - if (child == component) return true; - if (child.IsParentOf(component)) return true; + if (children[i] == component) return true; + if (children[i].IsParentOf(component)) return true; } return false; diff --git a/Subsurface/Source/GameMain.cs b/Subsurface/Source/GameMain.cs index 95655eae0..77faa8aa2 100644 --- a/Subsurface/Source/GameMain.cs +++ b/Subsurface/Source/GameMain.cs @@ -305,7 +305,8 @@ namespace Barotrauma if (titleScreenOpen) { TitleScreen.Draw(spriteBatch, GraphicsDevice, (float)deltaTime); - if (TitleScreen.LoadState>=100.0f && (PlayerInput.GetKeyboardState.GetPressedKeys().Length>0 || PlayerInput.LeftButtonClicked())) + if (TitleScreen.LoadState>=100.0f && + (!waitForKeyHit || PlayerInput.GetKeyboardState.GetPressedKeys().Length>0 || PlayerInput.LeftButtonClicked())) { titleScreenOpen = false; } @@ -325,8 +326,10 @@ namespace Barotrauma Stopwatch sw; - public static void ShowLoading(IEnumerable loader) + static bool waitForKeyHit = true; + public static void ShowLoading(IEnumerable loader, bool waitKeyHit = true) { + waitForKeyHit = waitKeyHit; titleScreenOpen = true; CoroutineManager.StartCoroutine(TitleScreen.DoLoading(loader)); diff --git a/Subsurface/Source/GameSession/GameModes/TutorialMode.cs b/Subsurface/Source/GameSession/GameModes/TutorialMode.cs index 6b49c7be9..d8b926c31 100644 --- a/Subsurface/Source/GameSession/GameModes/TutorialMode.cs +++ b/Subsurface/Source/GameSession/GameModes/TutorialMode.cs @@ -213,7 +213,7 @@ namespace Barotrauma yield return new WaitForSeconds(5.0f); infoBox = CreateInfoFrame("You need a screwdriver to check the wiring of the terminal." - + " Equip a screwdriver by pulling it to either of the slots with a hand symbol, and then select the terminal again by pressing E."); + + " Equip a screwdriver by pulling it to either of the slots with a hand symbol, and then use it on the terminal by left clicking."); while (Character.Controlled.SelectedConstruction != steering.Item || Character.Controlled.SelectedItems.FirstOrDefault(i => i != null && i.Name == "Screwdriver") == null) diff --git a/Subsurface/Source/Items/Components/Holdable/Holdable.cs b/Subsurface/Source/Items/Components/Holdable/Holdable.cs index 99d1c7886..4d4b10d5b 100644 --- a/Subsurface/Source/Items/Components/Holdable/Holdable.cs +++ b/Subsurface/Source/Items/Components/Holdable/Holdable.cs @@ -215,7 +215,7 @@ namespace Barotrauma.Items.Components attached = true; - item.NewComponentEvent(this, true, true); + if (character != null) item.NewComponentEvent(this, true, true); return true; } diff --git a/Subsurface/Source/Items/Components/Holdable/Pickable.cs b/Subsurface/Source/Items/Components/Holdable/Pickable.cs index 6f3e2c3fc..260887a64 100644 --- a/Subsurface/Source/Items/Components/Holdable/Pickable.cs +++ b/Subsurface/Source/Items/Components/Holdable/Pickable.cs @@ -37,7 +37,7 @@ namespace Barotrauma.Items.Components if (picker == null) return false; if (picker.Inventory == null) return false; - if (picker.Inventory.TryPutItem(item, allowedSlots)) + if (picker.Inventory.TryPutItem(item, allowedSlots, picker==Character.Controlled)) { if (!picker.HasSelectedItem(item) && item.body!=null) item.body.Enabled = false; this.picker = picker; diff --git a/Subsurface/Source/Items/Components/ItemComponent.cs b/Subsurface/Source/Items/Components/ItemComponent.cs index 6fab1cba3..3a7cb8744 100644 --- a/Subsurface/Source/Items/Components/ItemComponent.cs +++ b/Subsurface/Source/Items/Components/ItemComponent.cs @@ -108,6 +108,18 @@ namespace Barotrauma.Items.Components set { canBeSelected = value; } } + public InputType PickKey + { + get; + private set; + } + + public InputType SelectKey + { + get; + private set; + } + [HasDefaultValue(false, false)] public bool DeleteOnUse { @@ -166,24 +178,26 @@ namespace Barotrauma.Items.Components statusEffects = new List(); - //var initableProperties = ObjectProperty.GetProperties(this); - //foreach (ObjectProperty initableProperty in initableProperties) - //{ - // object value = ToolBox.GetAttributeObject(element, initableProperty.Name.ToLower()); - // if (value==null) - // { - // foreach (var ini in initableProperty.Attributes.OfType()) - // { - // value = ini.defaultValue; - // break; - // } - // } + SelectKey = InputType.Select; - // initableProperty.TrySetValue(value); - //} - if (item.Name=="Welding Tool") + try { - int a = 1; + SelectKey = (InputType)Enum.Parse(typeof(InputType), ToolBox.GetAttributeString(element, "selectkey", "Select"), true); + } + catch (Exception e) + { + DebugConsole.ThrowError("Invalid select key in " + element + "!", e); + } + + PickKey = InputType.Select; + + try + { + PickKey = (InputType)Enum.Parse(typeof(InputType), ToolBox.GetAttributeString(element, "selectkey", "Select"), true); + } + catch (Exception e) + { + DebugConsole.ThrowError("Invalid pick key in " + element + "!", e); } properties = ObjectProperty.InitProperties(this, element); diff --git a/Subsurface/Source/Items/Components/Machines/Radar.cs b/Subsurface/Source/Items/Components/Machines/Radar.cs index 0df23e5c4..7940096da 100644 --- a/Subsurface/Source/Items/Components/Machines/Radar.cs +++ b/Subsurface/Source/Items/Components/Machines/Radar.cs @@ -77,7 +77,7 @@ namespace Barotrauma.Items.Components if (voltage < minVoltage) return; - if (GUI.DrawButton(spriteBatch, new Rectangle(x + 20, y + 20, 200, 30), "Activate Radar")) + if (GUI.DrawButton(spriteBatch, new Rectangle(x + 20, y + 20, 200, 30), "Activate Sonar")) { IsActive = !IsActive; item.NewComponentEvent(this, true, false); diff --git a/Subsurface/Source/Items/Components/Projectile.cs b/Subsurface/Source/Items/Components/Projectile.cs index 738b74ee6..d9fadefd2 100644 --- a/Subsurface/Source/Items/Components/Projectile.cs +++ b/Subsurface/Source/Items/Components/Projectile.cs @@ -119,11 +119,31 @@ namespace Barotrauma.Items.Components { if (stickTarget!=null) { - item.body.FarseerBody.RestoreCollisionWith(stickTarget); + try + { + item.body.FarseerBody.RestoreCollisionWith(stickTarget); + } + catch (Exception e) + { +#if DEBUG + DebugConsole.ThrowError("Failed to restore collision with stickTarget", e); +#endif + } + stickTarget = null; } - GameMain.World.RemoveJoint(stickJoint); + try + { + GameMain.World.RemoveJoint(stickJoint); + } + catch (Exception e) + { +#if DEBUG + DebugConsole.ThrowError("Failed to remove stickJoint", e); +#endif + } + stickJoint = null; IsActive = false; diff --git a/Subsurface/Source/Items/Components/Signal/Wire.cs b/Subsurface/Source/Items/Components/Signal/Wire.cs index e705e6c0a..ca42763e1 100644 --- a/Subsurface/Source/Items/Components/Signal/Wire.cs +++ b/Subsurface/Source/Items/Components/Signal/Wire.cs @@ -420,11 +420,17 @@ namespace Barotrauma.Items.Components public override void ReadNetworkData(Networking.NetworkEventType type, Lidgren.Network.NetIncomingMessage message) { Nodes.Clear(); + + List newNodes = new List(); int nodeCount = message.ReadByte(); for (int i = 0; i ushort.MaxValue / 2 && messageId < short.MaxValue / 2) { for (ushort i = (ushort)Math.Min((int)lastMessageID + 1, ushort.MaxValue); i <= ushort.MaxValue; i++) { if (i == ushort.MaxValue && lastMessageID == ushort.MaxValue) break; - if (!missingMessages.ContainsKey(i)) missingMessages.Add(i, new MissingMessage(i)); + QueueMissingMessage(i); if (i == ushort.MaxValue) break; } for (ushort i = 1; i < messageId; i++) { - if (!missingMessages.ContainsKey(i)) missingMessages.Add(i, new MissingMessage(i)); + QueueMissingMessage(i); } } else { + //we already wrapped around but message hasn't, so it's an old message + if (lastMessageID < ushort.MaxValue / 2 && messageId > ushort.MaxValue / 2) + { + Debug.WriteLine("old already received message, ignore"); + return; + } + for (ushort i = (ushort)Math.Min((int)lastMessageID+1, ushort.MaxValue); i <= messageId; i++) { - if (!missingMessages.ContainsKey(i)) missingMessages.Add(i, new MissingMessage(i)); + QueueMissingMessage(i); if (i == ushort.MaxValue) break; } } diff --git a/Subsurface/Source/Screens/MainMenuScreen.cs b/Subsurface/Source/Screens/MainMenuScreen.cs index 3a9bed0be..0716c35b4 100644 --- a/Subsurface/Source/Screens/MainMenuScreen.cs +++ b/Subsurface/Source/Screens/MainMenuScreen.cs @@ -391,7 +391,7 @@ namespace Barotrauma GUI.Draw((float)deltaTime, spriteBatch, null); - spriteBatch.DrawString(GUI.Font, "Barotrauma chat lag test build", new Vector2(10, GameMain.GraphicsHeight-20), Color.White); + spriteBatch.DrawString(GUI.Font, "Barotrauma v"+GameMain.Version, new Vector2(10, GameMain.GraphicsHeight-20), Color.White); spriteBatch.End(); } diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index 4cd6ea86e451d83a42c529dae5b73a7076ced2b6..162aad8732b25cf6090097918f5d8082ea4e789d 100644 GIT binary patch delta 16027 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 SdLiz6l!-%`Hp>47o%t^Wu?W5Z delta 16186 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 kmEGP4&