rollWithExplode method

UnmodifiableListView<int> rollWithExplode({
  1. required int ndice,
  2. required int nsides,
  3. bool explode = false,
  4. int explodeLimit = defaultExplodeLimit,
})

return result of rolling given number of nsided dice.

Implementation

UnmodifiableListView<int> rollWithExplode({
  required int ndice,
  required int nsides,
  bool explode = false,
  int explodeLimit = defaultExplodeLimit,
}) {
  RangeError.checkValueInInterval(ndice, minDice, maxDice, 'ndice');
  RangeError.checkValueInInterval(nsides, minSides, maxSides, 'nsides');

  final results = <int>[];
  var numToRoll = ndice;

  var explodeCount = 0;
  while (numToRoll > 0 && explodeCount <= explodeLimit) {
    if (explodeCount > 0) {
      _log.finest(() => "explode $numToRoll !");
    }
    final localResults = roll(numToRoll, nsides);
    results.addAll(localResults);
    if (!explode) {
      break;
    }
    if (nsides == 1) {
      _log.finer("1-sided dice cannot explode");
      break;
    }

    explodeCount++;
    numToRoll = localResults.where((v) => v == nsides).length;
  }

  _log.finest(() => "roll ${ndice}d!$nsides => $results");
  return UnmodifiableListView(results);
}