@yipe/dice 0.2.9 → 0.2.11

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.
@@ -1,38 +1,42 @@
1
1
  import { P as PMF, i as DiceQuery, L as LRUCache } from '../pmf-D1p2Re-J.cjs';
2
2
 
3
- type ExpressionNode = DieNode | ConstantNode | SumNode | AddNode | KeepNode | D20RollNode;
3
+ type ExpressionNode = DieNode | ConstantNode | SumNode | AddNode | KeepNode | D20RollNode | HalfNode;
4
4
  type DieNode = {
5
- type: 'die';
5
+ type: "die";
6
6
  sides: number;
7
7
  reroll?: number;
8
8
  minimum?: number;
9
9
  explode?: number;
10
10
  };
11
11
  type ConstantNode = {
12
- type: 'constant';
12
+ type: "constant";
13
13
  value: number;
14
14
  };
15
15
  type SumNode = {
16
- type: 'sum';
16
+ type: "sum";
17
17
  count: number;
18
18
  child: ExpressionNode;
19
19
  };
20
20
  type AddNode = {
21
- type: 'add';
21
+ type: "add";
22
22
  children: {
23
23
  node: ExpressionNode;
24
24
  sign: 1 | -1;
25
25
  }[];
26
26
  };
27
27
  type KeepNode = {
28
- type: 'keep';
29
- mode: 'highest' | 'lowest';
28
+ type: "keep";
29
+ mode: "highest" | "lowest";
30
30
  count: number;
31
31
  child: SumNode | KeepNode;
32
32
  };
33
33
  type D20RollNode = {
34
- type: 'd20Roll';
35
- rollType: 'advantage' | 'disadvantage' | 'elven accuracy';
34
+ type: "d20Roll";
35
+ rollType: "advantage" | "disadvantage" | "elven accuracy";
36
+ child: ExpressionNode;
37
+ };
38
+ type HalfNode = {
39
+ type: "half";
36
40
  child: ExpressionNode;
37
41
  };
38
42
 
@@ -151,6 +155,17 @@ declare class RollBuilder {
151
155
  get modifier(): number;
152
156
  get rollType(): RollType;
153
157
  get baseReroll(): number;
158
+ half(): HalfRollBuilder;
159
+ }
160
+ declare class HalfRollBuilder extends RollBuilder {
161
+ private readonly innerRoll;
162
+ constructor(innerRoll: RollBuilder);
163
+ get lastConfig(): any;
164
+ getSubRollConfigs(): readonly RollConfig[];
165
+ toExpression(): string;
166
+ toAST(): ExpressionNode;
167
+ toPMF(eps?: number): PMF;
168
+ copy(): HalfRollBuilder;
154
169
  }
155
170
 
156
171
  type ActionEffect = RollBuilder;
@@ -264,4 +279,4 @@ declare const flat: (n: number) => RollBuilder;
264
279
  declare const roll: RollFactory;
265
280
  declare const builderPMFCache: LRUCache<string, PMF>;
266
281
 
267
- export { ACBuilder, type AttackConfig, type AttackResolution, type CheckBuilder, DCBuilder, type KeepMode, type Resolution, RollBuilder, type RollConfig, type RollFactory, type RollType, SaveBuilder, type SaveOutcome, type SaveResolution, builderPMFCache, d, d10, d100, d12, d20, d4, d6, d8, defaultConfig, flat, hd20, roll };
282
+ export { ACBuilder, type AttackConfig, type AttackResolution, type CheckBuilder, DCBuilder, HalfRollBuilder, type KeepMode, type Resolution, RollBuilder, type RollConfig, type RollFactory, type RollType, SaveBuilder, type SaveOutcome, type SaveResolution, builderPMFCache, d, d10, d100, d12, d20, d4, d6, d8, defaultConfig, flat, hd20, roll };
@@ -1,38 +1,42 @@
1
1
  import { P as PMF, i as DiceQuery, L as LRUCache } from '../pmf-D1p2Re-J.js';
2
2
 
3
- type ExpressionNode = DieNode | ConstantNode | SumNode | AddNode | KeepNode | D20RollNode;
3
+ type ExpressionNode = DieNode | ConstantNode | SumNode | AddNode | KeepNode | D20RollNode | HalfNode;
4
4
  type DieNode = {
5
- type: 'die';
5
+ type: "die";
6
6
  sides: number;
7
7
  reroll?: number;
8
8
  minimum?: number;
9
9
  explode?: number;
10
10
  };
11
11
  type ConstantNode = {
12
- type: 'constant';
12
+ type: "constant";
13
13
  value: number;
14
14
  };
15
15
  type SumNode = {
16
- type: 'sum';
16
+ type: "sum";
17
17
  count: number;
18
18
  child: ExpressionNode;
19
19
  };
20
20
  type AddNode = {
21
- type: 'add';
21
+ type: "add";
22
22
  children: {
23
23
  node: ExpressionNode;
24
24
  sign: 1 | -1;
25
25
  }[];
26
26
  };
27
27
  type KeepNode = {
28
- type: 'keep';
29
- mode: 'highest' | 'lowest';
28
+ type: "keep";
29
+ mode: "highest" | "lowest";
30
30
  count: number;
31
31
  child: SumNode | KeepNode;
32
32
  };
33
33
  type D20RollNode = {
34
- type: 'd20Roll';
35
- rollType: 'advantage' | 'disadvantage' | 'elven accuracy';
34
+ type: "d20Roll";
35
+ rollType: "advantage" | "disadvantage" | "elven accuracy";
36
+ child: ExpressionNode;
37
+ };
38
+ type HalfNode = {
39
+ type: "half";
36
40
  child: ExpressionNode;
37
41
  };
38
42
 
@@ -151,6 +155,17 @@ declare class RollBuilder {
151
155
  get modifier(): number;
152
156
  get rollType(): RollType;
153
157
  get baseReroll(): number;
158
+ half(): HalfRollBuilder;
159
+ }
160
+ declare class HalfRollBuilder extends RollBuilder {
161
+ private readonly innerRoll;
162
+ constructor(innerRoll: RollBuilder);
163
+ get lastConfig(): any;
164
+ getSubRollConfigs(): readonly RollConfig[];
165
+ toExpression(): string;
166
+ toAST(): ExpressionNode;
167
+ toPMF(eps?: number): PMF;
168
+ copy(): HalfRollBuilder;
154
169
  }
155
170
 
156
171
  type ActionEffect = RollBuilder;
@@ -264,4 +279,4 @@ declare const flat: (n: number) => RollBuilder;
264
279
  declare const roll: RollFactory;
265
280
  declare const builderPMFCache: LRUCache<string, PMF>;
266
281
 
267
- export { ACBuilder, type AttackConfig, type AttackResolution, type CheckBuilder, DCBuilder, type KeepMode, type Resolution, RollBuilder, type RollConfig, type RollFactory, type RollType, SaveBuilder, type SaveOutcome, type SaveResolution, builderPMFCache, d, d10, d100, d12, d20, d4, d6, d8, defaultConfig, flat, hd20, roll };
282
+ export { ACBuilder, type AttackConfig, type AttackResolution, type CheckBuilder, DCBuilder, HalfRollBuilder, type KeepMode, type Resolution, RollBuilder, type RollConfig, type RollFactory, type RollType, SaveBuilder, type SaveOutcome, type SaveResolution, builderPMFCache, d, d10, d100, d12, d20, d4, d6, d8, defaultConfig, flat, hd20, roll };
@@ -2696,7 +2696,7 @@ var RollBuilder = class _RollBuilder {
2696
2696
  let rootD20Group;
2697
2697
  if (rootConfig && rootConfig.sides === 20) {
2698
2698
  const rootIndex = groupedConfigs.findIndex(
2699
- ({ config }) => config.sides === rootConfig.sides && config.rollType === rootConfig.rollType && config.reroll === rootConfig.reroll && config.explode === rootConfig.explode && config.minimum === rootConfig.minimum && config.bestOf === rootConfig.bestOf && JSON.stringify(config.keep) === JSON.stringify(rootConfig.keep)
2699
+ ({ config }) => rollConfigsEqual(config, rootConfig) && JSON.stringify(config.keep) === JSON.stringify(rootConfig.keep)
2700
2700
  );
2701
2701
  if (rootIndex !== -1) {
2702
2702
  rootD20Group = groupedConfigs.splice(rootIndex, 1)[0];
@@ -2735,13 +2735,19 @@ var RollBuilder = class _RollBuilder {
2735
2735
  const expression = diceExpressions[i];
2736
2736
  if (i === 0) {
2737
2737
  result = (config.isSubtraction ? "-" : "") + expression;
2738
+ if (config.sides === 20 && totalModifier !== 0) {
2739
+ if (totalModifier > 0) result += ` + ${totalModifier}`;
2740
+ else result += ` - ${Math.abs(totalModifier)}`;
2741
+ }
2738
2742
  } else {
2739
2743
  const operator = config.isSubtraction ? " - " : " + ";
2740
2744
  result += operator + expression;
2741
2745
  }
2742
2746
  }
2743
- if (totalModifier > 0) result += ` + ${totalModifier}`;
2744
- else if (totalModifier < 0) result += ` - ${Math.abs(totalModifier)}`;
2747
+ if (diceConfigs.length === 0 || diceConfigs[0].sides !== 20) {
2748
+ if (totalModifier > 0) result += ` + ${totalModifier}`;
2749
+ else if (totalModifier < 0) result += ` - ${Math.abs(totalModifier)}`;
2750
+ }
2745
2751
  return result.replace(/\+ -/g, "-");
2746
2752
  }
2747
2753
  toPMF(eps = 0) {
@@ -2867,6 +2873,37 @@ var RollBuilder = class _RollBuilder {
2867
2873
  const rootConfig = this.getRootDieConfig();
2868
2874
  return rootConfig?.reroll || 0;
2869
2875
  }
2876
+ half() {
2877
+ return new HalfRollBuilder(this);
2878
+ }
2879
+ };
2880
+ var HalfRollBuilder = class _HalfRollBuilder extends RollBuilder {
2881
+ constructor(innerRoll) {
2882
+ super(0);
2883
+ this.innerRoll = innerRoll;
2884
+ }
2885
+ get lastConfig() {
2886
+ return this.innerRoll.lastConfig;
2887
+ }
2888
+ getSubRollConfigs() {
2889
+ return this.innerRoll.getSubRollConfigs();
2890
+ }
2891
+ toExpression() {
2892
+ const innerExpression = this.innerRoll.toExpression();
2893
+ return `(${innerExpression}) // 2`;
2894
+ }
2895
+ toAST() {
2896
+ return {
2897
+ type: "half",
2898
+ child: this.innerRoll.toAST()
2899
+ };
2900
+ }
2901
+ toPMF(eps = 0) {
2902
+ return pmfFromRollBuilder(this, eps);
2903
+ }
2904
+ copy() {
2905
+ return new _HalfRollBuilder(this.innerRoll.copy());
2906
+ }
2870
2907
  };
2871
2908
 
2872
2909
  // src/builder/factory.ts
@@ -3034,14 +3071,17 @@ function resolve(node, eps = defaultEps) {
3034
3071
  const rerollOne = !!childDie && (childDie.reroll || 0) >= 1;
3035
3072
  return d20RollPMF(node.rollType, rerollOne);
3036
3073
  }
3074
+ case "half": {
3075
+ const childPMF = resolve(node.child, eps);
3076
+ return childPMF.scaleDamage(0.5, "floor");
3077
+ }
3037
3078
  }
3038
3079
  })();
3039
3080
  builderPMFCache.set(cacheKey, result);
3040
3081
  return result;
3041
3082
  }
3042
3083
  function pmfFromRollBuilder(rb, eps = defaultEps) {
3043
- const configs = rb.getSubRollConfigs?.() ?? [];
3044
- const ast = astFromRollConfigs(configs) || { type: "constant", value: 0 };
3084
+ const ast = rb.toAST();
3045
3085
  return resolve(ast, eps);
3046
3086
  }
3047
3087
  function resolveSingleDie(die, eps = defaultEps) {
@@ -3104,6 +3144,7 @@ function findDie(node) {
3104
3144
  return void 0;
3105
3145
  case "sum":
3106
3146
  case "d20Roll":
3147
+ case "half":
3107
3148
  return findDie(node.child);
3108
3149
  case "keep":
3109
3150
  return findDie(node.child.child);
@@ -3169,6 +3210,8 @@ function getASTSignature(node) {
3169
3210
  return `keep{c:${node.count},m:${node.mode},ch:${getASTSignature(
3170
3211
  node.child
3171
3212
  )}}`;
3213
+ case "half":
3214
+ return `half{ch:${getASTSignature(node.child)}}`;
3172
3215
  case "add": {
3173
3216
  let constantValue = 0;
3174
3217
  const otherChildrenSigs = [];
@@ -3538,6 +3581,6 @@ RollBuilder.prototype.dc = function(saveDC) {
3538
3581
  return new DCBuilder(this).dc(saveDC);
3539
3582
  };
3540
3583
 
3541
- export { ACBuilder, DCBuilder, RollBuilder, SaveBuilder, builderPMFCache, d, d10, d100, d12, d20, d4, d6, d8, defaultConfig, flat, hd20, roll };
3584
+ export { ACBuilder, DCBuilder, HalfRollBuilder, RollBuilder, SaveBuilder, builderPMFCache, d, d10, d100, d12, d20, d4, d6, d8, defaultConfig, flat, hd20, roll };
3542
3585
  //# sourceMappingURL=index.js.map
3543
3586
  //# sourceMappingURL=index.js.map