@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.
Files changed (51) hide show
  1. package/README.md +280 -170
  2. package/package.json +33 -3
  3. package/src/camera/cameraState.js +81 -0
  4. package/src/core.js +447 -0
  5. package/src/cube/animationSlice.js +205 -0
  6. package/src/cube/animationState.js +96 -0
  7. package/src/cube/cubeSettings.js +19 -0
  8. package/src/cube/cubeState.js +285 -139
  9. package/src/cube/stickerState.js +188 -0
  10. package/src/debouncer.js +16 -0
  11. package/src/globals.ts +9 -0
  12. package/src/index.js +621 -0
  13. package/src/settings.js +138 -0
  14. package/src/three/centerPiece.js +44 -0
  15. package/src/three/cornerPiece.js +60 -0
  16. package/src/three/cube.js +492 -0
  17. package/src/three/edgePiece.js +50 -0
  18. package/src/three/sticker.js +37 -0
  19. package/tests/common.js +27 -0
  20. package/tests/cube.five.test.js +126 -0
  21. package/tests/cube.four.test.js +126 -0
  22. package/tests/cube.seven.test.js +126 -0
  23. package/tests/cube.six.test.js +126 -0
  24. package/tests/cube.three.test.js +151 -0
  25. package/tests/cube.two.test.js +125 -0
  26. package/tests/setup.js +36 -0
  27. package/types/camera/cameraState.d.ts +19 -0
  28. package/types/core.d.ts +454 -0
  29. package/types/cube/animationSlice.d.ts +26 -0
  30. package/types/cube/animationState.d.ts +41 -0
  31. package/types/cube/cubeSettings.d.ts +17 -0
  32. package/types/cube/cubeState.d.ts +47 -0
  33. package/types/cube/stickerState.d.ts +21 -0
  34. package/types/debouncer.d.ts +13 -0
  35. package/types/globals.d.ts +7 -0
  36. package/types/index.d.ts +87 -0
  37. package/types/settings.d.ts +38 -0
  38. package/types/three/centerPiece.d.ts +15 -0
  39. package/types/three/cornerPiece.d.ts +24 -0
  40. package/types/three/cube.d.ts +130 -0
  41. package/types/three/edgePiece.d.ts +16 -0
  42. package/types/three/sticker.d.ts +15 -0
  43. package/.prettierrc +0 -7
  44. package/index.js +0 -274
  45. package/src/cube/cube.js +0 -276
  46. package/src/cube/cubeRotation.js +0 -63
  47. package/src/threejs/materials.js +0 -42
  48. package/src/threejs/pieces.js +0 -103
  49. package/src/threejs/stickers.js +0 -48
  50. package/src/utils/debouncer.js +0 -7
  51. 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
+ }