diff --git a/Barotrauma/Content/Characters/Crawler/crawler.xml b/Barotrauma/Content/Characters/Crawler/crawler.xml
index a1b1b7cf3..c429a3e9b 100644
--- a/Barotrauma/Content/Characters/Crawler/crawler.xml
+++ b/Barotrauma/Content/Characters/Crawler/crawler.xml
@@ -16,6 +16,7 @@
sight="0.5"
hearing="1.0"
fleehealththreshold="10"
+ attachtowalls="true"
attackcooldown="3.0"/>
0)
+ {
+ Body closestBody = Submarine.CheckVisibility(Character.SimPosition, ConvertUnits.ToSimUnits(cells[0].Center));
+ if (closestBody != null && closestBody.UserData is Voronoi2.VoronoiCell)
+ {
+ wallAttackPos = Submarine.LastPickedPosition;
+ }
+ }
+ raycastTimer = RaycastInterval;
+ }
}
else
{
- steeringManager.SteeringAvoid(deltaTime, 0.1f);
- steeringManager.SteeringWander(0.5f);
+ wallAttackPos = Vector2.Zero;
}
- attackingLimb = null;
- attackTimer = 0.0f;
+ if (wallAttackPos == Vector2.Zero)
+ {
+ //wander around randomly
+ steeringManager.SteeringAvoid(deltaTime, 0.1f);
+ steeringManager.SteeringWander(0.5f);
+ return;
+ }
- coolDownTimer -= deltaTime;
+ float dist = Vector2.Distance(SimPosition, wallAttackPos);
+ if (dist < Math.Max(Math.Max(Character.AnimController.Collider.radius, Character.AnimController.Collider.width), Character.AnimController.Collider.height) * 1.2f)
+ {
+ //close enough to a wall -> attach
+ Character.AnimController.Collider.MoveToPos(wallAttackPos, 1.0f);
+ steeringManager.Reset();
+
+ }
+ else
+ {
+ //move closer to the wall
+ steeringManager.SteeringAvoid(deltaTime, 0.1f);
+ steeringManager.SteeringSeek(wallAttackPos);
+ }
}
-
+
+ #endregion
+
+ #region Escape
+
+ private void UpdateEscape(float deltaTime)
+ {
+ SteeringManager.SteeringManual(deltaTime, Vector2.Normalize(SimPosition - selectedAiTarget.SimPosition) * 5);
+ SteeringManager.SteeringWander(1.0f);
+ SteeringManager.SteeringAvoid(deltaTime, 2f);
+ }
+
+ #endregion
+
+ #region Attack
+
private void UpdateAttack(float deltaTime)
{
if (selectedAiTarget == null || selectedAiTarget.Entity == null || selectedAiTarget.Entity.Removed)
@@ -250,7 +310,7 @@ namespace Barotrauma
}
}
}
-
+
if (Math.Abs(Character.AnimController.movement.X) > 0.1f && !Character.AnimController.InWater)
{
Character.AnimController.TargetDir = Character.SimPosition.X < attackSimPosition.X ? Direction.Right : Direction.Left;
@@ -281,13 +341,13 @@ namespace Barotrauma
{
foreach (Limb limb in Character.AnimController.Limbs)
{
- if (limb.attack==null) continue;
+ if (limb.attack == null) continue;
attackLimb = limb;
if (ConvertUnits.ToDisplayUnits(Vector2.Distance(limb.SimPosition, attackSimPosition)) > limb.attack.Range) continue;
-
+
attackingLimb = limb;
- break;
+ break;
}
if (Character.IsRemotePlayer)
@@ -302,37 +362,14 @@ namespace Barotrauma
if (steeringManager is IndoorsSteeringManager)
{
var indoorsSteering = (IndoorsSteeringManager)steeringManager;
- if (indoorsSteering.CurrentPath!=null && (indoorsSteering.CurrentPath.Finished || indoorsSteering.CurrentPath.Unreachable))
+ if (indoorsSteering.CurrentPath != null && (indoorsSteering.CurrentPath.Finished || indoorsSteering.CurrentPath.Unreachable))
{
steeringManager.SteeringManual(deltaTime, attackSimPosition - attackLimb.SimPosition);
}
}
if (attackingLimb != null) UpdateLimbAttack(deltaTime, attackingLimb, attackSimPosition);
- }
- }
-
- private void UpdateEscape(float deltaTime)
- {
- SteeringManager.SteeringManual(deltaTime, Vector2.Normalize(SimPosition - selectedAiTarget.SimPosition) * 5);
- SteeringManager.SteeringWander(1.0f);
- SteeringManager.SteeringAvoid(deltaTime, 2f);
- }
-
- private void UpdateCoolDown(Vector2 attackPosition, float deltaTime)
- {
- coolDownTimer -= deltaTime;
- attackingLimb = null;
-
- float dist = Vector2.Distance(attackPosition, Character.SimPosition);
-
- if (dist < ConvertUnits.ToSimUnits(500.0f))
- {
- steeringManager.SteeringSeek(attackPosition, -0.8f);
- steeringManager.SteeringManual(deltaTime, Vector2.Normalize(Character.SimPosition - attackPosition) * (1.0f - (dist / 500.0f)));
}
-
- steeringManager.SteeringAvoid(deltaTime, 1.0f);
}
private void GetTargetEntity()
@@ -424,6 +461,26 @@ namespace Barotrauma
}
}
+ private void UpdateCoolDown(Vector2 attackPosition, float deltaTime)
+ {
+ coolDownTimer -= deltaTime;
+ attackingLimb = null;
+
+ float dist = Vector2.Distance(attackPosition, Character.SimPosition);
+
+ if (dist < ConvertUnits.ToSimUnits(500.0f))
+ {
+ steeringManager.SteeringSeek(attackPosition, -0.8f);
+ steeringManager.SteeringManual(deltaTime, Vector2.Normalize(Character.SimPosition - attackPosition) * (1.0f - (dist / 500.0f)));
+ }
+
+ steeringManager.SteeringAvoid(deltaTime, 1.0f);
+ }
+
+ #endregion
+
+ #region Eat
+
private void UpdateEating(float deltaTime)
{
if (selectedAiTarget == null || selectedAiTarget.Entity == null || selectedAiTarget.Entity.Removed)
@@ -505,6 +562,10 @@ namespace Barotrauma
}
}
+ #endregion
+
+ #region Targeting
+
//goes through all the AItargets, evaluates how preferable it is to attack the target,
//whether the Character can see/hear the target and chooses the most preferable target within
//sight/hearing range
@@ -603,21 +664,6 @@ namespace Barotrauma
Body closestBody = Submarine.CheckVisibility(rayStart, rayEnd);
Structure closestStructure = (closestBody == null) ? null : closestBody.UserData as Structure;
-
- /* float targetStrength = 0.0f;
- if (targetDamageable != null)
- {
- targetStrength = targetDamageable.Health;
- }
- else if (closestStructure!=null)
- {
- targetStrength = ((IDamageable)closestStructure).Health;
- }
- else
- {
- targetStrength = 1000.0f;
- }*/
-;
if (selectedAiTarget == null || Math.Abs(valueModifier) > Math.Abs(targetValue))
{
@@ -669,6 +715,8 @@ namespace Barotrauma
}
}
+ #endregion
+
public override void DebugDraw(SpriteBatch spriteBatch)
{
if (Character.IsDead) return;