public static boolean hasArrived(Entity entity) {
   EnemyMovement enemyMovement = EntityUtil.getComponent(entity, EnemyMovement.class);
   Vector2 intent = enemyMovement.getIntent().cpy();
   Vector2 position = PhysicsUtil.getPosition(entity);
   intent.y = position.y;
   return position.epsilonEquals(intent, Constants.GAME.EPSILON);
 }
  public static void chase(Entity chaser, Entity target, boolean isHorizontal) {
    Body targetBody = EntityUtil.getComponent(target, Physics.class).getBody();

    if (isHorizontal) {
      moveEnemyTo(chaser, targetBody.getPosition());
    } else {
      moveTo(chaser, targetBody.getPosition());
    }
  }
 public static void drag(Entity enemy, Vector2 target, float force, int duration) {
   EnemyMovement movement = EntityUtil.getComponent(enemy, EnemyMovement.class);
   if (movement != null) {
     movement.setDraggedTo(target);
     movement.setDragForce(force);
     movement.setDragDuration(duration);
     movement.setStartDrag(TimeUtil.getGameTime());
     movement.setDraggedFrom(PhysicsUtil.getPosition(enemy));
   }
 }
  public static void moveEnemyTo(Entity entity, Vector2 destination) {
    if (!EntityUtil.isEnemy(entity)) {
      return;
    }

    Body body = EntityUtil.getComponent(entity, Physics.class).getBody();
    destination.y = body.getPosition().y;

    moveTo(entity, destination);
  }
 public static void use(Entity entity, String name) {
   Ability abilityComponent = EntityUtil.getComponent(entity, Ability.class);
   if (abilityComponent == null) {
     return;
   }
   AbilityInfo ability = abilityComponent.getAbility(name);
   if (ability == null) {
     return;
   }
   ability.getAbility().cast(entity);
   ability.setLastCast(TimeUtil.getGameTime());
 }
 public static boolean isAvailable(Entity entity, String name) {
   Ability abilityComponent = EntityUtil.getComponent(entity, Ability.class);
   if (abilityComponent == null) {
     return false;
   }
   AbilityInfo ability = abilityComponent.getAbility(name);
   if (ability == null) {
     return false;
   }
   long lastCast = ability.getLastCast();
   return lastCast == -1 || (TimeUtil.getGameTime() - lastCast > ability.getCooldown());
 }
  public static void moveTo(Entity entity, Vector2 destination) {
    Physics physicsComponent = EntityUtil.getComponent(entity, Physics.class);
    Body body = physicsComponent.getBody();
    float mass = body.getMass();
    Vector2 currentVelocity = body.getLinearVelocity();
    Vector2 position = body.getPosition();

    Vector2 desiredVelocity =
        destination.cpy().sub(position).nor().scl(physicsComponent.getMaxSpeed());

    Vector2 impulse = desiredVelocity.sub(currentVelocity).scl(mass);

    PhysicsUtil.applyImpulse(entity, impulse);
  }
 public static void setTarget(Entity enemy, Vector2 target) {
   EnemyMovement movement = EntityUtil.getComponent(enemy, EnemyMovement.class);
   if (movement != null) {
     movement.setIntent(target);
   }
 }