(0eef99a8b) Don't change targets, wander or stay still in ladders. Don't stay still in water. Improve bot behavior in close spaces.

This commit is contained in:
Joonas Rikkonen
2019-04-08 13:36:16 +03:00
parent 9c07ebda53
commit 10776572d2
2 changed files with 78 additions and 43 deletions
@@ -61,7 +61,7 @@ namespace Barotrauma
if (vanillaContent == null) if (vanillaContent == null)
{ {
// TODO: Dynamic method for defining and finding the vanilla content package. // TODO: Dynamic method for defining and finding the vanilla content package.
vanillaContent = ContentPackage.List.SingleOrDefault(cp => Path.GetFileName(cp.Path).ToLowerInvariant() == "vanilla 0.9.xml"); vanillaContent = SelectedPackages.SingleOrDefault(cp => Path.GetFileName(cp.Path).ToLowerInvariant() == "vanilla 0.9.xml");
} }
return vanillaContent; return vanillaContent;
} }
@@ -62,9 +62,24 @@ namespace Barotrauma
newTargetTimer = 0; newTargetTimer = 0;
standStillTimer = 0; standStillTimer = 0;
} }
if (character.AnimController.InWater || character.IsClimbing) else if (character.IsClimbing)
{ {
standStillTimer = 0; if (currentTarget == null)
{
newTargetTimer = 0;
}
else
{
// Don't allow new targets when climbing.
newTargetTimer = Math.Max(newTargetIntervalMin, newTargetTimer);
}
}
else if (character.AnimController.InWater)
{
if (currentTarget == null)
{
newTargetTimer = 0;
}
} }
if (newTargetTimer <= 0.0f) if (newTargetTimer <= 0.0f)
{ {
@@ -122,8 +137,12 @@ namespace Barotrauma
// - if reached the end of the path // - if reached the end of the path
// - if the target is unreachable // - if the target is unreachable
// - if the path requires going outside // - if the path requires going outside
if (!character.IsClimbing)
{
if (SteeringManager != PathSteering || (PathSteering.CurrentPath != null && if (SteeringManager != PathSteering || (PathSteering.CurrentPath != null &&
(PathSteering.CurrentPath.NextNode == null || PathSteering.CurrentPath.Unreachable || PathSteering.CurrentPath.HasOutdoorsNodes))) (PathSteering.CurrentPath.NextNode == null || PathSteering.CurrentPath.Unreachable || PathSteering.CurrentPath.HasOutdoorsNodes)))
{
if (!character.AnimController.InWater)
{ {
standStillTimer -= deltaTime; standStillTimer -= deltaTime;
if (standStillTimer > 0.0f) if (standStillTimer > 0.0f)
@@ -136,10 +155,11 @@ namespace Barotrauma
{ {
standStillTimer = Rand.Range(standStillMin, standStillMax); standStillTimer = Rand.Range(standStillMin, standStillMax);
} }
}
Wander(deltaTime); Wander(deltaTime);
return; return;
} }
}
if (currentTarget != null) if (currentTarget != null)
{ {
@@ -149,11 +169,20 @@ namespace Barotrauma
public void Wander(float deltaTime) public void Wander(float deltaTime)
{ {
if (character.IsClimbing) { return; }
//steer away from edges of the hull //steer away from edges of the hull
if (character.AnimController.CurrentHull != null && !character.IsClimbing) var currentHull = character.CurrentHull;
if (currentHull != null)
{ {
float leftDist = character.Position.X - character.AnimController.CurrentHull.Rect.X; float roomWidth = currentHull.Rect.Width;
float rightDist = character.AnimController.CurrentHull.Rect.Right - character.Position.X; if (roomWidth < WallAvoidDistance * 4)
{
PathSteering.Reset();
}
else
{
float leftDist = character.Position.X - currentHull.Rect.X;
float rightDist = currentHull.Rect.Right - character.Position.X;
if (leftDist < WallAvoidDistance && rightDist < WallAvoidDistance) if (leftDist < WallAvoidDistance && rightDist < WallAvoidDistance)
{ {
if (Math.Abs(rightDist - leftDist) > WallAvoidDistance / 2) if (Math.Abs(rightDist - leftDist) > WallAvoidDistance / 2)
@@ -167,14 +196,14 @@ namespace Barotrauma
} }
else if (leftDist < WallAvoidDistance) else if (leftDist < WallAvoidDistance)
{ {
//PathSteering.SteeringManual(deltaTime, Vector2.UnitX * (WallAvoidDistance - leftDist) / WallAvoidDistance); float speed = (WallAvoidDistance - leftDist) / WallAvoidDistance;
PathSteering.SteeringManual(deltaTime, Vector2.UnitX); PathSteering.SteeringManual(deltaTime, Vector2.UnitX * MathHelper.Clamp(speed, 0.25f, 1));
PathSteering.WanderAngle = 0.0f; PathSteering.WanderAngle = 0.0f;
} }
else if (rightDist < WallAvoidDistance) else
{ {
//PathSteering.SteeringManual(deltaTime, -Vector2.UnitX * (WallAvoidDistance - rightDist) / WallAvoidDistance); float speed = (WallAvoidDistance - rightDist) / WallAvoidDistance;
PathSteering.SteeringManual(deltaTime, -Vector2.UnitX); PathSteering.SteeringManual(deltaTime, -Vector2.UnitX * MathHelper.Clamp(speed, 0.25f, 1));
PathSteering.WanderAngle = MathHelper.Pi; PathSteering.WanderAngle = MathHelper.Pi;
} }
else else
@@ -182,11 +211,12 @@ namespace Barotrauma
SteeringManager.SteeringWander(); SteeringManager.SteeringWander();
} }
} }
}
else else
{ {
SteeringManager.SteeringWander(); SteeringManager.SteeringWander();
} }
if (!character.IsClimbing && !character.AnimController.InWater) if (!character.AnimController.InWater)
{ {
//reset vertical steering to prevent dropping down from platforms etc //reset vertical steering to prevent dropping down from platforms etc
character.AIController.SteeringManager.ResetY(); character.AIController.SteeringManager.ResetY();
@@ -221,7 +251,12 @@ namespace Barotrauma
if (!targetHulls.Contains(hull)) if (!targetHulls.Contains(hull))
{ {
targetHulls.Add(hull); targetHulls.Add(hull);
hullWeights.Add(hull.Volume); float weight = hull.Volume;
// Prefer rooms that are closer. Avoid rooms that are not in the same level.
float dist = Math.Abs(character.WorldPosition.X - hull.WorldPosition.X) + Math.Abs(character.WorldPosition.Y - hull.WorldPosition.Y) * 5.0f;
float distanceFactor = MathHelper.Lerp(1, 0.1f, MathUtils.InverseLerp(0, 2500, dist));
weight *= distanceFactor;
hullWeights.Add(weight);
} }
} }