Project

General

Profile

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

distorted-objectlib / src / main / java / org / distorted / objectlib / objects / TwistyIvy.java @ cde08c52

1 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2020 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// Magic Cube is free software: you can redistribute it and/or modify                            //
7
// it under the terms of the GNU General Public License as published by                          //
8
// the Free Software Foundation, either version 2 of the License, or                             //
9
// (at your option) any later version.                                                           //
10
//                                                                                               //
11
// Magic Cube is distributed in the hope that it will be useful,                                 //
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
14
// GNU General Public License for more details.                                                  //
15
//                                                                                               //
16
// You should have received a copy of the GNU General Public License                             //
17
// along with Magic Cube.  If not, see <http://www.gnu.org/licenses/>.                           //
18
///////////////////////////////////////////////////////////////////////////////////////////////////
19
20
package org.distorted.objectlib.objects;
21
22 c9c71c3f Leszek Koltunski
import static org.distorted.objectlib.touchcontrol.TouchControl.TYPE_SPLIT_CORNER;
23
import static org.distorted.objectlib.touchcontrol.TouchControl.TC_HEXAHEDRON;
24 29b82486 Leszek Koltunski
25 82eb152a Leszek Koltunski
import java.io.InputStream;
26 29b82486 Leszek Koltunski
27
import org.distorted.library.type.Static3D;
28
import org.distorted.library.type.Static4D;
29
30 3ee1d662 Leszek Koltunski
import org.distorted.objectlib.helpers.ObjectFaceShape;
31 c9c71c3f Leszek Koltunski
import org.distorted.objectlib.touchcontrol.TouchControlHexahedron;
32 8005e762 Leszek Koltunski
import org.distorted.objectlib.main.ObjectType;
33 198c5bf0 Leszek Koltunski
import org.distorted.objectlib.helpers.ObjectShape;
34 10b7e306 Leszek Koltunski
import org.distorted.objectlib.scrambling.ScrambleState;
35 386af988 Leszek Koltunski
import org.distorted.objectlib.main.ShapeHexahedron;
36 29b82486 Leszek Koltunski
37
///////////////////////////////////////////////////////////////////////////////////////////////////
38
39 386af988 Leszek Koltunski
public class TwistyIvy extends ShapeHexahedron
40 29b82486 Leszek Koltunski
{
41
  static final Static3D[] ROT_AXIS = new Static3D[]
42
         {
43
           new Static3D(+SQ3/3,+SQ3/3,+SQ3/3),
44
           new Static3D(+SQ3/3,+SQ3/3,-SQ3/3),
45
           new Static3D(+SQ3/3,-SQ3/3,+SQ3/3),
46
           new Static3D(+SQ3/3,-SQ3/3,-SQ3/3)
47
         };
48
49
  public static final float IVY_D = 0.006f;
50
  private static final int  IVY_N = 8;
51
52
  private ScrambleState[] mStates;
53 beee90ab Leszek Koltunski
  private int[][] mBasicAngle;
54 29b82486 Leszek Koltunski
  private float[][] mCuts;
55 802fe251 Leszek Koltunski
  private int[] mQuatIndex;
56 29b82486 Leszek Koltunski
57
///////////////////////////////////////////////////////////////////////////////////////////////////
58
59 3bf19410 Leszek Koltunski
  public TwistyIvy(int[] numL, int meshState, int iconMode, Static4D quat, Static3D move, float scale, InputStream stream)
60 29b82486 Leszek Koltunski
    {
61 3bf19410 Leszek Koltunski
    super(numL, meshState, iconMode, numL[0], quat, move, scale, stream);
62 29b82486 Leszek Koltunski
    }
63
64 ed0988c0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
65
// ditto, manually provide the sticker coordinates.
66
67
  @Override
68
  public void adjustStickerCoords()
69
    {
70 0275f61f Leszek Koltunski
    float B = 1.08f;
71
    float A1 = B*0.41f;
72
    float A2 = B*0.46f;
73
74 ed0988c0 Leszek Koltunski
    mStickerCoords = new float[][]
75
          {
76
            { 0.29258922f, -0.5f, 0.29258922f, 0.29258922f, -0.5f, 0.29258922f },
77 0275f61f Leszek Koltunski
            { -A1,A1,A2,-A2 }
78 ed0988c0 Leszek Koltunski
          };
79
    }
80
81 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
82
83 f9a81f52 Leszek Koltunski
  public ScrambleState[] getScrambleStates()
84 29b82486 Leszek Koltunski
    {
85
    if( mStates==null )
86
      {
87
      int[] tmp = {0,-1,0, 0,1,0, 1,-1,0, 1,1,0 };
88
89
      mStates = new ScrambleState[]
90
        {
91
        new ScrambleState( new int[][] {tmp,tmp,tmp,tmp} )
92
        };
93
      }
94
95
    return mStates;
96
    }
97
98
///////////////////////////////////////////////////////////////////////////////////////////////////
99
100 7bbfc84f Leszek Koltunski
  public float[][] getCuts(int[] numLayers)
101 29b82486 Leszek Koltunski
    {
102
    if( mCuts==null )
103
      {
104
      float[] cut = new float[] {0.0f};
105
      mCuts = new float[][] { cut,cut,cut,cut };
106
      }
107
108
    return mCuts;
109
    }
110
111
///////////////////////////////////////////////////////////////////////////////////////////////////
112
113 59c20632 Leszek Koltunski
  public boolean[][] getLayerRotatable(int[] numLayers)
114 29b82486 Leszek Koltunski
    {
115 59c20632 Leszek Koltunski
    int numAxis = ROT_AXIS.length;
116
    boolean[][] layerRotatable = new boolean[numAxis][];
117 a57e6870 Leszek Koltunski
118 59c20632 Leszek Koltunski
    for(int i=0; i<numAxis; i++)
119
      {
120
      layerRotatable[i] = new boolean[numLayers[i]];
121
      for(int j=0; j<numLayers[i]; j++) layerRotatable[i][j] = true;
122 29b82486 Leszek Koltunski
      }
123 59c20632 Leszek Koltunski
124
    return layerRotatable;
125
    }
126
127
///////////////////////////////////////////////////////////////////////////////////////////////////
128
129 11fa413d Leszek Koltunski
  public int getTouchControlType()
130 59c20632 Leszek Koltunski
    {
131 c9c71c3f Leszek Koltunski
    return TC_HEXAHEDRON;
132 59c20632 Leszek Koltunski
    }
133
134
///////////////////////////////////////////////////////////////////////////////////////////////////
135
136 11fa413d Leszek Koltunski
  public int getTouchControlSplit()
137 59c20632 Leszek Koltunski
    {
138
    return TYPE_SPLIT_CORNER;
139
    }
140
141
///////////////////////////////////////////////////////////////////////////////////////////////////
142
143
  public int[][][] getEnabled()
144
    {
145
    return new int[][][]
146
      {
147
          {{0},{3},{3},{0}},
148
          {{2},{1},{1},{2}},
149
          {{2},{0},{0},{2}},
150
          {{1},{3},{3},{1}},
151
          {{0},{0},{1},{1}},
152
          {{2},{2},{3},{3}},
153
      };
154
    }
155
156
///////////////////////////////////////////////////////////////////////////////////////////////////
157
158
  public float[] getDist3D(int[] numLayers)
159
    {
160 4c9ca251 Leszek Koltunski
    return TouchControlHexahedron.D3D;
161
    }
162
163
///////////////////////////////////////////////////////////////////////////////////////////////////
164
165
  public Static3D[] getFaceAxis()
166
    {
167
    return TouchControlHexahedron.FACE_AXIS;
168 29b82486 Leszek Koltunski
    }
169
170
///////////////////////////////////////////////////////////////////////////////////////////////////
171
172 7b832206 Leszek Koltunski
  public float[][] getCubitPositions(int[] numLayers)
173 29b82486 Leszek Koltunski
    {
174 a57e6870 Leszek Koltunski
    final float DIST_CORNER = numLayers[0]-1;
175
    final float DIST_CENTER = numLayers[0]-1;
176 29b82486 Leszek Koltunski
177 802fe251 Leszek Koltunski
    return new float[][]
178
      {
179
        { DIST_CORNER, DIST_CORNER, DIST_CORNER },
180
        {-DIST_CORNER, DIST_CORNER,-DIST_CORNER },
181
        {-DIST_CORNER,-DIST_CORNER, DIST_CORNER },
182
        { DIST_CORNER,-DIST_CORNER,-DIST_CORNER },
183
        {           0,           0, DIST_CENTER },
184
        {           0,           0,-DIST_CENTER },
185 0b9d97b5 Leszek Koltunski
        {           0, DIST_CENTER,           0 },
186
        {           0,-DIST_CENTER,           0 },
187
        { DIST_CENTER,           0,           0 },
188
        {-DIST_CENTER,           0,           0 },
189 802fe251 Leszek Koltunski
      };
190 29b82486 Leszek Koltunski
    }
191
192 d0e6cf7f Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
193
194
  public Static4D getCubitQuats(int cubit, int[] numLayers)
195
    {
196 0b9d97b5 Leszek Koltunski
    if( mQuatIndex==null ) mQuatIndex = new int[] { 0,11,10, 9,
197
                                                    0,11, 7, 6, 5, 8
198
                                                  };
199 802fe251 Leszek Koltunski
    return mObjectQuats[mQuatIndex[cubit]];
200 d0e6cf7f Leszek Koltunski
    }
201
202 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
203
204 e30c522a Leszek Koltunski
  public ObjectShape getObjectShape(int variant)
205 29b82486 Leszek Koltunski
    {
206
    if( variant==0 )
207
      {
208 0275f61f Leszek Koltunski
      final float A = 0.3f;
209 29b82486 Leszek Koltunski
      final float angle = (float)Math.PI/(2*IVY_N);
210 57ef6378 Leszek Koltunski
      final float CORR  = 1-2*IVY_D;
211 0275f61f Leszek Koltunski
      float[][] vertices= new float[3*(IVY_N+1)+5][3];
212
      int[][] indices   = new int[3*IVY_N+3][];
213
214
      indices[0] = new int[IVY_N+4];
215
      indices[1] = new int[IVY_N+4];
216
      indices[2] = new int[IVY_N+4];
217
218
      vertices[3*(IVY_N+1)+4][0] = -A;
219
      vertices[3*(IVY_N+1)+4][1] = -A;
220
      vertices[3*(IVY_N+1)+4][2] = -A;
221 29b82486 Leszek Koltunski
222 57ef6378 Leszek Koltunski
      vertices[0][0] = 0;
223
      vertices[0][1] = 0;
224
      vertices[0][2] = 0;
225
      vertices[1][0] =-2;
226
      vertices[1][1] = 0;
227
      vertices[1][2] = 0;
228
      vertices[2][0] = 0;
229
      vertices[2][1] =-2;
230
      vertices[2][2] = 0;
231
      vertices[3][0] = 0;
232
      vertices[3][1] = 0;
233
      vertices[3][2] =-2;
234 29b82486 Leszek Koltunski
235 ac97ecc0 Leszek Koltunski
      indices[0][0] = 2;
236
      indices[0][1] = 0;
237
      indices[0][2] = 1;
238
      indices[1][0] = 3;
239
      indices[1][1] = 0;
240
      indices[1][2] = 2;
241
      indices[2][0] = 1;
242
      indices[2][1] = 0;
243
      indices[2][2] = 3;
244 29b82486 Leszek Koltunski
245
      int N1 = 4;
246
      int N2 = N1 + IVY_N + 1;
247
      int N3 = N2 + IVY_N + 1;
248
249
      for(int i=0; i<=IVY_N; i++)
250
        {
251 57ef6378 Leszek Koltunski
        float cos1 = (float)Math.cos((IVY_N-i)*angle);
252
        float sin1 = (float)Math.sin((IVY_N-i)*angle);
253
        float cos2 = (float)Math.cos((      i)*angle);
254
        float sin2 = (float)Math.sin((      i)*angle);
255 29b82486 Leszek Koltunski
256 57ef6378 Leszek Koltunski
        vertices[N1+i][0] = CORR*(2*cos1-1) - 1;
257
        vertices[N1+i][1] = CORR*(2*sin1-1) - 1;
258
        vertices[N1+i][2] = 0;
259 29b82486 Leszek Koltunski
260 57ef6378 Leszek Koltunski
        vertices[N2+i][0] = 0;
261
        vertices[N2+i][1] = CORR*(2*sin2-1) - 1;
262
        vertices[N2+i][2] = CORR*(2*cos2-1) - 1;
263 29b82486 Leszek Koltunski
264 57ef6378 Leszek Koltunski
        vertices[N3+i][0] = CORR*(2*cos2-1) - 1;
265
        vertices[N3+i][1] = 0;
266
        vertices[N3+i][2] = CORR*(2*sin2-1) - 1;
267 29b82486 Leszek Koltunski
268 ac97ecc0 Leszek Koltunski
        indices[0][i+3] = N1 + i;
269
        indices[1][i+3] = N2 + i;
270
        indices[2][i+3] = N3 + i;
271 0275f61f Leszek Koltunski
        }
272
273
      for(int i=0; i<IVY_N; i++)
274
        {
275
        indices[3*i+3] = new int[] { N1+i+1, N1+i, 3*(IVY_N+1)+4 };
276
        indices[3*i+4] = new int[] { N2+i+1, N2+i, 3*(IVY_N+1)+4 };
277
        indices[3*i+5] = new int[] { N3+i+1, N3+i, 3*(IVY_N+1)+4 };
278 29b82486 Leszek Koltunski
        }
279
280 59a971c1 Leszek Koltunski
      return new ObjectShape(vertices, indices);
281 29b82486 Leszek Koltunski
      }
282
    else
283
      {
284
      final float angle = (float)Math.PI/(2*IVY_N);
285 57ef6378 Leszek Koltunski
      final float CORR  = 1-2*IVY_D;
286 0275f61f Leszek Koltunski
      float[][] vertices= new float[2*IVY_N+1][3];
287
      int[][] indices   = new int[2*IVY_N+1][];
288 29b82486 Leszek Koltunski
289
      for(int i=0; i<IVY_N; i++)
290
        {
291 57ef6378 Leszek Koltunski
        float sin = (float)Math.sin(i*angle);
292
        float cos = (float)Math.cos(i*angle);
293 29b82486 Leszek Koltunski
294 57ef6378 Leszek Koltunski
        vertices[i      ][0] = CORR*(1-2*cos);
295
        vertices[i      ][1] = CORR*(1-2*sin);
296 29b82486 Leszek Koltunski
        vertices[i      ][2] = 0;
297 57ef6378 Leszek Koltunski
        vertices[i+IVY_N][0] = CORR*(2*cos-1);
298
        vertices[i+IVY_N][1] = CORR*(2*sin-1);
299 29b82486 Leszek Koltunski
        vertices[i+IVY_N][2] = 0;
300
        }
301
302 0275f61f Leszek Koltunski
      vertices[2*IVY_N][0] = 0.0f;
303
      vertices[2*IVY_N][1] = 0.0f;
304
      vertices[2*IVY_N][2] =-0.1f;
305
306
      indices[0] = new int[2*IVY_N+1];
307 29b82486 Leszek Koltunski
      for(int i=0; i<2*IVY_N; i++)
308
        {
309 ac97ecc0 Leszek Koltunski
        indices[0][i] = i;
310 0275f61f Leszek Koltunski
        indices[i+1]  = new int[] {i+1,i,2*IVY_N};
311 29b82486 Leszek Koltunski
        }
312 0275f61f Leszek Koltunski
      indices[2*IVY_N][0] = 0;
313 29b82486 Leszek Koltunski
314 59a971c1 Leszek Koltunski
      return new ObjectShape(vertices, indices);
315 3ee1d662 Leszek Koltunski
      }
316
    }
317
318
///////////////////////////////////////////////////////////////////////////////////////////////////
319
320
  public ObjectFaceShape getObjectFaceShape(int variant)
321
    {
322
    if( variant==0 )
323
      {
324 3bf19410 Leszek Koltunski
      float height = isInIconMode() ? 0.001f : 0.015f;
325 3ee1d662 Leszek Koltunski
      float[][] centers  = { {-1.0f,-1.0f,-1.0f} };
326 0275f61f Leszek Koltunski
      float[][] corners  = { {0.04f,0.20f}, {0.03f,0.20f} };
327 3bf19410 Leszek Koltunski
      float[][] bands    = { {height,20,0.2f,0.5f,7,1,2}, {0.001f,1,0.2f,0.0f,2,0,0} };
328 3ee1d662 Leszek Koltunski
329 0275f61f Leszek Koltunski
      int[] cornerIndices= new int[3*(IVY_N+1)+5];
330
      int[] centerIndices= new int[3*(IVY_N+1)+5];
331
      int[] bandIndices  = new int[3*(IVY_N+1)  ];
332 4e9f2df5 Leszek Koltunski
333 3ee1d662 Leszek Koltunski
      for(int i=0; i<3*(IVY_N+1); i++)
334 29b82486 Leszek Koltunski
        {
335 3ee1d662 Leszek Koltunski
        cornerIndices[i+4] = -1;
336
        centerIndices[i+4] = -1;
337 0275f61f Leszek Koltunski
        bandIndices[i] = 1;
338 29b82486 Leszek Koltunski
        }
339
340 0275f61f Leszek Koltunski
      cornerIndices[3*(IVY_N+1)+4] = -1;
341
      centerIndices[3*(IVY_N+1)+4] = -1;
342
343
      bandIndices[0] = 0;
344
      bandIndices[1] = 0;
345
      bandIndices[2] = 0;
346
347 3ee1d662 Leszek Koltunski
      cornerIndices[0] = 1;
348
      cornerIndices[1] = 0;
349
      cornerIndices[2] = 0;
350
      cornerIndices[3] = 0;
351
352
      centerIndices[0] = 0;
353
      centerIndices[1] = 0;
354
      centerIndices[2] = 0;
355
      centerIndices[3] = 0;
356
357
      float C = 1-SQ2/2;
358 4e9f2df5 Leszek Koltunski
      float[] convexCenter = {-C,-C,-C};
359 3ee1d662 Leszek Koltunski
      return new ObjectFaceShape(bands,bandIndices,corners,cornerIndices,centers,centerIndices,convexCenter);
360
      }
361
    else
362
      {
363 3bf19410 Leszek Koltunski
      float h1 = isInIconMode() ? 0.001f : 0.03f;
364
      float h2 = isInIconMode() ? 0.001f : 0.01f;
365 0275f61f Leszek Koltunski
      float[][] corners= { {0.04f,0.20f} };
366 4e9f2df5 Leszek Koltunski
      float[][] centers= { {-0.0f,-0.0f,-1.0f} };
367 3bf19410 Leszek Koltunski
      float[][] bands  = { { h1,35,0.5f,0.5f,5,0,0}, {h2,1,0.5f,0.8f,2,0,0} };
368 3ee1d662 Leszek Koltunski
369 0275f61f Leszek Koltunski
      int[] bandIndices= new int[2*IVY_N+1];
370
      int[] indexes = new int[2*IVY_N+1];
371
      for(int i=0; i<2*IVY_N+1; i++)
372
        {
373
        indexes[i] = -1;
374
        bandIndices[i] = 1;
375
        }
376 3ee1d662 Leszek Koltunski
      indexes[0] = indexes[IVY_N] = 0;
377 0275f61f Leszek Koltunski
      bandIndices[0] = 0;
378 29b82486 Leszek Koltunski
379 3ee1d662 Leszek Koltunski
      return new ObjectFaceShape(bands,bandIndices,corners,indexes,centers,indexes, null);
380 29b82486 Leszek Koltunski
      }
381
    }
382
383
///////////////////////////////////////////////////////////////////////////////////////////////////
384
385 e30c522a Leszek Koltunski
  public int getNumCubitVariants(int[] numLayers)
386 29b82486 Leszek Koltunski
    {
387
    return 2;
388
    }
389
390
///////////////////////////////////////////////////////////////////////////////////////////////////
391
392 e30c522a Leszek Koltunski
  public int getCubitVariant(int cubit, int[] numLayers)
393 29b82486 Leszek Koltunski
    {
394
    return cubit<4 ? 0:1;
395
    }
396
397 00f4980d Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
398
399 d53fb890 Leszek Koltunski
  public float getStickerRadius()
400 00f4980d Leszek Koltunski
    {
401
    return 0.19f;
402
    }
403
404
///////////////////////////////////////////////////////////////////////////////////////////////////
405
406 d53fb890 Leszek Koltunski
  public float getStickerStroke()
407 00f4980d Leszek Koltunski
    {
408 3bf19410 Leszek Koltunski
    return isInIconMode() ? 0.16f : 0.12f;
409 00f4980d Leszek Koltunski
    }
410
411
///////////////////////////////////////////////////////////////////////////////////////////////////
412
413 d53fb890 Leszek Koltunski
  public float[][] getStickerAngles()
414 00f4980d Leszek Koltunski
    {
415
    float D = (float)(Math.PI/4);
416 cc70f525 Leszek Koltunski
    return new float[][] { { 0,0,-D },{ D,D } };
417 00f4980d Leszek Koltunski
    }
418
419 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
420
// PUBLIC API
421
422
  public Static3D[] getRotationAxis()
423
    {
424
    return ROT_AXIS;
425
    }
426
427
///////////////////////////////////////////////////////////////////////////////////////////////////
428
429 beee90ab Leszek Koltunski
  public int[][] getBasicAngles()
430 29b82486 Leszek Koltunski
    {
431 beee90ab Leszek Koltunski
    if( mBasicAngle ==null )
432
      {
433
      int num = getNumLayers()[0];
434
      int[] tmp = new int[num];
435
      for(int i=0; i<num; i++) tmp[i] = 3;
436
      mBasicAngle = new int[][] { tmp,tmp,tmp,tmp };
437
      }
438
439 29b82486 Leszek Koltunski
    return mBasicAngle;
440
    }
441
442 61aa85e4 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
443
444 5f54927b Leszek Koltunski
  public String getShortName()
445 61aa85e4 Leszek Koltunski
    {
446 5f54927b Leszek Koltunski
    return ObjectType.IVY_2.name();
447
    }
448
449
///////////////////////////////////////////////////////////////////////////////////////////////////
450
451
  public long getSignature()
452
    {
453
    return ObjectType.IVY_2.ordinal();
454 61aa85e4 Leszek Koltunski
    }
455
456 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
457
458 e26eb4e7 Leszek Koltunski
  public String getObjectName()
459 29b82486 Leszek Koltunski
    {
460 e26eb4e7 Leszek Koltunski
    return "Ivy Cube";
461 29b82486 Leszek Koltunski
    }
462
463
///////////////////////////////////////////////////////////////////////////////////////////////////
464
465 e26eb4e7 Leszek Koltunski
  public String getInventor()
466 29b82486 Leszek Koltunski
    {
467 e26eb4e7 Leszek Koltunski
    return "Eitan Cher";
468 29b82486 Leszek Koltunski
    }
469
470 59c20632 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
471
472 e26eb4e7 Leszek Koltunski
  public int getYearOfInvention()
473 59c20632 Leszek Koltunski
    {
474
    return 2009;
475
    }
476
477 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
478
479 e26eb4e7 Leszek Koltunski
  public int getComplexity()
480 29b82486 Leszek Koltunski
    {
481 b4223a92 Leszek Koltunski
    return 0;
482 29b82486 Leszek Koltunski
    }
483 052e0362 Leszek Koltunski
484
///////////////////////////////////////////////////////////////////////////////////////////////////
485
486
  public String[][] getTutorials()
487
    {
488
    return new String[][]{
489
                          {"gb","QMzeJobSu1M","How to Solve the Ivy Cube","Z3"},
490
                          {"es","2-Gf2cmEJDs","Resolver Ivy Cube","Cuby"},
491
                          {"ru","pbkfOCnnfsA","Как собрать Иви куб","Алексей Ярыгин"},
492
                          {"fr","mn7YTnYu3Uc","Comment résoudre le Ivy Cube","ValentinoCube"},
493
                          {"de","vaW5fSUG_O8","Ivy Cube","ThomasStadler"},
494
                          {"pl","8s_0VxNvFA8","Jak ułożyć Ivy Cube","DubiCube"},
495
                          {"kr","TmSPgjtSFac","15분만에 아이비큐브 완전정복하기!","초등취미생활"},
496 a399e91b Leszek Koltunski
                          {"vn","Ktx9KQr_8qo","Tutorial N.29 - Ivy Cube","Duy Thích Rubik"},
497 052e0362 Leszek Koltunski
                         };
498
    }
499 29b82486 Leszek Koltunski
}