@Override
  public void advance(float amount) {
    if (Global.getCombatEngine() == null) return;

    float t = Global.getCombatEngine().getTotalElapsedTime(false);
    if (t > timeOfNextUpdate) {
      timeOfNextUpdate = t + UPDATE_FREQUENCY;

      if (findTarget() == null) return;

      float selfOverloadTime = IceUtils.getBaseOverloadDuration(ship);
      float targetOverloadTime =
          IceUtils.estimateOverloadDurationOnHit(
              target, weapon.getDerivedStats().getDamagePerShot(), weapon.getDamageType());
      float incomingMissileDamage = IceUtils.estimateIncomingMissileDamage(ship);
      float fpOfSupport = IceUtils.getFPWorthOfSupport(ship, 2000);
      float fpOfEnemies = IceUtils.getFPWorthOfHostility(ship, 2000);
      fpOfEnemies = Math.max(0, fpOfEnemies - IceUtils.getFP(target) / 2);

      hitChance = IceUtils.getHitChance(weapon, target);
      targetWillDieSoonAnyway = (IceUtils.getLifeExpectancy(ship) < 3);
      overloadBalance = targetOverloadTime - selfOverloadTime;
      fpRatio = IceUtils.getFPStrength(target) / IceUtils.getFPStrength(ship);
      danger = Math.max(0, fpOfEnemies - fpOfSupport + incomingMissileDamage / 100f);
    }
  }