@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.
- package/dist/builder/index.cjs +49 -5
- package/dist/builder/index.cjs.map +1 -1
- package/dist/builder/index.d.cts +25 -10
- package/dist/builder/index.d.ts +25 -10
- package/dist/builder/index.js +49 -6
- package/dist/builder/index.js.map +1 -1
- package/package.json +1 -1
package/dist/builder/index.d.cts
CHANGED
|
@@ -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:
|
|
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:
|
|
12
|
+
type: "constant";
|
|
13
13
|
value: number;
|
|
14
14
|
};
|
|
15
15
|
type SumNode = {
|
|
16
|
-
type:
|
|
16
|
+
type: "sum";
|
|
17
17
|
count: number;
|
|
18
18
|
child: ExpressionNode;
|
|
19
19
|
};
|
|
20
20
|
type AddNode = {
|
|
21
|
-
type:
|
|
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:
|
|
29
|
-
mode:
|
|
28
|
+
type: "keep";
|
|
29
|
+
mode: "highest" | "lowest";
|
|
30
30
|
count: number;
|
|
31
31
|
child: SumNode | KeepNode;
|
|
32
32
|
};
|
|
33
33
|
type D20RollNode = {
|
|
34
|
-
type:
|
|
35
|
-
rollType:
|
|
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 };
|
package/dist/builder/index.d.ts
CHANGED
|
@@ -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:
|
|
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:
|
|
12
|
+
type: "constant";
|
|
13
13
|
value: number;
|
|
14
14
|
};
|
|
15
15
|
type SumNode = {
|
|
16
|
-
type:
|
|
16
|
+
type: "sum";
|
|
17
17
|
count: number;
|
|
18
18
|
child: ExpressionNode;
|
|
19
19
|
};
|
|
20
20
|
type AddNode = {
|
|
21
|
-
type:
|
|
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:
|
|
29
|
-
mode:
|
|
28
|
+
type: "keep";
|
|
29
|
+
mode: "highest" | "lowest";
|
|
30
30
|
count: number;
|
|
31
31
|
child: SumNode | KeepNode;
|
|
32
32
|
};
|
|
33
33
|
type D20RollNode = {
|
|
34
|
-
type:
|
|
35
|
-
rollType:
|
|
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 };
|
package/dist/builder/index.js
CHANGED
|
@@ -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
|
|
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 (
|
|
2744
|
-
|
|
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
|
|
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
|