diff --git a/Barotrauma/BarotraumaClient/Source/GameMain.cs b/Barotrauma/BarotraumaClient/Source/GameMain.cs index 10fa40667..14fe0e948 100644 --- a/Barotrauma/BarotraumaClient/Source/GameMain.cs +++ b/Barotrauma/BarotraumaClient/Source/GameMain.cs @@ -61,7 +61,7 @@ namespace Barotrauma if (vanillaContent == null) { // 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; } diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveIdle.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveIdle.cs index bad0fcffd..30248ca2e 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveIdle.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveIdle.cs @@ -62,9 +62,24 @@ namespace Barotrauma newTargetTimer = 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) { @@ -122,23 +137,28 @@ namespace Barotrauma // - if reached the end of the path // - if the target is unreachable // - if the path requires going outside - if (SteeringManager != PathSteering || (PathSteering.CurrentPath != null && - (PathSteering.CurrentPath.NextNode == null || PathSteering.CurrentPath.Unreachable || PathSteering.CurrentPath.HasOutdoorsNodes))) + if (!character.IsClimbing) { - standStillTimer -= deltaTime; - if (standStillTimer > 0.0f) + if (SteeringManager != PathSteering || (PathSteering.CurrentPath != null && + (PathSteering.CurrentPath.NextNode == null || PathSteering.CurrentPath.Unreachable || PathSteering.CurrentPath.HasOutdoorsNodes))) { - walkDuration = Rand.Range(walkDurationMin, walkDurationMax); - PathSteering.Reset(); + if (!character.AnimController.InWater) + { + standStillTimer -= deltaTime; + if (standStillTimer > 0.0f) + { + walkDuration = Rand.Range(walkDurationMin, walkDurationMax); + PathSteering.Reset(); + return; + } + if (standStillTimer < -walkDuration) + { + standStillTimer = Rand.Range(standStillMin, standStillMax); + } + } + Wander(deltaTime); return; } - if (standStillTimer < -walkDuration) - { - standStillTimer = Rand.Range(standStillMin, standStillMax); - } - - Wander(deltaTime); - return; } if (currentTarget != null) @@ -149,44 +169,54 @@ namespace Barotrauma public void Wander(float deltaTime) { + if (character.IsClimbing) { return; } //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 rightDist = character.AnimController.CurrentHull.Rect.Right - character.Position.X; - if (leftDist < WallAvoidDistance && rightDist < WallAvoidDistance) + float roomWidth = currentHull.Rect.Width; + if (roomWidth < WallAvoidDistance * 4) { - if (Math.Abs(rightDist - leftDist) > WallAvoidDistance / 2) - { - PathSteering.SteeringManual(deltaTime, Vector2.UnitX * Math.Sign(rightDist - leftDist)); - } - else - { - PathSteering.Reset(); - } - } - else if (leftDist < WallAvoidDistance) - { - //PathSteering.SteeringManual(deltaTime, Vector2.UnitX * (WallAvoidDistance - leftDist) / WallAvoidDistance); - PathSteering.SteeringManual(deltaTime, Vector2.UnitX); - PathSteering.WanderAngle = 0.0f; - } - else if (rightDist < WallAvoidDistance) - { - //PathSteering.SteeringManual(deltaTime, -Vector2.UnitX * (WallAvoidDistance - rightDist) / WallAvoidDistance); - PathSteering.SteeringManual(deltaTime, -Vector2.UnitX); - PathSteering.WanderAngle = MathHelper.Pi; + PathSteering.Reset(); } else { - SteeringManager.SteeringWander(); + float leftDist = character.Position.X - currentHull.Rect.X; + float rightDist = currentHull.Rect.Right - character.Position.X; + if (leftDist < WallAvoidDistance && rightDist < WallAvoidDistance) + { + if (Math.Abs(rightDist - leftDist) > WallAvoidDistance / 2) + { + PathSteering.SteeringManual(deltaTime, Vector2.UnitX * Math.Sign(rightDist - leftDist)); + } + else + { + PathSteering.Reset(); + } + } + else if (leftDist < WallAvoidDistance) + { + float speed = (WallAvoidDistance - leftDist) / WallAvoidDistance; + PathSteering.SteeringManual(deltaTime, Vector2.UnitX * MathHelper.Clamp(speed, 0.25f, 1)); + PathSteering.WanderAngle = 0.0f; + } + else + { + float speed = (WallAvoidDistance - rightDist) / WallAvoidDistance; + PathSteering.SteeringManual(deltaTime, -Vector2.UnitX * MathHelper.Clamp(speed, 0.25f, 1)); + PathSteering.WanderAngle = MathHelper.Pi; + } + else + { + SteeringManager.SteeringWander(); + } } } else { SteeringManager.SteeringWander(); } - if (!character.IsClimbing && !character.AnimController.InWater) + if (!character.AnimController.InWater) { //reset vertical steering to prevent dropping down from platforms etc character.AIController.SteeringManager.ResetY(); @@ -221,7 +251,12 @@ namespace Barotrauma if (!targetHulls.Contains(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); } }