@yipe/dice 0.2.7 → 0.2.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2429,6 +2429,12 @@ var defaultConfig = {
2429
2429
  keep: void 0,
2430
2430
  rollType: "flat"
2431
2431
  };
2432
+ var rollConfigsEqual = (a, b) => {
2433
+ return a.count === b.count && a.sides === b.sides && a.modifier === b.modifier && a.reroll === b.reroll && a.explode === b.explode && a.minimum === b.minimum && a.bestOf === b.bestOf && a.keep === b.keep && a.rollType === b.rollType;
2434
+ };
2435
+ var configComplexityScore = (config) => {
2436
+ return (config.reroll > 0 ? 1 : 0) + (config.explode > 0 ? 1 : 0) + (config.minimum > 0 ? 1 : 0) + (config.bestOf > 0 ? 1 : 0) + (config.keep !== void 0 ? 1 : 0) + (config.rollType !== "flat" ? 1 : 0);
2437
+ };
2432
2438
  var RollBuilder = class _RollBuilder {
2433
2439
  constructor(countOrConfigs = 1) {
2434
2440
  __publicField(this, "subRollConfigs");
@@ -2649,13 +2655,19 @@ var RollBuilder = class _RollBuilder {
2649
2655
  ];
2650
2656
  return new this.constructor(configs);
2651
2657
  }
2652
- doubleDice() {
2658
+ scaleDice(scale) {
2659
+ const scaleInt = Math.floor(scale);
2660
+ if (scaleInt !== scale) throw new Error("Scale must be an integer");
2661
+ if (scaleInt <= 0) throw new Error("Scale must be > 0");
2653
2662
  const newConfigs = this.getSubRollConfigs().map((config) => {
2654
2663
  if (!config.sides || config.sides <= 0) return config;
2655
- return { ...config, count: config.count * 2 };
2664
+ return { ...config, count: config.count * scaleInt };
2656
2665
  });
2657
2666
  return new this.constructor(newConfigs);
2658
2667
  }
2668
+ doubleDice() {
2669
+ return this.scaleDice(2);
2670
+ }
2659
2671
  copy() {
2660
2672
  return new this.constructor(this.getSubRollConfigs());
2661
2673
  }
@@ -2698,12 +2710,9 @@ var RollBuilder = class _RollBuilder {
2698
2710
  })).sort((a, b) => {
2699
2711
  const aHasPriority = a.reroll > 0 || a.minimum > 0;
2700
2712
  const bHasPriority = b.reroll > 0 || b.minimum > 0;
2701
- if (aHasPriority !== bHasPriority) {
2702
- return aHasPriority ? -1 : 1;
2703
- }
2713
+ if (aHasPriority !== bHasPriority) return aHasPriority ? -1 : 1;
2704
2714
  if (b.sides !== a.sides) return b.sides - a.sides;
2705
- const complexity = (c) => (c.reroll > 0 ? 1 : 0) + (c.minimum > 0 ? 1 : 0) + (c.explode > 0 ? 1 : 0) + (c.bestOf > 0 ? 1 : 0) + (c.keep ? 1 : 0);
2706
- return complexity(b) - complexity(a);
2715
+ return configComplexityScore(b) - configComplexityScore(a);
2707
2716
  });
2708
2717
  const diceConfigs = rootD20Group ? [
2709
2718
  { ...rootD20Group.config, count: rootD20Group.totalCount },
@@ -2715,9 +2724,7 @@ var RollBuilder = class _RollBuilder {
2715
2724
  );
2716
2725
  if (diceConfigs.length === 0) return totalModifier.toString();
2717
2726
  const rootDieConfig = this.getRootDieConfig();
2718
- const newRootConfig = rootDieConfig ? diceConfigs.find(
2719
- (c) => c.sides === rootDieConfig.sides && c.rollType === rootDieConfig.rollType && c.reroll === rootDieConfig.reroll && c.explode === rootDieConfig.explode && c.minimum === rootDieConfig.minimum && c.bestOf === rootDieConfig.bestOf && c.keep === rootDieConfig.keep
2720
- ) : void 0;
2727
+ const newRootConfig = rootDieConfig ? diceConfigs.find((c) => rollConfigsEqual(c, rootDieConfig)) : void 0;
2721
2728
  const diceExpressions = diceConfigs.map(
2722
2729
  (config) => this.configToSingleExpressionWithoutModifier(
2723
2730
  config,
@@ -2763,7 +2770,11 @@ var RollBuilder = class _RollBuilder {
2763
2770
  }
2764
2771
  }
2765
2772
  if (config.minimum > 0) {
2766
- baseDie = `${config.minimum}>${baseDie}`;
2773
+ if (config.reroll > 0 && !config.explode) {
2774
+ baseDie = `${config.minimum}>(${baseDie})`;
2775
+ } else {
2776
+ baseDie = `${config.minimum}>${baseDie}`;
2777
+ }
2767
2778
  if (config.reroll > 0 && config.explode > 0) {
2768
2779
  for (let i = 1; i <= config.reroll; i++) {
2769
2780
  baseDie += ` reroll ${i}`;
@@ -2800,21 +2811,20 @@ var RollBuilder = class _RollBuilder {
2800
2811
  const isComplex = baseDie.length > `d${config.sides}`.length;
2801
2812
  const isHalflingShorthand = baseDie === "hd20";
2802
2813
  const isD20Shorthand = baseDie === "d20" && isRootDie;
2803
- const hasMinimum = baseDie.startsWith("(") && baseDie.includes(">");
2804
- const hasReroll = baseDie.includes("reroll");
2814
+ const hasMinimum = config.minimum > 0;
2815
+ const hasReroll = config.reroll > 0;
2805
2816
  const effectiveCount = config.isSubtraction ? Math.abs(config.count) : config.count < 0 ? 1 : Math.abs(config.count);
2806
2817
  if (effectiveCount > 1) {
2807
- const shouldAddParentheses = isComplex && (// Complex single roll: explode + reroll
2808
- !hasMinimum && !hasReroll || // Simple complex case
2809
- hasReroll && !hasMinimum);
2818
+ const shouldAddParentheses = isComplex;
2810
2819
  mainExpression = shouldAddParentheses ? `${effectiveCount}(${baseDie})` : `${effectiveCount}${baseDie}`;
2811
2820
  } else if (effectiveCount === 1) {
2821
+ const needsParens = hasReroll && hasMinimum;
2812
2822
  if (config.isSubtraction) {
2813
- mainExpression = `1${baseDie}`;
2823
+ mainExpression = needsParens ? `1(${baseDie})` : `1${baseDie}`;
2814
2824
  } else if (isComplex || isHalflingShorthand || isD20Shorthand || config.count < 0) {
2815
- mainExpression = baseDie;
2825
+ mainExpression = needsParens ? `1(${baseDie})` : baseDie;
2816
2826
  } else {
2817
- mainExpression = `1${baseDie}`;
2827
+ mainExpression = needsParens ? `1(${baseDie})` : `1${baseDie}`;
2818
2828
  }
2819
2829
  } else {
2820
2830
  mainExpression = baseDie;