@houstonp/rubiks-cube 1.5.2 → 2.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/README.md +280 -170
- package/package.json +33 -3
- package/src/camera/cameraState.js +81 -0
- package/src/core.js +447 -0
- package/src/cube/animationSlice.js +205 -0
- package/src/cube/animationState.js +96 -0
- package/src/cube/cubeSettings.js +19 -0
- package/src/cube/cubeState.js +285 -139
- package/src/cube/stickerState.js +188 -0
- package/src/debouncer.js +16 -0
- package/src/globals.ts +9 -0
- package/src/index.js +621 -0
- package/src/settings.js +138 -0
- package/src/three/centerPiece.js +44 -0
- package/src/three/cornerPiece.js +60 -0
- package/src/three/cube.js +492 -0
- package/src/three/edgePiece.js +50 -0
- package/src/three/sticker.js +37 -0
- package/tests/common.js +27 -0
- package/tests/cube.five.test.js +126 -0
- package/tests/cube.four.test.js +126 -0
- package/tests/cube.seven.test.js +126 -0
- package/tests/cube.six.test.js +126 -0
- package/tests/cube.three.test.js +151 -0
- package/tests/cube.two.test.js +125 -0
- package/tests/setup.js +36 -0
- package/types/camera/cameraState.d.ts +19 -0
- package/types/core.d.ts +454 -0
- package/types/cube/animationSlice.d.ts +26 -0
- package/types/cube/animationState.d.ts +41 -0
- package/types/cube/cubeSettings.d.ts +17 -0
- package/types/cube/cubeState.d.ts +47 -0
- package/types/cube/stickerState.d.ts +21 -0
- package/types/debouncer.d.ts +13 -0
- package/types/globals.d.ts +7 -0
- package/types/index.d.ts +87 -0
- package/types/settings.d.ts +38 -0
- package/types/three/centerPiece.d.ts +15 -0
- package/types/three/cornerPiece.d.ts +24 -0
- package/types/three/cube.d.ts +130 -0
- package/types/three/edgePiece.d.ts +16 -0
- package/types/three/sticker.d.ts +15 -0
- package/.prettierrc +0 -7
- package/index.js +0 -274
- package/src/cube/cube.js +0 -276
- package/src/cube/cubeRotation.js +0 -63
- package/src/threejs/materials.js +0 -42
- package/src/threejs/pieces.js +0 -103
- package/src/threejs/stickers.js +0 -48
- package/src/utils/debouncer.js +0 -7
- package/src/utils/rotation.js +0 -53
package/src/core.js
ADDED
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
/**
|
|
3
|
+
* @typedef {typeof Movements.Single[keyof typeof Movements.Single]} SingleMove
|
|
4
|
+
* @typedef {typeof Movements.Wide[keyof typeof Movements.Wide]} WideMove
|
|
5
|
+
* @typedef {typeof Movements.Two[keyof typeof Movements.Two]} TwoMove
|
|
6
|
+
* @typedef {typeof Movements.Three[keyof typeof Movements.Three]} ThreeMove
|
|
7
|
+
* @typedef {typeof Movements.Four[keyof typeof Movements.Four]} FourMove
|
|
8
|
+
* @typedef {typeof Movements.Five[keyof typeof Movements.Five]} FiveMove
|
|
9
|
+
* @typedef {typeof Movements.Six[keyof typeof Movements.Six]} SixMove
|
|
10
|
+
* @typedef {SingleMove | WideMove | TwoMove | ThreeMove | FourMove | FiveMove | SixMove} Movement
|
|
11
|
+
*/
|
|
12
|
+
export const Movements = Object.freeze({
|
|
13
|
+
Single: Object.freeze({
|
|
14
|
+
R: 'R',
|
|
15
|
+
R2: 'R2',
|
|
16
|
+
RP: "R'",
|
|
17
|
+
L: 'L',
|
|
18
|
+
L2: 'L2',
|
|
19
|
+
LP: "L'",
|
|
20
|
+
U: 'U',
|
|
21
|
+
U2: 'U2',
|
|
22
|
+
UP: "U'",
|
|
23
|
+
D: 'D',
|
|
24
|
+
D2: 'D2',
|
|
25
|
+
DP: "D'",
|
|
26
|
+
F: 'F',
|
|
27
|
+
F2: 'F2',
|
|
28
|
+
FP: "F'",
|
|
29
|
+
B: 'B',
|
|
30
|
+
B2: 'B2',
|
|
31
|
+
BP: "B'",
|
|
32
|
+
M: 'M',
|
|
33
|
+
M2: 'M2',
|
|
34
|
+
MP: "M'",
|
|
35
|
+
E: 'E',
|
|
36
|
+
E2: 'E2',
|
|
37
|
+
EP: "E'",
|
|
38
|
+
S: 'S',
|
|
39
|
+
S2: 'S2',
|
|
40
|
+
SP: "S'",
|
|
41
|
+
}),
|
|
42
|
+
Wide: Object.freeze({
|
|
43
|
+
Rw: 'Rw',
|
|
44
|
+
Rw2: 'Rw2',
|
|
45
|
+
RwP: "Rw'",
|
|
46
|
+
r: 'r',
|
|
47
|
+
r2: 'r2',
|
|
48
|
+
rP: "r'",
|
|
49
|
+
Lw: 'Lw',
|
|
50
|
+
Lw2: 'Lw2',
|
|
51
|
+
LwP: "Lw'",
|
|
52
|
+
l: 'l',
|
|
53
|
+
l2: 'l2',
|
|
54
|
+
lP: "l'",
|
|
55
|
+
Fw: 'Fw',
|
|
56
|
+
Fw2: 'Fw2',
|
|
57
|
+
FwP: "Fw'",
|
|
58
|
+
f: 'f',
|
|
59
|
+
f2: 'f2',
|
|
60
|
+
fP: "f'",
|
|
61
|
+
Bw: 'Bw',
|
|
62
|
+
Bw2: 'Bw2',
|
|
63
|
+
BwP: "Bw'",
|
|
64
|
+
b: 'b',
|
|
65
|
+
b2: 'b2',
|
|
66
|
+
bP: "b'",
|
|
67
|
+
Uw: 'Uw',
|
|
68
|
+
Uw2: 'Uw2',
|
|
69
|
+
UwP: "Uw'",
|
|
70
|
+
u: 'u',
|
|
71
|
+
u2: 'u2',
|
|
72
|
+
uP: "u'",
|
|
73
|
+
Dw: 'Dw',
|
|
74
|
+
Dw2: 'D2',
|
|
75
|
+
DwP: "Dw'",
|
|
76
|
+
d: 'd',
|
|
77
|
+
d2: 'd2',
|
|
78
|
+
dP: "d'",
|
|
79
|
+
}),
|
|
80
|
+
Two: Object.freeze({
|
|
81
|
+
Rw: '2Rw',
|
|
82
|
+
Rw2: '2Rw2',
|
|
83
|
+
RwP: "2Rw'",
|
|
84
|
+
r: '2r',
|
|
85
|
+
r2: '2r2',
|
|
86
|
+
rP: "2r'",
|
|
87
|
+
R: '2R',
|
|
88
|
+
R2: '2R2',
|
|
89
|
+
RP: "2R'",
|
|
90
|
+
Lw: '2Lw',
|
|
91
|
+
Lw2: '2Lw2',
|
|
92
|
+
LwP: "2Lw'",
|
|
93
|
+
l: '2l',
|
|
94
|
+
l2: '2l2',
|
|
95
|
+
lP: "2l'",
|
|
96
|
+
L: '2L',
|
|
97
|
+
L2: '2L2',
|
|
98
|
+
LP: "2L'",
|
|
99
|
+
Fw: '2Fw',
|
|
100
|
+
Fw2: '2Fw2',
|
|
101
|
+
FwP: "2Fw'",
|
|
102
|
+
f: '2f',
|
|
103
|
+
f2: '2f2',
|
|
104
|
+
fP: "2f'",
|
|
105
|
+
F: '2F',
|
|
106
|
+
F2: '2F2',
|
|
107
|
+
FP: "2F'",
|
|
108
|
+
Bw: '2Bw',
|
|
109
|
+
Bw2: '2Bw2',
|
|
110
|
+
BwP: "2Bw'",
|
|
111
|
+
b: '2b',
|
|
112
|
+
b2: '2b2',
|
|
113
|
+
bP: "2b'",
|
|
114
|
+
B: '2B',
|
|
115
|
+
B2: '2B2',
|
|
116
|
+
BP: "2B'",
|
|
117
|
+
Uw: '2Uw',
|
|
118
|
+
Uw2: '2Uw2',
|
|
119
|
+
UwP: "2Uw'",
|
|
120
|
+
u: '2u',
|
|
121
|
+
u2: '2u2',
|
|
122
|
+
uP: "2u'",
|
|
123
|
+
U: '2U',
|
|
124
|
+
U2: '2U2',
|
|
125
|
+
UP: "2U'",
|
|
126
|
+
Dw: '2Dw',
|
|
127
|
+
Dw2: '2Dw2',
|
|
128
|
+
DwP: "2Dw'",
|
|
129
|
+
d: '2d',
|
|
130
|
+
d2: '2d2',
|
|
131
|
+
dP: "2d'",
|
|
132
|
+
D: '2D',
|
|
133
|
+
D2: '2D2',
|
|
134
|
+
DP: "2D'",
|
|
135
|
+
}),
|
|
136
|
+
Three: Object.freeze({
|
|
137
|
+
Rw: '3Rw',
|
|
138
|
+
Rw2: '3Rw2',
|
|
139
|
+
RwP: "3Rw'",
|
|
140
|
+
r: '3r',
|
|
141
|
+
r2: '3r2',
|
|
142
|
+
rP: "3r'",
|
|
143
|
+
R: '3R',
|
|
144
|
+
R2: '3R2',
|
|
145
|
+
RP: "3R'",
|
|
146
|
+
Lw: '3Lw',
|
|
147
|
+
Lw2: '3Lw2',
|
|
148
|
+
LwP: "3Lw'",
|
|
149
|
+
l: '3l',
|
|
150
|
+
l2: '3l2',
|
|
151
|
+
lP: "3l'",
|
|
152
|
+
L: '3L',
|
|
153
|
+
L2: '3L2',
|
|
154
|
+
LP: "3L'",
|
|
155
|
+
Fw: '3Fw',
|
|
156
|
+
Fw2: '3Fw2',
|
|
157
|
+
FwP: "3Fw'",
|
|
158
|
+
f: '3f',
|
|
159
|
+
f2: '3f2',
|
|
160
|
+
fP: "3f'",
|
|
161
|
+
F: '3F',
|
|
162
|
+
F2: '3F2',
|
|
163
|
+
FP: "3F'",
|
|
164
|
+
Bw: '3Bw',
|
|
165
|
+
Bw2: '3Bw2',
|
|
166
|
+
BwP: "3Bw'",
|
|
167
|
+
b: '3b',
|
|
168
|
+
b2: '3b2',
|
|
169
|
+
bP: "3b'",
|
|
170
|
+
B: '3B',
|
|
171
|
+
B2: '3B2',
|
|
172
|
+
BP: "3B'",
|
|
173
|
+
Uw: '3Uw',
|
|
174
|
+
Uw2: '3Uw2',
|
|
175
|
+
UwP: "3Uw'",
|
|
176
|
+
u: '3u',
|
|
177
|
+
u2: '3u2',
|
|
178
|
+
uP: "3u'",
|
|
179
|
+
U: '3U',
|
|
180
|
+
U2: '3U2',
|
|
181
|
+
UP: "3U'",
|
|
182
|
+
Dw: '3Dw',
|
|
183
|
+
Dw2: '3Dw2',
|
|
184
|
+
DwP: "3Dw'",
|
|
185
|
+
d: '3d',
|
|
186
|
+
d2: '3d2',
|
|
187
|
+
dP: "3d'",
|
|
188
|
+
D: '3D',
|
|
189
|
+
D2: '3D2',
|
|
190
|
+
DP: "3D'",
|
|
191
|
+
}),
|
|
192
|
+
Four: Object.freeze({
|
|
193
|
+
Rw: '4Rw',
|
|
194
|
+
Rw2: '4Rw2',
|
|
195
|
+
RwP: "4Rw'",
|
|
196
|
+
r: '4r',
|
|
197
|
+
r2: '4r2',
|
|
198
|
+
rP: "4r'",
|
|
199
|
+
R: '4R',
|
|
200
|
+
R2: '4R2',
|
|
201
|
+
RP: "4R'",
|
|
202
|
+
Lw: '4Lw',
|
|
203
|
+
Lw2: '4Lw2',
|
|
204
|
+
LwP: "4Lw'",
|
|
205
|
+
l: '4l',
|
|
206
|
+
l2: '4l2',
|
|
207
|
+
lP: "4l'",
|
|
208
|
+
L: '4L',
|
|
209
|
+
L2: '4L2',
|
|
210
|
+
LP: "4L'",
|
|
211
|
+
Fw: '4Fw',
|
|
212
|
+
Fw2: '4Fw2',
|
|
213
|
+
FwP: "4Fw'",
|
|
214
|
+
f: '4f',
|
|
215
|
+
f2: '4f2',
|
|
216
|
+
fP: "4f'",
|
|
217
|
+
F: '4F',
|
|
218
|
+
F2: '4F2',
|
|
219
|
+
FP: "4F'",
|
|
220
|
+
Bw: '4Bw',
|
|
221
|
+
Bw2: '4Bw2',
|
|
222
|
+
BwP: "4Bw'",
|
|
223
|
+
b: '4b',
|
|
224
|
+
b2: '4b2',
|
|
225
|
+
bP: "4b'",
|
|
226
|
+
B: '4B',
|
|
227
|
+
B2: '4B2',
|
|
228
|
+
BP: "4B'",
|
|
229
|
+
Uw: '4Uw',
|
|
230
|
+
Uw2: '4Uw2',
|
|
231
|
+
UwP: "4Uw'",
|
|
232
|
+
u: '4u',
|
|
233
|
+
u2: '4u2',
|
|
234
|
+
uP: "4u'",
|
|
235
|
+
U: '4U',
|
|
236
|
+
U2: '4U2',
|
|
237
|
+
UP: "4U'",
|
|
238
|
+
Dw: '4Dw',
|
|
239
|
+
Dw2: '4Dw2',
|
|
240
|
+
DwP: "4Dw'",
|
|
241
|
+
d: '4d',
|
|
242
|
+
d2: '4d2',
|
|
243
|
+
dP: "4d'",
|
|
244
|
+
D: '4D',
|
|
245
|
+
D2: '4D2',
|
|
246
|
+
DP: "4D'",
|
|
247
|
+
}),
|
|
248
|
+
Five: Object.freeze({
|
|
249
|
+
Rw: '5Rw',
|
|
250
|
+
Rw2: '5Rw2',
|
|
251
|
+
RwP: "5Rw'",
|
|
252
|
+
r: '5r',
|
|
253
|
+
r2: '5r2',
|
|
254
|
+
rP: "5r'",
|
|
255
|
+
R: '5R',
|
|
256
|
+
R2: '5R2',
|
|
257
|
+
RP: "5R'",
|
|
258
|
+
Lw: '5Lw',
|
|
259
|
+
Lw2: '5Lw2',
|
|
260
|
+
LwP: "5Lw'",
|
|
261
|
+
l: '5l',
|
|
262
|
+
l2: '5l2',
|
|
263
|
+
lP: "5l'",
|
|
264
|
+
L: '5L',
|
|
265
|
+
L2: '5L2',
|
|
266
|
+
LP: "5L'",
|
|
267
|
+
Fw: '5Fw',
|
|
268
|
+
Fw2: '5Fw2',
|
|
269
|
+
FwP: "5Fw'",
|
|
270
|
+
f: '5f',
|
|
271
|
+
f2: '5f2',
|
|
272
|
+
fP: "5f'",
|
|
273
|
+
F: '5F',
|
|
274
|
+
F2: '5F2',
|
|
275
|
+
FP: "5F'",
|
|
276
|
+
Bw: '5Bw',
|
|
277
|
+
Bw2: '5Bw2',
|
|
278
|
+
BwP: "5Bw'",
|
|
279
|
+
b: '5b',
|
|
280
|
+
b2: '5b2',
|
|
281
|
+
bP: "5b'",
|
|
282
|
+
B: '5B',
|
|
283
|
+
B2: '5B2',
|
|
284
|
+
BP: "5B'",
|
|
285
|
+
Uw: '5Uw',
|
|
286
|
+
Uw2: '5Uw2',
|
|
287
|
+
UwP: "5Uw'",
|
|
288
|
+
u: '5u',
|
|
289
|
+
u2: '5u2',
|
|
290
|
+
uP: "5u'",
|
|
291
|
+
U: '5U',
|
|
292
|
+
U2: '5U2',
|
|
293
|
+
UP: "5U'",
|
|
294
|
+
Dw: '5Dw',
|
|
295
|
+
Dw2: '5Dw2',
|
|
296
|
+
DwP: "5Dw'",
|
|
297
|
+
d: '5d',
|
|
298
|
+
d2: '5d2',
|
|
299
|
+
dP: "5d'",
|
|
300
|
+
D: '5D',
|
|
301
|
+
D2: '5D2',
|
|
302
|
+
DP: "5D'",
|
|
303
|
+
}),
|
|
304
|
+
Six: Object.freeze({
|
|
305
|
+
Rw: '6Rw',
|
|
306
|
+
Rw2: '6Rw2',
|
|
307
|
+
RwP: "6Rw'",
|
|
308
|
+
r: '6r',
|
|
309
|
+
r2: '6r2',
|
|
310
|
+
rP: "6r'",
|
|
311
|
+
R: '6R',
|
|
312
|
+
R2: '6R2',
|
|
313
|
+
RP: "6R'",
|
|
314
|
+
Lw: '6Lw',
|
|
315
|
+
Lw2: '6Lw2',
|
|
316
|
+
LwP: "6Lw'",
|
|
317
|
+
l: '6l',
|
|
318
|
+
l2: '6l2',
|
|
319
|
+
lP: "6l'",
|
|
320
|
+
L: '6L',
|
|
321
|
+
L2: '6L2',
|
|
322
|
+
LP: "6L'",
|
|
323
|
+
Fw: '6Fw',
|
|
324
|
+
Fw2: '6Fw2',
|
|
325
|
+
FwP: "6Fw'",
|
|
326
|
+
f: '6f',
|
|
327
|
+
f2: '6f2',
|
|
328
|
+
fP: "6f'",
|
|
329
|
+
F: '6F',
|
|
330
|
+
F2: '6F2',
|
|
331
|
+
FP: "6F'",
|
|
332
|
+
Bw: '6Bw',
|
|
333
|
+
Bw2: '6Bw2',
|
|
334
|
+
BwP: "6Bw'",
|
|
335
|
+
b: '6b',
|
|
336
|
+
b2: '6b2',
|
|
337
|
+
bP: "6b'",
|
|
338
|
+
B: '6B',
|
|
339
|
+
B2: '6B2',
|
|
340
|
+
BP: "6B'",
|
|
341
|
+
Uw: '6Uw',
|
|
342
|
+
Uw2: '6Uw2',
|
|
343
|
+
UwP: "6Uw'",
|
|
344
|
+
u: '6u',
|
|
345
|
+
u2: '6u2',
|
|
346
|
+
uP: "6u'",
|
|
347
|
+
U: '6U',
|
|
348
|
+
U2: '6U2',
|
|
349
|
+
UP: "6U'",
|
|
350
|
+
Dw: '6Dw',
|
|
351
|
+
Dw2: '6Dw2',
|
|
352
|
+
DwP: "6Dw'",
|
|
353
|
+
d: '6d',
|
|
354
|
+
d2: '6d2',
|
|
355
|
+
dP: "6d'",
|
|
356
|
+
D: '6D',
|
|
357
|
+
D2: '6D2',
|
|
358
|
+
DP: "6D'",
|
|
359
|
+
}),
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
/**
|
|
363
|
+
* @typedef {typeof Rotations[keyof typeof Rotations]} Rotation
|
|
364
|
+
*/
|
|
365
|
+
export const Rotations = Object.freeze({
|
|
366
|
+
x: 'x',
|
|
367
|
+
x2: 'x2',
|
|
368
|
+
xP: "x'",
|
|
369
|
+
y: 'y',
|
|
370
|
+
y2: 'y2',
|
|
371
|
+
yP: "y'",
|
|
372
|
+
z: 'z',
|
|
373
|
+
z2: 'z2',
|
|
374
|
+
zP: "z'",
|
|
375
|
+
});
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* @typedef {typeof Faces [keyof typeof Faces]} Face
|
|
379
|
+
*/
|
|
380
|
+
export const Faces = Object.freeze({
|
|
381
|
+
U: 'U',
|
|
382
|
+
D: 'D',
|
|
383
|
+
L: 'L',
|
|
384
|
+
R: 'R',
|
|
385
|
+
F: 'F',
|
|
386
|
+
B: 'B',
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* @typedef {typeof CubeTypes [keyof typeof CubeTypes]} CubeType
|
|
391
|
+
*/
|
|
392
|
+
export const CubeTypes = Object.freeze({
|
|
393
|
+
Two: 'Two',
|
|
394
|
+
Three: 'Three',
|
|
395
|
+
Four: 'Four',
|
|
396
|
+
Five: 'Five',
|
|
397
|
+
Six: 'Six',
|
|
398
|
+
Seven: 'Seven',
|
|
399
|
+
});
|
|
400
|
+
|
|
401
|
+
/**
|
|
402
|
+
* @typedef {typeof AnimationStyles[keyof typeof AnimationStyles]} AnimationStyle
|
|
403
|
+
*/
|
|
404
|
+
export const AnimationStyles = Object.freeze({
|
|
405
|
+
Exponential: 'exponential',
|
|
406
|
+
Next: 'next',
|
|
407
|
+
Fixed: 'fixed',
|
|
408
|
+
Match: 'match',
|
|
409
|
+
});
|
|
410
|
+
|
|
411
|
+
/**
|
|
412
|
+
* @typedef {typeof FaceColours [keyof typeof FaceColours]} FaceColour
|
|
413
|
+
*/
|
|
414
|
+
export const FaceColours = Object.freeze({
|
|
415
|
+
U: 'white',
|
|
416
|
+
D: 'yellow',
|
|
417
|
+
L: '#fc9a05',
|
|
418
|
+
R: 'red',
|
|
419
|
+
F: '#2cbf13',
|
|
420
|
+
B: 'blue',
|
|
421
|
+
});
|
|
422
|
+
|
|
423
|
+
/**
|
|
424
|
+
* @typedef {typeof PeekTypes [keyof typeof PeekTypes]} PeekType
|
|
425
|
+
*/
|
|
426
|
+
export const PeekTypes = Object.freeze({
|
|
427
|
+
Horizontal: 'horizontal',
|
|
428
|
+
Vertical: 'vertical',
|
|
429
|
+
Right: 'right',
|
|
430
|
+
Left: 'left',
|
|
431
|
+
Up: 'up',
|
|
432
|
+
Down: 'down',
|
|
433
|
+
RightUp: 'rightUp',
|
|
434
|
+
RightDown: 'rightDown',
|
|
435
|
+
LeftUp: 'leftUp',
|
|
436
|
+
LeftDown: 'leftDown',
|
|
437
|
+
});
|
|
438
|
+
|
|
439
|
+
/**
|
|
440
|
+
* @typedef {typeof PeekStates [keyof typeof PeekStates]} PeekState
|
|
441
|
+
*/
|
|
442
|
+
export const PeekStates = Object.freeze({
|
|
443
|
+
RightUp: 'rightUp',
|
|
444
|
+
RightDown: 'rightDown',
|
|
445
|
+
LeftUp: 'leftUp',
|
|
446
|
+
LeftDown: 'leftDown',
|
|
447
|
+
});
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import { Rotations } from '../core';
|
|
3
|
+
import { getAllLayers } from './cubeState';
|
|
4
|
+
|
|
5
|
+
/** @typedef {typeof Axi[keyof typeof Axi]} Axis */
|
|
6
|
+
export const Axi = Object.freeze({
|
|
7
|
+
x: 'x',
|
|
8
|
+
y: 'y',
|
|
9
|
+
z: 'z',
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
/** @typedef {{axis: Axis, layers: number[], direction: number}} Slice */
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @param {import('../core').Movement } outerBlockMovement
|
|
16
|
+
* @param {import('../core').CubeType} cubeType
|
|
17
|
+
* @param {boolean} prioritiseStandardMovement
|
|
18
|
+
* @returns {Slice | undefined}
|
|
19
|
+
*/
|
|
20
|
+
export function GetLayerSlice(outerBlockMovement, cubeType, prioritiseStandardMovement = false) {
|
|
21
|
+
const layers = getAllLayers(cubeType);
|
|
22
|
+
const result = RegExp(`^([1234567]|[123456]-[1234567])?([RLUDFB]w|[RLUDFBMES]|[rludfbmes])([123])?(\')?$`).exec(outerBlockMovement);
|
|
23
|
+
if (result == null) {
|
|
24
|
+
console.error(`Failed to parse outerBlockMovement. invalid movement: ${outerBlockMovement}`);
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
let layerRangeLower = undefined;
|
|
28
|
+
let layerRangeUpper = undefined;
|
|
29
|
+
let layerNumber = undefined;
|
|
30
|
+
if (result[1]?.includes('-')) {
|
|
31
|
+
layerRangeLower = parseInt(result[1][0]);
|
|
32
|
+
layerRangeUpper = parseInt(result[1][2]);
|
|
33
|
+
} else {
|
|
34
|
+
layerNumber = result[1] ? parseInt(result[1]) : undefined;
|
|
35
|
+
} // some input validation
|
|
36
|
+
|
|
37
|
+
if (layerRangeLower != null && layerRangeUpper != null) {
|
|
38
|
+
if (layerRangeLower >= layerRangeUpper || layerRangeUpper > layers.length || layerRangeLower > layers.length - 1) {
|
|
39
|
+
console.error(
|
|
40
|
+
`${outerBlockMovement} is not valid for the current cubeType: ${cubeType}. For range inputs like x-yr it should follow that 1 <= x < y <= ${layers.length}.`,
|
|
41
|
+
);
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (layerNumber != null && layerNumber > layers.length) {
|
|
46
|
+
console.error(
|
|
47
|
+
`${outerBlockMovement} is not valid for the current cubeType: ${cubeType}. For inputs like xR it should follow that x <= ${layers.length}.`,
|
|
48
|
+
);
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const movementType = result[2];
|
|
53
|
+
const rotationNumber = result[3] ? parseInt(result[3]) % 4 : 1;
|
|
54
|
+
const isPrime = result[4] === "'";
|
|
55
|
+
const direction = (isPrime ? -1 : 1) * rotationNumber;
|
|
56
|
+
|
|
57
|
+
let axis = undefined;
|
|
58
|
+
switch (movementType) {
|
|
59
|
+
case 'R':
|
|
60
|
+
case 'Rw':
|
|
61
|
+
case 'r':
|
|
62
|
+
case 'L':
|
|
63
|
+
case 'Lw':
|
|
64
|
+
case 'l':
|
|
65
|
+
case 'M':
|
|
66
|
+
case 'm':
|
|
67
|
+
axis = Axi.x;
|
|
68
|
+
break;
|
|
69
|
+
case 'U':
|
|
70
|
+
case 'Uw':
|
|
71
|
+
case 'u':
|
|
72
|
+
case 'D':
|
|
73
|
+
case 'Dw':
|
|
74
|
+
case 'd':
|
|
75
|
+
case 'E':
|
|
76
|
+
case 'e':
|
|
77
|
+
axis = Axi.y;
|
|
78
|
+
break;
|
|
79
|
+
case 'F':
|
|
80
|
+
case 'Fw':
|
|
81
|
+
case 'f':
|
|
82
|
+
case 'B':
|
|
83
|
+
case 'Bw':
|
|
84
|
+
case 'b':
|
|
85
|
+
case 'S':
|
|
86
|
+
case 's':
|
|
87
|
+
axis = Axi.z;
|
|
88
|
+
break;
|
|
89
|
+
default:
|
|
90
|
+
console.error(`${outerBlockMovement} is invalid. Invalid movementType ${movementType}.`);
|
|
91
|
+
}
|
|
92
|
+
if (axis == null) {
|
|
93
|
+
return undefined;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
switch (movementType) {
|
|
97
|
+
case 'R':
|
|
98
|
+
case 'U':
|
|
99
|
+
case 'F':
|
|
100
|
+
layerNumber = layerNumber ? layerNumber : 1;
|
|
101
|
+
var layer = layers[layers.length - layerNumber];
|
|
102
|
+
return { axis, layers: [layer], direction: -direction };
|
|
103
|
+
case 'L':
|
|
104
|
+
case 'D':
|
|
105
|
+
case 'B':
|
|
106
|
+
layerNumber = layerNumber ? layerNumber : 1;
|
|
107
|
+
var layer = layers[layerNumber - 1];
|
|
108
|
+
return { axis, layers: [layer], direction };
|
|
109
|
+
case 'Rw':
|
|
110
|
+
case 'Uw':
|
|
111
|
+
case 'Fw':
|
|
112
|
+
layerNumber = layerNumber ? layerNumber : 2;
|
|
113
|
+
var sliceLayers = layers.slice(layers.length - layerNumber);
|
|
114
|
+
if (layerRangeLower != null && layerRangeUpper != null) {
|
|
115
|
+
var sliceLayers = layers.slice(layers.length - layerRangeUpper, layers.length - (layerRangeLower - 1));
|
|
116
|
+
}
|
|
117
|
+
return { axis, layers: sliceLayers, direction: -direction };
|
|
118
|
+
case 'r':
|
|
119
|
+
case 'u':
|
|
120
|
+
case 'f':
|
|
121
|
+
var defaultLayerNumber = prioritiseStandardMovement ? layers.length - 1 : 2;
|
|
122
|
+
layerNumber = layerNumber ? layerNumber : defaultLayerNumber;
|
|
123
|
+
var sliceLayers = layers.slice(layers.length - layerNumber);
|
|
124
|
+
if (layerRangeLower != null && layerRangeUpper != null) {
|
|
125
|
+
var sliceLayers = layers.slice(layers.length - layerRangeUpper, layers.length - (layerRangeLower - 1));
|
|
126
|
+
}
|
|
127
|
+
return { axis, layers: sliceLayers, direction: -direction };
|
|
128
|
+
case 'Lw':
|
|
129
|
+
case 'Dw':
|
|
130
|
+
case 'Bw':
|
|
131
|
+
layerNumber = layerNumber ? layerNumber : 2;
|
|
132
|
+
var sliceLayers = layers.slice(0, layerNumber);
|
|
133
|
+
if (layerRangeLower != null && layerRangeUpper != null) {
|
|
134
|
+
var sliceLayers = layers.slice(layerRangeLower - 1, layerRangeUpper);
|
|
135
|
+
}
|
|
136
|
+
return { axis, layers: sliceLayers, direction };
|
|
137
|
+
case 'l':
|
|
138
|
+
case 'd':
|
|
139
|
+
case 'b':
|
|
140
|
+
var defaultLayerNumber = prioritiseStandardMovement ? layers.length - 1 : 2;
|
|
141
|
+
layerNumber = layerNumber ? layerNumber : defaultLayerNumber;
|
|
142
|
+
var sliceLayers = layers.slice(0, layerNumber);
|
|
143
|
+
if (layerRangeLower != null && layerRangeUpper != null) {
|
|
144
|
+
var sliceLayers = layers.slice(layerRangeLower - 1, layerRangeUpper);
|
|
145
|
+
}
|
|
146
|
+
return { axis, layers: sliceLayers, direction };
|
|
147
|
+
case 'M':
|
|
148
|
+
case 'E':
|
|
149
|
+
var defaultLayerNumber = prioritiseStandardMovement ? Math.floor(layers.length / 2) : 1;
|
|
150
|
+
layerNumber = layerNumber ? layerNumber : defaultLayerNumber;
|
|
151
|
+
var lower = Math.max(Math.floor(layers.length / 2) - (layerNumber - 1), 1);
|
|
152
|
+
var upper = Math.min(Math.ceil(layers.length / 2) + (layerNumber - 1), layers.length - 1);
|
|
153
|
+
var sliceLayers = layers.slice(lower, upper);
|
|
154
|
+
return { axis, layers: sliceLayers, direction };
|
|
155
|
+
case 'm':
|
|
156
|
+
case 'e':
|
|
157
|
+
layerNumber = layerNumber ? layerNumber : 1;
|
|
158
|
+
var sliceLayers = layers.slice(layerNumber, layers.length - layerNumber);
|
|
159
|
+
return { axis, layers: sliceLayers, direction };
|
|
160
|
+
case 'S':
|
|
161
|
+
var defaultLayerNumber = prioritiseStandardMovement ? Math.floor(layers.length / 2) : 1;
|
|
162
|
+
layerNumber = layerNumber ? layerNumber : defaultLayerNumber;
|
|
163
|
+
var lower = Math.max(Math.floor(layers.length / 2) - (layerNumber - 1), 1);
|
|
164
|
+
var upper = Math.min(Math.ceil(layers.length / 2) + (layerNumber - 1), layers.length - 1);
|
|
165
|
+
var sliceLayers = layers.slice(lower, upper);
|
|
166
|
+
return { axis, layers: sliceLayers, direction: -direction };
|
|
167
|
+
case 's':
|
|
168
|
+
layerNumber = layerNumber ? layerNumber : 1;
|
|
169
|
+
var sliceLayers = layers.slice(layerNumber, layers.length - layerNumber);
|
|
170
|
+
return { axis, layers: sliceLayers, direction: -direction };
|
|
171
|
+
|
|
172
|
+
default:
|
|
173
|
+
console.error(`${outerBlockMovement} is invalid. Invalid movementType ${movementType}.`);
|
|
174
|
+
return undefined;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* @param {import("../core").Rotation} rotation
|
|
180
|
+
* @param {import('../core').CubeType} cubeType
|
|
181
|
+
* @returns {Slice | undefined}
|
|
182
|
+
*/
|
|
183
|
+
export function GetRotationSlice(rotation, cubeType) {
|
|
184
|
+
const result = RegExp(`^([xyz])(\\d)?(\')?$`).exec(rotation);
|
|
185
|
+
if (result == null) {
|
|
186
|
+
console.error(`Failed to parse rotation. invalid rotation: [${rotation}]`);
|
|
187
|
+
return undefined;
|
|
188
|
+
}
|
|
189
|
+
const rotationType = result[1];
|
|
190
|
+
const rotationNumber = result[2] ? parseInt(result[2]) : 1;
|
|
191
|
+
|
|
192
|
+
const isPrime = result[3] === "'";
|
|
193
|
+
const direction = (isPrime ? 1 : -1) * (rotationNumber % 4);
|
|
194
|
+
switch (rotationType) {
|
|
195
|
+
case Rotations.x:
|
|
196
|
+
return { axis: Axi.x, layers: getAllLayers(cubeType), direction };
|
|
197
|
+
case Rotations.y:
|
|
198
|
+
return { axis: Axi.y, layers: getAllLayers(cubeType), direction };
|
|
199
|
+
case Rotations.z:
|
|
200
|
+
return { axis: Axi.z, layers: getAllLayers(cubeType), direction };
|
|
201
|
+
default:
|
|
202
|
+
console.error(`Failed to get rotation slice. invalid rotationType: ${rotationType}`);
|
|
203
|
+
return undefined;
|
|
204
|
+
}
|
|
205
|
+
}
|