diff --git a/Subsurface/Data/SavedSubs/test.sub b/Subsurface/Data/SavedSubs/test.sub new file mode 100644 index 000000000..183ff5b7b Binary files /dev/null and b/Subsurface/Data/SavedSubs/test.sub differ diff --git a/Subsurface/Source/Characters/AI/HumanAIController.cs b/Subsurface/Source/Characters/AI/HumanAIController.cs index b0dc59834..33254c705 100644 --- a/Subsurface/Source/Characters/AI/HumanAIController.cs +++ b/Subsurface/Source/Characters/AI/HumanAIController.cs @@ -58,7 +58,31 @@ namespace Barotrauma objectiveManager.DoCurrentObjective(deltaTime); - Character.AnimController.IgnorePlatforms = (-Character.AnimController.TargetMovement.Y > Math.Abs(Character.AnimController.TargetMovement.X)); + float currObjectivePriority = objectiveManager.GetCurrentPriority(Character); + float moveSpeed = MathHelper.Clamp(currObjectivePriority/10.0f, 1.0f, 3.0f); + + steeringManager.Update(moveSpeed); + + Character.AnimController.IgnorePlatforms = (-Character.AnimController.TargetMovement.Y > Math.Abs(Character.AnimController.TargetMovement.X*0.5f)); + + if (!Character.AnimController.InWater) + { + Character.AnimController.TargetMovement = new Vector2( + Character.AnimController.TargetMovement.X, + MathHelper.Clamp(Character.AnimController.TargetMovement.Y, -1.0f, 1.0f)) * Character.SpeedMultiplier; + + Character.SpeedMultiplier = 1.0f; + } + + if (Character.SelectedConstruction != null && Character.SelectedConstruction.GetComponent()!=null) + { + var currPath = (steeringManager as IndoorsSteeringManager).CurrentPath; + if (currPath != null && currPath.CurrentNode != null && currPath.CurrentNode.Ladders != null) + { + Character.AnimController.TargetMovement = new Vector2( 0.0f, Math.Sign(Character.AnimController.TargetMovement.Y)); + } + + } if (Character.IsKeyDown(InputType.Aim)) { @@ -69,10 +93,8 @@ namespace Barotrauma Character.AnimController.TargetDir = Character.AnimController.TargetMovement.X > 0.0f ? Direction.Right : Direction.Left; } - float currObjectivePriority = objectiveManager.GetCurrentPriority(Character); - float moveSpeed = MathHelper.Clamp(currObjectivePriority/10.0f, 1.0f, 3.0f); - - steeringManager.Update(moveSpeed); + + } public override void OnAttacked(IDamageable attacker, float amount) diff --git a/Subsurface/Source/Characters/AI/IndoorsSteeringManager.cs b/Subsurface/Source/Characters/AI/IndoorsSteeringManager.cs index d4b0f0b95..9ca539095 100644 --- a/Subsurface/Source/Characters/AI/IndoorsSteeringManager.cs +++ b/Subsurface/Source/Characters/AI/IndoorsSteeringManager.cs @@ -88,8 +88,8 @@ namespace Barotrauma Vector2 diff = DiffToCurrentNode(); if (diff == Vector2.Zero) return -host.Steering; - - return (diff == Vector2.Zero) ? Vector2.Zero : Vector2.Normalize(diff)*speed; + + return Vector2.Normalize(diff) * speed; } private Vector2 DiffToCurrentNode() @@ -107,15 +107,23 @@ namespace Barotrauma pos -= Submarine.Loaded.SimPosition; } + if (currentPath.CurrentNode!= null && currentPath.CurrentNode.Ladders!=null) + { + if (character.SelectedConstruction != currentPath.CurrentNode.Ladders.Item && currentPath.CurrentNode.Ladders.Item.IsInsideTrigger(character.WorldPosition)) + { + currentPath.CurrentNode.Ladders.Item.Pick(character, false, true); + } + + if (Math.Sign(host.Steering.Y) == currentPath.CurrentNode.SimPosition.Y - pos.Y) + { + allowedDistance = 0.0f; + } + } + currentPath.CheckProgress(pos, allowedDistance); if (currentPath.CurrentNode == null) return Vector2.Zero; - //if (currentPath.CurrentNode.SimPosition.Y > character.SimPosition.Y+1.0f && character.AnimController.Stairs == null) - //{ - // return currentPath.PrevNode.SimPosition - host.SimPosition; - //} - return currentPath.CurrentNode.SimPosition - pos; } diff --git a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGoTo.cs b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGoTo.cs index d1f771847..39a40396f 100644 --- a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGoTo.cs +++ b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGoTo.cs @@ -55,7 +55,7 @@ namespace Barotrauma protected override void Act(float deltaTime) { - if (character.SelectedConstruction!=null) + if (character.SelectedConstruction!=null && character.SelectedConstruction.GetComponent()==null) { character.SelectedConstruction = null; } diff --git a/Subsurface/Source/Characters/Animation/Ragdoll.cs b/Subsurface/Source/Characters/Animation/Ragdoll.cs index c644a2548..3f79eead1 100644 --- a/Subsurface/Source/Characters/Animation/Ragdoll.cs +++ b/Subsurface/Source/Characters/Animation/Ragdoll.cs @@ -794,9 +794,11 @@ namespace Barotrauma } else { - correctionMovement = - Vector2.Lerp(targetMovement, Vector2.Normalize(diff) * MathHelper.Clamp(dist * 5.0f, 0.1f, 5.0f), 0.2f); - + Vector2 newCorrectionMovement = Vector2.Normalize(diff) * MathHelper.Clamp(dist * 5.0f, 0.5f, 5.0f); + newCorrectionMovement.X = Math.Max(newCorrectionMovement.X, 0.5f) * Math.Sign(newCorrectionMovement.X); + + correctionMovement = Vector2.Lerp(targetMovement, newCorrectionMovement, 0.2f); + if (Math.Abs(correctionMovement.Y) < 0.1f) correctionMovement.Y = 0.0f; } } diff --git a/Subsurface/Source/Map/WayPoint.cs b/Subsurface/Source/Map/WayPoint.cs index afeeff74e..3ebce3b5e 100644 --- a/Subsurface/Source/Map/WayPoint.cs +++ b/Subsurface/Source/Map/WayPoint.cs @@ -7,6 +7,7 @@ using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using System.Collections.ObjectModel; +using Barotrauma.Items.Components; namespace Barotrauma { @@ -27,6 +28,8 @@ namespace Barotrauma private Hull currentHull; + public Ladder Ladders; + public Gap ConnectedGap { get; @@ -71,6 +74,7 @@ namespace Barotrauma this.spawnType = spawnType; ConnectedGap = gap; } + public WayPoint(Rectangle newRect, Submarine submarine) : base (submarine) { @@ -252,7 +256,7 @@ namespace Barotrauma continue; } - for (float x = hull.Rect.X + minDist; x <= hull.Rect.X + hull.Rect.Width - minDist; x += minDist) + for (float x = hull.Rect.X + minDist; x <= hull.Rect.Right - minDist; x += minDist) { var wayPoint = new WayPoint(new Vector2(x, hull.Rect.Y - hull.Rect.Height + heightFromFloor), SpawnType.Path, Submarine.Loaded); @@ -325,18 +329,18 @@ namespace Barotrauma WayPoint[] stairPoints = new WayPoint[2]; stairPoints[0] = new WayPoint( - new Vector2(stairs.Rect.X - 50.0f, + new Vector2(stairs.Rect.X - 75.0f, stairs.Rect.Y - (stairs.StairDirection == Direction.Left ? 80 : stairs.Rect.Height) + heightFromFloor), SpawnType.Path, Submarine.Loaded); stairPoints[1] = new WayPoint( - new Vector2(stairs.Rect.Right + 50.0f, + new Vector2(stairs.Rect.Right + 75.0f, stairs.Rect.Y - (stairs.StairDirection == Direction.Left ? stairs.Rect.Height : 80) + heightFromFloor), SpawnType.Path, Submarine.Loaded); for (int i = 0; i < 2; i++ ) { for (int dir = -1; dir <= 1; dir += 2) { - WayPoint closest = stairPoints[i].FindClosest(dir, true, 30.0f); + WayPoint closest = stairPoints[i].FindClosest(dir, true, new Vector2(-30.0f,30f)); if (closest == null) continue; stairPoints[i].ConnectTo(closest); } @@ -354,13 +358,26 @@ namespace Barotrauma ladderPoints[0] = new WayPoint(new Vector2(item.Rect.Center.X, item.Rect.Y - item.Rect.Height + heightFromFloor), SpawnType.Path, Submarine.Loaded); - ladderPoints[1] = new WayPoint(new Vector2(item.Rect.Center.X, item.Rect.Y - heightFromFloor), SpawnType.Path, Submarine.Loaded); + ladderPoints[1] = new WayPoint(new Vector2(item.Rect.Center.X, item.Rect.Y-1.0f), SpawnType.Path, Submarine.Loaded); + + WayPoint prevPoint = ladderPoints[0]; + for (float y = ladderPoints[0].Position.Y+100.0f; y < ladderPoints[1].Position.Y; y+=100.0f ) + { + var midPoint = new WayPoint(new Vector2(item.Rect.Center.X, y), SpawnType.Path, Submarine.Loaded); + midPoint.Ladders = ladders; + + midPoint.ConnectTo(prevPoint); + prevPoint = midPoint; + } + ladderPoints[1].ConnectTo(prevPoint); for (int i = 0; i < 2; i++) { + ladderPoints[i].Ladders = ladders; + for (int dir = -1; dir <= 1; dir += 2) { - WayPoint closest = ladderPoints[i].FindClosest(dir, true, 30.0f); + WayPoint closest = ladderPoints[i].FindClosest(dir, true, new Vector2(-100.0f, 0f)); if (closest == null) continue; ladderPoints[i].ConnectTo(closest); } @@ -373,19 +390,30 @@ namespace Barotrauma { if (!gap.isHorizontal) continue; + //too small to walk through + if (gap.Rect.Height < 150.0f) continue; + var wayPoint = new WayPoint( new Vector2(gap.Rect.Center.X, gap.Rect.Y - gap.Rect.Height + heightFromFloor), SpawnType.Path, Submarine.Loaded, gap); for (int dir = -1; dir <= 1; dir += 2) { - WayPoint closest = wayPoint.FindClosest(dir, true, gap.IsRoomToRoom ? 30.0f : outSideWaypointInterval/2.0f); + float tolerance = gap.IsRoomToRoom ? 30.0f : outSideWaypointInterval / 2.0f; + WayPoint closest = wayPoint.FindClosest(dir, true, new Vector2(-tolerance, tolerance)); if (closest == null) continue; wayPoint.ConnectTo(closest); } } + + var orphans = WayPointList.FindAll(w => w.spawnType == SpawnType.Path && !w.linkedTo.Any()); + + foreach (WayPoint wp in orphans) + { + wp.Remove(); + } } - private WayPoint FindClosest(int dir, bool horizontalSearch, float tolerance) + private WayPoint FindClosest(int dir, bool horizontalSearch, Vector2 tolerance) { if (dir != -1 && dir != 1) return null; @@ -398,7 +426,7 @@ namespace Barotrauma { if (wp.SpawnType != SpawnType.Path || wp == this) continue; - if (Math.Abs(wp.Position.Y - Position.Y) > tolerance) continue; + if ((wp.Position.Y - Position.Y) < tolerance.X || (wp.Position.Y - Position.Y) > tolerance.Y) continue; float diff = wp.Position.X - Position.X; if (Math.Sign(diff) != dir) continue; @@ -419,8 +447,8 @@ namespace Barotrauma private void ConnectTo(WayPoint wayPoint2) { - linkedTo.Add(wayPoint2); - wayPoint2.linkedTo.Add(this); + if (!linkedTo.Contains(wayPoint2)) linkedTo.Add(wayPoint2); + if (!wayPoint2.linkedTo.Contains(this)) wayPoint2.linkedTo.Add(this); } public static WayPoint GetRandom(SpawnType spawnType = SpawnType.None, Job assignedJob = null) diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index a2b073127..1618eb354 100644 Binary files a/Subsurface_Solution.v12.suo and b/Subsurface_Solution.v12.suo differ