protected void updateAsMobile() {
    final Target target = this.targetFor(null) ;
    float idealHeight = DEFAULT_FLY_HEIGHT ;
    
    if (! health.conscious()) idealHeight = 0 ;
    else if (target == null) idealHeight = flyHeight ;
    else if (target instanceof Tile) idealHeight = DEFAULT_FLY_HEIGHT ;
    else if (Spacing.distance(target, this) < health.sightRange()) {
      idealHeight = target.position(null).z + (target.height() / 2f) - 0.5f ;
    }
    
    final float MFI = 1f / (2 * PlayLoop.UPDATES_PER_SECOND) ;
    flyHeight = Visit.clamp(idealHeight, flyHeight - MFI, flyHeight + MFI) ;
    super.updateAsMobile() ;
  }