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;