From efcc466fdd066bd5f9d70fa5ed433fe1db730683 Mon Sep 17 00:00:00 2001 From: Regalis Date: Mon, 17 Oct 2016 16:32:57 +0300 Subject: [PATCH] - added colliders to all monster configs - disabling monster collider & placing it at mainlimb when stunned/dead/frozen - monsters can't swim above water - misc fixes --- .../Characters/Charybdis/charybdis.xml | 2 + .../Content/Characters/Coelanth/coelanth.xml | 4 +- .../Content/Characters/Endworm/endworm.xml | 14 +-- .../Fractalguardian/fractalguardian.xml | 3 +- .../Fractalguardian2/fractalguardian2.xml | 4 +- Subsurface/Content/Characters/Human/human.xml | 1 + .../Content/Characters/Mantis/mantis.xml | 2 +- .../Content/Characters/Moloch/moloch.xml | 4 +- .../TigerThresher/tigerthresher.xml | 4 +- .../Content/Characters/Watcher/watcher.xml | 15 ++- .../Animation/FishAnimController.cs | 91 +++++++++++++------ .../Animation/HumanoidAnimController.cs | 14 +-- .../Source/Characters/Animation/Ragdoll.cs | 30 +++--- Subsurface/Source/Characters/Character.cs | 7 +- Subsurface/Source/Map/SubmarineBody.cs | 2 +- 15 files changed, 118 insertions(+), 79 deletions(-) diff --git a/Subsurface/Content/Characters/Charybdis/charybdis.xml b/Subsurface/Content/Characters/Charybdis/charybdis.xml index a1574b013..fa5caf861 100644 --- a/Subsurface/Content/Characters/Charybdis/charybdis.xml +++ b/Subsurface/Content/Characters/Charybdis/charybdis.xml @@ -5,6 +5,8 @@ + + diff --git a/Subsurface/Content/Characters/Coelanth/coelanth.xml b/Subsurface/Content/Characters/Coelanth/coelanth.xml index 02a9f67ab..d32181c38 100644 --- a/Subsurface/Content/Characters/Coelanth/coelanth.xml +++ b/Subsurface/Content/Characters/Coelanth/coelanth.xml @@ -5,8 +5,10 @@ - + + + diff --git a/Subsurface/Content/Characters/Endworm/endworm.xml b/Subsurface/Content/Characters/Endworm/endworm.xml index 6abd89cdc..157c81d7a 100644 --- a/Subsurface/Content/Characters/Endworm/endworm.xml +++ b/Subsurface/Content/Characters/Endworm/endworm.xml @@ -7,6 +7,8 @@ + + @@ -18,27 +20,27 @@ - + - + - + - + - + - + diff --git a/Subsurface/Content/Characters/Fractalguardian/fractalguardian.xml b/Subsurface/Content/Characters/Fractalguardian/fractalguardian.xml index c7e2aa8ff..ee99fe1d0 100644 --- a/Subsurface/Content/Characters/Fractalguardian/fractalguardian.xml +++ b/Subsurface/Content/Characters/Fractalguardian/fractalguardian.xml @@ -6,10 +6,11 @@ + - + diff --git a/Subsurface/Content/Characters/Fractalguardian2/fractalguardian2.xml b/Subsurface/Content/Characters/Fractalguardian2/fractalguardian2.xml index e13311179..c772e9b69 100644 --- a/Subsurface/Content/Characters/Fractalguardian2/fractalguardian2.xml +++ b/Subsurface/Content/Characters/Fractalguardian2/fractalguardian2.xml @@ -6,10 +6,12 @@ + + - + diff --git a/Subsurface/Content/Characters/Human/human.xml b/Subsurface/Content/Characters/Human/human.xml index 021f592ef..3731b78be 100644 --- a/Subsurface/Content/Characters/Human/human.xml +++ b/Subsurface/Content/Characters/Human/human.xml @@ -9,6 +9,7 @@ movementlerp="0.4" legtorque="15.0" thightorque="-5.0" + walkspeed="1.5" swimspeed="2.0"> diff --git a/Subsurface/Content/Characters/Mantis/mantis.xml b/Subsurface/Content/Characters/Mantis/mantis.xml index 0ab4a4544..cfcd6f781 100644 --- a/Subsurface/Content/Characters/Mantis/mantis.xml +++ b/Subsurface/Content/Characters/Mantis/mantis.xml @@ -15,7 +15,7 @@ footrotation ="180.0" flip="true"> - + diff --git a/Subsurface/Content/Characters/Moloch/moloch.xml b/Subsurface/Content/Characters/Moloch/moloch.xml index bd7ebcbce..aba30598b 100644 --- a/Subsurface/Content/Characters/Moloch/moloch.xml +++ b/Subsurface/Content/Characters/Moloch/moloch.xml @@ -8,10 +8,12 @@ + + - + diff --git a/Subsurface/Content/Characters/TigerThresher/tigerthresher.xml b/Subsurface/Content/Characters/TigerThresher/tigerthresher.xml index 8cd6014e6..0284b6405 100644 --- a/Subsurface/Content/Characters/TigerThresher/tigerthresher.xml +++ b/Subsurface/Content/Characters/TigerThresher/tigerthresher.xml @@ -5,8 +5,10 @@ - + + + diff --git a/Subsurface/Content/Characters/Watcher/watcher.xml b/Subsurface/Content/Characters/Watcher/watcher.xml index 8c7a24fff..c83554741 100644 --- a/Subsurface/Content/Characters/Watcher/watcher.xml +++ b/Subsurface/Content/Characters/Watcher/watcher.xml @@ -3,30 +3,27 @@ + + - + - + - - + - - + - - - diff --git a/Subsurface/Source/Characters/Animation/FishAnimController.cs b/Subsurface/Source/Characters/Animation/FishAnimController.cs index f218ffb17..362ed8c1b 100644 --- a/Subsurface/Source/Characters/Animation/FishAnimController.cs +++ b/Subsurface/Source/Characters/Animation/FishAnimController.cs @@ -15,6 +15,8 @@ namespace Barotrauma private float waveAmplitude; private float waveLength; + private Limb mainLimb; + private bool rotateTowardsMovement; private bool mirror, flip; @@ -43,16 +45,41 @@ namespace Barotrauma } rotateTowardsMovement = ToolBox.GetAttributeBool(element, "rotatetowardsmovement", true); + + Limb torso = GetLimb(LimbType.Torso); + Limb head = GetLimb(LimbType.Head); + + mainLimb = torso == null ? head : torso; } public override void UpdateAnim(float deltaTime) { - if (character.IsDead) + if (character.IsDead || Frozen || character.IsUnconscious || stunTimer > 0.0f) { - UpdateDying(deltaTime); + collider.PhysEnabled = false; + collider.SetTransform(mainLimb.SimPosition, 0.0f); + + if (stunTimer > 0.0f) + { + stunTimer -= deltaTime; + } + return; } + //re-enable collider + if (!collider.FarseerBody.Enabled) + { + var lowestLimb = FindLowestLimb(); + + collider.SetTransform(new Vector2( + collider.SimPosition.X, + Math.Max(lowestLimb.SimPosition.Y + (collider.radius + collider.height / 2), collider.SimPosition.Y)), + 0.0f); + + collider.FarseerBody.Enabled = true; + } + ResetPullJoints(); if (strongestImpact > 0.0f) @@ -61,22 +88,28 @@ namespace Barotrauma strongestImpact = 0.0f; } - if (stunTimer>0.0f) + + if (inWater) { - stunTimer -= deltaTime; - return; + collider.FarseerBody.FixedRotation = false; + UpdateSineAnim(deltaTime); } - else + else if (currentHull != null && CanEnterSubmarine) { - if (inWater)// || RefLimb.inWater) + if (Math.Abs(MathUtils.GetShortestAngle(collider.Rotation, 0.0f)) > 0.001f) { - UpdateSineAnim(deltaTime); + //rotate collider back upright + collider.AngularVelocity = MathUtils.GetShortestAngle(collider.Rotation, 0.0f) * 60.0f; + collider.FarseerBody.FixedRotation = false; } - else if (currentHull != null && CanEnterSubmarine) + else { - UpdateWalkAnim(deltaTime); + collider.FarseerBody.FixedRotation = true; } + + UpdateWalkAnim(deltaTime); } + if (mirror || !inWater) { @@ -136,8 +169,6 @@ namespace Barotrauma Limb torso = GetLimb(LimbType.Torso); Limb head = GetLimb(LimbType.Head); - Limb mainLimb = torso == null ? head : torso; - mainLimb.pullJoint.Enabled = true; mainLimb.pullJoint.WorldAnchorB = collider.SimPosition; @@ -145,12 +176,24 @@ namespace Barotrauma float movementAngle = MathUtils.VectorToAngle(movement) - MathHelper.PiOver2; - float angle = (rotateTowardsMovement) ? - mainLimb.body.Rotation + MathUtils.GetShortestAngle(mainLimb.body.Rotation, movementAngle) : - HeadAngle * Dir; + + if (rotateTowardsMovement) + { + collider.SmoothRotate(movementAngle, 25.0f); + mainLimb.body.SmoothRotate(movementAngle, 25.0f); + } + else + { + collider.SmoothRotate(HeadAngle * Dir, 25.0f); + mainLimb.body.SmoothRotate(HeadAngle * Dir, 25.0f); + } + + //float angle = (rotateTowardsMovement) ? + // mainLimb.body.Rotation + MathUtils.GetShortestAngle(mainLimb.body.Rotation, movementAngle) : + // HeadAngle * Dir; - collider.SmoothRotate(angle, 25.0f); - mainLimb.body.SmoothRotate(angle, 25.0f); + //collider.SmoothRotate(angle, 25.0f); + //mainLimb.body.SmoothRotate(angle, 25.0f); Limb tail = GetLimb(LimbType.Tail); if (tail != null && waveAmplitude > 0.0f) @@ -166,9 +209,7 @@ namespace Barotrauma for (int i = 0; i < Limbs.Count(); i++) { Vector2 pullPos = Limbs[i].pullJoint == null ? Limbs[i].SimPosition : Limbs[i].pullJoint.WorldAnchorA; - Limbs[i].body.ApplyForce(movement * Limbs[i].SteerForce * Limbs[i].Mass, pullPos); - - + Limbs[i].body.ApplyForce(movement * Limbs[i].SteerForce * Limbs[i].Mass, pullPos); if (Limbs[i] == mainLimb) continue; @@ -191,26 +232,18 @@ namespace Barotrauma IgnorePlatforms = (TargetMovement.Y < -Math.Abs(TargetMovement.X)); - Limb mainLimb; float mainLimbHeight, mainLimbAngle; - - Limb torso = GetLimb(LimbType.Torso); - Limb head = GetLimb(LimbType.Head); - - if (torso != null) + if (mainLimb.type == LimbType.Torso) { - mainLimb = torso; mainLimbHeight = TorsoPosition; mainLimbAngle = torsoAngle; } else { - mainLimb = head; mainLimbHeight = HeadPosition; mainLimbAngle = headAngle; } - //collider.SmoothRotate(TorsoAngle * Dir, 10.0f); mainLimb.body.SmoothRotate(mainLimbAngle * Dir, 50.0f); collider.LinearVelocity = new Vector2( diff --git a/Subsurface/Source/Characters/Animation/HumanoidAnimController.cs b/Subsurface/Source/Characters/Animation/HumanoidAnimController.cs index 39267fc32..4b1d15c29 100644 --- a/Subsurface/Source/Characters/Animation/HumanoidAnimController.cs +++ b/Subsurface/Source/Characters/Animation/HumanoidAnimController.cs @@ -65,7 +65,6 @@ namespace Barotrauma { collider.PhysEnabled = false; - var lowestLimb = FindLowestLimb(); collider.SetTransform(GetLimb(LimbType.Torso).SimPosition, 0.0f); if (stunTimer > 0) @@ -106,6 +105,7 @@ namespace Barotrauma { if (Math.Abs(MathUtils.GetShortestAngle(collider.Rotation, 0.0f)) > 0.001f) { + //rotate collider back upright collider.AngularVelocity = MathUtils.GetShortestAngle(collider.Rotation, 0.0f) * 60.0f; collider.FarseerBody.FixedRotation = false; } @@ -308,7 +308,7 @@ namespace Barotrauma if (onGround) { collider.LinearVelocity = new Vector2( - movement.X * 1.5f, + movement.X, collider.LinearVelocity.Y > 0.0f ? collider.LinearVelocity.Y * 0.5f : collider.LinearVelocity.Y); } @@ -329,12 +329,12 @@ namespace Barotrauma if (stairs != null) { torso.pullJoint.WorldAnchorB = new Vector2( - MathHelper.SmoothStep(torso.SimPosition.X, footMid + movement.X * 0.35f, getUpSpeed * 0.8f), + MathHelper.SmoothStep(torso.SimPosition.X, footMid + movement.X * 0.25f, getUpSpeed * 0.8f), MathHelper.SmoothStep(torso.SimPosition.Y, colliderPos.Y + TorsoPosition - Math.Abs(walkPosX * 0.05f), getUpSpeed * 2.0f)); head.pullJoint.WorldAnchorB = new Vector2( - MathHelper.SmoothStep(head.SimPosition.X, footMid + movement.X * (Crouching ? 1.0f : 0.4f), getUpSpeed * 0.8f), + MathHelper.SmoothStep(head.SimPosition.X, footMid + movement.X * (Crouching ? 0.6f : 0.25f), getUpSpeed * 0.8f), MathHelper.SmoothStep(head.SimPosition.Y, colliderPos.Y + HeadPosition - Math.Abs(walkPosX * 0.05f), getUpSpeed * 2.0f)); waist.pullJoint.WorldAnchorB = waist.SimPosition;// +movement * 0.3f; @@ -345,13 +345,13 @@ namespace Barotrauma torso.pullJoint.WorldAnchorB = MathUtils.SmoothStep(torso.SimPosition, - new Vector2(footMid + movement.X * 0.3f, colliderPos.Y + TorsoPosition), getUpSpeed); + new Vector2(footMid + movement.X * 0.2f, colliderPos.Y + TorsoPosition), getUpSpeed); head.pullJoint.WorldAnchorB = MathUtils.SmoothStep(head.SimPosition, - new Vector2(footMid + movement.X * (Crouching && Math.Sign(movement.X) == Math.Sign(Dir) ? 1.0f : 0.3f), colliderPos.Y + HeadPosition), getUpSpeed * 1.2f); + new Vector2(footMid + movement.X * (Crouching && Math.Sign(movement.X) == Math.Sign(Dir) ? 0.6f : 0.2f), colliderPos.Y + HeadPosition), getUpSpeed * 1.2f); - waist.pullJoint.WorldAnchorB = waist.SimPosition + movement * 0.1f; + waist.pullJoint.WorldAnchorB = waist.SimPosition + movement * 0.06f; } if (!onGround) diff --git a/Subsurface/Source/Characters/Animation/Ragdoll.cs b/Subsurface/Source/Characters/Animation/Ragdoll.cs index 00d761ccd..a6690aec9 100644 --- a/Subsurface/Source/Characters/Animation/Ragdoll.cs +++ b/Subsurface/Source/Characters/Animation/Ragdoll.cs @@ -32,9 +32,9 @@ namespace Barotrauma foreach (Limb l in Limbs) { - l.body.PhysEnabled = frozen; + l.body.PhysEnabled = !frozen; } - collider.PhysEnabled = frozen; + collider.PhysEnabled = !frozen; } } @@ -238,18 +238,17 @@ namespace Barotrauma float scale = ToolBox.GetAttributeFloat(element, "scale", 1.0f); - //int limbAmount = ; Limbs = new Limb[element.Elements("limb").Count()]; limbJoints = new RevoluteJoint[element.Elements("joint").Count()]; limbDictionary = new Dictionary(); - headPosition = ToolBox.GetAttributeFloat(element, "headposition", 50.0f); - headPosition = ConvertUnits.ToSimUnits(headPosition); - headAngle = MathHelper.ToRadians(ToolBox.GetAttributeFloat(element, "headangle", 0.0f)); + headPosition = ToolBox.GetAttributeFloat(element, "headposition", 50.0f); + headPosition = ConvertUnits.ToSimUnits(headPosition); + headAngle = MathHelper.ToRadians(ToolBox.GetAttributeFloat(element, "headangle", 0.0f)); - torsoPosition = ToolBox.GetAttributeFloat(element, "torsoposition", 50.0f); - torsoPosition = ConvertUnits.ToSimUnits(torsoPosition); - torsoAngle = MathHelper.ToRadians(ToolBox.GetAttributeFloat(element, "torsoangle", 0.0f)); + torsoPosition = ToolBox.GetAttributeFloat(element, "torsoposition", 50.0f); + torsoPosition = ConvertUnits.ToSimUnits(torsoPosition); + torsoAngle = MathHelper.ToRadians(ToolBox.GetAttributeFloat(element, "torsoangle", 0.0f)); CanEnterSubmarine = ToolBox.GetAttributeBool(element, "canentersubmarine", true); @@ -499,10 +498,10 @@ namespace Barotrauma GUI.DrawRectangle(spriteBatch, new Rectangle((int)pos.X, (int)pos.Y, 5, 5), Color.Red, true, 0.01f); } - limb.body.DebugDraw(spriteBatch, character.Submarine == null ? Color.Cyan : Color.White); + limb.body.DebugDraw(spriteBatch, inWater ? Color.Cyan : Color.White); } - - collider.DebugDraw(spriteBatch, character.Submarine == null ? Color.Cyan : Color.White); + + collider.DebugDraw(spriteBatch, inWater ? Color.SkyBlue : Color.Gray); foreach (RevoluteJoint joint in limbJoints) { @@ -737,11 +736,12 @@ namespace Barotrauma inWater = false; headInWater = false; - var colliderB = GetColliderBottom().Y; - float surf = ConvertUnits.ToSimUnits(currentHull.Surface); + float waterSurface = ConvertUnits.ToSimUnits(currentHull.Surface); + + float floorY = GetFloorY(); if (currentHull.Volume > currentHull.FullVolume * 0.95f || - ConvertUnits.ToSimUnits(currentHull.Surface) - GetFloorY() > HeadPosition * 0.95f) + (waterSurface - floorY > HeadPosition * 0.95f && collider.SimPosition.Y < waterSurface)) inWater = true; } diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index d1d329566..06ddf5627 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -557,14 +557,9 @@ namespace Barotrauma { AnimController = new FishAnimController(this, doc.Root.Element("ragdoll")); PressureProtection = 100.0f; - //FishAnimController fishAnim = (FishAnimController)animController; } AnimController.SetPosition(ConvertUnits.ToSimUnits(position)); - foreach (Limb limb in AnimController.Limbs) - { - limb.body.SetTransform(ConvertUnits.ToSimUnits(position)+limb.SimPosition, 0.0f); - } maxHealth = ToolBox.GetAttributeFloat(doc.Root, "health", 100.0f); health = maxHealth; @@ -766,7 +761,7 @@ namespace Barotrauma if (length > 0.0f) targetMovement = targetMovement / length; } - if (Math.Sign(targetMovement.X) == Math.Sign(AnimController.Dir) && IsKeyDown(InputType.Run)) + if (Math.Sign(targetMovement.X) != -Math.Sign(AnimController.Dir) && IsKeyDown(InputType.Run)) targetMovement *= 3.0f; targetMovement *= SpeedMultiplier; diff --git a/Subsurface/Source/Map/SubmarineBody.cs b/Subsurface/Source/Map/SubmarineBody.cs index 0b95234df..f53c45a25 100644 --- a/Subsurface/Source/Map/SubmarineBody.cs +++ b/Subsurface/Source/Map/SubmarineBody.cs @@ -432,7 +432,7 @@ namespace Barotrauma { Vector2 normal = Vector2.Normalize(Body.Position - limb.SimPosition); - float impact = Math.Min(Vector2.Dot(Velocity - limb.LinearVelocity, -normal), 5.0f); + float impact = Math.Min(Vector2.Dot(Velocity - limb.LinearVelocity, -normal), 50.0f) / 5.0f; ApplyImpact(impact * Math.Min(limb.Mass / 200.0f, 1), -normal, contact); }