protected void updateAsMobile() {
    //
    //  Firstly, check whether you even need to exist any more-
    super.updateAsMobile() ;
    if (
      (! followed.inWorld()) ||
      ! followed.mind.agenda().includes(tracked)
    ) {
      if (passenger != null) {
        ////I.say("Depositing passenger...") ;
        final Tile o = origin() ;
        passenger.setPosition(o.x, o.y, world) ;
      }
      exitWorld() ;
      return ;
    }
    //
    //  If so, update your position so as to follow behind the actor-
    final Vec3D FP = followed.position(null) ;
    final Vec2D FR = new Vec2D().setFromAngle(followed.rotation()) ;
    final float idealDist = followed.radius() + this.radius() ;
    FR.scale(0 - idealDist) ;
    FP.x += FR.x ;
    FP.y += FR.y ;
    nextPosition.setTo(FP) ;
    nextPosition.z = aboveGroundHeight() ;
    nextRotation = followed.rotation() ;
    //
    //  And if you have a passenger, update their position.
    if (passenger != null) {
      if (followed.indoors()) {
        final Boardable toBoard = followed.aboard() ;
        ///I.say("Transferring "+passenger+" to: "+toBoard) ;
        passenger.goAboard(toBoard, world) ;
        passenger.setHeading(toBoard.position(null), 0, false, world) ;
      }
      else {
        final Vec3D raise = new Vec3D(nextPosition) ;
        raise.z += 0.15f ;
        passenger.setHeading(raise, nextRotation, false, world) ;
      }
    }
  }