@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.
@@ -127,6 +127,7 @@ declare class RollBuilder {
127
127
  add(anotherRoll: RollBuilder | undefined): RollBuilder;
128
128
  withBonus(anotherRoll: RollBuilder): RollBuilder;
129
129
  addRoll(count?: number): RollBuilder;
130
+ scaleDice(scale: number): RollBuilder;
130
131
  doubleDice(): RollBuilder;
131
132
  copy(): RollBuilder;
132
133
  d4: () => RollBuilder;
@@ -127,6 +127,7 @@ declare class RollBuilder {
127
127
  add(anotherRoll: RollBuilder | undefined): RollBuilder;
128
128
  withBonus(anotherRoll: RollBuilder): RollBuilder;
129
129
  addRoll(count?: number): RollBuilder;
130
+ scaleDice(scale: number): RollBuilder;
130
131
  doubleDice(): RollBuilder;
131
132
  copy(): RollBuilder;
132
133
  d4: () => RollBuilder;
@@ -2427,6 +2427,12 @@ var defaultConfig = {
2427
2427
  keep: void 0,
2428
2428
  rollType: "flat"
2429
2429
  };
2430
+ var rollConfigsEqual = (a, b) => {
2431
+ 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;
2432
+ };
2433
+ var configComplexityScore = (config) => {
2434
+ 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);
2435
+ };
2430
2436
  var RollBuilder = class _RollBuilder {
2431
2437
  constructor(countOrConfigs = 1) {
2432
2438
  __publicField(this, "subRollConfigs");
@@ -2647,13 +2653,19 @@ var RollBuilder = class _RollBuilder {
2647
2653
  ];
2648
2654
  return new this.constructor(configs);
2649
2655
  }
2650
- doubleDice() {
2656
+ scaleDice(scale) {
2657
+ const scaleInt = Math.floor(scale);
2658
+ if (scaleInt !== scale) throw new Error("Scale must be an integer");
2659
+ if (scaleInt <= 0) throw new Error("Scale must be > 0");
2651
2660
  const newConfigs = this.getSubRollConfigs().map((config) => {
2652
2661
  if (!config.sides || config.sides <= 0) return config;
2653
- return { ...config, count: config.count * 2 };
2662
+ return { ...config, count: config.count * scaleInt };
2654
2663
  });
2655
2664
  return new this.constructor(newConfigs);
2656
2665
  }
2666
+ doubleDice() {
2667
+ return this.scaleDice(2);
2668
+ }
2657
2669
  copy() {
2658
2670
  return new this.constructor(this.getSubRollConfigs());
2659
2671
  }
@@ -2696,12 +2708,9 @@ var RollBuilder = class _RollBuilder {
2696
2708
  })).sort((a, b) => {
2697
2709
  const aHasPriority = a.reroll > 0 || a.minimum > 0;
2698
2710
  const bHasPriority = b.reroll > 0 || b.minimum > 0;
2699
- if (aHasPriority !== bHasPriority) {
2700
- return aHasPriority ? -1 : 1;
2701
- }
2711
+ if (aHasPriority !== bHasPriority) return aHasPriority ? -1 : 1;
2702
2712
  if (b.sides !== a.sides) return b.sides - a.sides;
2703
- 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);
2704
- return complexity(b) - complexity(a);
2713
+ return configComplexityScore(b) - configComplexityScore(a);
2705
2714
  });
2706
2715
  const diceConfigs = rootD20Group ? [
2707
2716
  { ...rootD20Group.config, count: rootD20Group.totalCount },
@@ -2713,9 +2722,7 @@ var RollBuilder = class _RollBuilder {
2713
2722
  );
2714
2723
  if (diceConfigs.length === 0) return totalModifier.toString();
2715
2724
  const rootDieConfig = this.getRootDieConfig();
2716
- const newRootConfig = rootDieConfig ? diceConfigs.find(
2717
- (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
2718
- ) : void 0;
2725
+ const newRootConfig = rootDieConfig ? diceConfigs.find((c) => rollConfigsEqual(c, rootDieConfig)) : void 0;
2719
2726
  const diceExpressions = diceConfigs.map(
2720
2727
  (config) => this.configToSingleExpressionWithoutModifier(
2721
2728
  config,
@@ -2761,7 +2768,11 @@ var RollBuilder = class _RollBuilder {
2761
2768
  }
2762
2769
  }
2763
2770
  if (config.minimum > 0) {
2764
- baseDie = `${config.minimum}>${baseDie}`;
2771
+ if (config.reroll > 0 && !config.explode) {
2772
+ baseDie = `${config.minimum}>(${baseDie})`;
2773
+ } else {
2774
+ baseDie = `${config.minimum}>${baseDie}`;
2775
+ }
2765
2776
  if (config.reroll > 0 && config.explode > 0) {
2766
2777
  for (let i = 1; i <= config.reroll; i++) {
2767
2778
  baseDie += ` reroll ${i}`;
@@ -2798,21 +2809,20 @@ var RollBuilder = class _RollBuilder {
2798
2809
  const isComplex = baseDie.length > `d${config.sides}`.length;
2799
2810
  const isHalflingShorthand = baseDie === "hd20";
2800
2811
  const isD20Shorthand = baseDie === "d20" && isRootDie;
2801
- const hasMinimum = baseDie.startsWith("(") && baseDie.includes(">");
2802
- const hasReroll = baseDie.includes("reroll");
2812
+ const hasMinimum = config.minimum > 0;
2813
+ const hasReroll = config.reroll > 0;
2803
2814
  const effectiveCount = config.isSubtraction ? Math.abs(config.count) : config.count < 0 ? 1 : Math.abs(config.count);
2804
2815
  if (effectiveCount > 1) {
2805
- const shouldAddParentheses = isComplex && (// Complex single roll: explode + reroll
2806
- !hasMinimum && !hasReroll || // Simple complex case
2807
- hasReroll && !hasMinimum);
2816
+ const shouldAddParentheses = isComplex;
2808
2817
  mainExpression = shouldAddParentheses ? `${effectiveCount}(${baseDie})` : `${effectiveCount}${baseDie}`;
2809
2818
  } else if (effectiveCount === 1) {
2819
+ const needsParens = hasReroll && hasMinimum;
2810
2820
  if (config.isSubtraction) {
2811
- mainExpression = `1${baseDie}`;
2821
+ mainExpression = needsParens ? `1(${baseDie})` : `1${baseDie}`;
2812
2822
  } else if (isComplex || isHalflingShorthand || isD20Shorthand || config.count < 0) {
2813
- mainExpression = baseDie;
2823
+ mainExpression = needsParens ? `1(${baseDie})` : baseDie;
2814
2824
  } else {
2815
- mainExpression = `1${baseDie}`;
2825
+ mainExpression = needsParens ? `1(${baseDie})` : `1${baseDie}`;
2816
2826
  }
2817
2827
  } else {
2818
2828
  mainExpression = baseDie;