offlineEarnings function

double offlineEarnings({
  1. required int lastClaimedMs,
  2. required int nowMs,
  3. required int maxOfflineCapMs,
  4. required double productionRatePerSecond,
})

Same formula as OfflineProgressionService._earningsAt(): earnings accrued between lastClaimedMs and nowMs, capped at maxOfflineCapMs elapsed, at productionRatePerSecond.

Throws ArgumentError for a negative maxOfflineCapMs or a non-finite/negative productionRatePerSecond — same validation as the real service, so a misconfigured simulator scenario fails exactly the same way a misconfigured real service would.

Implementation

double offlineEarnings({
  required int lastClaimedMs,
  required int nowMs,
  required int maxOfflineCapMs,
  required double productionRatePerSecond,
}) {
  if (maxOfflineCapMs < 0) {
    throw ArgumentError.value(
      maxOfflineCapMs,
      'maxOfflineCapMs',
      'must be >= 0',
    );
  }
  if (!productionRatePerSecond.isFinite || productionRatePerSecond < 0) {
    throw ArgumentError.value(
      productionRatePerSecond,
      'productionRatePerSecond',
      'must be finite and >= 0',
    );
  }

  final elapsedMs = (nowMs - lastClaimedMs).clamp(0, maxOfflineCapMs);
  return elapsedMs / 1000 * productionRatePerSecond;
}