From 16bf5628379efb8d74df289b8d48fbc75a063a73 Mon Sep 17 00:00:00 2001 From: Regalis Date: Tue, 15 Sep 2015 17:24:52 +0300 Subject: [PATCH] improved humanoid animations, some map stats in map editor, gap connections visible in editor, editing wire nodes in editor, pumps don't have to be manually linked, coroutine exception handling --- Launcher2/Icon.ico | Bin 147541 -> 16958 bytes Launcher2/LauncherMain.cs | 7 +- Launcher2/Properties/AssemblyInfo.cs | 2 +- Subsurface/Content/Characters/Human/human.xml | 6 +- Subsurface/Source/Characters/Character.cs | 48 ++++++---- .../Characters/HumanoidAnimController.cs | 86 +++++++++++------- Subsurface/Source/Characters/Limb.cs | 2 +- Subsurface/Source/Characters/Ragdoll.cs | 18 ++-- Subsurface/Source/CoroutineManager.cs | 12 ++- Subsurface/Source/GUI/GUITextBlock.cs | 2 +- .../GameSession/GameModes/TutorialMode.cs | 6 +- .../Source/Items/Components/Machines/Pump.cs | 60 +++++++----- .../Source/Items/Components/Signal/Wire.cs | 14 +-- Subsurface/Source/Items/Item.cs | 2 +- Subsurface/Source/Map/Gap.cs | 51 +++++++---- .../Map/Lights/{Light.cs => LightSource.cs} | 1 - Subsurface/Source/Program.cs | 6 +- Subsurface/Source/Screens/EditMapScreen.cs | 55 ++++++++--- Subsurface/Subsurface.csproj | 8 +- Subsurface/Subsurface.csproj.user | 4 + Subsurface_Solution.v12.suo | Bin 679936 -> 717312 bytes 21 files changed, 254 insertions(+), 136 deletions(-) rename Subsurface/Source/Map/Lights/{Light.cs => LightSource.cs} (99%) diff --git a/Launcher2/Icon.ico b/Launcher2/Icon.ico index 7d9dec18704053ee43cd7c956022ddbdb34d8de1..5b40528ea8c1e51011333b0bfc4c3a0417706bff 100644 GIT binary patch literal 16958 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 RJoIeLznU7AhJ`o~_y6Yy51#-4 diff --git a/Launcher2/LauncherMain.cs b/Launcher2/LauncherMain.cs index f607f340c..75f9d8948 100644 --- a/Launcher2/LauncherMain.cs +++ b/Launcher2/LauncherMain.cs @@ -143,6 +143,11 @@ namespace Launcher2 if (settings.GraphicsWidth == mode.Width && settings.GraphicsHeight == mode.Height) resolutionDD.SelectItem(mode); } + if (resolutionDD.SelectedItemData==null) + { + resolutionDD.SelectItem(GraphicsAdapter.DefaultAdapter.SupportedDisplayModes.Last()); + } + new GUITextBlock(new Rectangle(x, y + 50, 20, 20), "Content package", GUI.Style, Alignment.TopLeft, Alignment.TopLeft, guiRoot); contentPackageDD = new GUIDropDown(new Rectangle(x, y + 70, 200, 20), "", GUI.Style, guiRoot); @@ -153,7 +158,7 @@ namespace Launcher2 if (settings.SelectedContentPackage == contentPackage) contentPackageDD.SelectItem(contentPackage); } - new GUIButton(new Rectangle(x,y+120,150,20), "Package Manager", GUI.Style, guiRoot); + //new GUIButton(new Rectangle(x,y+120,150,20), "Package Manager", GUI.Style, guiRoot); var fullScreenTick = new GUITickBox(new Rectangle(x,y+150,20,20), "Fullscreen", Alignment.TopLeft, guiRoot); fullScreenTick.OnSelected = ToggleFullScreen; diff --git a/Launcher2/Properties/AssemblyInfo.cs b/Launcher2/Properties/AssemblyInfo.cs index 4ddff2475..b63ffe7f1 100644 --- a/Launcher2/Properties/AssemblyInfo.cs +++ b/Launcher2/Properties/AssemblyInfo.cs @@ -5,7 +5,7 @@ using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. -[assembly: AssemblyTitle("Launcher2")] +[assembly: AssemblyTitle("Barotrauma Launcher")] [assembly: AssemblyProduct("Launcher2")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyDescription("")] diff --git a/Subsurface/Content/Characters/Human/human.xml b/Subsurface/Content/Characters/Human/human.xml index b81c79cc2..5af2065ec 100644 --- a/Subsurface/Content/Characters/Human/human.xml +++ b/Subsurface/Content/Characters/Human/human.xml @@ -4,7 +4,11 @@ + stepsize="42.0, 12.0" + walkanimspeed="4.58" + movementlerp="0.4" + legtorque="15.0" + thightorque="-5.0"> diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index 74ae1457f..759a8ffa7 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -680,17 +680,8 @@ namespace Subsurface public void Update(Camera cam, float deltaTime) { - if (isDead) - { - if (controlled == this) - { - cam.Zoom = MathHelper.Lerp(cam.Zoom, 1.5f, 0.1f); - cam.TargetPos = ConvertUnits.ToDisplayUnits(AnimController.limbs[0].SimPosition); - cam.OffsetAmount = 0.0f; - } - return; - } - + if (isDead) return; + if (PressureProtection==0.0f && (AnimController.CurrentHull == null || AnimController.CurrentHull.LethalPressure >= 100.0f)) { @@ -953,15 +944,40 @@ namespace Subsurface Kill(true); } - private IEnumerable DeathAnim() + private IEnumerable DeathAnim(Camera cam) { - float timer = 8.0f; + float dimDuration = 8.0f; + float timer = 0.0f; - while (timer > 0.0f) + Color prevAmbientLight = Game1.LightManager.AmbientLight; + + while (timer < dimDuration) { AnimController.UpdateAnim(1.0f / 60.0f); - timer -= 1.0f / 60.0f; + timer += 1.0f / 60.0f; + if (cam != null) + { + cam.TargetPos = ConvertUnits.ToDisplayUnits(AnimController.limbs[0].SimPosition); + cam.OffsetAmount = 0.0f; + } + + Game1.LightManager.AmbientLight = Color.Lerp(prevAmbientLight, Color.DarkGray, timer / dimDuration); + + yield return CoroutineStatus.Running; + } + + while (Character.Controlled == this) + { + yield return CoroutineStatus.Running; + } + + float lerpLightBack = 0.0f; + while (lerpLightBack<1.0f) + { + lerpLightBack = Math.Min(lerpLightBack+0.05f,1.0f); + + Game1.LightManager.AmbientLight = Color.Lerp(Color.DarkGray, prevAmbientLight, lerpLightBack); yield return CoroutineStatus.Running; } @@ -985,7 +1001,7 @@ namespace Subsurface } } - CoroutineManager.StartCoroutine(DeathAnim()); + CoroutineManager.StartCoroutine(DeathAnim(Game1.GameScreen.Cam)); health = 0.0f; diff --git a/Subsurface/Source/Characters/HumanoidAnimController.cs b/Subsurface/Source/Characters/HumanoidAnimController.cs index d354043c0..c5280e4bb 100644 --- a/Subsurface/Source/Characters/HumanoidAnimController.cs +++ b/Subsurface/Source/Characters/HumanoidAnimController.cs @@ -11,9 +11,21 @@ namespace Subsurface { private bool aiming; + private float walkAnimSpeed; + + private float movementLerp; + + private float thighTorque; + public HumanoidAnimController(Character character, XElement element) : base(character, element) { + walkAnimSpeed = ToolBox.GetAttributeFloat(element, "walkanimspeed", 4.0f); + walkAnimSpeed = MathHelper.ToRadians(walkAnimSpeed); + + movementLerp = ToolBox.GetAttributeFloat(element, "movementlerp", 0.4f); + + thighTorque = ToolBox.GetAttributeFloat(element, "thightorque", -5.0f); } public override void UpdateAnim(float deltaTime) @@ -26,7 +38,7 @@ namespace Subsurface Vector2 colliderPos = GetLimb(LimbType.Torso).SimPosition; - if (inWater) stairs = null; + //if (inWater) stairs = null; Vector2 rayStart = colliderPos; // at the bottom of the player sprite Vector2 rayEnd = rayStart - new Vector2(0.0f, TorsoPosition); @@ -42,7 +54,7 @@ namespace Subsurface switch (fixture.CollisionCategories) { case Physics.CollisionStairs: - if (inWater) return -1; + if (inWater && TargetMovement.Y < 0.5f) return -1; Structure structure = fixture.Body.UserData as Structure; if (stairs == null && structure!=null) { @@ -155,6 +167,8 @@ namespace Subsurface aiming = false; } + + void UpdateStanding() { Vector2 handPos; @@ -164,6 +178,8 @@ namespace Subsurface Limb head = GetLimb(LimbType.Head); Limb torso = GetLimb(LimbType.Torso); + Limb waist = GetLimb(LimbType.Waist); + Limb leftHand = GetLimb(LimbType.LeftHand); Limb rightHand = GetLimb(LimbType.RightHand); @@ -171,7 +187,7 @@ namespace Subsurface Limb rightLeg = GetLimb(LimbType.RightLeg); float getUpSpeed = 0.3f; - float walkCycleSpeed = head.LinearVelocity.X * 0.08f; + float walkCycleSpeed = head.LinearVelocity.X * walkAnimSpeed; if (stairs != null) { TargetMovement = new Vector2(MathHelper.Clamp(TargetMovement.X, -2.0f, 2.0f), TargetMovement.Y) ; @@ -183,7 +199,6 @@ namespace Subsurface } else { - TargetMovement /= 1.2f; } @@ -200,9 +215,9 @@ namespace Subsurface this.stepSize.X * walkPosX * runningModifier, this.stepSize.Y * walkPosY * runningModifier * runningModifier); - float footMid = (leftFoot.SimPosition.X + rightFoot.SimPosition.X) / 2.0f; + float footMid = waist.SimPosition.X;// (leftFoot.SimPosition.X + rightFoot.SimPosition.X) / 2.0f; - movement = MathUtils.SmoothStep(movement, TargetMovement, 0.4f); + movement = MathUtils.SmoothStep(movement, TargetMovement, movementLerp); movement.Y = 0.0f; //place the anchors of the head and the torso to make the ragdoll stand @@ -230,12 +245,17 @@ namespace Subsurface torso.pullJoint.Enabled = true; torso.pullJoint.WorldAnchorB = MathUtils.SmoothStep(torso.SimPosition, - new Vector2(footMid + movement.X * 0.35f, colliderPos.Y + TorsoPosition), getUpSpeed); + new Vector2(footMid + movement.X * 0.3f, colliderPos.Y + TorsoPosition), getUpSpeed); head.pullJoint.Enabled = true; head.pullJoint.WorldAnchorB = MathUtils.SmoothStep(head.SimPosition, - new Vector2(footMid + movement.X * 0.4f, colliderPos.Y + HeadPosition), getUpSpeed); + new Vector2(footMid + movement.X * (0.2f + runningModifier / 10.0f), colliderPos.Y + HeadPosition), getUpSpeed); + + waist.pullJoint.Enabled = true; + waist.pullJoint.WorldAnchorB = waist.SimPosition + movement*0.1f; + //MathUtils.SmoothStep(waist.SimPosition, + //new Vector2(footMid + movement.X * 0.4f, colliderPos.Y + HeadPosition), getUpSpeed); } @@ -257,31 +277,40 @@ namespace Subsurface (-stepSize.Y > 0.0f) ? -stepSize.Y : -0.15f), 15.0f, true); - if (Math.Sign(stepSize.X) == Math.Sign(Dir)) + leftFoot.body.SmoothRotate(leftLeg.body.Rotation + MathHelper.PiOver2 * Dir * 1.6f, 20.0f * runningModifier); + rightFoot.body.SmoothRotate(rightLeg.body.Rotation + MathHelper.PiOver2 * Dir * 1.6f, 20.0f * runningModifier); + + if (runningModifier>1.0f) { - leftFoot.body.SmoothRotate(leftLeg.body.Rotation + MathHelper.PiOver2 * Dir * 1.6f, 20.0f * runningModifier); - } - else if (Math.Sign(-stepSize.X) == Math.Sign(Dir)) - { - rightFoot.body.SmoothRotate(rightLeg.body.Rotation + MathHelper.PiOver2 * Dir * 1.6f, 20 * runningModifier); + if (walkPosY > 0.0f) + { + GetLimb(LimbType.LeftThigh).body.ApplyTorque(-walkPosY * Dir * Math.Abs(movement.X) * thighTorque); + } + else + { + GetLimb(LimbType.RightThigh).body.ApplyTorque(walkPosY * Dir * Math.Abs(movement.X) * thighTorque); + } } - if (walkPosY > 0.0f) + if (legTorque>0.0f) { - GetLimb(LimbType.LeftThigh).body.ApplyTorque(-walkPosY * Dir * Math.Abs(movement.X) * -5.0f); - } - else - { - GetLimb(LimbType.RightThigh).body.ApplyTorque(walkPosY * Dir * Math.Abs(movement.X) * -5.0f); + if (Math.Sign(walkPosX) != Math.Sign(movement.X)) + { + GetLimb(LimbType.LeftLeg).body.ApplyTorque(-walkPosY * Dir * Math.Abs(movement.X) * legTorque / runningModifier); + } + else + { + GetLimb(LimbType.RightLeg).body.ApplyTorque(walkPosY * Dir * Math.Abs(movement.X) * legTorque / runningModifier); + } } //calculate the positions of hands handPos = torso.SimPosition; - handPos.X = -walkPosX * 0.1f * runningModifier; + handPos.X = -walkPosX * 0.2f;// *runningModifier; float lowerY = -0.6f + runningModifier/3.5f; - handPos.Y = lowerY + (float)(Math.Abs(Math.Sin(walkPos - Math.PI * 1.5f) * 0.1)) / runningModifier; + handPos.Y = lowerY + (float)(Math.Abs(Math.Sin(walkPos - Math.PI * 1.5f) * 0.05)) / runningModifier; Vector2 posAdditon = new Vector2(movement.X*0.07f, 0.0f); if (stairs!=null) @@ -321,11 +350,6 @@ namespace Subsurface } else { - //add torque to the head to do a subtle "breathing" effect - //head.body.ApplyTorque((float)Math.Sin(gameTime.TotalGameTime.TotalMilliseconds / 300) * 0.2f); - - //standing still -> "attach" the feet to the ground - float movementFactor = (movement.X / 4.0f) * movement.X * Math.Sign(movement.X); Vector2 footPos = new Vector2( @@ -337,13 +361,7 @@ namespace Subsurface leftFoot.body.SmoothRotate(Dir * MathHelper.PiOver2, 5.0f); rightFoot.body.SmoothRotate(Dir * MathHelper.PiOver2, 5.0f); - - - - - //handPos = torso.SimPosition; - //handPos.X += movement.X; - //handPos.Y -= 0.4f; + if (!rightHand.Disabled) { // MoveLimb(rightHand, handPos, 0.05f, true); diff --git a/Subsurface/Source/Characters/Limb.cs b/Subsurface/Source/Characters/Limb.cs index b21c6fb77..31b065a97 100644 --- a/Subsurface/Source/Characters/Limb.cs +++ b/Subsurface/Source/Characters/Limb.cs @@ -426,7 +426,7 @@ namespace Subsurface if (pullJoint!=null) { Vector2 pos = ConvertUnits.ToDisplayUnits(pullJoint.WorldAnchorB); - GUI.DrawRectangle(spriteBatch, new Rectangle((int)pos.X, (int)pos.Y, 5, 5), Color.Red, true); + GUI.DrawRectangle(spriteBatch, new Rectangle((int)pos.X, (int)-pos.Y, 5, 5), Color.Red, true); } if (bodyShapeTexture == null) diff --git a/Subsurface/Source/Characters/Ragdoll.cs b/Subsurface/Source/Characters/Ragdoll.cs index 776ceacd6..a8f2b886e 100644 --- a/Subsurface/Source/Characters/Ragdoll.cs +++ b/Subsurface/Source/Characters/Ragdoll.cs @@ -283,13 +283,15 @@ namespace Subsurface } else if (structure.StairDirection!=Direction.None) { - if ((inWater || !(targetMovement.Y>Math.Abs(targetMovement.X/2.0f))) && - lowestLimb.Position.Y < structure.Rect.Y - structure.Rect.Height + 50.0f) + if (targetMovement.Y < 0.5f) { - stairs = null; - return false; + if (inWater || lowestLimb.Position.Y < structure.Rect.Y - structure.Rect.Height + 50.0f) + { + stairs = null; + return false; + } } - + if (targetMovement.Y >= 0.0f && lowestLimb.SimPosition.Y > ConvertUnits.ToSimUnits(structure.Rect.Y - Submarine.GridSize.Y * 8.0f)) { stairs = null; @@ -367,12 +369,14 @@ namespace Subsurface if (limb.pullJoint != null) { Vector2 pos = ConvertUnits.ToDisplayUnits(limb.pullJoint.WorldAnchorA); - GUI.DrawRectangle(spriteBatch, new Rectangle((int)pos.X, (int)-pos.Y, 5, 5), Color.Red, true, 0.01f); + pos.Y = -pos.Y; + GUI.DrawRectangle(spriteBatch, new Rectangle((int)pos.X, (int)pos.Y, 5, 5), Color.Red, true, 0.01f); if (limb.AnimTargetPos == Vector2.Zero) continue; Vector2 pos2 = ConvertUnits.ToDisplayUnits(limb.AnimTargetPos); - GUI.DrawRectangle(spriteBatch, new Rectangle((int)pos2.X, (int)-pos2.Y, 5, 5), Color.Blue, true, 0.01f); + pos2.Y = -pos2.Y; + GUI.DrawRectangle(spriteBatch, new Rectangle((int)pos2.X, (int)pos2.Y, 5, 5), Color.Blue, true, 0.01f); GUI.DrawLine(spriteBatch, pos, pos2, Color.Green); } diff --git a/Subsurface/Source/CoroutineManager.cs b/Subsurface/Source/CoroutineManager.cs index 9b08261bf..c5be073fc 100644 --- a/Subsurface/Source/CoroutineManager.cs +++ b/Subsurface/Source/CoroutineManager.cs @@ -56,12 +56,18 @@ namespace Subsurface break; } } - } + try + { + Coroutines[i].MoveNext(); + } - Coroutines[i].MoveNext(); - + catch (Exception e) + { + DebugConsole.ThrowError("Coroutine "+Coroutines[i]+" threw an exception: "+e.Message); + Coroutines.RemoveAt(i); + } } } diff --git a/Subsurface/Source/GUI/GUITextBlock.cs b/Subsurface/Source/GUI/GUITextBlock.cs index 6f2afa6ed..7ea96e934 100644 --- a/Subsurface/Source/GUI/GUITextBlock.cs +++ b/Subsurface/Source/GUI/GUITextBlock.cs @@ -120,7 +120,7 @@ namespace Subsurface SetTextPos(); - if (rect.Height == 0) + if (rect.Height == 0 && !string.IsNullOrWhiteSpace(Text)) { this.rect.Height = (int)Font.MeasureString(Text).Y; } diff --git a/Subsurface/Source/GameSession/GameModes/TutorialMode.cs b/Subsurface/Source/GameSession/GameModes/TutorialMode.cs index 88b91fa1d..69e8d55a4 100644 --- a/Subsurface/Source/GameSession/GameModes/TutorialMode.cs +++ b/Subsurface/Source/GameSession/GameModes/TutorialMode.cs @@ -400,9 +400,9 @@ namespace Subsurface yield return new WaitForSeconds(1.0f); } - infoBox = CreateInfoFrame("The capacitors consume large amounts of power when they're being charged at a high rate. "+ - "Be cautious to overload the electrical grid or the reactor. They also take some time to recharge, so now is a good "+ - "time to head to the room below to load some shells into the railgun."); + infoBox = CreateInfoFrame("The capacitors consume large amounts of power when they're being charged at a high rate, so "+ + "be careful not to overload the electrical grid or the reactor. They also take some time to recharge, so now is a good "+ + "time to head to the room below and load some shells for the railgun."); var loader = Item.itemList.Find(i => i.Name == "Railgun Loader").GetComponent(); diff --git a/Subsurface/Source/Items/Components/Machines/Pump.cs b/Subsurface/Source/Items/Components/Machines/Pump.cs index f2f7e8471..0198c6b28 100644 --- a/Subsurface/Source/Items/Components/Machines/Pump.cs +++ b/Subsurface/Source/Items/Components/Machines/Pump.cs @@ -38,8 +38,19 @@ namespace Subsurface.Items.Components public Pump(Item item, XElement element) : base(item, element) { - item.linkedTo.CollectionChanged += delegate(object sender, NotifyCollectionChangedEventArgs e) - { GetHulls(); }; + GetHull(); + } + + public override void Move(Vector2 amount) + { + base.Move(amount); + + GetHull(); + } + + public override void OnMapLoaded() + { + GetHull(); } public override void Update(float deltaTime, Camera cam) @@ -77,28 +88,33 @@ namespace Subsurface.Items.Components voltage = 0.0f; } - - private void GetHulls() + + private void GetHull() { - hull1 = null; - hull2 = null; - - foreach (MapEntity e in item.linkedTo) - { - Hull hull = e as Hull; - if (hull == null) continue; - - if (hull1 == null) - { - hull1 = hull; - } - else if (hull2 == null && hull != hull1) - { - hull2 = hull; - break; - } - } + hull1 = Hull.FindHull(item.Position, item.CurrentHull); } + + //private void GetHulls() + //{ + // hull1 = null; + // hull2 = null; + + // foreach (MapEntity e in item.linkedTo) + // { + // Hull hull = e as Hull; + // if (hull == null) continue; + + // if (hull1 == null) + // { + // hull1 = hull; + // } + // else if (hull2 == null && hull != hull1) + // { + // hull2 = hull; + // break; + // } + // } + //} public override void DrawHUD(SpriteBatch spriteBatch, Character character) { diff --git a/Subsurface/Source/Items/Components/Signal/Wire.cs b/Subsurface/Source/Items/Components/Signal/Wire.cs index 8260a7337..c18f608de 100644 --- a/Subsurface/Source/Items/Components/Signal/Wire.cs +++ b/Subsurface/Source/Items/Components/Signal/Wire.cs @@ -287,20 +287,21 @@ namespace Subsurface.Items.Components for (int i = 1; i < Nodes.Count; i++) { - GUI.DrawRectangle(spriteBatch, new Rectangle((int)Nodes[i].X - 3, (int)-Nodes[i].Y -3, 6, 6), Color.Red, true, 0.0f); + GUI.DrawRectangle(spriteBatch, new Rectangle((int)Nodes[i].X - 3, (int)-Nodes[i].Y - 3, 6, 6), Color.Red, true, 0.0f); - if (Vector2.Distance(Game1.EditMapScreen.Cam.ScreenToWorld(PlayerInput.MousePosition), Nodes[i]) < 20.0f) + if (GUIComponent.MouseOn == null && + Vector2.Distance(Game1.EditMapScreen.Cam.ScreenToWorld(PlayerInput.MousePosition), Nodes[i]) < 20.0f) { GUI.DrawRectangle(spriteBatch, new Rectangle((int)Nodes[i].X - 10, (int)-Nodes[i].Y - 10, 20, 20), Color.Red, false, 0.0f); - if (selectedNodeIndex==null && selectedNodeIndex>0 && selectedNodeIndex0 && selectedNodeIndex 1 && linkedTo[1] != null) - // GUI.DrawLine(sb, new Vector2(Position.X, Position.Y), - // new Vector2(linkedTo[1].Position.X, linkedTo[1].Position.Y), Color.Blue); - - - //GUI.DrawLine(sb, new Vector2(Position.X, -Position.Y), new Vector2(Position.X, -Position.Y)+new Vector2(flowForce.X, -flowForce.Y), Color.LightBlue); - if (!editing) return; Color clr = (open == 0.0f) ? Color.Red : Color.Cyan; - GUI.DrawRectangle(sb, new Rectangle(rect.X, -rect.Y, rect.Width, rect.Height), clr); + GUI.DrawRectangle(sb, new Rectangle(rect.X, -rect.Y, rect.Width, rect.Height), clr*0.5f, true); + + if (isHorizontal) + { + for (int i = 0; i < linkedTo.Count; i++ ) + { + if (linkedTo[i].Rect.Center.X > rect.Center.X) + { + GUI.DrawRectangle(sb, new Rectangle(rect.Right, -rect.Y, 10, rect.Height), Color.Green * 0.3f, true); + } + else + { + GUI.DrawRectangle(sb, new Rectangle(rect.X - 10, -rect.Y, 10, rect.Height), Color.Green * 0.3f, true); + } + } + } + else + { + for (int i = 0; i < linkedTo.Count; i++) + { + if (linkedTo[i].Rect.Y - linkedTo[i].Rect.Height/2.0f > rect.Y) + { + GUI.DrawRectangle(sb, new Rectangle(rect.X, -rect.Y - 10, rect.Width, 10), Color.Green * 0.3f, true); + } + else + { + GUI.DrawRectangle(sb, new Rectangle(rect.X, -rect.Y + rect.Height, rect.Width, 10), Color.Green * 0.3f, true); + } + } + } if (isSelected) { @@ -202,10 +220,6 @@ namespace Subsurface new Vector2(rect.Width + 10, rect.Height + 10), Color.Red); } - - //HUD.DrawLine(sb, new Vector2(position.X, -position.Y), - // isHorizontal ? new Vector2(position.X, -position.Y + size) : new Vector2(position.X + size, -position.Y), - // clr); } public override void Update(Camera cam, float deltaTime) @@ -218,10 +232,7 @@ namespace Subsurface index = Math.Min(index,2); soundIndex = AmbientSoundManager.flowSounds[index].Loop(soundIndex, soundVolume, Position, 2000.0f); - //soundVolume = Math.Max(0.0f, soundVolume-deltaTime); - //Sound.UpdatePosition(soundIndex, Position, 2000.0f); - flowForce = Vector2.Zero; if (open == 0.0f) return; @@ -240,7 +251,7 @@ namespace Subsurface UpdateRoomToRoom(deltaTime); } - if (FlowForce.Length() > 150.0f && flowTargetHull!=null && flowTargetHull.Volume < flowTargetHull.FullVolume) + if (FlowForce.Length() > 150.0f && flowTargetHull != null && flowTargetHull.Volume < flowTargetHull.FullVolume) { //UpdateFlowForce(); diff --git a/Subsurface/Source/Map/Lights/Light.cs b/Subsurface/Source/Map/Lights/LightSource.cs similarity index 99% rename from Subsurface/Source/Map/Lights/Light.cs rename to Subsurface/Source/Map/Lights/LightSource.cs index 5a343f4fb..3b57c26b3 100644 --- a/Subsurface/Source/Map/Lights/Light.cs +++ b/Subsurface/Source/Map/Lights/LightSource.cs @@ -9,7 +9,6 @@ namespace Subsurface.Lights { class LightSource { - private static Texture2D lightTexture; private Color color; diff --git a/Subsurface/Source/Program.cs b/Subsurface/Source/Program.cs index 278d37812..8b88b8480 100644 --- a/Subsurface/Source/Program.cs +++ b/Subsurface/Source/Program.cs @@ -87,13 +87,15 @@ namespace Subsurface sw.WriteLine(sb.ToString()); + sw.Close(); + #if WINDOWS MessageBox.Show( "A crash report (''crashreport.txt'') was saved in the root folder of the game."+ - " If you'd like to help fix this bug, please make a bug report on the Undertow Games forum with the report attached.", + " If you'd like to help fix this bug, please post the report on the Undertow Games forums.", "Oops! Subsurface just crashed.", MessageBoxButtons.OK, MessageBoxIcon.Error); #endif - sw.Close(); + } } #endif diff --git a/Subsurface/Source/Screens/EditMapScreen.cs b/Subsurface/Source/Screens/EditMapScreen.cs index 779eb10b2..8a50933b9 100644 --- a/Subsurface/Source/Screens/EditMapScreen.cs +++ b/Subsurface/Source/Screens/EditMapScreen.cs @@ -24,6 +24,27 @@ namespace Subsurface get { return cam; } } + public string GetSubName() + { + return ((Submarine.Loaded == null) ? "" : Submarine.Loaded.Name); + } + + private string GetItemCount() + { + return "Items: " +Item.itemList.Count; + } + + private string GetStructureCount() + { + return "Structures: " + (MapEntity.mapEntityList.Count - Item.itemList.Count); + } + + private string GetPhysicsBodyCount() + { + return "Physics bodies: " + Game1.World.BodyList.Count; + } + + public EditMapScreen() { cam = new Camera(); @@ -37,15 +58,28 @@ namespace Subsurface //constructionList.OnSelected = MapEntityPrefab.SelectPrefab; //constructionList.CheckSelected = MapEntityPrefab.GetSelected; - GUIButton button = new GUIButton(new Rectangle(0, 50, 100, 20), "Items", Alignment.Left, GUI.Style, GUIpanel); + GUITextBlock nameBlock = new GUITextBlock(new Rectangle(0, 30, 0, 20), "", GUI.Style, Alignment.TopLeft, Alignment.TopLeft, GUIpanel, true, GUI.LargeFont); + nameBlock.TextGetter = GetSubName; + + GUITextBlock itemCount = new GUITextBlock(new Rectangle(0, 80, 0, 20), "", GUI.Style, GUIpanel); + itemCount.TextGetter = GetItemCount; + + GUITextBlock structureCount = new GUITextBlock(new Rectangle(0, 100, 0, 20), "", GUI.Style, GUIpanel); + structureCount.TextGetter = GetStructureCount; + + //GUITextBlock physicsBodyCount = new GUITextBlock(new Rectangle(0, 120, 0, 20), "", GUI.Style, GUIpanel); + //physicsBodyCount.TextGetter = GetPhysicsBodyCount; + + GUIButton button = new GUIButton(new Rectangle(0, 150, 0, 20), "Items", Alignment.Left, GUI.Style, GUIpanel); button.UserData = 0; button.OnClicked = SelectTab; - button = new GUIButton(new Rectangle(0, 80, 100, 20), "Structures", Alignment.Left, GUI.Style, GUIpanel); + button = new GUIButton(new Rectangle(0, 180, 0, 20), "Structures", Alignment.Left, GUI.Style, GUIpanel); button.UserData = 1; button.OnClicked = SelectTab; - button = new GUIButton(new Rectangle(0, 140, 100, 20), "Character mode", Alignment.Left, GUI.Style, GUIpanel); + button = new GUIButton(new Rectangle(0, 220, 0, 20), "Character mode", Alignment.Left, GUI.Style, GUIpanel); + button.ToolTip = "Allows you to pick up and use items. Useful for things such as placing items inside closets, turning devices on/off and doing the wiring."; button.OnClicked = ToggleCharacterMode; GUItabs = new GUIComponent[2]; @@ -130,10 +164,10 @@ namespace Subsurface private bool ToggleCharacterMode(GUIButton button, object obj) { - selectedTab = 0; + selectedTab = -1; characterMode = !characterMode; - button.Color = (characterMode) ? Color.Gold : Color.White; + //button.Color = (characterMode) ? Color.Gold : Color.White; if (characterMode) { @@ -170,16 +204,9 @@ namespace Subsurface /// Provides a snapshot of timing values. public override void Update(double deltaTime) { - //Vector2 mousePosition = new Vector2(PlayerInput.GetMouseState.X, PlayerInput.GetMouseState.Y); - //mousePosition = cam.ScreenToWorld(mousePosition); - //if (!Character.characterList.Contains(dummyCharacter)) - //{ - // CreateDummyCharacter(); - //} - - if (GUIComponent.MouseOn==null) cam.MoveCamera((float)deltaTime); - cam.Zoom = MathHelper.Clamp(cam.Zoom + PlayerInput.ScrollWheelSpeed/1000.0f,0.1f, 2.0f); + if (GUIComponent.MouseOn == null) cam.MoveCamera((float)deltaTime); + cam.Zoom = MathHelper.Clamp(cam.Zoom + PlayerInput.ScrollWheelSpeed / 1000.0f, 0.1f, 2.0f); if (characterMode) { diff --git a/Subsurface/Subsurface.csproj b/Subsurface/Subsurface.csproj index 3cbaaa924..3e1cfe070 100644 --- a/Subsurface/Subsurface.csproj +++ b/Subsurface/Subsurface.csproj @@ -43,6 +43,12 @@ true bin\Windows\Release\ TRACE;WINDOWS + + + .allowedextension + prompt 4 @@ -85,7 +91,7 @@ - + diff --git a/Subsurface/Subsurface.csproj.user b/Subsurface/Subsurface.csproj.user index 693505ea4..c2dd67340 100644 --- a/Subsurface/Subsurface.csproj.user +++ b/Subsurface/Subsurface.csproj.user @@ -11,4 +11,8 @@ false ShowAllFiles + + + + \ No newline at end of file diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index c7e248a4d5f323d2d6d368d8e46377f284cf92e9..d99e1b1d3c35d9560dde4766b6c774cc4a0651bf 100644 GIT binary patch delta 24891 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 O5S5;_ZoNL5v;GhHEeJvY