protected void updateAsMobile() {
    super.updateAsMobile() ;
    if (pilot != null) updatePiloting() ;
    else motion.updateTarget(motion.target()) ;
    final Boardable step = motion.nextStep() ;
    
    if (motion.checkPathingOkay() && step != null) {
      float moveRate = baseMoveRate() ;
      if (origin().pathType() == Tile.PATH_ROAD) moveRate *= 1.5f ;
      if (origin().owner() instanceof Causeway) moveRate *= 1.5f ;
      moveRate *= (pilotBonus + 1) / 2 ;
      motion.headTowards(step, moveRate, true) ;
    }
    else world.schedule.scheduleNow(this) ;
  }