@erpg/dicecore 3.1.0

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.
Files changed (55) hide show
  1. package/dist/index.cjs +9 -0
  2. package/dist/index.d.cts +1 -0
  3. package/dist/index.d.ts +1 -0
  4. package/dist/index.js +9 -0
  5. package/dist/v3/cache.d.cts +23 -0
  6. package/dist/v3/cache.d.ts +23 -0
  7. package/dist/v3/compiler.d.cts +50 -0
  8. package/dist/v3/compiler.d.ts +50 -0
  9. package/dist/v3/engine.d.cts +7 -0
  10. package/dist/v3/engine.d.ts +7 -0
  11. package/dist/v3/errors.d.cts +37 -0
  12. package/dist/v3/errors.d.ts +37 -0
  13. package/dist/v3/executor.d.cts +11 -0
  14. package/dist/v3/executor.d.ts +11 -0
  15. package/dist/v3/freeze.d.cts +5 -0
  16. package/dist/v3/freeze.d.ts +5 -0
  17. package/dist/v3/index.d.cts +8 -0
  18. package/dist/v3/index.d.ts +8 -0
  19. package/dist/v3/math.d.cts +12 -0
  20. package/dist/v3/math.d.ts +12 -0
  21. package/dist/v3/normalization.d.cts +10 -0
  22. package/dist/v3/normalization.d.ts +10 -0
  23. package/dist/v3/roll-count-expression.d.cts +2 -0
  24. package/dist/v3/roll-count-expression.d.ts +2 -0
  25. package/dist/v3/runtime/budget.d.cts +57 -0
  26. package/dist/v3/runtime/budget.d.ts +57 -0
  27. package/dist/v3/runtime/context.d.cts +27 -0
  28. package/dist/v3/runtime/context.d.ts +27 -0
  29. package/dist/v3/runtime/index.d.cts +7 -0
  30. package/dist/v3/runtime/index.d.ts +7 -0
  31. package/dist/v3/runtime/journal.d.cts +23 -0
  32. package/dist/v3/runtime/journal.d.ts +23 -0
  33. package/dist/v3/runtime/limits.d.cts +25 -0
  34. package/dist/v3/runtime/limits.d.ts +25 -0
  35. package/dist/v3/runtime/mt19937.d.cts +23 -0
  36. package/dist/v3/runtime/mt19937.d.ts +23 -0
  37. package/dist/v3/runtime/replay.d.cts +38 -0
  38. package/dist/v3/runtime/replay.d.ts +38 -0
  39. package/dist/v3/runtime/xoshiro128ss.d.cts +14 -0
  40. package/dist/v3/runtime/xoshiro128ss.d.ts +14 -0
  41. package/dist/v3/syntax/ast.d.cts +132 -0
  42. package/dist/v3/syntax/ast.d.ts +132 -0
  43. package/dist/v3/syntax/index.d.cts +4 -0
  44. package/dist/v3/syntax/index.d.ts +4 -0
  45. package/dist/v3/syntax/parser.d.cts +7 -0
  46. package/dist/v3/syntax/parser.d.ts +7 -0
  47. package/dist/v3/syntax/scanner.d.cts +3 -0
  48. package/dist/v3/syntax/scanner.d.ts +3 -0
  49. package/dist/v3/syntax/tokens.d.cts +38 -0
  50. package/dist/v3/syntax/tokens.d.ts +38 -0
  51. package/dist/v3/types.d.cts +251 -0
  52. package/dist/v3/types.d.ts +251 -0
  53. package/licence.txt +23 -0
  54. package/package.json +105 -0
  55. package/readme.md +255 -0
@@ -0,0 +1,14 @@
1
+ import type { RandomCallBudget } from './budget.js';
2
+ import type { RandomSource } from './mt19937.js';
3
+ /** The public-domain xoshiro128** 1.1 generator by Blackman and Vigna. */
4
+ export declare class Xoshiro128StarStar implements RandomSource {
5
+ private state0;
6
+ private state1;
7
+ private state2;
8
+ private state3;
9
+ private readonly budget;
10
+ constructor(seed: ArrayLike<number>, budget?: RandomCallBudget | null);
11
+ nextUint32(): number;
12
+ integer(min: number, max: number): number;
13
+ real(): number;
14
+ }
@@ -0,0 +1,132 @@
1
+ import type { SourceSpan } from '../errors.cjs';
2
+ export type { SourceSpan } from '../errors.cjs';
3
+ export type NodeId = string;
4
+ export type BinaryOperator = '+' | '-' | '*' | '/' | '%' | '^' | '**';
5
+ export type UnaryOperator = '+' | '-';
6
+ export type ComparisonOperator = '=' | '!=' | '<>' | '<' | '>' | '<=' | '>=';
7
+ export type UnaryFunctionName = 'abs' | 'ceil' | 'cos' | 'exp' | 'floor' | 'log' | 'round' | 'sign' | 'sin' | 'sqrt' | 'tan';
8
+ export type BinaryFunctionName = 'pow' | 'max' | 'min';
9
+ export interface SyntaxNodeBase {
10
+ readonly id: NodeId;
11
+ readonly span: SourceSpan;
12
+ }
13
+ export interface NumberNode extends SyntaxNodeBase {
14
+ readonly kind: 'number';
15
+ readonly value: number;
16
+ readonly raw: string;
17
+ readonly implicit: boolean;
18
+ }
19
+ export interface UnaryNode extends SyntaxNodeBase {
20
+ readonly kind: 'unary';
21
+ readonly operator: UnaryOperator;
22
+ readonly operand: ExpressionNode;
23
+ }
24
+ export interface BinaryNode extends SyntaxNodeBase {
25
+ readonly kind: 'binary';
26
+ readonly operator: BinaryOperator;
27
+ readonly left: ExpressionNode;
28
+ readonly right: ExpressionNode;
29
+ }
30
+ export interface ParenthesizedNode extends SyntaxNodeBase {
31
+ readonly kind: 'parenthesized';
32
+ readonly expression: ExpressionNode;
33
+ }
34
+ export interface UnaryFunctionNode extends SyntaxNodeBase {
35
+ readonly kind: 'function';
36
+ readonly functionKind: 'unary';
37
+ readonly name: UnaryFunctionName;
38
+ readonly arguments: readonly [ExpressionNode];
39
+ }
40
+ export interface BinaryFunctionNode extends SyntaxNodeBase {
41
+ readonly kind: 'function';
42
+ readonly functionKind: 'binary';
43
+ readonly name: BinaryFunctionName;
44
+ readonly arguments: readonly [ExpressionNode, ExpressionNode];
45
+ }
46
+ export type FunctionNode = UnaryFunctionNode | BinaryFunctionNode;
47
+ export type DiceArgumentNode = NumberNode | ParenthesizedNode;
48
+ export interface StandardDiceNode extends SyntaxNodeBase {
49
+ readonly kind: 'dice';
50
+ readonly diceKind: 'standard';
51
+ readonly quantity: DiceArgumentNode;
52
+ readonly sides: DiceArgumentNode;
53
+ readonly modifiers: readonly ModifierNode[];
54
+ }
55
+ export interface PercentileDiceNode extends SyntaxNodeBase {
56
+ readonly kind: 'dice';
57
+ readonly diceKind: 'percentile';
58
+ readonly quantity: DiceArgumentNode;
59
+ readonly modifiers: readonly ModifierNode[];
60
+ }
61
+ export interface FudgeDiceNode extends SyntaxNodeBase {
62
+ readonly kind: 'dice';
63
+ readonly diceKind: 'fudge';
64
+ readonly quantity: DiceArgumentNode;
65
+ readonly variant: 1 | 2;
66
+ readonly modifiers: readonly ModifierNode[];
67
+ }
68
+ export type DiceNode = StandardDiceNode | PercentileDiceNode | FudgeDiceNode;
69
+ export interface GroupNode extends SyntaxNodeBase {
70
+ readonly kind: 'group';
71
+ readonly expressions: readonly ExpressionNode[];
72
+ readonly modifiers: readonly ModifierNode[];
73
+ }
74
+ export type ExpressionNode = NumberNode | UnaryNode | BinaryNode | ParenthesizedNode | FunctionNode | DiceNode | GroupNode;
75
+ export interface ComparePointNode extends SyntaxNodeBase {
76
+ readonly kind: 'compare-point';
77
+ readonly operator: ComparisonOperator;
78
+ readonly value: number;
79
+ }
80
+ export interface ExplodeModifierNode extends SyntaxNodeBase {
81
+ readonly kind: 'explode';
82
+ readonly compound: boolean;
83
+ readonly penetrate: boolean;
84
+ readonly compare: ComparePointNode | null;
85
+ }
86
+ export interface TargetModifierNode extends SyntaxNodeBase {
87
+ readonly kind: 'target';
88
+ readonly success: ComparePointNode;
89
+ readonly failure: ComparePointNode | null;
90
+ }
91
+ export interface DropModifierNode extends SyntaxNodeBase {
92
+ readonly kind: 'drop';
93
+ readonly selection: 'lowest' | 'highest';
94
+ readonly quantity: number;
95
+ }
96
+ export interface KeepModifierNode extends SyntaxNodeBase {
97
+ readonly kind: 'keep';
98
+ readonly selection: 'lowest' | 'highest';
99
+ readonly quantity: number;
100
+ }
101
+ export interface MinimumModifierNode extends SyntaxNodeBase {
102
+ readonly kind: 'min';
103
+ readonly value: number;
104
+ }
105
+ export interface MaximumModifierNode extends SyntaxNodeBase {
106
+ readonly kind: 'max';
107
+ readonly value: number;
108
+ }
109
+ export interface RerollModifierNode extends SyntaxNodeBase {
110
+ readonly kind: 'reroll';
111
+ readonly once: boolean;
112
+ readonly compare: ComparePointNode | null;
113
+ }
114
+ export interface UniqueModifierNode extends SyntaxNodeBase {
115
+ readonly kind: 'unique';
116
+ readonly once: boolean;
117
+ readonly compare: ComparePointNode | null;
118
+ }
119
+ export interface CriticalSuccessModifierNode extends SyntaxNodeBase {
120
+ readonly kind: 'critical-success';
121
+ readonly compare: ComparePointNode | null;
122
+ }
123
+ export interface CriticalFailureModifierNode extends SyntaxNodeBase {
124
+ readonly kind: 'critical-failure';
125
+ readonly compare: ComparePointNode | null;
126
+ }
127
+ export interface SortModifierNode extends SyntaxNodeBase {
128
+ readonly kind: 'sort';
129
+ readonly direction: 'ascending' | 'descending';
130
+ }
131
+ export type ModifierNode = ExplodeModifierNode | TargetModifierNode | DropModifierNode | KeepModifierNode | MinimumModifierNode | MaximumModifierNode | RerollModifierNode | UniqueModifierNode | CriticalSuccessModifierNode | CriticalFailureModifierNode | SortModifierNode;
132
+ export declare function createNodeId(kind: string, span: SourceSpan): NodeId;
@@ -0,0 +1,132 @@
1
+ import type { SourceSpan } from '../errors.js';
2
+ export type { SourceSpan } from '../errors.js';
3
+ export type NodeId = string;
4
+ export type BinaryOperator = '+' | '-' | '*' | '/' | '%' | '^' | '**';
5
+ export type UnaryOperator = '+' | '-';
6
+ export type ComparisonOperator = '=' | '!=' | '<>' | '<' | '>' | '<=' | '>=';
7
+ export type UnaryFunctionName = 'abs' | 'ceil' | 'cos' | 'exp' | 'floor' | 'log' | 'round' | 'sign' | 'sin' | 'sqrt' | 'tan';
8
+ export type BinaryFunctionName = 'pow' | 'max' | 'min';
9
+ export interface SyntaxNodeBase {
10
+ readonly id: NodeId;
11
+ readonly span: SourceSpan;
12
+ }
13
+ export interface NumberNode extends SyntaxNodeBase {
14
+ readonly kind: 'number';
15
+ readonly value: number;
16
+ readonly raw: string;
17
+ readonly implicit: boolean;
18
+ }
19
+ export interface UnaryNode extends SyntaxNodeBase {
20
+ readonly kind: 'unary';
21
+ readonly operator: UnaryOperator;
22
+ readonly operand: ExpressionNode;
23
+ }
24
+ export interface BinaryNode extends SyntaxNodeBase {
25
+ readonly kind: 'binary';
26
+ readonly operator: BinaryOperator;
27
+ readonly left: ExpressionNode;
28
+ readonly right: ExpressionNode;
29
+ }
30
+ export interface ParenthesizedNode extends SyntaxNodeBase {
31
+ readonly kind: 'parenthesized';
32
+ readonly expression: ExpressionNode;
33
+ }
34
+ export interface UnaryFunctionNode extends SyntaxNodeBase {
35
+ readonly kind: 'function';
36
+ readonly functionKind: 'unary';
37
+ readonly name: UnaryFunctionName;
38
+ readonly arguments: readonly [ExpressionNode];
39
+ }
40
+ export interface BinaryFunctionNode extends SyntaxNodeBase {
41
+ readonly kind: 'function';
42
+ readonly functionKind: 'binary';
43
+ readonly name: BinaryFunctionName;
44
+ readonly arguments: readonly [ExpressionNode, ExpressionNode];
45
+ }
46
+ export type FunctionNode = UnaryFunctionNode | BinaryFunctionNode;
47
+ export type DiceArgumentNode = NumberNode | ParenthesizedNode;
48
+ export interface StandardDiceNode extends SyntaxNodeBase {
49
+ readonly kind: 'dice';
50
+ readonly diceKind: 'standard';
51
+ readonly quantity: DiceArgumentNode;
52
+ readonly sides: DiceArgumentNode;
53
+ readonly modifiers: readonly ModifierNode[];
54
+ }
55
+ export interface PercentileDiceNode extends SyntaxNodeBase {
56
+ readonly kind: 'dice';
57
+ readonly diceKind: 'percentile';
58
+ readonly quantity: DiceArgumentNode;
59
+ readonly modifiers: readonly ModifierNode[];
60
+ }
61
+ export interface FudgeDiceNode extends SyntaxNodeBase {
62
+ readonly kind: 'dice';
63
+ readonly diceKind: 'fudge';
64
+ readonly quantity: DiceArgumentNode;
65
+ readonly variant: 1 | 2;
66
+ readonly modifiers: readonly ModifierNode[];
67
+ }
68
+ export type DiceNode = StandardDiceNode | PercentileDiceNode | FudgeDiceNode;
69
+ export interface GroupNode extends SyntaxNodeBase {
70
+ readonly kind: 'group';
71
+ readonly expressions: readonly ExpressionNode[];
72
+ readonly modifiers: readonly ModifierNode[];
73
+ }
74
+ export type ExpressionNode = NumberNode | UnaryNode | BinaryNode | ParenthesizedNode | FunctionNode | DiceNode | GroupNode;
75
+ export interface ComparePointNode extends SyntaxNodeBase {
76
+ readonly kind: 'compare-point';
77
+ readonly operator: ComparisonOperator;
78
+ readonly value: number;
79
+ }
80
+ export interface ExplodeModifierNode extends SyntaxNodeBase {
81
+ readonly kind: 'explode';
82
+ readonly compound: boolean;
83
+ readonly penetrate: boolean;
84
+ readonly compare: ComparePointNode | null;
85
+ }
86
+ export interface TargetModifierNode extends SyntaxNodeBase {
87
+ readonly kind: 'target';
88
+ readonly success: ComparePointNode;
89
+ readonly failure: ComparePointNode | null;
90
+ }
91
+ export interface DropModifierNode extends SyntaxNodeBase {
92
+ readonly kind: 'drop';
93
+ readonly selection: 'lowest' | 'highest';
94
+ readonly quantity: number;
95
+ }
96
+ export interface KeepModifierNode extends SyntaxNodeBase {
97
+ readonly kind: 'keep';
98
+ readonly selection: 'lowest' | 'highest';
99
+ readonly quantity: number;
100
+ }
101
+ export interface MinimumModifierNode extends SyntaxNodeBase {
102
+ readonly kind: 'min';
103
+ readonly value: number;
104
+ }
105
+ export interface MaximumModifierNode extends SyntaxNodeBase {
106
+ readonly kind: 'max';
107
+ readonly value: number;
108
+ }
109
+ export interface RerollModifierNode extends SyntaxNodeBase {
110
+ readonly kind: 'reroll';
111
+ readonly once: boolean;
112
+ readonly compare: ComparePointNode | null;
113
+ }
114
+ export interface UniqueModifierNode extends SyntaxNodeBase {
115
+ readonly kind: 'unique';
116
+ readonly once: boolean;
117
+ readonly compare: ComparePointNode | null;
118
+ }
119
+ export interface CriticalSuccessModifierNode extends SyntaxNodeBase {
120
+ readonly kind: 'critical-success';
121
+ readonly compare: ComparePointNode | null;
122
+ }
123
+ export interface CriticalFailureModifierNode extends SyntaxNodeBase {
124
+ readonly kind: 'critical-failure';
125
+ readonly compare: ComparePointNode | null;
126
+ }
127
+ export interface SortModifierNode extends SyntaxNodeBase {
128
+ readonly kind: 'sort';
129
+ readonly direction: 'ascending' | 'descending';
130
+ }
131
+ export type ModifierNode = ExplodeModifierNode | TargetModifierNode | DropModifierNode | KeepModifierNode | MinimumModifierNode | MaximumModifierNode | RerollModifierNode | UniqueModifierNode | CriticalSuccessModifierNode | CriticalFailureModifierNode | SortModifierNode;
132
+ export declare function createNodeId(kind: string, span: SourceSpan): NodeId;
@@ -0,0 +1,4 @@
1
+ export * from './ast.cjs';
2
+ export * from './parser.cjs';
3
+ export * from './scanner.cjs';
4
+ export type * from './tokens.cjs';
@@ -0,0 +1,4 @@
1
+ export * from './ast.js';
2
+ export * from './parser.js';
3
+ export * from './scanner.js';
4
+ export type * from './tokens.js';
@@ -0,0 +1,7 @@
1
+ import { type ExpressionNode } from './ast.cjs';
2
+ export interface DiceParserLimits {
3
+ readonly maxDepth: number;
4
+ readonly maxNodes: number;
5
+ }
6
+ /** Parses one compact, comment-free roll formula (without an `N#` prefix). */
7
+ export declare function parseDiceNotation(input: string, limits?: DiceParserLimits): ExpressionNode;
@@ -0,0 +1,7 @@
1
+ import { type ExpressionNode } from './ast.js';
2
+ export interface DiceParserLimits {
3
+ readonly maxDepth: number;
4
+ readonly maxNodes: number;
5
+ }
6
+ /** Parses one compact, comment-free roll formula (without an `N#` prefix). */
7
+ export declare function parseDiceNotation(input: string, limits?: DiceParserLimits): ExpressionNode;
@@ -0,0 +1,3 @@
1
+ import type { SyntaxToken } from './tokens.cjs';
2
+ /** Tokenizes compact V3 notation while retaining exact source offsets. */
3
+ export declare function tokenizeDiceNotation(input: string): readonly SyntaxToken[];
@@ -0,0 +1,3 @@
1
+ import type { SyntaxToken } from './tokens.js';
2
+ /** Tokenizes compact V3 notation while retaining exact source offsets. */
3
+ export declare function tokenizeDiceNotation(input: string): readonly SyntaxToken[];
@@ -0,0 +1,38 @@
1
+ import type { BinaryOperator, ComparisonOperator } from './ast.cjs';
2
+ import type { SourceSpan } from '../errors.cjs';
3
+ export interface NumberToken {
4
+ readonly kind: 'number';
5
+ readonly lexeme: string;
6
+ readonly value: number;
7
+ readonly span: SourceSpan;
8
+ }
9
+ export interface IdentifierToken {
10
+ readonly kind: 'identifier';
11
+ readonly lexeme: string;
12
+ readonly value: string;
13
+ readonly span: SourceSpan;
14
+ }
15
+ export interface OperatorToken {
16
+ readonly kind: 'operator';
17
+ readonly lexeme: string;
18
+ readonly value: BinaryOperator;
19
+ readonly span: SourceSpan;
20
+ }
21
+ export interface ComparisonToken {
22
+ readonly kind: 'comparison';
23
+ readonly lexeme: string;
24
+ readonly value: Exclude<ComparisonOperator, '!='>;
25
+ readonly span: SourceSpan;
26
+ }
27
+ export type PunctuationKind = 'left-parenthesis' | 'right-parenthesis' | 'left-brace' | 'right-brace' | 'comma' | 'dot' | 'bang';
28
+ export interface PunctuationToken {
29
+ readonly kind: PunctuationKind;
30
+ readonly lexeme: string;
31
+ readonly span: SourceSpan;
32
+ }
33
+ export interface EofToken {
34
+ readonly kind: 'eof';
35
+ readonly lexeme: '';
36
+ readonly span: SourceSpan;
37
+ }
38
+ export type SyntaxToken = NumberToken | IdentifierToken | OperatorToken | ComparisonToken | PunctuationToken | EofToken;
@@ -0,0 +1,38 @@
1
+ import type { BinaryOperator, ComparisonOperator } from './ast.js';
2
+ import type { SourceSpan } from '../errors.js';
3
+ export interface NumberToken {
4
+ readonly kind: 'number';
5
+ readonly lexeme: string;
6
+ readonly value: number;
7
+ readonly span: SourceSpan;
8
+ }
9
+ export interface IdentifierToken {
10
+ readonly kind: 'identifier';
11
+ readonly lexeme: string;
12
+ readonly value: string;
13
+ readonly span: SourceSpan;
14
+ }
15
+ export interface OperatorToken {
16
+ readonly kind: 'operator';
17
+ readonly lexeme: string;
18
+ readonly value: BinaryOperator;
19
+ readonly span: SourceSpan;
20
+ }
21
+ export interface ComparisonToken {
22
+ readonly kind: 'comparison';
23
+ readonly lexeme: string;
24
+ readonly value: Exclude<ComparisonOperator, '!='>;
25
+ readonly span: SourceSpan;
26
+ }
27
+ export type PunctuationKind = 'left-parenthesis' | 'right-parenthesis' | 'left-brace' | 'right-brace' | 'comma' | 'dot' | 'bang';
28
+ export interface PunctuationToken {
29
+ readonly kind: PunctuationKind;
30
+ readonly lexeme: string;
31
+ readonly span: SourceSpan;
32
+ }
33
+ export interface EofToken {
34
+ readonly kind: 'eof';
35
+ readonly lexeme: '';
36
+ readonly span: SourceSpan;
37
+ }
38
+ export type SyntaxToken = NumberToken | IdentifierToken | OperatorToken | ComparisonToken | PunctuationToken | EofToken;
@@ -0,0 +1,251 @@
1
+ import type { DiceRollError, SourceSpan } from './errors.cjs';
2
+ import type { DiceLimits } from './runtime/limits.cjs';
3
+ import type { RandomAlgorithm, ReplayDescriptor, SeedInput } from './runtime/replay.cjs';
4
+ export type DiceSides = number | 'F';
5
+ export type DiceState = 'compound' | 'critical-failure' | 'critical-success' | 'dropped' | 'exploded' | 'maximum' | 'minimum' | 'penetrated' | 'rerolled' | 'target-failure' | 'target-neutral' | 'target-success' | 'unique-rerolled';
6
+ export type GroupState = 'dropped' | 'sorted-ascending' | 'sorted-descending';
7
+ export interface DiceInspectionCost {
8
+ readonly staticDice: number;
9
+ readonly worstCaseGeneratedDice: number;
10
+ readonly worstCaseRandomCalls: number;
11
+ readonly totalStaticDice: number;
12
+ readonly totalWorstCaseGeneratedDice: number;
13
+ readonly totalWorstCaseRandomCalls: number;
14
+ }
15
+ export interface RollPlanGroup {
16
+ readonly id: string;
17
+ readonly sourceNodeId: string;
18
+ readonly kind: 'dice' | 'expression' | 'function' | 'group';
19
+ readonly notation: string;
20
+ readonly span: SourceSpan;
21
+ readonly childIds: readonly string[];
22
+ }
23
+ export interface RollPlan {
24
+ readonly type: 'roll-plan';
25
+ readonly schemaVersion: 3;
26
+ readonly compilerVersion: 1;
27
+ readonly planFingerprint: string;
28
+ readonly input: string;
29
+ readonly comment: string;
30
+ readonly notation: string;
31
+ readonly normalizedNotation: string;
32
+ readonly isMultiRoll: boolean;
33
+ readonly rollCount: number;
34
+ readonly groups: readonly RollPlanGroup[];
35
+ readonly cost: DiceInspectionCost;
36
+ }
37
+ export interface EntityRange {
38
+ readonly start: number;
39
+ readonly count: number;
40
+ }
41
+ export interface ResolvedDie {
42
+ readonly id: string;
43
+ readonly sourceNodeId: string;
44
+ readonly parentDieId: string | null;
45
+ readonly rollIndex: number;
46
+ readonly rollDieIndex: number;
47
+ readonly groupId: string;
48
+ readonly sides: DiceSides;
49
+ readonly rawValue: number;
50
+ readonly value: number;
51
+ readonly contribution: number;
52
+ readonly included: boolean;
53
+ readonly states: readonly DiceState[];
54
+ }
55
+ export interface ResolvedGroup {
56
+ readonly id: string;
57
+ readonly sourceNodeId: string;
58
+ readonly rollIndex: number;
59
+ readonly kind: 'dice' | 'expression' | 'function' | 'group';
60
+ readonly notation: string;
61
+ readonly span: SourceSpan;
62
+ readonly value: number;
63
+ readonly contribution: number;
64
+ readonly included: boolean;
65
+ readonly states: readonly GroupState[];
66
+ readonly childIds: readonly string[];
67
+ }
68
+ export interface PoolSummary {
69
+ readonly successes: number;
70
+ readonly failures: number;
71
+ readonly netSuccesses: number;
72
+ }
73
+ interface EventBase {
74
+ readonly sequence: number;
75
+ readonly rollIndex: number;
76
+ readonly sourceNodeId: string;
77
+ }
78
+ interface DieEventBase extends EventBase {
79
+ readonly subject: 'die';
80
+ readonly dieId: string;
81
+ readonly parentDieId: string | null;
82
+ }
83
+ interface GroupEventBase extends EventBase {
84
+ readonly subject: 'group';
85
+ readonly groupId: string;
86
+ }
87
+ export interface RollDiceEvent extends DieEventBase {
88
+ readonly type: 'roll';
89
+ readonly value: number;
90
+ }
91
+ export interface RerollDiceEvent extends DieEventBase {
92
+ readonly type: 'reroll';
93
+ readonly from: number;
94
+ readonly to: number;
95
+ readonly reason: 'reroll' | 'reroll-once' | 'unique' | 'unique-once';
96
+ }
97
+ export interface ExplodeDiceEvent extends DieEventBase {
98
+ readonly type: 'explode';
99
+ readonly childDieId: string;
100
+ readonly value: number;
101
+ readonly reason: 'explode' | 'compound' | 'penetrate';
102
+ }
103
+ export interface TransformDiceEvent extends DieEventBase {
104
+ readonly type: 'transform';
105
+ readonly from: number;
106
+ readonly to: number;
107
+ readonly reason: 'minimum' | 'maximum' | 'penetrate' | 'compound';
108
+ }
109
+ export interface TransformGroupEvent extends GroupEventBase {
110
+ readonly type: 'transform';
111
+ readonly from: readonly string[];
112
+ readonly to: readonly string[];
113
+ readonly reason: 'sort-ascending' | 'sort-descending';
114
+ }
115
+ export interface IncludeDiceEvent extends DieEventBase {
116
+ readonly type: 'include';
117
+ readonly contribution: number;
118
+ }
119
+ export interface IncludeGroupEvent extends GroupEventBase {
120
+ readonly type: 'include';
121
+ readonly value: number;
122
+ readonly contribution: number;
123
+ }
124
+ export interface ExcludeDiceEvent extends DieEventBase {
125
+ readonly type: 'exclude';
126
+ readonly reason: 'drop' | 'keep' | 'compound-absorbed';
127
+ }
128
+ export interface ExcludeGroupEvent extends GroupEventBase {
129
+ readonly type: 'exclude';
130
+ readonly value: number;
131
+ readonly reason: 'drop' | 'keep';
132
+ }
133
+ export interface ClassifyDiceEvent extends DieEventBase {
134
+ readonly type: 'classify';
135
+ readonly outcome: 'success' | 'failure' | 'neutral' | 'critical-success' | 'critical-failure';
136
+ }
137
+ export type DiceEvent = RollDiceEvent | RerollDiceEvent | ExplodeDiceEvent | TransformDiceEvent | TransformGroupEvent | IncludeDiceEvent | IncludeGroupEvent | ExcludeDiceEvent | ExcludeGroupEvent | ClassifyDiceEvent;
138
+ export interface ExecutionStats {
139
+ readonly rolls: number;
140
+ readonly initialDice: number;
141
+ readonly generatedDice: number;
142
+ readonly randomCalls: number;
143
+ readonly modifierSteps: number;
144
+ readonly events: number;
145
+ readonly resolvedGroups: number;
146
+ readonly resultItems: number;
147
+ }
148
+ export interface ResolvedRoll {
149
+ readonly index: number;
150
+ readonly total: number;
151
+ readonly pool: PoolSummary | null;
152
+ readonly diceRange: EntityRange;
153
+ readonly groupRange: EntityRange;
154
+ readonly eventRange: EntityRange;
155
+ }
156
+ interface RollResultBase {
157
+ readonly schemaVersion: 3;
158
+ readonly input: string;
159
+ readonly notation: string;
160
+ readonly normalizedNotation: string;
161
+ readonly comment: string;
162
+ readonly total: number;
163
+ readonly replay: ReplayDescriptor;
164
+ readonly stats: ExecutionStats;
165
+ readonly pool: PoolSummary | null;
166
+ }
167
+ export interface DiceRollResult extends RollResultBase {
168
+ readonly type: 'dice-roll';
169
+ readonly output: string;
170
+ readonly rolls: readonly ResolvedRoll[];
171
+ readonly groups: readonly ResolvedGroup[];
172
+ readonly dice: readonly ResolvedDie[];
173
+ readonly events: readonly DiceEvent[];
174
+ }
175
+ export interface ResolvedRollSummary {
176
+ readonly index: number;
177
+ readonly total: number;
178
+ readonly pool: PoolSummary | null;
179
+ }
180
+ export interface DiceRollSummary extends RollResultBase {
181
+ readonly type: 'dice-roll-summary';
182
+ readonly rolls: readonly ResolvedRollSummary[];
183
+ }
184
+ interface DiceNotationInspectionBase {
185
+ readonly type: 'dice-notation-inspection';
186
+ readonly input: string;
187
+ readonly notation: string;
188
+ readonly normalizedNotation: string;
189
+ readonly comment: string;
190
+ }
191
+ interface ValidDiceNotationInspection extends DiceNotationInspectionBase {
192
+ readonly isValid: true;
193
+ readonly plan: RollPlan;
194
+ readonly groups: readonly RollPlanGroup[];
195
+ readonly cost: DiceInspectionCost;
196
+ readonly error: null;
197
+ }
198
+ interface InvalidDiceNotationInspection extends DiceNotationInspectionBase {
199
+ readonly isValid: false;
200
+ readonly plan: null;
201
+ readonly groups: readonly RollPlanGroup[];
202
+ readonly cost: null;
203
+ readonly error: DiceRollError;
204
+ }
205
+ export type DiceNotationInspection = ValidDiceNotationInspection | InvalidDiceNotationInspection;
206
+ export type FreezeResultsMode = 'development' | 'always' | 'never';
207
+ export interface DiceCacheOptions {
208
+ readonly maxInputEntries?: number;
209
+ readonly maxProgramEntries?: number;
210
+ readonly maxProgramNodes?: number;
211
+ }
212
+ export interface DiceCacheStats {
213
+ readonly inputEntries: number;
214
+ readonly programEntries: number;
215
+ readonly programNodes: number;
216
+ readonly hits: number;
217
+ readonly misses: number;
218
+ readonly evictions: number;
219
+ }
220
+ export interface DiceEngineOptions {
221
+ readonly limits?: Partial<DiceLimits>;
222
+ readonly freezeResults?: FreezeResultsMode;
223
+ readonly cache?: false | DiceCacheOptions;
224
+ readonly randomAlgorithm?: RandomAlgorithm;
225
+ }
226
+ export interface CompileOptions {
227
+ readonly limits?: Partial<DiceLimits>;
228
+ }
229
+ type SeededRollOptions = {
230
+ readonly seed?: SeedInput;
231
+ readonly replay?: never;
232
+ readonly randomAlgorithm?: RandomAlgorithm;
233
+ };
234
+ type ReplayRollOptions = {
235
+ readonly seed?: never;
236
+ readonly replay: ReplayDescriptor;
237
+ readonly randomAlgorithm?: never;
238
+ };
239
+ export type RollOptions = CompileOptions & (SeededRollOptions | ReplayRollOptions);
240
+ export interface DiceEngine {
241
+ readonly limits: DiceLimits;
242
+ clearCache(): void;
243
+ compile(input: string, options?: CompileOptions): RollPlan;
244
+ getCacheStats(): DiceCacheStats;
245
+ inspect(input: string, options?: CompileOptions): DiceNotationInspection;
246
+ normalize(input: string): string;
247
+ roll(input: string | RollPlan, options?: RollOptions): DiceRollResult;
248
+ rollSummary(input: string | RollPlan, options?: RollOptions): DiceRollSummary;
249
+ verify(input: string, options?: CompileOptions): boolean;
250
+ }
251
+ export {};