From 46e862216b468767421c4043b0b414ff241c122b Mon Sep 17 00:00:00 2001 From: Regalis Date: Sat, 3 Oct 2015 17:19:14 +0300 Subject: [PATCH] Launcher error messageboxes, more easily controllable & better looking swimming, oxygen tank bugfixes, loading screen coroutine bugfix --- Launcher2/LauncherMain.cs | 32 +++++- .../TigerThresher/tigerthresher.xml | 4 +- .../Content/Items/Diving/divinggear.xml | 17 ++- Subsurface/Content/Items/Tools/tools.xml | 6 +- Subsurface/Source/Camera.cs | 27 ++--- Subsurface/Source/Characters/Character.cs | 2 +- .../Characters/HumanoidAnimController.cs | 100 +++++++++++------- Subsurface/Source/Characters/Limb.cs | 10 +- Subsurface/Source/Characters/Ragdoll.cs | 10 +- Subsurface/Source/GUI/TitleScreen.cs | 2 + Subsurface/Source/GameMain.cs | 10 +- .../Source/Items/Components/ItemComponent.cs | 11 +- .../Source/Items/Components/Projectile.cs | 2 - Subsurface/Source/Items/Inventory.cs | 14 --- Subsurface/Source/Items/Item.cs | 4 +- Subsurface/Source/Map/Levels/Level.cs | 32 +++--- Subsurface/Source/Map/MapEntity.cs | 2 - Subsurface/Source/Map/Structure.cs | 2 - Subsurface/Source/Map/StructurePrefab.cs | 4 +- Subsurface/Source/Screens/EditMapScreen.cs | 2 +- Subsurface/Source/Screens/GameScreen.cs | 15 +-- Subsurface/Source/Screens/LobbyScreen.cs | 7 +- Subsurface/Source/Screens/MainMenuScreen.cs | 2 + Subsurface/Source/Screens/NetLobbyScreen.cs | 5 +- .../Source/Sounds/AmbientSoundManager.cs | 2 +- Subsurface/Source/Sounds/Sound.cs | 6 +- Subsurface/Source/Sounds/SoundManager.cs | 1 - Subsurface/Source/Utils/UpdaterUtil.cs | 2 + Subsurface_Solution.v12.suo | Bin 759808 -> 714240 bytes 29 files changed, 184 insertions(+), 149 deletions(-) diff --git a/Launcher2/LauncherMain.cs b/Launcher2/LauncherMain.cs index 376b92b44..d24cee5a8 100644 --- a/Launcher2/LauncherMain.cs +++ b/Launcher2/LauncherMain.cs @@ -181,6 +181,17 @@ namespace Launcher2 PlayerInput.Update(deltaTime); + if (GUIMessageBox.MessageBoxes.Count > 0) + { + var messageBox = GUIMessageBox.MessageBoxes.Peek(); + if (messageBox != null) + { + GUIComponent.MouseOn = messageBox; + messageBox.Update(deltaTime); + return; + } + } + guiRoot.Update(deltaTime); } @@ -297,6 +308,15 @@ namespace Launcher2 private bool CheckForUpdates() { + if (string.IsNullOrWhiteSpace(settings.MasterServerUrl)) + { + updateInfoText.Text = "Checking updates failed"; + updateInfoBox.Visible = true; + SetUpdateInfoBox("Update server URL not set"); + return false; + + } + updateInfoText.Text = "Checking for updates..."; XDocument doc = null; @@ -308,6 +328,9 @@ namespace Launcher2 catch (Exception e) { + updateInfoText.Text = "Checking updates failed"; + updateInfoBox.Visible = true; + SetUpdateInfoBox("Error while checking for updates: " + e.Message); return false; } @@ -416,6 +439,12 @@ namespace Launcher2 latestVersionFiles = UpdaterUtil.GetFileList(doc); filesToDownload = UpdaterUtil.GetRequiredFiles(doc); + string updaterVersion = ToolBox.GetAttributeString(doc.Root, "updaterversion", "1.0"); + if (updaterVersion!=UpdaterUtil.Version || true) + { + ShowError("Warning", "The update may contain changes which can't be installed by the autoupdater. If you receive any error messages during the install, please download and install the update manually."); + } + string dir = Directory.GetCurrentDirectory(); filesToDownloadCount = filesToDownload.Count; @@ -503,7 +532,8 @@ namespace Launcher2 { GUIFrame dummyFrame = new GUIFrame(new Rectangle(0,0,graphicsWidth,graphicsHeight)); - new GUIMessageBox(header, message, new string[] { "OK" }, 400, 250, Alignment.TopLeft, dummyFrame); + GUIMessageBox errorBox = new GUIMessageBox(header, message, new string[] { "OK" }, 400, 250, Alignment.TopLeft, dummyFrame); + errorBox.Buttons[0].OnClicked = errorBox.Close; } private void Completed(object sender, AsyncCompletedEventArgs e) diff --git a/Subsurface/Content/Characters/TigerThresher/tigerthresher.xml b/Subsurface/Content/Characters/TigerThresher/tigerthresher.xml index 03f133667..ad1761c38 100644 --- a/Subsurface/Content/Characters/TigerThresher/tigerthresher.xml +++ b/Subsurface/Content/Characters/TigerThresher/tigerthresher.xml @@ -8,12 +8,12 @@ - + - + diff --git a/Subsurface/Content/Items/Diving/divinggear.xml b/Subsurface/Content/Items/Diving/divinggear.xml index 13408a945..016106d69 100644 --- a/Subsurface/Content/Items/Diving/divinggear.xml +++ b/Subsurface/Content/Items/Diving/divinggear.xml @@ -1,17 +1,19 @@  + name="Oxygen Tank" + Tags="smallitem" + pickdistance="150" + price="50"> - - + + + + - - @@ -61,7 +61,6 @@ - diff --git a/Subsurface/Content/Items/Tools/tools.xml b/Subsurface/Content/Items/Tools/tools.xml index 95cc3ae5b..cc3ef1d93 100644 --- a/Subsurface/Content/Items/Tools/tools.xml +++ b/Subsurface/Content/Items/Tools/tools.xml @@ -93,8 +93,10 @@ - + + + + 2000.0f); + AnimController.SimplePhysicsEnabled = (Character.controlled!=this && Vector2.Distance(cam.WorldViewCenter, Position)>5000.0f); if (isDead) return; diff --git a/Subsurface/Source/Characters/HumanoidAnimController.cs b/Subsurface/Source/Characters/HumanoidAnimController.cs index 0f19a120e..29af4ed48 100644 --- a/Subsurface/Source/Characters/HumanoidAnimController.cs +++ b/Subsurface/Source/Characters/HumanoidAnimController.cs @@ -34,6 +34,11 @@ namespace Subsurface Vector2 colliderPos = GetLimb(LimbType.Torso).SimPosition; + if (!MathUtils.IsValid(RefLimb.body.SimPosition)) + { + int a = 1; + } + //if (inWater) stairs = null; Vector2 rayStart = colliderPos; // at the bottom of the player sprite @@ -405,6 +410,11 @@ namespace Subsurface { movement = Vector2.Normalize(movement); } + + if (!MathUtils.IsValid(movement)) + { + int a = 1; + } RefLimb.pullJoint.Enabled = true; RefLimb.pullJoint.WorldAnchorB = @@ -412,6 +422,11 @@ namespace Subsurface RefLimb.body.SmoothRotate(0.0f); + if (!MathUtils.IsValid(RefLimb.body.SimPosition)) + { + int a = 1; + } + foreach (Limb l in Limbs) { if (l==RefLimb) continue; @@ -458,25 +473,30 @@ namespace Subsurface TargetDir = Direction.Right; } - if (TargetMovement == Vector2.Zero) return; - float targetSpeed = TargetMovement.Length(); if (targetSpeed > 0.0f) TargetMovement /= targetSpeed; - - //if trying to head to the opposite direction, apply torque - //to the torso to flip the ragdoll around - //if (Math.Sign(TargetMovement.X) != Dir && TargetMovement.X != 0.0f) - //{ - // float torque = torso.Mass * 10.0f; - // torque *= (rotation > 90 && rotation < 270) ? -Dir : Dir; - - // torso.body.ApplyTorque(torque); - //} - - if (targetSpeed > 0.1f && !aiming) + + if (targetSpeed > 0.1f) { - torso.body.SmoothRotate(MathUtils.VectorToAngle(TargetMovement)-MathHelper.PiOver2); + if (!aiming) + { + torso.body.SmoothRotate(MathUtils.VectorToAngle(TargetMovement)-MathHelper.PiOver2); + } } + else + { + if (aiming) + { + Vector2 mousePos = ConvertUnits.ToSimUnits(character.CursorPosition); + Vector2 diff = (mousePos - torso.SimPosition) * Dir; + + TargetMovement = new Vector2(0.0f, -0.1f); + + torso.body.SmoothRotate(MathUtils.VectorToAngle(diff)); + } + } + + if (TargetMovement == Vector2.Zero) return; movement = MathUtils.SmoothStep(movement, TargetMovement, 0.3f); @@ -503,9 +523,11 @@ namespace Subsurface movement.Y = movement.Y - (surfaceLimiter - 1.0f) * 0.01f; } + movement.Y -= 0.05f; + head.body.ApplyForce((new Vector2(movement.X, movement.Y / surfaceLimiter + 0.2f) - head.body.LinearVelocity * 0.2f) * - 20.0f * head.body.Mass); + 30.0f * head.body.Mass); torso.body.ApplyForce((new Vector2(movement.X, movement.Y / surfaceLimiter + 0.2f) - torso.body.LinearVelocity * 0.2f) * 10.0f * torso.body.Mass); @@ -513,30 +535,25 @@ namespace Subsurface walkPos += movement.Length() * 0.15f; footPos = (leftFoot.SimPosition + rightFoot.SimPosition) / 2.0f; - Vector2 transformedFootPos = new Vector2((float)Math.Sin(walkPos) * 0.3f, 0.0f); + var rightThigh = GetLimb(LimbType.RightThigh); + var leftThigh = GetLimb(LimbType.LeftThigh); + + rightThigh.body.SmoothRotate(torso.Rotation + (float)Math.Sin(walkPos) * 0.3f, 2.0f); + leftThigh.body.SmoothRotate(torso.Rotation - (float)Math.Sin(walkPos) * 0.3f, 2.0f); + + Vector2 transformedFootPos = new Vector2((float)Math.Sin(walkPos) * 0.5f, 0.0f); transformedFootPos = Vector2.Transform( transformedFootPos, Matrix.CreateRotationZ(torso.body.Rotation)); - MoveLimb(leftFoot, footPos + transformedFootPos, 2.5f); - MoveLimb(rightFoot, footPos - transformedFootPos, 2.5f); - - //float legCorrection = MathUtils.GetShortestAngle(leftLeg.Rotation, torso.body.Rotation); - - //leftLeg.body.ApplyTorque(legCorrection); - - //legCorrection = MathUtils.GetShortestAngle(rightLeg.Rotation, torso.body.Rotation); - - //rightLeg.body.ApplyTorque(legCorrection); - Vector2 feetExtendForce = new Vector2( - (float)-Math.Sin(torso.body.Rotation), - (float)Math.Cos(torso.body.Rotation)); - - leftFoot.body.ApplyForce(feetExtendForce); - rightFoot.body.ApplyForce(feetExtendForce); - - leftFoot.body.ApplyTorque(leftFoot.body.Mass * -Dir); - rightFoot.body.ApplyTorque(rightFoot.body.Mass * -Dir); + if (Math.Abs(MathUtils.GetShortestAngle(torso.Rotation, rightThigh.Rotation))<0.3f) + { + MoveLimb(rightFoot, footPos - transformedFootPos, 1.0f); + } + if (Math.Abs(MathUtils.GetShortestAngle(torso.Rotation, leftThigh.Rotation)) < 0.3f) + { + MoveLimb(leftFoot, footPos + transformedFootPos, 1.0f); + } handPos = (torso.SimPosition + head.SimPosition) / 2.0f; @@ -571,8 +588,8 @@ namespace Subsurface float handCyclePos = walkPos / 2.0f; float handPosX = (float)Math.Cos(handCyclePos * Dir) * 0.4f; - float handPosY = (float)Math.Sin(handCyclePos * Dir) * 0.7f; - handPosY = MathHelper.Clamp(handPosY, -0.6f, 0.6f); + float handPosY = (float)Math.Sin(handCyclePos * Dir) * 1.0f; + handPosY = MathHelper.Clamp(handPosY, -0.8f, 0.8f); Matrix rotationMatrix = Matrix.CreateRotationZ(torso.Rotation); @@ -582,7 +599,9 @@ namespace Subsurface rightHandPos.X = (Dir == 1.0f) ? Math.Max(0.2f, rightHandPos.X) : Math.Min(-0.2f, rightHandPos.X); rightHandPos = Vector2.Transform(rightHandPos, rotationMatrix); - MoveLimb(rightHand, handPos + rightHandPos, 3.5f); + //MoveLimb(rightHand, handPos + rightHandPos, 1.5f); + + HandIK(rightHand, handPos + rightHandPos, 0.5f); } if (!leftHand.Disabled) @@ -591,7 +610,8 @@ namespace Subsurface leftHandPos.X = (Dir == 1.0f) ? Math.Max(0.2f, leftHandPos.X) : Math.Min(-0.2f, leftHandPos.X); leftHandPos = Vector2.Transform(leftHandPos, rotationMatrix); - MoveLimb(leftHand, handPos + leftHandPos, 3.5f); + //MoveLimb(leftHand, handPos + leftHandPos,1.5f); + HandIK(leftHand, handPos + leftHandPos, 0.5f); } } diff --git a/Subsurface/Source/Characters/Limb.cs b/Subsurface/Source/Characters/Limb.cs index d76166327..f74c5b15d 100644 --- a/Subsurface/Source/Characters/Limb.cs +++ b/Subsurface/Source/Characters/Limb.cs @@ -364,11 +364,11 @@ namespace Subsurface { if (LinearVelocity.X>100.0f) { - DebugConsole.ThrowError("CHARACTER EXPLODED"); + //DebugConsole.ThrowError("CHARACTER EXPLODED"); foreach (Limb limb in character.AnimController.Limbs) { limb.body.ResetDynamics(); - limb.body.SetTransform(body.SimPosition, 0.0f); + limb.body.SetTransform(character.AnimController.RefLimb.SimPosition, 0.0f); } } @@ -390,15 +390,15 @@ namespace Subsurface Vector2 dragForce = Vector2.Zero; if (dragDot > 0) { - float vel = LinearVelocity.Length(); + float vel = LinearVelocity.Length()*2.0f; float drag = dragDot * vel * vel * ConvertUnits.ToSimUnits(sprite.size.Y); dragForce = drag * -velDir; - if (dragForce.Length() > 100.0f) { } + //if (dragForce.Length() > 100.0f) { } } body.ApplyForce(dragForce + buoyancy); - body.ApplyTorque(body.AngularVelocity * body.Mass * -0.05f); + body.ApplyTorque(body.AngularVelocity * body.Mass * -0.08f); } if (character.IsDead) return; diff --git a/Subsurface/Source/Characters/Ragdoll.cs b/Subsurface/Source/Characters/Ragdoll.cs index 849d84a57..fcb068497 100644 --- a/Subsurface/Source/Characters/Ragdoll.cs +++ b/Subsurface/Source/Characters/Ragdoll.cs @@ -655,12 +655,12 @@ namespace Subsurface { if (inWater) { - //foreach (Limb limb in Limbs) - //{ - // if (limb.body.TargetPosition == Vector2.Zero) continue; + foreach (Limb limb in Limbs) + { + //if (limb.body.TargetPosition == Vector2.Zero) continue; - // limb.body.SetTransform(limb.SimPosition + newMovement * 0.1f, limb.Rotation); - //} + limb.body.SetTransform(limb.SimPosition + newMovement * 0.1f, limb.Rotation); + } correctionMovement = Vector2.Normalize(newMovement) * Math.Min(0.1f + dist, 3.0f); } diff --git a/Subsurface/Source/GUI/TitleScreen.cs b/Subsurface/Source/GUI/TitleScreen.cs index 5908a09aa..1086fc4b3 100644 --- a/Subsurface/Source/GUI/TitleScreen.cs +++ b/Subsurface/Source/GUI/TitleScreen.cs @@ -152,6 +152,8 @@ namespace Subsurface } loadState = 100.0f; + + yield return CoroutineStatus.Success; } } } diff --git a/Subsurface/Source/GameMain.cs b/Subsurface/Source/GameMain.cs index 351812ead..3d27c205e 100644 --- a/Subsurface/Source/GameMain.cs +++ b/Subsurface/Source/GameMain.cs @@ -314,11 +314,11 @@ namespace Subsurface Screen.Selected.Draw(deltaTime, GraphicsDevice, spriteBatch); } - double elapsed = sw.Elapsed.TotalSeconds; - if (elapsed < Physics.step) - { - System.Threading.Thread.Sleep((int)((Physics.step - elapsed) * 1000.0)); - } + //double elapsed = sw.Elapsed.TotalSeconds; + //if (elapsed < Physics.step) + //{ + // System.Threading.Thread.Sleep((int)((Physics.step - elapsed) * 1000.0)); + //} sw.Restart(); } diff --git a/Subsurface/Source/Items/Components/ItemComponent.cs b/Subsurface/Source/Items/Components/ItemComponent.cs index b9c2e38d1..e1e21f037 100644 --- a/Subsurface/Source/Items/Components/ItemComponent.cs +++ b/Subsurface/Source/Items/Components/ItemComponent.cs @@ -38,7 +38,8 @@ namespace Subsurface.Items.Components /// /// The base class for components holding the different functionalities of the item /// - class ItemComponent : IPropertyObject + class + ItemComponent : IPropertyObject { protected Item item; @@ -86,8 +87,7 @@ namespace Subsurface.Items.Components { if (!value && isActive) { - StopSounds(ActionType.OnActive); - StopSounds(ActionType.OnUse); + StopSounds(ActionType.OnActive); } isActive = value; @@ -181,7 +181,10 @@ namespace Subsurface.Items.Components // initableProperty.TrySetValue(value); //} - + if (item.Name=="Welding Tool") + { + int a = 1; + } properties = ObjectProperty.InitProperties(this, element); diff --git a/Subsurface/Source/Items/Components/Projectile.cs b/Subsurface/Source/Items/Components/Projectile.cs index efae83239..956665a6c 100644 --- a/Subsurface/Source/Items/Components/Projectile.cs +++ b/Subsurface/Source/Items/Components/Projectile.cs @@ -81,8 +81,6 @@ namespace Subsurface.Items.Components //ApplyStatusEffects(ActionType.OnUse, 1.0f, character); - Debug.WriteLine(item.body.Rotation); - Launch(new Vector2( (float)Math.Cos(item.body.Rotation), (float)Math.Sin(item.body.Rotation)) * launchImpulse * item.body.Mass); diff --git a/Subsurface/Source/Items/Inventory.cs b/Subsurface/Source/Items/Inventory.cs index 708b5a40b..7a3c6a468 100644 --- a/Subsurface/Source/Items/Inventory.cs +++ b/Subsurface/Source/Items/Inventory.cs @@ -306,20 +306,6 @@ namespace Subsurface TryPutItem(item, i, false); } - - - //System.Diagnostics.Debug.WriteLine("Inventory update: "+itemId+" - "+slotIndex); - - //if (slotIndex==-1) - //{ - // if (item.inventory == this) item.Drop(); - //} - //else - //{ - // TryPutItem(item, slotIndex, false); - //} - - } } } diff --git a/Subsurface/Source/Items/Item.cs b/Subsurface/Source/Items/Item.cs index 79966335d..1dd6b05a1 100644 --- a/Subsurface/Source/Items/Item.cs +++ b/Subsurface/Source/Items/Item.cs @@ -474,6 +474,8 @@ namespace Subsurface { if (ic.Parent != null) ic.IsActive = ic.Parent.IsActive; + if (ic.WasUsed) ic.StopSounds(ActionType.OnUse); + if (!ic.IsActive) continue; if (condition > 0.0f) @@ -745,7 +747,7 @@ namespace Subsurface foreach (Item item in itemList) { if (ignoredItems!=null && ignoredItems.Contains(item)) continue; - if (hull != item.CurrentHull) continue; + if (hull != item.CurrentHull && (hull==null || (item.Rect.Height(); diff --git a/Subsurface/Source/Map/Levels/Level.cs b/Subsurface/Source/Map/Levels/Level.cs index 2ccacad2f..243502db5 100644 --- a/Subsurface/Source/Map/Levels/Level.cs +++ b/Subsurface/Source/Map/Levels/Level.cs @@ -218,7 +218,7 @@ namespace Subsurface cell.edges.Add(ge); } } - + Debug.WriteLine("find cells: " + sw2.ElapsedMilliseconds + " ms"); sw2.Restart(); @@ -590,7 +590,7 @@ int currentTargetIndex = 1; tempVertices.Clear(); foreach (GraphEdge ge in cell.edges) { - if (ge.point1 == ge.point2) continue; + if (Math.Abs(Vector2.Distance(ge.point1, ge.point2))<0.1f) continue; if (!tempVertices.Contains(ge.point1)) tempVertices.Add(ge.point1); if (!tempVertices.Contains(ge.point2)) tempVertices.Add(ge.point2); @@ -686,7 +686,6 @@ int currentTargetIndex = 1; int i = 0; foreach (Body body in bodies) { - System.Diagnostics.Debug.WriteLine(i); i++; body.SetTransform(body.Position + simAmount, body.Rotation); } @@ -823,25 +822,28 @@ int currentTargetIndex = 1; pos.X += Position.X; pos.Y = -pos.Y - Position.Y; - int shaftWidth = 10000; + if (GameMain.GameScreen.Cam.WorldView.Y < -pos.Y-512) return; + + float x = GameMain.GameScreen.Cam.WorldView.X-512.0f; + int width = (int)(Math.Ceiling(GameMain.GameScreen.Cam.WorldView.Width/512.0f + 2.0f)*512.0f); spriteBatch.Draw(shaftTexture, - new Rectangle((int)(pos.X - shaftWidth / 2), (int)pos.Y, shaftWidth, 512), - new Rectangle(0, 0, shaftWidth, 256), + new Rectangle((int)(MathUtils.Round(x, 512.0f)), (int)pos.Y, width, 512), + new Rectangle(0, 0, width, 256), Color.White, 0.0f, Vector2.Zero, SpriteEffects.None, 0.0f); - pos = startPosition; - pos.X += Position.X; - pos.Y = -pos.Y - Position.Y; + //pos = startPosition; + //pos.X += Position.X; + //pos.Y = -pos.Y - Position.Y; - spriteBatch.Draw(shaftTexture, - new Rectangle((int)(pos.X - shaftWidth/2), (int)pos.Y, shaftWidth, 512), - new Rectangle(0, 0, shaftWidth, 256), - Color.White, 0.0f, - Vector2.Zero, - SpriteEffects.None, 0.0f); + //spriteBatch.Draw(shaftTexture, + // new Rectangle((int)(pos.X - shaftWidth/2), (int)pos.Y, shaftWidth, 512), + // new Rectangle(0, 0, shaftWidth, 256), + // Color.White, 0.0f, + // Vector2.Zero, + // SpriteEffects.None, 0.0f); //List edges = GetCellEdges(observerPosition, 1, false); diff --git a/Subsurface/Source/Map/MapEntity.cs b/Subsurface/Source/Map/MapEntity.cs index c7ec8e9e4..78d29e55d 100644 --- a/Subsurface/Source/Map/MapEntity.cs +++ b/Subsurface/Source/Map/MapEntity.cs @@ -332,7 +332,6 @@ namespace Subsurface } selectionPos = Vector2.Zero; - Debug.WriteLine("zero"); selectionSize = Vector2.Zero; } } @@ -350,7 +349,6 @@ namespace Subsurface } selectionPos = position; - Debug.WriteLine("pos"); } diff --git a/Subsurface/Source/Map/Structure.cs b/Subsurface/Source/Map/Structure.cs index 886fea72d..808dd31f3 100644 --- a/Subsurface/Source/Map/Structure.cs +++ b/Subsurface/Source/Map/Structure.cs @@ -599,8 +599,6 @@ namespace Subsurface string name = element.Attribute("name").Value; - Debug.WriteLine(name+" - "+rect); - Structure s = null; foreach (MapEntityPrefab ep in MapEntityPrefab.list) diff --git a/Subsurface/Source/Map/StructurePrefab.cs b/Subsurface/Source/Map/StructurePrefab.cs index 055e1d4a7..978801100 100644 --- a/Subsurface/Source/Map/StructurePrefab.cs +++ b/Subsurface/Source/Map/StructurePrefab.cs @@ -60,9 +60,7 @@ namespace Subsurface foreach (XElement el in doc.Root.Elements()) { StructurePrefab sp = Load(el); - - Debug.WriteLine(sp.name); - + list.Add(sp); } } diff --git a/Subsurface/Source/Screens/EditMapScreen.cs b/Subsurface/Source/Screens/EditMapScreen.cs index 3ddf107f6..a67c2e7c2 100644 --- a/Subsurface/Source/Screens/EditMapScreen.cs +++ b/Subsurface/Source/Screens/EditMapScreen.cs @@ -250,7 +250,7 @@ namespace Subsurface /// Provides a snapshot of timing values. public override void Draw(double deltaTime, GraphicsDevice graphics, SpriteBatch spriteBatch) { - //cam.UpdateTransform(); + cam.UpdateTransform(); spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend, diff --git a/Subsurface/Source/Screens/GameScreen.cs b/Subsurface/Source/Screens/GameScreen.cs index 1451423ec..af6d5b60d 100644 --- a/Subsurface/Source/Screens/GameScreen.cs +++ b/Subsurface/Source/Screens/GameScreen.cs @@ -83,6 +83,7 @@ namespace Subsurface StatusEffect.UpdateAll((float)deltaTime); Physics.accumulator = Math.Min(Physics.accumulator, Physics.step * 4); + //Physics.accumulator = Physics.step; while (Physics.accumulator >= Physics.step) { cam.MoveCamera((float)Physics.step); @@ -119,6 +120,8 @@ namespace Subsurface { //if (!Physics.updated) return; + cam.UpdateTransform(); + DrawMap(graphics, spriteBatch); spriteBatch.Begin(); @@ -282,12 +285,12 @@ namespace Subsurface Submarine.DrawFront(spriteBatch); foreach (Character c in Character.CharacterList) c.DrawFront(spriteBatch); - - //if (GameMain.GameSession != null && GameMain.GameSession.Level != null) - //{ - // GameMain.GameSession.Level.Draw(spriteBatch); - // //Game1.GameSession.Level.SetObserverPosition(cam.WorldViewCenter); - //} + + if (GameMain.GameSession != null && GameMain.GameSession.Level != null) + { + GameMain.GameSession.Level.Draw(spriteBatch); + //Game1.GameSession.Level.SetObserverPosition(cam.WorldViewCenter); + } spriteBatch.End(); diff --git a/Subsurface/Source/Screens/LobbyScreen.cs b/Subsurface/Source/Screens/LobbyScreen.cs index c06a2ecf3..0ca926800 100644 --- a/Subsurface/Source/Screens/LobbyScreen.cs +++ b/Subsurface/Source/Screens/LobbyScreen.cs @@ -446,14 +446,15 @@ namespace Subsurface private bool StartShift(GUIButton button, object selection) { - GameMain.ShowLoading(ShiftLoading()); + //GameMain.ShowLoading(ShiftLoading()); + GameMain.GameSession.StartShift(TimeSpan.Zero, selectedLevel, false); + GameMain.GameScreen.Select(); return true; } private IEnumerable ShiftLoading() - { - + { GameMain.GameSession.StartShift(TimeSpan.Zero, selectedLevel, false); GameMain.GameScreen.Select(); diff --git a/Subsurface/Source/Screens/MainMenuScreen.cs b/Subsurface/Source/Screens/MainMenuScreen.cs index 1d9e4e416..eb718cf44 100644 --- a/Subsurface/Source/Screens/MainMenuScreen.cs +++ b/Subsurface/Source/Screens/MainMenuScreen.cs @@ -158,6 +158,8 @@ namespace Subsurface { base.Select(); + Submarine.Unload(); + SelectTab(null, 0); //selectedTab = 0; } diff --git a/Subsurface/Source/Screens/NetLobbyScreen.cs b/Subsurface/Source/Screens/NetLobbyScreen.cs index 7ca5533ee..e115819cb 100644 --- a/Subsurface/Source/Screens/NetLobbyScreen.cs +++ b/Subsurface/Source/Screens/NetLobbyScreen.cs @@ -546,11 +546,8 @@ namespace Subsurface { Gender gender = (Gender)obj; GameMain.NetworkMember.CharacterInfo.Gender = gender; - GameMain.Client.SendCharacterData(); + if (GameMain.Client != null) GameMain.Client.SendCharacterData(); - //CreatePreviewCharacter(); - - UpdatePreviewPlayer(GameMain.NetworkMember.CharacterInfo); return true; } diff --git a/Subsurface/Source/Sounds/AmbientSoundManager.cs b/Subsurface/Source/Sounds/AmbientSoundManager.cs index b2890ef65..0c2002499 100644 --- a/Subsurface/Source/Sounds/AmbientSoundManager.cs +++ b/Subsurface/Source/Sounds/AmbientSoundManager.cs @@ -273,7 +273,7 @@ namespace Subsurface { if (i == selectedSound) { - Debug.WriteLine(s.sound.Play(1.0f, 2000.0f, position)); + s.sound.Play(1.0f, 2000.0f, position); Debug.WriteLine("playing: " + s.sound); return; } diff --git a/Subsurface/Source/Sounds/Sound.cs b/Subsurface/Source/Sounds/Sound.cs index df1190f66..6ec1da84e 100644 --- a/Subsurface/Source/Sounds/Sound.cs +++ b/Subsurface/Source/Sounds/Sound.cs @@ -234,11 +234,11 @@ namespace Subsurface loadedSounds.Remove(this); - System.Diagnostics.Debug.WriteLine("Removing sound " + filePath + " (buffer id" + AlBufferId + ")"); - if (alSourceId>0 && SoundManager.IsPlaying(alSourceId)) { + ALHelper.Check(); SoundManager.Stop(alSourceId); + ALHelper.Check(); } foreach (Sound s in loadedSounds) @@ -246,6 +246,8 @@ namespace Subsurface if (s.oggSound == oggSound) return; } + System.Diagnostics.Debug.WriteLine("Removing sound " + filePath + " (buffer id" + AlBufferId + ")"); + SoundManager.ClearAlSource(AlBufferId); oggSound.Dispose(); } diff --git a/Subsurface/Source/Sounds/SoundManager.cs b/Subsurface/Source/Sounds/SoundManager.cs index 7df7098ee..10f818a4f 100644 --- a/Subsurface/Source/Sounds/SoundManager.cs +++ b/Subsurface/Source/Sounds/SoundManager.cs @@ -218,7 +218,6 @@ namespace Subsurface.Sounds if (AL.GetSourceState(alSources[sourceIndex]) != ALSourceState.Paused) return; - Debug.WriteLine("sourceplay"); AL.SourcePlay(alSources[sourceIndex]); ALHelper.Check(); } diff --git a/Subsurface/Source/Utils/UpdaterUtil.cs b/Subsurface/Source/Utils/UpdaterUtil.cs index 83e55b512..0c6fabbcc 100644 --- a/Subsurface/Source/Utils/UpdaterUtil.cs +++ b/Subsurface/Source/Utils/UpdaterUtil.cs @@ -10,6 +10,8 @@ namespace Subsurface { public static class UpdaterUtil { + public const string Version = "1.0"; + public static void SaveFileList(string filePath) { XDocument doc = new XDocument(CreateFileList()); diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index b6b8ebe6f758eeebf6ce637de7a6f87b5d6bfa67..0babd018459408f7fd0e6a1aa2780dab536c17cd 100644 GIT binary patch delta 16923 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 k*eoh($ delta 20386 zcmdUX30zfW{`Y;(a?b+d1rZSyuZV~n0s^9$vbm$;l9iDOid%|=XzpIManI0e{K^_d zvx{0eZgI?U3Q5b%6wS<0GIZ3ObPP>f9MkvvoC8S9G&TSKJMZVc_T^d5bDrh5J-=r; zxem8+ZHvf{>}{+5Ic&C2!Dg$E^xb>+?(u8}1mKU1upHQpcr?m%03v`$APo2%`2r2h zlH4ovZ>|z1_-tD&H|X|58H>eB32WRlgc)q)&Rc>PV;{PiRL}bdG_W5pA-LyuN=_Ew zPL!Ja@^&A>D=z@EfEf1_sc)TLDA*sVSAebVkECRw8*}@~aoRRK2t(#Z_dvM;+wLAG zx3PyIuMKmrk;9^XK(s5+1aP6)6F>#KGku(`q+jm(Dpl?D zA&T<8*Z%QN^Sn4zaURcu5%RI+AT)q}fH}N|KN}uM*Bnp1-Ls|S|8$rS{_bI-Z@mAR z2=}>vs5?gD{c?|Wq)VN3o6UXD;Zz?$qzg|}I%ZMiLy|uwJS0g?GLgj#b5#GvAa5+s zUpeoIg6{|naBK$Lu3k(A;0XKntc=jy9KOxLQI0a~g_~SrB zU^mjEZML2^UnE`zzC^|h;ANmC5QMx8U@$NqC<8hH&jKZQ-WVaLLSw|=V-)?GAz|%k~3cP@D05A(EK>9Mmj=*Wehamh4 zaNqIjso7c~rwu^+l7;&23h#RC3HKE5xoo)mmiJMifsF=i7F)O@1G?)8LCErDX*`% zd`B0jM1?*~a)wYERTSSsqXKojXNv`&yvnJrNS9ZGD2sta<*fX zQ*swRAW>*@=2Txr#an7uZsd7{<%|`&6H^yZ-9X8Q@{481&JE+|G<6roNIOGgP{nd* zP?1w*g4@|2Ih*b>cgT?qDi@#Cwd-=hs)TKE^3dzq=8RPq)}pyMAZ2|E)m zS15*a4y$0R#E_jKH_pnQu7W_W17fIq<36X_4bAuYaThX&NQpnnxtW=!K8TzlwR0)& zfcW|=&O6@j!j_VIV`r!OJs$t?<08S#WTkO4n6+hwGZft@IL|_jP;Yj}cc;^*f)zU% zXQz+&3fLKgw;!logV#fLn{64S13x-!kpS+$04U8^hQv(e11RE&QY0d6fe+ z+eW-wRQvs%H!CBU5z?031=->`n>T{Zs|rJmkVtm7so{(eHZf^t?N{VKqOE1_=|8mD z8G5Ijd4@2D+ZBu#cCfRIqP|z6Xz_Fm;i1v&!@BOmv8Zzp>ZBdI8c#W2$v#GpY3wux z+nR9+<%}O!yMD@R!-hziwX?iisy5r}<{&Z5>oH1uqx~#)j1_d2a)cn=$n7kxVD6HS zyO8sO;%D@Cu^loSL9CV7=Xr+~U}W?W)-gZs-fe}<)9g{K>D);uQ4ahK_yAA)AZ!NA2EIjlKX44Fi}X$48shH( zk0QPZVG|6@4(vkuF<=$)CL%n7a45npKq2BMffR5DU0#IXrcHUg-&5Bnrr;p)W$RJwuDFBVjG8kRgT83pSS6 zB4M}zh2Q7pcKV>9Z$qViwO@DVC79~8^JW6qrd_N;^sEqsxfjt@7f>ICPoT?rKqAtE z06*k?k8l*Q1NoN_{sG}BgnNNt;2ESRBkTZt2do3KfTI8>=bH#WLYa3E?gd$QB76yu zfJ599`5PXt1TG-s2=E->0S*Aq13u`40+b*gh;kbc)bhe$3#&`XRCyH~~}uG8!0!0`m~BgSaWDh?nv_U=`wD0LuV3@DZ>BID}_+5&j+F z9fY$Hjz-u5C<2xuy#OJk!1gV|4-vk?LeVoMZUFs(hG_6M9^6KJ62hkt#xVC?3Nu3Y zvU0CgiLgh};#td*9b#v-;@v_Pb99Jll(4B~6C~IzyL%Ahr0AAPx{)3tZ1noyv2$&?o#V3oTkISi z9L1cGzr~vI8mp}t1!l3v|FJ3KHF25y-!^6K1+c7(AgmVh><@#9Z>!JG5c;U?5RCNAa5slqdCl?NU|FR`2zrwL3j*f8lH zvt(h2a8{=1Wm)|WA9Qr_4sI#;0w5IdoVnbv8Sa8`7?W}`dH(H-9W1~!Buw=q9s%pT!IxnLxB z0~5ex%81gM8_i3F&lK7|MeRo2bSa4v!>xRv^7ew@lRcnK>}{P4hx{v3}VBD z{>A{Ou$>i`2~ImXpAlaXZQlwtYgXgtGom;1oZ{xGgIb^JuM#I%L~!+1!X1}-e4pH~ z|Du=s9sl%1r*+b1N*vAVlfx~pbUbrq=Cx6W{?Mmlxw1HZeVr$0yIUM!j;b7^BG+jl z)E(N_sm_47Os_36ly_P%XK1=v9mzW*43VbQF68Y3|JGMYgXg>uK-*WTQ53aHY)sES z%2XOqAb8PoKi$iCa+ml#^V}BfbGd%?gvsJ2fzN%fBYqIzQ@R(@4B*e42>*zDMDH00 z)2iY;U5WS=l;`pD2;D#c(6B1+Sgo?WOw+1-L}{*5@@1j4(kXo|>1c!Unn}w&f@m+k zr0rwg-YAM(^XG2bx`W$w1>DueauG~VY@qk2%AK;E9=glgTFJCQnxAp*E^Eq6x;kLv z3j&1~9OVZpi!wGfVntKSW6H8RE;XkQV{f34!q{S(_crThBvgncSkN`onioVsPdWyO zA0XLTZAa}ciMJg~Tz;2lw7OLB@W#50d(DgRviO?%g}4g~AR{CQEfrr7xmgJoxmn>N zbrK@wcI`ndL_8~ch6w_jM)Q0GG!~A=3i^wQH195!RNKCk11Nu=?B{k&w>v_HHxk?K zICW&s24&@fm7ND$o&C7KIFK2kZ87-Y?3r@U! zJu}|mrx4vz&}bg;TRpQ)DEsd{v#@{fnRQ3wG;oaC!RT;OtHUVuiWXC6WNubg_T=<_ z8RN41t)_VnVE~nVszqAzriyprzsHFeWs+}b8y$w;Dp^b%)FkrRCAV&!tMd;_W{=#^ zqRHi>Cs4xIT1kPOi*Hx%3?09#rqpHIHuiUCxAGqJ%$KkC@%N^44W;_V*#5!`mPRF^ zAfGaf&=DK*kpPIB*4$O*IjHTkaMgMs&+x4-n9!--dN#;l=|bW zal&$PEn=ZNLvLf2J|Yfajzw?eD6>;bzOs*B{>0LAIsVod@{WqjY3ZZPi@Yvtag-Fm z+Eb3AhmiC~F@lXE_OX~m6}ft2YWjEWoF`4x$rqdN4p+CEuXPyo;NOlGcON_9QT^}q z)MnPyo%W!&k+)Uo#2iIs`Ol5Xcw@nU4r^X|VR}+e+MX=5zz(LLT8?q?g{b?^x-cUo z-6TV32!;5I8`Mo0#p|_4V%+q{96>^7tqZv_v`AyZ2yu1Ype*b#N7zQ%Cfojeed@^R zWfyy0EZkleJ9E{0mWoH*7LT(Z*<>z+)i#;Ot8Frm|95S2o~ReB1yPgku?fc3wc;Rd z;~)kuZj9HMCX^Ba#f-YrfZ3yCz-NN$ro*u_Z!%<3OPJ0Au4RafvvTaz2p# z>A6pY7Dj%In8Q5&l2EWwOi_bHESx~%8eyWmjqv>+r&}Avx%O6AlC4Of8Lx_cOjpQR zyQEh--+x1nnb}{-Fh(qgd{WdZ`A%q&8BxwS3Jhk_5=*3$d4lWoyA$I(+ox3f^ z?yxMy8&bY_hj})L0vlRoqqp!0Vf!exq0z8FR0PA>SPW%C%>C_a%4;G%Yp^vi_{Cx3 z6h>cM$7I{Cxlo7JwiGi9()c#!cNL5l&K2q!bqmGY%-!cfof76@I{r(t(9no+35Qw1 zLNSk}(v*ebT-KLv@gSC_ED{%p5{Q8{y}wb{BVHG&FeEMVAR*EIs{1kM@Q8+L>}}#9S5+GxAMVT2ZUx+NZSq zvKB)lj%wa4n-VXvZsckPdfy`!#;2%a44=)isvpr)386dXYLMfHq(8+a|Gkg&$o^~R z4}EcItf`O2h6%!O2*eK%h&}MVtX-sDwDuD<(8x#?*D>9H;-%{@+@Vfvj%h` zNBpD1t9<0A+y2zIsej8}OX_^Md>74oN}NjxIU<$@Wnzg|uvAQ@cbV`Yxe(J>O9)(? zDRfmw9dvW4m`3}V0L@<}=E*A|m4n>V_p~xX%HaeQ-_~5L;EbLCW!NW+PZ-YgA~r8u zi;p?peS2bjp9|yuG<@LLTi+)1{KT{gLe6mRB6KrKT8jy+xI!yo{#ogRCr!y6nU$V4 zA!B-0Ztv`zDS6cG2d$xR4=(@aFR+B~GW0U;CX3CO0(3FV)4e(jQ3 zHGTfHs8ZkV;+rhb+#{mGG0fX|@=K8z4Y?}!FnaCa?9$nOH38NwskViqo4U0JOL<;w zxu+5y+f{f!^h!L0>zbDqZVdWP+{y~#r9AsA^rW9gGvcM*A`7XdJ~!hf)2(GEX-X$) zuFQ|lhPuD6z+x{&N@H?Aq$7BmHg=cNX?{Dc7oAOHAynCt>890o-4$ITWgZp%$^WL< z)^T}2N56h|o_y}%UPT`ocJJ#; zK<8Vs;FbBuJI$$*LOa3|NZ6MMOSz;0`+)<%d%y=(ogN3OSS%K?p!j8H z&b&1@W?tHZf4R6de$v94cTy?wy4aNs`aRmzbFvYdZ@KiRy z+H$Vlck4rLTZ7cHJp_zvHpIQ=H=+EC_hIJ!cmq=`&#H-g!zIYjFRrM zg7;X6dt+c@qiYwblzH|*ys^tu@HAg#CviF-l)|NDoX>3!N;&4{n^AaB8o`Q(Nqfcn zr$)tnBuSv%U09&e_=0qSdHO@byNH2IdY?~njUNaMPyt8z5p%*Ujlqe zxPtI1@Ksfs=iR6k{~Ga|0O!&-2)_ls1HK3T3Gnh$LG&LGzY8$LdER7Ox-AK3`+4{` z$(C*4Ec&{aXE?fh{tY?62$(8;$vl}z3X7x^BW0Sjmw84@L)@;1K!cZYMq`w&kh*F{ z*8@^1rkg@3%m|wyoo1dxQjljB2zE(oOr@_%U5qYsr2ULSZb|)({*t_dxl1ql8ELOc z+kA>U+q*JPfGl|OB_B_i>|a!xD@k;GzC6R2(N$i^ib|&LdGn%3mxuHrA%enRwZSmp42q_n^pU0(rLyuQ7w(e-utP*3B~Qt7r#&zx1_ z__Q8m47x3E)rv~nN>}slY(-BR2iY(98l?qN zS4NyvlzCf@qsU!Kv@tfq{sQx)*zKMpxF>Sn%N}FI^syh7X~!p$ADw+)avCpuBpnew zL+pa*G6p)#?(keim~9uRY?v$=Ql)f9q0$9*5P6z?zf8viLwS33ka6#SWHvhkm?!7Yh%f)Gr z{^Qg)n38%X4Nh)D+Y|MURMCU^HLyJT9QgK=Y~yY1*3Brm_k9_QykCO0M#+KdqQL3q z1L|5Jm#`+Z?**wIt(ho!Q^LzKwxdSN$Hit)g{S_YC)Vwml-ir$N*Rngr`U3d9arWV zu9xjD=H76*GnE{b8!NmF_EIP#)82^c2x5qtgS|r<*b}FTWkZ$LW)AjZ$hV!=#!NV? zACG9P_?S5{$Vn_xlIiYCS|~+&BuNZHR!{&zIt#9OoOnTQLUrRsD<=eH&h=JWn)5S34(LrYit2*Vsf@f{;%wxs2oCb-cjr|m0;-I%><_v5-o^N@n%ldu##&M=wf?{$QAspF*d;)PqkK>(9syt zqAt#?OnURltmZAVQobi-?ueS%HALlmmo+&iw<}j;Nl`AU4l}zID&%CO{4mX*Mno%i zi-dl>v)O1ma+BQ}i^=L;N+WuEuWT`vv$2`1S#0Fua%{5FlpKFX9jgYbA+#-9@xivP zy$l-$T@;J;ych`G&1@W#4mI1w$Co8qH0F(9#0{u2wMw3 zEOPKRqXudn%*R~!z^Ozt(HeZui~gmPWNlhAD{^1GOMaW$GjA!_9K5 z+Ap-BgjZDuHN6P$luI{_IEOzWyObarzD&K(X|4lq*9h1Et^%BQX5}mDYxm1UeWO|e zh0{e#zY90n{b=nBEtszEgyatDsYH^QSD2_;T&byP_`WJ#=e=x}s#(1ZMFP6e(`wda zA=mlH6WH93*kL~|(v3P*+Q7BySW%T$`6AJ1guR(*q>!jKQf}un4b9xK>aQnw)z|^J6V8s%BK19Sd$50& zUct84j5@%5WU8flI2W_}-mR$0GH_ZzC|l6B=c<^>DQH?SXFb&ta%?5m=%__OZYMCb z-qxrd5dvZ;KnDeoka|}PRGT*pQlTG%BnmVfO zyG3v={Z;dWMA(J$qd(4vT{Y(iE@;h$s4d+kf7i{|IjQzN2IBDzCo_k0$D9yyS}MVm zzMOaX0w&*zQC0So)6!%p-|H}6;U?4UXUQem+sttw2P)fu5}b-!UFP|Q_U4q(QIjT|LKznFHq} zKK828zV3ut7NW|^b)ZcRRf`%mbmzyI=8H9A-qkKx?cvPY8cEJWRbG@itEFlU`OPTv zC37<7(iQoI5^Cmfc{8V|6}_wGMNW83VXY_v^SD`t=a^;61}m0GbAlkpnxjmu;M6HQ zpj(e?)D*6OMIAmO_*t>Eb#9d@<5CO7?Q6EctAM?2LpkrNmca6f&lDPSddQhwH2^+6 zSlPNgfUxajX$@CgXicnH85d?qZ9CeQuQ)6hDKpa^M1?a|)x0%kmNIE`TW)VAxWYjE znwyClPByusS(N2A7LytLt)7b2y(+zJO8Hl+#>2-9yVBhvHgtls97^7 zq-lH56(=Q3mn1L9Y|UJ>erpS}Sk2g-IZC*h!|7v+Tji0eDT7x9U)8eAeCDsQFmvi@ zftGRMT>_Vy(UAkP#cl4YqMjD!1q8EZt}~|MITvY`y7I~}mv^W99#u0i_6s@DlWByg zTJ+{Ughd@pt`*!(`y95Bb9iN2t*2Ql_dbqgX#>mzr?lAwKj<`bYPbjw(2|d;`K}qg z-c_}7_yFONJ)os@Pwma8&0f@Ok=(pz3g*+1SYJ%UoSKc*FP~!vm@{m)ZHTQeQc=*P zD06*04ka?M#u39^Suo`nO8MW2+uZPsj;xVmXvK&2`)>u(@S!p|kSlMoUaN3RZP}x=@?p6tRb*f(nm0@i z5PRBEi6%wsyFL5`~;t#9|Oe+BzbZVavqxNb~7P zTRhTn_?KzE7mu)`dCQ6~_)>efpo|1PmR4_J4!W5yg|OZ{qXVTqZjV#aQ5f{0$J@%y zYx-dC6NR>UeWTH43~FtM6z@%x*^5Y!ek5Y?$cZ-dI-pFftrHNBC!NeES!OS2&QN(P zCz4u^Q{UoN1~@hj9L%QA-BLTg4dA4bY`c^8luI#GSt(%lSz*z`-a7{MWnzR;s5uUC z-j^thJ;v+{rw#85r_d<0+YV)8@oY45I^i#WgZDk&HkML?v%K21PjhGmvOd$UqauVeTnh(Ky@H6&zRMzN}l&1I> zWU6__;uXp?TqJr|^{2|QY7CW}zy{8iBxP59Y-_R!l=ik7W~}lk+1Nl26@rafk0|FA z&o)J(m`idHRbIvVWX%W#J89>y$O~y}KQ)M+@zTbU>pX5zU||tJ&VH&y@rH7cl6L8- z^w=$}vGHD}(%FmhSE`-)`9uh<*scT^xh`cz9jf%Qw>DbmD>2w%`xG~!{Z1;^aAM_+ zi6yOpJ>Do@t!%<()cZ;=bDzZ+e^x1AG^jxJGji4_`ChbTh~3BV*`%b|$?q!ev-F>Y zbFVHpl>JSp^nyHuDlTF}?C@442HWcwpfuR^iXgu$N<1AYQvHooKXsR84Bw?}U{v;w z>`l($_Hc^Xt+e(8t6>zfodwg@Kx~w4-K}i%@}yzFxp{h^F?GMP)R)R4>`udZN~w^^ zl>{H|@L=4jmti6L{tydoYW%DxLKx$=}AR54izHwrH)DFXSm)ck1w zZFMni4b##J!n82Mu}rNDB)<@)i{bpcf-N^3*N{UNUBaO($Ds~wvcY>nhy)%4K$-ce(t ze{Xe%y`FkA{y|L%H)BWTc%`x1rD_Sh^9-)c~XQY4s$d zNvAQq6=B#fyBT30OO;)~yTbG82#rc2)Wyc)Ybvy@VwT-bu6C+q=r`4GWZGt^{BsAT zEmg*e${DgdO~|7kgJfld46a*lGOD>4HJDmJLVy{B}V*A?RCX-0`({DKp*)Qj*-1U zn<{(CHHlU=S0hd5--ua)FETynHOaWJRBJ66K1;Nd%t*+`sV6%{`(DxVXzwa*4f8cz z8@1157V3Vg2gdO=KAEZ5qGi&w9a@1P92D@6D*l;yv4?it|S2{bTXZ0{-7>>G87lD28_ zRPu?IXiVR$EfPJdE_q5cyT?zr7aZ3p}*u3qgupO>|emX>F!s+NPd96`TI@>99+_ec!n;wQ=>07hl?UTANE5_4Veo zQ`h4hKDADpBSub+pl1G31DI>vs7y433hi;$MCfwi;T!ArMFgb3xT4v#dT-V4^*?CV zIW6U1pI!U);HAx9)!8-f4_(wse|`zD;IfwZD>r@&Y#=rhjD(hYiBSBWHeBr43E%3b zz<-Igbq9O7$J4=rw*-ubBJ|f-!69q}I^V}M6L(MxXFa3wS`?~GG@DIArLl;2HytnT3`U!= zB!nH2-wq8%<7phw!R$~+l!w!Gze%qTu?L5p2b;HTFEuOEo}jsxq4#AUX}$rI$BoI( zn2irvU4)Bv%r|6S{t_Ee&IS3Gjh_irsYhSG#O>g#~I};rE?_y&5TS; zOz9BUy+ga$sKnTIF^Q2K+a)H&MYfAgj!%q>OG@bwpVV>otR5M;le4mNooQpIPaZdN zva@^km~q)z&JGc==|6qcZ&LQ8o*5Hq+nZX02S!)Dms9m#*8TTJPMSDzQg(XPlL?c? zj2ro*gf)!q_lIGQ*{f>IPmjyZvPu{~DdGDws#xW=+%H!@J1g($Nx4ss%N~Q+(}dN zK%t2l*%@Q1s>Wq0@Gs5NSr-a!Xqz3O@k{CyZN3_k@L#z@?X;3R*20OtxgH z_WS9z6Xqou=+XTjUm9?v{6_JqTPL|j%h0v%+z2+L=Vl5DE&8kG>pR#|#ruV| z16xE%N5r{3Pciw|)03hL?x<5usc9spj(Mx#NI9R?Lye+Hy&?52T3x*@tYkLgI83yqn3`x=())_lMpt3CvZ7FD zI3GZ0T^_A@9a|~qX6i2)D|YIQWuthB-p5hkFD2Cf>CL0utkD^n*2fERFN^in%4E%~ zgRYl@4Ntx-HZUB|EYPa zvR3?}SU{^9foxIo0OEXR`L(ucnMSLv!KSVJmu*#*H!r2N$Jnf2#XJ0SUthXjPcP+N z>`X~NXaT-GtDoC~OGYE^q<8*-DL(Ct)*WZ^L6o1Y_b^5b(+f3nmdO&q%MYfqRaiK2 z`B5n0BP~=@QpZiqM1P{qvD4f$SkRcYU#b~us}lYpTvhFkui+|IUV|%}@+Q7I88;J` zHo3TR^X*5QW(olTnKk`tUy_ZuH<0pgXCh5`7?Tou((S%Pn#RGaO5^xrQz)I-FR%Kk zCEWet3w_>5HNoh^IAIFE&3szxe}8|TvN{T(BFfZUgL{OV-F0xi`;NEn zN2{9t_(HVh9#ILu|D6;l1maLLoJy|Xoq=Tx{&2Q_s%~+(j@8JZcUS~ndjn@ITT!^S z&qEJg)1EAFpoV>iq*x>NE6q!w1fEX&MsiS^ub%VornVAal;-!(i(Gwl2A7=mz|G+N z$FT+a_$}>~g4^0z$KLr_y*JFf5Y&9Ed@#9TyCt4f{x}9$trYty<1pwEj7{!|(Nsl_~>4=X~^z!bn?zw>|_b z3tV}ka~nh)UXHb^MJ{ihRk77a&o17>zGEuC?!-}07Ze4jTtDW-Hj}`dPDV*8*vc}^ zFJ+9QWtv0y4eN}A5Ky?*_261d4ELb&1ZI7NP_?S4@Uj1hFTk*MOg8$ip49>&qUop}Kup4*_*o1yx16~679o7Hjj^T%>=P>XlV6{W~TVmMC z{MYz56tU!L4e6-$iEIlK(r4h^3#?-5w9{*E&FoAq~Y29iY1mP`v zygQ#w_nB3B*gKvFL_+V}f1loA6Nj&Yw?Iuq5!WyWe7FoD)Kmz*O0*FOBygFcjhOb#gM zr25g<4jp@hyfgSwvx|CrEoaixS-Io#vL@2LmAFhl`V;tL`6qR|*SJw2xj7y8rDLDz zZM}w!gEK#5Y;M-%v7SeCY}fsKR%-MU+tLTO{$rs@bF6Xh$yB=S?{c(fu9$9-{uTN#4>7(#}3^2cv%*n)-4!?;&n_K7)Q^J#yWJLZ&4`9adQaz8=b7E_K z6820+nfog^hqCE(eY8HER^(t5{5t8c|G{T9{xq;aXh1nDanb9sv${XEsL&4-x6w?POlM^@VTO!w-xHfo@+HBuv7Bs#GTEz zy*u{SzxJpdf75elJortME}&i(gV?t2*e;Hgus8QswEjM$l_&HjRQMSN@csq;Ax_s= z(mvB0atDtv&JD`-R{ug5qbk7F^m2U^*F_o_3vN}5-h57k4t)IUIFCBgS7#xk;N?0? zTc7(3E^m2--iU%42x0dbiZ5+`thej|Q^Bag-}G^uNv)w6Ki69te?i|tOV5GY2`BZo zzo1ji&g!jsUsZbXqVDr^?RxB@9!H;D)OE^;!|6Q#Z{f4jMBnnl*^+{x*+bRNoD_04l+-Oqz(`d=B|=Pxtg%Wwa2))VIEa`Y;R^||u;|M&~$ n(WU|$V@~Kvtd>xjY74UU<5Kj{@6lbF$LT!nQ+@m|>+Jsl!@Fqc