@swrpg-online/dice 1.0.4 → 1.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.
package/dist/cli.d.ts CHANGED
@@ -2,3 +2,4 @@
2
2
  import { DicePool } from "./types";
3
3
  export declare function parseDiceNotation(input: string): DicePool;
4
4
  export declare function formatResult(result: any): string;
5
+ export declare const main: () => void;
package/dist/cli.js CHANGED
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.main = void 0;
4
5
  exports.parseDiceNotation = parseDiceNotation;
5
6
  exports.formatResult = formatResult;
6
7
  const dice_1 = require("./dice");
@@ -13,6 +14,7 @@ function parseDiceNotation(input) {
13
14
  setBackDice: 0,
14
15
  difficultyDice: 0,
15
16
  challengeDice: 0,
17
+ forceDice: 0,
16
18
  };
17
19
  // function getImagePath(type: string): string {
18
20
  // const basePath = path.join(__dirname, 'images');
@@ -36,44 +38,44 @@ function parseDiceNotation(input) {
36
38
  const parts = input.toLowerCase().trim().split(" ");
37
39
  for (const part of parts) {
38
40
  const count = parseInt(part);
39
- const color = part.slice(String(count).length);
41
+ const color = part.slice(String(count).length).toLowerCase();
40
42
  switch (color) {
41
- // y/pro = Yellow/Proficiency
43
+ // y/pro = Yellow / Proficiency
42
44
  case "y":
43
45
  pool.proficiencyDice = count;
44
46
  break;
45
47
  case "pro":
46
48
  pool.proficiencyDice = count;
47
49
  break;
48
- // g/a = Green/Ability
50
+ // g/a = Green / Ability
49
51
  case "g":
50
52
  pool.abilityDice = count;
51
53
  break;
52
54
  case "a":
53
55
  pool.abilityDice = count;
54
56
  break;
55
- // b/boo = Blue/Boost
57
+ // b/boo = Blue / Boost
56
58
  case "b":
57
- pool.setBackDice = count;
59
+ pool.boostDice = count;
58
60
  break;
59
61
  case "boo":
60
- pool.setBackDice = count;
62
+ pool.boostDice = count;
61
63
  break;
62
- // r/c = Red/ Challenge
64
+ // r/c = Red / Challenge
63
65
  case "r":
64
66
  pool.challengeDice = count;
65
67
  break;
66
68
  case "c":
67
69
  pool.challengeDice = count;
68
70
  break;
69
- // p/diff = Purple/ Difficulty
71
+ // p/diff = Purple / Difficulty
70
72
  case "p":
71
73
  pool.difficultyDice = count;
72
74
  break;
73
75
  case "diff":
74
76
  pool.difficultyDice = count;
75
77
  break;
76
- // blk/k/sb/s = Black/Setback
78
+ // blk/k/sb/s = Black / Setback
77
79
  case "blk":
78
80
  pool.setBackDice = count;
79
81
  break;
@@ -86,8 +88,13 @@ function parseDiceNotation(input) {
86
88
  case "s":
87
89
  pool.setBackDice = count;
88
90
  break;
89
- // w/f = White/Force
90
- // TODO
91
+ // w/f = White / Force
92
+ case "w":
93
+ pool.forceDice = count;
94
+ break;
95
+ case "f":
96
+ pool.forceDice = count;
97
+ break;
91
98
  }
92
99
  }
93
100
  return pool;
@@ -106,6 +113,10 @@ function formatResult(result) {
106
113
  parts.push(`${result.summary.triumphs} Triumph(s)`);
107
114
  if (result.summary.despair > 0)
108
115
  parts.push(`${result.summary.despair} Despair(s)`);
116
+ if (result.summary.lightSide > 0)
117
+ parts.push(`${result.summary.lightSide} Light Side(s)`);
118
+ if (result.summary.darkSide > 0)
119
+ parts.push(`${result.summary.darkSide} Dark Side(s)`);
109
120
  return parts.join(", ") || "No effects";
110
121
  }
111
122
  const main = () => {
@@ -118,6 +129,7 @@ const main = () => {
118
129
  - r/c = Red / Challenge
119
130
  - p/diff = Purple / Difficulty
120
131
  - blk/k/sb/s = Black / Setback
132
+ - w/f = White/Force
121
133
  `);
122
134
  process.exit(1);
123
135
  }
@@ -125,6 +137,7 @@ const main = () => {
125
137
  const result = (0, dice_1.roll)(pool);
126
138
  console.log(formatResult(result));
127
139
  };
140
+ exports.main = main;
128
141
  if (require.main === module) {
129
- main();
142
+ (0, exports.main)();
130
143
  }
package/dist/dice.js CHANGED
@@ -12,6 +12,8 @@ const boostDieResult = (roll) => {
12
12
  threats: 0,
13
13
  triumphs: 0,
14
14
  despair: 0,
15
+ lightSide: 0,
16
+ darkSide: 0,
15
17
  };
16
18
  case 4:
17
19
  return {
@@ -21,6 +23,8 @@ const boostDieResult = (roll) => {
21
23
  threats: 0,
22
24
  triumphs: 0,
23
25
  despair: 0,
26
+ lightSide: 0,
27
+ darkSide: 0,
24
28
  };
25
29
  case 5:
26
30
  return {
@@ -30,6 +34,8 @@ const boostDieResult = (roll) => {
30
34
  threats: 0,
31
35
  triumphs: 0,
32
36
  despair: 0,
37
+ lightSide: 0,
38
+ darkSide: 0,
33
39
  };
34
40
  case 6:
35
41
  return {
@@ -39,6 +45,8 @@ const boostDieResult = (roll) => {
39
45
  threats: 0,
40
46
  triumphs: 0,
41
47
  despair: 0,
48
+ lightSide: 0,
49
+ darkSide: 0,
42
50
  };
43
51
  default:
44
52
  return {
@@ -48,6 +56,8 @@ const boostDieResult = (roll) => {
48
56
  threats: 0,
49
57
  triumphs: 0,
50
58
  despair: 0,
59
+ lightSide: 0,
60
+ darkSide: 0,
51
61
  };
52
62
  }
53
63
  };
@@ -62,6 +72,8 @@ const setBackDieResult = (roll) => {
62
72
  threats: 0,
63
73
  triumphs: 0,
64
74
  despair: 0,
75
+ lightSide: 0,
76
+ darkSide: 0,
65
77
  };
66
78
  case 5:
67
79
  case 6:
@@ -72,6 +84,8 @@ const setBackDieResult = (roll) => {
72
84
  threats: 1,
73
85
  triumphs: 0,
74
86
  despair: 0,
87
+ lightSide: 0,
88
+ darkSide: 0,
75
89
  };
76
90
  default:
77
91
  return {
@@ -81,6 +95,8 @@ const setBackDieResult = (roll) => {
81
95
  threats: 0,
82
96
  triumphs: 0,
83
97
  despair: 0,
98
+ lightSide: 0,
99
+ darkSide: 0,
84
100
  };
85
101
  }
86
102
  };
@@ -95,6 +111,8 @@ const abilityDieResult = (roll) => {
95
111
  threats: 0,
96
112
  triumphs: 0,
97
113
  despair: 0,
114
+ lightSide: 0,
115
+ darkSide: 0,
98
116
  };
99
117
  case 4:
100
118
  return {
@@ -104,6 +122,8 @@ const abilityDieResult = (roll) => {
104
122
  threats: 0,
105
123
  triumphs: 0,
106
124
  despair: 0,
125
+ lightSide: 0,
126
+ darkSide: 0,
107
127
  };
108
128
  case 5:
109
129
  case 6:
@@ -114,6 +134,8 @@ const abilityDieResult = (roll) => {
114
134
  threats: 0,
115
135
  triumphs: 0,
116
136
  despair: 0,
137
+ lightSide: 0,
138
+ darkSide: 0,
117
139
  };
118
140
  case 7:
119
141
  return {
@@ -123,6 +145,8 @@ const abilityDieResult = (roll) => {
123
145
  threats: 0,
124
146
  triumphs: 0,
125
147
  despair: 0,
148
+ lightSide: 0,
149
+ darkSide: 0,
126
150
  };
127
151
  case 8:
128
152
  return {
@@ -132,6 +156,8 @@ const abilityDieResult = (roll) => {
132
156
  threats: 0,
133
157
  triumphs: 0,
134
158
  despair: 0,
159
+ lightSide: 0,
160
+ darkSide: 0,
135
161
  };
136
162
  default:
137
163
  return {
@@ -141,6 +167,8 @@ const abilityDieResult = (roll) => {
141
167
  threats: 0,
142
168
  triumphs: 0,
143
169
  despair: 0,
170
+ lightSide: 0,
171
+ darkSide: 0,
144
172
  };
145
173
  }
146
174
  };
@@ -154,6 +182,8 @@ const difficultyDieResult = (roll) => {
154
182
  threats: 0,
155
183
  triumphs: 0,
156
184
  despair: 0,
185
+ lightSide: 0,
186
+ darkSide: 0,
157
187
  };
158
188
  case 3:
159
189
  return {
@@ -163,6 +193,8 @@ const difficultyDieResult = (roll) => {
163
193
  threats: 0,
164
194
  triumphs: 0,
165
195
  despair: 0,
196
+ lightSide: 0,
197
+ darkSide: 0,
166
198
  };
167
199
  case 4:
168
200
  case 5:
@@ -174,6 +206,8 @@ const difficultyDieResult = (roll) => {
174
206
  threats: 1,
175
207
  triumphs: 0,
176
208
  despair: 0,
209
+ lightSide: 0,
210
+ darkSide: 0,
177
211
  };
178
212
  case 7:
179
213
  return {
@@ -183,6 +217,8 @@ const difficultyDieResult = (roll) => {
183
217
  threats: 2,
184
218
  triumphs: 0,
185
219
  despair: 0,
220
+ lightSide: 0,
221
+ darkSide: 0,
186
222
  };
187
223
  case 8:
188
224
  return {
@@ -192,6 +228,8 @@ const difficultyDieResult = (roll) => {
192
228
  threats: 1,
193
229
  triumphs: 0,
194
230
  despair: 0,
231
+ lightSide: 0,
232
+ darkSide: 0,
195
233
  };
196
234
  default:
197
235
  return {
@@ -201,6 +239,8 @@ const difficultyDieResult = (roll) => {
201
239
  threats: 0,
202
240
  triumphs: 0,
203
241
  despair: 0,
242
+ lightSide: 0,
243
+ darkSide: 0,
204
244
  };
205
245
  }
206
246
  };
@@ -215,6 +255,8 @@ const proficiencyDieResult = (roll) => {
215
255
  threats: 0,
216
256
  triumphs: 0,
217
257
  despair: 0,
258
+ lightSide: 0,
259
+ darkSide: 0,
218
260
  };
219
261
  case 4:
220
262
  case 5:
@@ -225,6 +267,8 @@ const proficiencyDieResult = (roll) => {
225
267
  threats: 0,
226
268
  triumphs: 0,
227
269
  despair: 0,
270
+ lightSide: 0,
271
+ darkSide: 0,
228
272
  };
229
273
  case 6:
230
274
  return {
@@ -234,6 +278,8 @@ const proficiencyDieResult = (roll) => {
234
278
  threats: 0,
235
279
  triumphs: 0,
236
280
  despair: 0,
281
+ lightSide: 0,
282
+ darkSide: 0,
237
283
  };
238
284
  case 7:
239
285
  case 8:
@@ -245,6 +291,8 @@ const proficiencyDieResult = (roll) => {
245
291
  threats: 0,
246
292
  triumphs: 0,
247
293
  despair: 0,
294
+ lightSide: 0,
295
+ darkSide: 0,
248
296
  };
249
297
  case 10:
250
298
  case 11:
@@ -255,6 +303,8 @@ const proficiencyDieResult = (roll) => {
255
303
  threats: 0,
256
304
  triumphs: 0,
257
305
  despair: 0,
306
+ lightSide: 0,
307
+ darkSide: 0,
258
308
  };
259
309
  case 12:
260
310
  return {
@@ -264,6 +314,8 @@ const proficiencyDieResult = (roll) => {
264
314
  threats: 0,
265
315
  triumphs: 1,
266
316
  despair: 0,
317
+ lightSide: 0,
318
+ darkSide: 0,
267
319
  };
268
320
  default:
269
321
  return {
@@ -273,6 +325,8 @@ const proficiencyDieResult = (roll) => {
273
325
  threats: 0,
274
326
  triumphs: 0,
275
327
  despair: 0,
328
+ lightSide: 0,
329
+ darkSide: 0,
276
330
  };
277
331
  }
278
332
  };
@@ -287,6 +341,8 @@ const challengeDieResult = (roll) => {
287
341
  threats: 0,
288
342
  triumphs: 0,
289
343
  despair: 0,
344
+ lightSide: 0,
345
+ darkSide: 0,
290
346
  };
291
347
  case 4:
292
348
  case 5:
@@ -297,6 +353,8 @@ const challengeDieResult = (roll) => {
297
353
  threats: 0,
298
354
  triumphs: 0,
299
355
  despair: 0,
356
+ lightSide: 0,
357
+ darkSide: 0,
300
358
  };
301
359
  case 6:
302
360
  case 7:
@@ -307,6 +365,8 @@ const challengeDieResult = (roll) => {
307
365
  threats: 1,
308
366
  triumphs: 0,
309
367
  despair: 0,
368
+ lightSide: 0,
369
+ darkSide: 0,
310
370
  };
311
371
  case 8:
312
372
  case 9:
@@ -317,6 +377,8 @@ const challengeDieResult = (roll) => {
317
377
  threats: 1,
318
378
  triumphs: 0,
319
379
  despair: 0,
380
+ lightSide: 0,
381
+ darkSide: 0,
320
382
  };
321
383
  case 10:
322
384
  case 11:
@@ -327,6 +389,8 @@ const challengeDieResult = (roll) => {
327
389
  threats: 2,
328
390
  triumphs: 0,
329
391
  despair: 0,
392
+ lightSide: 0,
393
+ darkSide: 0,
330
394
  };
331
395
  case 12:
332
396
  return {
@@ -336,6 +400,8 @@ const challengeDieResult = (roll) => {
336
400
  threats: 0,
337
401
  triumphs: 0,
338
402
  despair: 1,
403
+ lightSide: 0,
404
+ darkSide: 0,
339
405
  };
340
406
  default:
341
407
  return {
@@ -345,6 +411,75 @@ const challengeDieResult = (roll) => {
345
411
  threats: 0,
346
412
  triumphs: 0,
347
413
  despair: 0,
414
+ lightSide: 0,
415
+ darkSide: 0,
416
+ };
417
+ }
418
+ };
419
+ const forceDieResult = (roll) => {
420
+ switch (roll) {
421
+ case 1:
422
+ case 2:
423
+ case 3:
424
+ case 4:
425
+ case 5:
426
+ return {
427
+ successes: 0,
428
+ failures: 0,
429
+ advantages: 0,
430
+ threats: 0,
431
+ triumphs: 0,
432
+ despair: 0,
433
+ lightSide: 1,
434
+ darkSide: 0,
435
+ };
436
+ case 6:
437
+ case 7:
438
+ return {
439
+ successes: 0,
440
+ failures: 0,
441
+ advantages: 0,
442
+ threats: 0,
443
+ triumphs: 0,
444
+ despair: 0,
445
+ lightSide: 2,
446
+ darkSide: 0,
447
+ };
448
+ case 8:
449
+ case 9:
450
+ case 10:
451
+ case 11:
452
+ return {
453
+ successes: 0,
454
+ failures: 0,
455
+ advantages: 0,
456
+ threats: 0,
457
+ triumphs: 0,
458
+ despair: 0,
459
+ lightSide: 0,
460
+ darkSide: 1,
461
+ };
462
+ case 12:
463
+ return {
464
+ successes: 0,
465
+ failures: 0,
466
+ advantages: 0,
467
+ threats: 0,
468
+ triumphs: 0,
469
+ despair: 0,
470
+ lightSide: 0,
471
+ darkSide: 2,
472
+ };
473
+ default:
474
+ return {
475
+ successes: 0,
476
+ failures: 0,
477
+ advantages: 0,
478
+ threats: 0,
479
+ triumphs: 0,
480
+ despair: 0,
481
+ lightSide: 0,
482
+ darkSide: 0,
348
483
  };
349
484
  }
350
485
  };
@@ -356,6 +491,8 @@ const sumResults = (results) => {
356
491
  threats: acc.threats + curr.threats,
357
492
  triumphs: acc.triumphs + curr.triumphs,
358
493
  despair: acc.despair + curr.despair,
494
+ lightSide: acc.lightSide + (curr.lightSide || 0),
495
+ darkSide: acc.darkSide + (curr.darkSide || 0),
359
496
  }), {
360
497
  successes: 0,
361
498
  failures: 0,
@@ -363,6 +500,8 @@ const sumResults = (results) => {
363
500
  threats: 0,
364
501
  triumphs: 0,
365
502
  despair: 0,
503
+ lightSide: 0,
504
+ darkSide: 0,
366
505
  });
367
506
  // Calculate net successes/failures
368
507
  let netSuccesses = 0;
@@ -384,10 +523,12 @@ const sumResults = (results) => {
384
523
  threats: sums.threats,
385
524
  triumphs: sums.triumphs,
386
525
  despair: sums.despair,
526
+ lightSide: sums.lightSide,
527
+ darkSide: sums.darkSide,
387
528
  };
388
529
  };
389
530
  const roll = (pool) => {
390
- var _a, _b, _c, _d, _e, _f;
531
+ var _a, _b, _c, _d, _e, _f, _g;
391
532
  // Initialize all dice counts to 0 if undefined
392
533
  const boostCount = (_a = pool.boostDice) !== null && _a !== void 0 ? _a : 0;
393
534
  const abilityCount = (_b = pool.abilityDice) !== null && _b !== void 0 ? _b : 0;
@@ -395,6 +536,7 @@ const roll = (pool) => {
395
536
  const setBackCount = (_d = pool.setBackDice) !== null && _d !== void 0 ? _d : 0;
396
537
  const difficultyCount = (_e = pool.difficultyDice) !== null && _e !== void 0 ? _e : 0;
397
538
  const challengeCount = (_f = pool.challengeDice) !== null && _f !== void 0 ? _f : 0;
539
+ const forceCount = (_g = pool.forceDice) !== null && _g !== void 0 ? _g : 0;
398
540
  // Ensure all dice counts are non-negative
399
541
  const sanitizedPool = {
400
542
  boostDice: Math.max(0, boostCount),
@@ -403,6 +545,7 @@ const roll = (pool) => {
403
545
  setBackDice: Math.max(0, setBackCount),
404
546
  difficultyDice: Math.max(0, difficultyCount),
405
547
  challengeDice: Math.max(0, challengeCount),
548
+ forceDice: Math.max(0, forceCount),
406
549
  };
407
550
  const detailedResults = [];
408
551
  // Roll boost dice
@@ -459,6 +602,15 @@ const roll = (pool) => {
459
602
  result: challengeDieResult(roll),
460
603
  });
461
604
  }
605
+ // Roll force dice
606
+ for (let i = 0; i < sanitizedPool.forceDice; i++) {
607
+ const roll = rollDie(12);
608
+ detailedResults.push({
609
+ type: "force",
610
+ roll,
611
+ result: forceDieResult(roll),
612
+ });
613
+ }
462
614
  return {
463
615
  results: detailedResults,
464
616
  summary: sumResults(detailedResults.map((r) => r.result)),
package/dist/types.d.ts CHANGED
@@ -5,6 +5,7 @@ export type DicePool = {
5
5
  setBackDice?: number;
6
6
  difficultyDice?: number;
7
7
  challengeDice?: number;
8
+ forceDice?: number;
8
9
  };
9
10
  export type DiceResult = {
10
11
  successes: number;
@@ -13,8 +14,10 @@ export type DiceResult = {
13
14
  threats: number;
14
15
  triumphs: number;
15
16
  despair: number;
17
+ lightSide: number;
18
+ darkSide: number;
16
19
  };
17
- export type DieType = "boost" | "ability" | "proficiency" | "setback" | "difficulty" | "challenge";
20
+ export type DieType = "boost" | "ability" | "proficiency" | "setback" | "difficulty" | "challenge" | "force";
18
21
  export type DetailedDieResult = {
19
22
  type: DieType;
20
23
  roll: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@swrpg-online/dice",
3
- "version": "1.0.4",
3
+ "version": "1.1.0",
4
4
  "description": "A TypeScript library for simulating Star Wars RPG narrative dice rolls.",
5
5
  "main": "dist/index.js",
6
6
  "bin": {