Project

General

Profile

Download (23.7 KB) Statistics
| Branch: | Revision:

distorted-objectlib / src / main / java / org / distorted / objectlib / objects / TwistyRedi.java @ 1fda81c4

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2020 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// Magic Cube is proprietary software licensed under an EULA which you should have received      //
7
// along with the code. If not, check https://distorted.org/magic/License-Magic-Cube.html        //
8
///////////////////////////////////////////////////////////////////////////////////////////////////
9

    
10
package org.distorted.objectlib.objects;
11

    
12
import static org.distorted.objectlib.touchcontrol.TouchControl.TC_HEXAHEDRON;
13
import static org.distorted.objectlib.touchcontrol.TouchControl.TYPE_SPLIT_CORNER;
14

    
15
import org.distorted.library.type.Static3D;
16
import org.distorted.library.type.Static4D;
17

    
18
import org.distorted.objectlib.helpers.FactoryCubit;
19
import org.distorted.objectlib.helpers.ObjectFaceShape;
20
import org.distorted.objectlib.signature.ObjectSignature;
21
import org.distorted.objectlib.helpers.ObjectVertexEffects;
22
import org.distorted.objectlib.main.InitAssets;
23
import org.distorted.objectlib.main.InitData;
24
import org.distorted.objectlib.signature.ObjectConstants;
25
import org.distorted.objectlib.scrambling.ScrambleEdgeGenerator;
26
import org.distorted.objectlib.touchcontrol.TouchControlHexahedron;
27
import org.distorted.objectlib.main.ObjectType;
28
import org.distorted.objectlib.helpers.ObjectShape;
29
import org.distorted.objectlib.shape.ShapeHexahedron;
30

    
31
///////////////////////////////////////////////////////////////////////////////////////////////////
32

    
33
public class TwistyRedi extends ShapeHexahedron
34
{
35
  static final Static3D[] ROT_AXIS = new Static3D[]
36
         {
37
           new Static3D( SQ3/3, SQ3/3, SQ3/3),
38
           new Static3D( SQ3/3, SQ3/3,-SQ3/3),
39
           new Static3D( SQ3/3,-SQ3/3, SQ3/3),
40
           new Static3D( SQ3/3,-SQ3/3,-SQ3/3)
41
         };
42

    
43
  private int[][] mEdges;
44
  private int[][] mBasicAngle;
45
  private float[][] mCuts;
46
  private float[][] mPosition;
47
  private int[] mQuatIndex;
48
  private boolean[][] mRotatable;
49

    
50
///////////////////////////////////////////////////////////////////////////////////////////////////
51

    
52
  public TwistyRedi(int iconMode, Static4D quat, Static3D move, float scale, InitData data, InitAssets asset)
53
    {
54
    super(iconMode, data.getNumLayers()[0], quat, move, scale, data, asset);
55
    }
56

    
57
///////////////////////////////////////////////////////////////////////////////////////////////////
58

    
59
  @Override
60
  public float[][] returnRotationFactor()
61
    {
62
    float C = 2.0f;
63
    int numL = getNumLayers()[0];
64
    float[] f = new float[numL];
65
    for(int i=0; i<numL; i++) f[i] = C;
66
    return new float[][] { f,f,f,f };
67
    }
68

    
69
///////////////////////////////////////////////////////////////////////////////////////////////////
70

    
71
  public int[][] getScrambleEdges()
72
    {
73
    if( mEdges==null )
74
      {
75
      int[] numLayers = getNumLayers();
76

    
77
      if( numLayers[0]==3 )
78
        {
79
        mEdges = new int[][]
80
          {
81
            { 0,8,1,8, 4,1,5,1, 6,7,7,7, 10,2,11,2, 12,6,13,6, 16,3,17,3, 18,5,19,5, 22,4,23,4 },  // 0
82
            {                            10,2,11,2,            16,3,17,3, 18,5,19,5            },  // 1
83
            {          4,1,5,1,                     12,6,13,6,                       22,4,23,4 },  // 2
84
            {          4,1,5,1, 6,7,7,7,                                             22,4,23,4 },  // 3
85
            { 0,8,1,8,                   10,2,11,2,            16,3,17,3                       },  // 4
86
            {          4,1,5,1, 6,7,7,7,            12,6,13,6                                  },  // 5
87
            { 0,8,1,8,                   10,2,11,2,                       18,5,19,5            },  // 6
88
            { 0,8,1,8,                                         16,3,17,3, 18,5,19,5            },  // 7
89
            {                   6,7,7,7,            12,6,13,6,                       22,4,23,4 },  // 8
90
          };
91
        }
92
      else
93
        {
94
        mEdges = new int[][]
95
          {
96
            { 0,16,1,16,2,8,3,8,  4,1,5,1,6,9,7,9,  8,15,9,15,10,7,11,7,  12,2,13,2,14,10,15,10,  16,14,17,14,18,6,19,6,  20,3,21,3,22,11,23,11,  24,13,25,13,26,5,27,5,  28,4,29,4,30,12,31,12 },  // 0
97

    
98
            {                                                             12,2,13,2,14,10,15,10,                          20,3,21,3,22,11,23,11,  24,13,25,13,26,5,27,5,                        },  // 1
99
            {                     4,1,5,1,6,9,7,9,                                                16,14,17,14,18,6,19,6,                                                  28,4,29,4,30,12,31,12 },  // 2
100
            {                     4,1,5,1,6,9,7,9,  8,15,9,15,10,7,11,7,                                                                                                  28,4,29,4,30,12,31,12 },  // 3
101
            { 0,16,1,16,2,8,3,8,                                          12,2,13,2,14,10,15,10,                          20,3,21,3,22,11,23,11,                                                },  // 4
102
            {                     4,1,5,1,6,9,7,9,  8,15,9,15,10,7,11,7,                          16,14,17,14,18,6,19,6,                                                                        },  // 5
103
            { 0,16,1,16,2,8,3,8,                                          12,2,13,2,14,10,15,10,                                                  24,13,25,13,26,5,27,5,                        },  // 6
104
            { 0,16,1,16,2,8,3,8,                                                                                          20,3,21,3,22,11,23,11,  24,13,25,13,26,5,27,5,                        },  // 7
105
            {                                       8,15,9,15,10,7,11,7,                          16,14,17,14,18,6,19,6,                                                  28,4,29,4,30,12,31,12 },  // 8
106

    
107
            {                                                             12,2,13,2,                                      20,3,21,3,                          26,5,27,5,                        },  // 9
108
            {                     4,1,5,1,                                                                    18,6,19,6,                                                  28,4,29,4,            },  // 10
109
            {                     4,1,5,1,                    10,7,11,7,                                                                                                  28,4,29,4,            },  // 11
110
            {           2,8,3,8,                                          12,2,13,2,                                      20,3,21,3,                                                            },  // 12
111
            {                     4,1,5,1,                    10,7,11,7,                                      18,6,19,6,                                                                        },  // 13
112
            {           2,8,3,8,                                          12,2,13,2,                                                                          26,5,27,5,                        },  // 14
113
            {           2,8,3,8,                                                                                          20,3,21,3,                          26,5,27,5,                        },  // 15
114
            {                                                 10,7,11,7,                                      18,6,19,6,                                                  28,4,29,4,            },  // 16
115
          };
116
        }
117
      }
118

    
119
    return mEdges;
120
    }
121

    
122
///////////////////////////////////////////////////////////////////////////////////////////////////
123

    
124
  @Override
125
  public int[][] getScrambleAlgorithms()
126
    {
127
    int[] numLayers = getNumLayers();
128

    
129
    if( numLayers[0]==3 )
130
      {
131
      return super.getScrambleAlgorithms();
132
      }
133
    else
134
      {
135
      if(mRotatable==null) mRotatable = createRotatable();
136
      return ScrambleEdgeGenerator.getScramblingAlgorithms(mBasicAngle, mRotatable);
137
      }
138
    }
139

    
140
///////////////////////////////////////////////////////////////////////////////////////////////////
141

    
142
  public float[][] getCuts(int[] numLayers)
143
    {
144
    if( mCuts==null )
145
      {
146
      switch( numLayers[0] )
147
        {
148
        case 3: float C3 = SQ3/2 + 0.05f;
149
                float[] c3 = new float[] {-C3,C3};
150
                mCuts = new float[][] { c3,c3,c3,c3 };
151
                break;
152
        case 5: float A5 = 5*SQ3/3;
153
                float B5 = 3*SQ3/3;
154
                float[] c5 = new float[] {-A5,-B5, B5, A5};
155
                mCuts = new float[][] { c5,c5,c5,c5 };
156
                break;
157
        }
158

    
159
      }
160

    
161
    return mCuts;
162
    }
163

    
164
///////////////////////////////////////////////////////////////////////////////////////////////////
165

    
166
  private boolean[][] createRotatable()
167
    {
168
    int numL = getNumLayers()[0];
169

    
170
    switch( numL )
171
      {
172
      case 3: boolean[] t3 = new boolean[] {true,false,true};
173
              return new boolean[][] { t3,t3,t3,t3 };
174
      case 5: boolean[] t5 = new boolean[] {true,true,false,true,true};
175
              return new boolean[][] { t5,t5,t5,t5 };
176
      }
177
    return null;
178
    }
179

    
180
///////////////////////////////////////////////////////////////////////////////////////////////////
181

    
182
  public boolean[][] getLayerRotatable(int[] numLayers)
183
    {
184
    if( mRotatable==null ) mRotatable = createRotatable();
185
    return mRotatable;
186
    }
187

    
188
///////////////////////////////////////////////////////////////////////////////////////////////////
189

    
190
  public int getTouchControlType()
191
    {
192
    return TC_HEXAHEDRON;
193
    }
194

    
195
///////////////////////////////////////////////////////////////////////////////////////////////////
196

    
197
  public int getTouchControlSplit()
198
    {
199
    return TYPE_SPLIT_CORNER;
200
    }
201

    
202
///////////////////////////////////////////////////////////////////////////////////////////////////
203

    
204
  public int[][][] getEnabled()
205
    {
206
    return new int[][][]
207
      {
208
          {{0,1},{3,1},{2,3},{0,2}},
209
          {{2,3},{3,1},{0,1},{0,2}},
210
          {{1,2},{0,1},{0,3},{2,3}},
211
          {{1,2},{2,3},{0,3},{0,1}},
212
          {{0,3},{0,2},{1,2},{1,3}},
213
          {{1,2},{0,2},{0,3},{1,3}},
214
      };
215
    }
216

    
217
///////////////////////////////////////////////////////////////////////////////////////////////////
218

    
219
  public float[] getDist3D(int[] numLayers)
220
    {
221
    return TouchControlHexahedron.D3D;
222
    }
223

    
224
///////////////////////////////////////////////////////////////////////////////////////////////////
225

    
226
  public Static3D[] getFaceAxis()
227
    {
228
    return TouchControlHexahedron.FACE_AXIS;
229
    }
230

    
231
///////////////////////////////////////////////////////////////////////////////////////////////////
232

    
233
  public float[][] getCubitPositions(int[] numLayers)
234
    {
235
    if( mPosition==null )
236
      {
237
      if( numLayers[0]==3 )
238
        {
239
        final float C = 1.0f;
240
        final float E = 1.5f;
241

    
242
        mPosition = new float[][]
243
          {
244
             { C, C, C },
245
             { C, C,-C },
246
             { C,-C, C },
247
             { C,-C,-C },
248
             {-C, C, C },
249
             {-C, C,-C },
250
             {-C,-C, C },
251
             {-C,-C,-C },
252

    
253
             { 0, E, E },
254
             { E, 0, E },
255
             { 0,-E, E },
256
             {-E, 0, E },
257
             { E, E, 0 },
258
             { E,-E, 0 },
259
             {-E,-E, 0 },
260
             {-E, E, 0 },
261
             { 0, E,-E },
262
             { E, 0,-E },
263
             { 0,-E,-E },
264
             {-E, 0,-E }
265
          };
266
        }
267
      else if( numLayers[0]==5 )
268
        {
269
        final float C = 15.0f/8;
270
        final float E = 2.5f;
271
        final float F = 5.0f/8;
272

    
273
        mPosition = new float[][]
274
          {
275
             { C, C, C },
276
             { C, C,-C },
277
             { C,-C, C },
278
             { C,-C,-C },
279
             {-C, C, C },
280
             {-C, C,-C },
281
             {-C,-C, C },
282
             {-C,-C,-C },
283

    
284
             {-F, E, E },
285
             { F, E, E },
286
             { E,-F, E },
287
             { E, F, E },
288
             {-F,-E, E },
289
             { F,-E, E },
290
             {-E,-F, E },
291
             {-E, F, E },
292
             { E, E,-F },
293
             { E, E, F },
294
             { E,-E,-F },
295
             { E,-E, F },
296
             {-E,-E,-F },
297
             {-E,-E, F },
298
             {-E, E,-F },
299
             {-E, E, F },
300
             {-F, E,-E },
301
             { F, E,-E },
302
             { E,-F,-E },
303
             { E, F,-E },
304
             {-F,-E,-E },
305
             { F,-E,-E },
306
             {-E,-F,-E },
307
             {-E, F,-E },
308

    
309
             { 0, F, E },
310
             { 0,-F, E },
311
             { F, 0, E },
312
             {-F, 0, E },
313
             { 0, F,-E },
314
             { 0,-F,-E },
315
             { F, 0,-E },
316
             {-F, 0,-E },
317
             { E, 0, F },
318
             { E, 0,-F },
319
             { E, F, 0 },
320
             { E,-F, 0 },
321
             {-E, 0, F },
322
             {-E, 0,-F },
323
             {-E, F, 0 },
324
             {-E,-F, 0 },
325

    
326
             { 0,-E, F },
327
             { 0,-E,-F },
328
             { F,-E, 0 },
329
             {-F,-E, 0 },
330
             { 0, E, F },
331
             { 0, E,-F },
332
             { F, E, 0 },
333
             {-F, E, 0 },
334
          };
335
        }
336
      }
337

    
338
    return mPosition;
339
    }
340

    
341
///////////////////////////////////////////////////////////////////////////////////////////////////
342

    
343
  public Static4D getCubitQuats(int cubit, int[] numLayers)
344
    {
345
    if( mQuatIndex==null ) mQuatIndex = new int[] { 0,2,10,8,1,4,6,7,11,5,9,3,   0,11,2,3,4,1 };
346

    
347
    switch(cubit)
348
      {
349
      case  0: return mObjectQuats[0];                   //  unit quat
350
      case  1: return new Static4D( SQ2/2,0,0,SQ2/2);    //  90 along X
351
      case  2: return new Static4D(-SQ2/2,0,0,SQ2/2);    // -90 along X
352
      case  3: return mObjectQuats[9];                   // 180 along X
353
      case  4: return new Static4D(0, SQ2/2,0,SQ2/2);    //  90 along Y
354
      case  5: return mObjectQuats[11];                  // 180 along Y
355
      case  6: return mObjectQuats[10];                  // 180 along Z
356
      case  7: return new Static4D(SQ2/2,0,-SQ2/2,0);    // 180 along (SQ2/2,0,-SQ2/2)
357
      default: int index = numLayers[0]==3 ? (cubit-8) : (cubit<32 ? (cubit-8)/2 : (cubit-32)/4 + 12);
358
               return mObjectQuats[mQuatIndex[index]];
359
      }
360
    }
361

    
362
///////////////////////////////////////////////////////////////////////////////////////////////////
363

    
364
  private float[][] getVertices(int variant)
365
    {
366
    float A = getNumLayers()[0]==3 ? 0.5f : 5.0f/8;
367
    float B = 2*A;
368
    float C = 3*A;
369

    
370
    if( variant==0 )
371
      {
372
      return new float[][]
373
          {
374
             { 0, 0, 0 },
375
             {-A, A, A },
376
             {-A,-A, A },
377
             { A, A, A },
378
             { A,-A, A },
379
             { A, A,-A },
380
             { A,-A,-A },
381
             {-A, A,-A },
382
          };
383
      }
384
    else if( variant==1 )
385
      {
386
      return new float[][]
387
          {
388
             {-A, 0, 0},
389
             { A, 0, 0},
390
             {-A,-B, 0},
391
             { A,-B, 0},
392
             { 0,-C, 0},
393
             {-A, 0,-B},
394
             { A, 0,-B},
395
             { 0, 0,-C},
396
          };
397
      }
398
    else
399
      {
400
      return new float[][]
401
          {
402
             {-A, 0, 0},
403
             { 0,-A, 0},
404
             { A, 0, 0},
405
             { 0, A, 0},
406
             { 0, 0,-A}
407
          };
408
      }
409
    }
410

    
411
///////////////////////////////////////////////////////////////////////////////////////////////////
412

    
413
  public ObjectShape getObjectShape(int variant)
414
    {
415
    if( variant==0 )
416
      {
417
      int[][] indices =
418
          {
419
             { 2,4,3,1 },
420
             { 1,3,5,7 },
421
             { 4,6,5,3 },
422

    
423
             { 0,4,2 },
424
             { 0,7,5 },
425
             { 0,6,4 },
426
             { 0,1,7 },
427
             { 0,2,1 },
428
             { 0,5,6 }
429
          };
430

    
431
      return new ObjectShape(getVertices(variant), indices);
432
      }
433
    else if( variant==1 )
434
      {
435
      int[][] indices =
436
          {
437
             { 0,2,4,3,1 },
438
             { 0,1,6,7,5 },
439
             { 1,3,6 },
440
             { 5,2,0 },
441
             { 4,7,6,3 },
442
             { 2,5,7,4 }
443
          };
444

    
445
      return new ObjectShape(getVertices(variant), indices);
446
      }
447
    else
448
      {
449
      int[][] indices = { {0,1,2,3},{4,1,0},{4,2,1},{4,3,2},{4,0,3} };
450
      return new ObjectShape(getVertices(variant), indices);
451
      }
452
    }
453

    
454
///////////////////////////////////////////////////////////////////////////////////////////////////
455

    
456
  public ObjectFaceShape getObjectFaceShape(int variant)
457
    {
458
    int numL = getNumLayers()[0];
459

    
460
    if( variant==0 )
461
      {
462
      int N = numL==3 ? 5:4;
463
      int E = numL==3 ? 1:0;
464
      float h1 = isInIconMode() ? 0.001f : 0.06f;
465
      float h2 = isInIconMode() ? 0.001f : 0.01f;
466
      float[][] bands = { {h1,35,0.5f,0.7f,N,E,E}, {h2,35,0.2f,0.4f,N,E,E} };
467
      int[] indices   = { 0,0,0,1,1,1,1,1,1 };
468
      return new ObjectFaceShape(bands,indices,null);
469
      }
470
    else if( variant==1 )
471
      {
472
      int N = numL==3 ? 6:5;
473
      int E = numL==3 ? 1:0;
474
      float h1 = isInIconMode() ? 0.001f : 0.038f;
475
      float h2 = isInIconMode() ? 0.001f : 0.020f;
476
      float[][] bands = { {h1,35,0.250f,0.7f,N,E,E}, {h2,35,0.125f,0.2f,3,E,E}, {h2,35,0.125f,0.2f,3,E,E} };
477
      int[] indices   = { 0,0,1,1,2,2 };
478
      return new ObjectFaceShape(bands,indices,null);
479
      }
480
    else
481
      {
482
      int N1 = numL==3 ? 6:2;
483
      int N2 = numL==3 ? 3:2;
484
      int E  = numL==3 ? 1:0;
485
      float height = isInIconMode() ? 0.001f : 0.04f;
486
      float[][] bands = { {height,35,SQ2/8,0.9f,N1,E,E}, {0.001f,35,1,0.0f,N2,0,0} };
487
      int[] indices   = { 0,1,1,1,1 };
488
      return new ObjectFaceShape(bands,indices,null);
489
      }
490
    }
491

    
492
///////////////////////////////////////////////////////////////////////////////////////////////////
493

    
494
  public ObjectVertexEffects getVertexEffects(int variant)
495
    {
496
    if( variant==0 )
497
      {
498
      float[][] corners = { {0.06f,0.12f} };
499
      int[] indices     = { -1,0,-1,0,0,0,-1,-1 };
500
      float[][] centers = { { 0.0f, 0.0f, 0.0f} };
501
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,indices,centers,indices);
502
      }
503
    else if( variant==1 )
504
      {
505
      float[][] corners = { {0.06f,0.20f} };
506
      int[] indices     = { 0,0,-1,-1,-1,-1,-1,-1 };
507
      float[][] centers = { { 0.0f,-0.75f,-0.75f} };
508
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,indices,centers,indices);
509
      }
510
    else
511
      {
512
      return null;
513
      }
514
    }
515

    
516
///////////////////////////////////////////////////////////////////////////////////////////////////
517

    
518
  public int getNumCubitVariants(int[] numLayers)
519
    {
520
    return numLayers[0]==3 ? 2 : 3;
521
    }
522

    
523
///////////////////////////////////////////////////////////////////////////////////////////////////
524

    
525
  public int getCubitVariant(int cubit, int[] numLayers)
526
    {
527
    switch( numLayers[0] )
528
      {
529
      case 3: return cubit<8 ? 0:1;
530
      case 5: return cubit<8 ? 0 : cubit<32 ? 1:2;
531
      }
532
    return 0;
533
    }
534

    
535
///////////////////////////////////////////////////////////////////////////////////////////////////
536

    
537
  public float getStickerRadius()
538
    {
539
    return 0.09f;
540
    }
541

    
542
///////////////////////////////////////////////////////////////////////////////////////////////////
543

    
544
  public float getStickerStroke()
545
    {
546
    switch(getNumLayers()[0])
547
      {
548
      case 3: return isInIconMode() ? 0.20f : 0.09f;
549
      case 5: return isInIconMode() ? 0.30f : 0.12f;
550
      }
551

    
552
    return 0;
553
    }
554

    
555
///////////////////////////////////////////////////////////////////////////////////////////////////
556

    
557
  public float[][][] getStickerAngles()
558
    {
559
    return null;
560
    }
561

    
562
///////////////////////////////////////////////////////////////////////////////////////////////////
563
// PUBLIC API
564

    
565
  public Static3D[] getRotationAxis()
566
    {
567
    return ROT_AXIS;
568
    }
569

    
570
///////////////////////////////////////////////////////////////////////////////////////////////////
571

    
572
  public int[][] getBasicAngles()
573
    {
574
    if( mBasicAngle==null )
575
      {
576
      int num = getNumLayers()[0];
577
      int[] tmp = new int[num];
578
      for(int i=0; i<num; i++) tmp[i] = 3;
579
      mBasicAngle = new int[][] { tmp,tmp,tmp,tmp };
580
      }
581

    
582
    return mBasicAngle;
583
    }
584

    
585
///////////////////////////////////////////////////////////////////////////////////////////////////
586

    
587
  public String getShortName()
588
    {
589
    switch(getNumLayers()[0])
590
      {
591
      case 3: return ObjectType.REDI_3.name();
592
      case 5: return ObjectType.FADI_5.name();
593
      }
594

    
595
    return null;
596
    }
597

    
598
///////////////////////////////////////////////////////////////////////////////////////////////////
599

    
600
  public ObjectSignature getSignature()
601
    {
602
    switch(getNumLayers()[0])
603
      {
604
      case 3: return new ObjectSignature(ObjectConstants.REDI_3);
605
      case 5: return new ObjectSignature(ObjectConstants.FADI_5);
606
      }
607

    
608
    return null;
609
    }
610

    
611
///////////////////////////////////////////////////////////////////////////////////////////////////
612

    
613
  public String getObjectName()
614
    {
615
    switch(getNumLayers()[0])
616
      {
617
      case 3: return "Redi Cube";
618
      case 5: return "Mosaic Cube";
619
      }
620
    return null;
621
    }
622

    
623
///////////////////////////////////////////////////////////////////////////////////////////////////
624

    
625
  public String getInventor()
626
    {
627
    return "Oskar van Deventer";
628
    }
629

    
630
///////////////////////////////////////////////////////////////////////////////////////////////////
631

    
632
  public int getYearOfInvention()
633
    {
634
    return 2009;
635
    }
636

    
637
///////////////////////////////////////////////////////////////////////////////////////////////////
638

    
639
  public int getComplexity()
640
    {
641
    switch(getNumLayers()[0])
642
      {
643
      case 3: return 1;
644
      case 5: return 2;
645
      }
646
    return 1;
647
    }
648

    
649
///////////////////////////////////////////////////////////////////////////////////////////////////
650

    
651
  public String[][] getTutorials()
652
    {
653
    switch(getNumLayers()[0])
654
      {
655
      case 3: return new String[][] {
656
                                {"gb", "Qn7TJED6O-4", "How to Solve the MoYu Redi Cube", "Z3"},
657
                                {"es", "g0M38Aotgac", "Resolver Redi Cube", "Cuby"},
658
                                {"ru", "dlNRbE-hyzU", "Как собрать Реди Куб", "Алексей Ярыгин"},
659
                                {"fr", "zw7UZcqqsgA", "Comment résoudre le Redi Cube", "ValentinoCube"},
660
                                {"de", "YU8riouyC2w", "Redi Cube Solve", "CubaroCubing"},
661
                                {"pl", "vxo3lXMsWQI", "Jak ułożyć Redi Cube?", "DJ rubiks"},
662
                                {"br", "muQ8U_G4LmM", "Como resolver o Redi Cube", "Rafael Cinoto"},
663
                                {"kr", "a5CzDMbRzbY", "레디큐브를 배우기", "vincentcube"},
664
                                {"vn", "2JZxtmrKUn4", "Tutorial N.6 - Redi", "Duy Thích Rubik"},
665
                                {"tw", "LBKPL01IHD8", "Redi Cube盲解教學", "1hrBLD"},
666
                               };
667
      case 5: return new String[][]{
668
                                {"gb", "Lp63Pn6q4vM", "Mosaic Cube", "Cubes made Easy"},
669
                                {"gb", "LGrxmaTiCZM", "How to solve the Mosaic Cube", "Cuber Stu"},
670
                                {"es", "o5_7dezogqM", "Resolver Mosaic Cube 1/4", "TheMaoiSha"},
671
                                {"es", "wT4wwCOfvQc", "Resolver Mosaic Cube 2/4", "TheMaoiSha"},
672
                                {"es", "yLdSbIK0ULU", "Resolver Mosaic Cube 3/4", "TheMaoiSha"},
673
                                {"es", "l_wl0AgP48k", "Resolver Mosaic Cube 4/4", "TheMaoiSha"},
674
                                {"ru", "wbbP45jHsU4", "Как собрать Мозаичный Куб", "SOLPUZ-Димон"},
675
                                {"pl", "Iu5vd_4h3Uc", "Mosaic cube Tutorial PL", "MrUK"},
676
                                {"br", "a-WiaZdlfjQ", "Mosaic Cube Walkthrough Solve", "Cubo vício"},
677
                                {"tw", "m0vG-cRB8fo", "Mosaic Cube Solution 1/2", "Arwin Hsu"},
678
                                {"tw", "qUDC4TF_1cw", "Mosaic Cube Solution 2/2", "Arwin Hsu"},
679
                               };
680
      }
681
    return null;
682
    }
683
}
(41-41/53)