/
DiceUtils.ts
155 lines (146 loc) · 3.41 KB
/
DiceUtils.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
import { assertNever, range } from "@systemic-games/pixels-core-utils";
import { PixelDieType } from "./PixelDieType";
export const DiceUtils = {
getLEDCount(dieType: PixelDieType): number {
switch (dieType) {
case "unknown":
return 0;
case "d4":
case "d6":
case "d6fudge":
return 6;
case "d6pipped":
return 21;
case "d8":
return 8;
case "d10":
case "d00":
return 10;
case "d12":
return 12;
case "d20":
return 20;
default:
assertNever(dieType);
}
},
getFaceCount(dieType: PixelDieType): number {
switch (dieType) {
case "unknown":
return 0;
case "d4":
return 4;
case "d6":
case "d6fudge":
case "d6pipped":
return 6;
case "d8":
return 8;
case "d10":
case "d00":
return 10;
case "d12":
return 12;
case "d20":
return 20;
default:
assertNever(dieType);
}
},
getTopFace(dieType: PixelDieType): number {
return dieType === "d00" || dieType === "d10"
? 0
: DiceUtils.getFaceCount(dieType);
},
// Try to derive the die type from number of LEDs
estimateDieType(ledCount: number): PixelDieType {
switch (ledCount) {
case 4:
return "d4";
case 6:
return "d6";
case 8:
return "d8";
case 10:
return "d10";
case 12:
return "d12";
case 20:
return "d20";
case 21:
return "d6pipped";
default:
return "unknown";
}
},
// TODO fix for D4 rolling as D6 and D00 rolling as D10
faceFromIndex(
faceIndex: number,
dieType: PixelDieType,
noFix?: boolean
): number {
switch (dieType) {
case "d4":
if (noFix) return faceIndex + 1;
if (faceIndex === 2) return 2;
if (faceIndex === 3) return 3;
if (faceIndex === 5) return 4;
return 1;
case "d10":
return faceIndex;
case "d00":
return faceIndex * 10;
case "unknown":
return faceIndex;
default:
return faceIndex + 1;
}
},
// TODO fix for D4 rolling as D6 and D00 rolling as D10
indexFromFace(face: number, dieType: PixelDieType, noFix?: boolean): number {
switch (dieType) {
case "d4":
if (noFix) return face - 1;
if (face === 2) return 2;
if (face === 3) return 3;
if (face === 4) return 5;
return 0;
case "d10":
return face;
case "d00":
return Math.floor(face / 10);
case "unknown":
return face;
default:
return face - 1;
}
},
getDieFaces(dieType: PixelDieType): number[] {
switch (dieType) {
case "unknown":
return [];
case "d4":
return range(1, 5);
case "d6":
case "d6pipped":
case "d6fudge":
return range(1, 7);
case "d8":
return range(1, 9);
case "d10":
return range(0, 10);
case "d00":
return range(0, 100, 10);
case "d12":
return range(1, 13);
case "d20":
return range(1, 21);
default:
assertNever(dieType);
}
},
// TODO fix for edit animations taking a face value instead of an index
mapFaceForAnimation(face: number, dieType: PixelDieType): number {
return 1 + DiceUtils.indexFromFace(face, dieType);
},
} as const;