AI using ladders
This commit is contained in:
Binary file not shown.
@@ -58,7 +58,31 @@ namespace Barotrauma
|
|||||||
|
|
||||||
objectiveManager.DoCurrentObjective(deltaTime);
|
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<Items.Components.Ladder>()!=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))
|
if (Character.IsKeyDown(InputType.Aim))
|
||||||
{
|
{
|
||||||
@@ -69,10 +93,8 @@ namespace Barotrauma
|
|||||||
Character.AnimController.TargetDir = Character.AnimController.TargetMovement.X > 0.0f ? Direction.Right : Direction.Left;
|
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)
|
public override void OnAttacked(IDamageable attacker, float amount)
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ namespace Barotrauma
|
|||||||
|
|
||||||
if (diff == Vector2.Zero) return -host.Steering;
|
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()
|
private Vector2 DiffToCurrentNode()
|
||||||
@@ -107,15 +107,23 @@ namespace Barotrauma
|
|||||||
pos -= Submarine.Loaded.SimPosition;
|
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);
|
currentPath.CheckProgress(pos, allowedDistance);
|
||||||
|
|
||||||
if (currentPath.CurrentNode == null) return Vector2.Zero;
|
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;
|
return currentPath.CurrentNode.SimPosition - pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ namespace Barotrauma
|
|||||||
|
|
||||||
protected override void Act(float deltaTime)
|
protected override void Act(float deltaTime)
|
||||||
{
|
{
|
||||||
if (character.SelectedConstruction!=null)
|
if (character.SelectedConstruction!=null && character.SelectedConstruction.GetComponent<Ladder>()==null)
|
||||||
{
|
{
|
||||||
character.SelectedConstruction = null;
|
character.SelectedConstruction = null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -794,8 +794,10 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
correctionMovement =
|
Vector2 newCorrectionMovement = Vector2.Normalize(diff) * MathHelper.Clamp(dist * 5.0f, 0.5f, 5.0f);
|
||||||
Vector2.Lerp(targetMovement, Vector2.Normalize(diff) * MathHelper.Clamp(dist * 5.0f, 0.1f, 5.0f), 0.2f);
|
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;
|
if (Math.Abs(correctionMovement.Y) < 0.1f) correctionMovement.Y = 0.0f;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ using Microsoft.Xna.Framework;
|
|||||||
using Microsoft.Xna.Framework.Graphics;
|
using Microsoft.Xna.Framework.Graphics;
|
||||||
using Microsoft.Xna.Framework.Input;
|
using Microsoft.Xna.Framework.Input;
|
||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
|
using Barotrauma.Items.Components;
|
||||||
|
|
||||||
namespace Barotrauma
|
namespace Barotrauma
|
||||||
{
|
{
|
||||||
@@ -27,6 +28,8 @@ namespace Barotrauma
|
|||||||
|
|
||||||
private Hull currentHull;
|
private Hull currentHull;
|
||||||
|
|
||||||
|
public Ladder Ladders;
|
||||||
|
|
||||||
public Gap ConnectedGap
|
public Gap ConnectedGap
|
||||||
{
|
{
|
||||||
get;
|
get;
|
||||||
@@ -71,6 +74,7 @@ namespace Barotrauma
|
|||||||
this.spawnType = spawnType;
|
this.spawnType = spawnType;
|
||||||
ConnectedGap = gap;
|
ConnectedGap = gap;
|
||||||
}
|
}
|
||||||
|
|
||||||
public WayPoint(Rectangle newRect, Submarine submarine)
|
public WayPoint(Rectangle newRect, Submarine submarine)
|
||||||
: base (submarine)
|
: base (submarine)
|
||||||
{
|
{
|
||||||
@@ -252,7 +256,7 @@ namespace Barotrauma
|
|||||||
continue;
|
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);
|
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];
|
WayPoint[] stairPoints = new WayPoint[2];
|
||||||
|
|
||||||
stairPoints[0] = new WayPoint(
|
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);
|
stairs.Rect.Y - (stairs.StairDirection == Direction.Left ? 80 : stairs.Rect.Height) + heightFromFloor), SpawnType.Path, Submarine.Loaded);
|
||||||
|
|
||||||
stairPoints[1] = new WayPoint(
|
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);
|
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 i = 0; i < 2; i++ )
|
||||||
{
|
{
|
||||||
for (int dir = -1; dir <= 1; dir += 2)
|
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;
|
if (closest == null) continue;
|
||||||
stairPoints[i].ConnectTo(closest);
|
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[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++)
|
for (int i = 0; i < 2; i++)
|
||||||
{
|
{
|
||||||
|
ladderPoints[i].Ladders = ladders;
|
||||||
|
|
||||||
for (int dir = -1; dir <= 1; dir += 2)
|
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;
|
if (closest == null) continue;
|
||||||
ladderPoints[i].ConnectTo(closest);
|
ladderPoints[i].ConnectTo(closest);
|
||||||
}
|
}
|
||||||
@@ -373,19 +390,30 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
if (!gap.isHorizontal) continue;
|
if (!gap.isHorizontal) continue;
|
||||||
|
|
||||||
|
//too small to walk through
|
||||||
|
if (gap.Rect.Height < 150.0f) continue;
|
||||||
|
|
||||||
var wayPoint = new WayPoint(
|
var wayPoint = new WayPoint(
|
||||||
new Vector2(gap.Rect.Center.X, gap.Rect.Y - gap.Rect.Height + heightFromFloor), SpawnType.Path, Submarine.Loaded, gap);
|
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)
|
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;
|
if (closest == null) continue;
|
||||||
wayPoint.ConnectTo(closest);
|
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;
|
if (dir != -1 && dir != 1) return null;
|
||||||
|
|
||||||
@@ -398,7 +426,7 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
if (wp.SpawnType != SpawnType.Path || wp == this) continue;
|
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;
|
float diff = wp.Position.X - Position.X;
|
||||||
if (Math.Sign(diff) != dir) continue;
|
if (Math.Sign(diff) != dir) continue;
|
||||||
@@ -419,8 +447,8 @@ namespace Barotrauma
|
|||||||
|
|
||||||
private void ConnectTo(WayPoint wayPoint2)
|
private void ConnectTo(WayPoint wayPoint2)
|
||||||
{
|
{
|
||||||
linkedTo.Add(wayPoint2);
|
if (!linkedTo.Contains(wayPoint2)) linkedTo.Add(wayPoint2);
|
||||||
wayPoint2.linkedTo.Add(this);
|
if (!wayPoint2.linkedTo.Contains(this)) wayPoint2.linkedTo.Add(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static WayPoint GetRandom(SpawnType spawnType = SpawnType.None, Job assignedJob = null)
|
public static WayPoint GetRandom(SpawnType spawnType = SpawnType.None, Job assignedJob = null)
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user