public void headTowards(
    Target target, float speed, boolean moves
  ) {
    //
    //  Determine the appropriate offset and angle for this target-
    if (target == null) return ;
    final Vec2D disp = displacement(target) ;
    final float dist = disp.length() ;
    float angle = dist == 0 ? 0 : disp.normalise().toAngle() ;
    float moveRate = moves ? (speed / PlayLoop.UPDATES_PER_SECOND) : 0 ;
    //
    //  Determine how far one can move this update, including limits on
    //  maximum rotation-
    final float maxRotate = speed * 180 / PlayLoop.UPDATES_PER_SECOND ;
    final float
      angleDif = Vec2D.degreeDif(angle, mobile.rotation),
      absDif   = Math.abs(angleDif) ;
    if (absDif > maxRotate) {
      angle = mobile.rotation + (maxRotate * (angleDif > 0 ? 1 : -1)) ;
      angle = (angle + 360) % 360 ;
      moveRate *= (180 - absDif) / 180 ;
    }
    disp.scale(Math.min(moveRate, dist)) ;
    //
    //  Then apply the changes in heading-
    mobile.nextPosition.x = disp.x + mobile.position.x ;
    mobile.nextPosition.y = disp.y + mobile.position.y ;
    mobile.nextRotation = angle ;
    if (
      Float.isNaN(mobile.nextPosition.x) ||
      Float.isNaN(mobile.nextPosition.y)
    ) {
      I.say("ILLEGAL POSITION") ;
      new Exception().printStackTrace() ;
    }
  }