Project

General

Profile

Download (17.1 KB) Statistics
| Branch: | Tag: | Revision:

magiccube / src / main / java / org / distorted / objects / ObjectList.java @ 14fe8a07

1
///////////////////////////////////////////////////////////////////////////////////////////////////
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.objects;
21

    
22
import android.content.res.Resources;
23

    
24
import org.distorted.library.main.DistortedEffects;
25
import org.distorted.library.main.DistortedTexture;
26
import org.distorted.library.mesh.MeshSquare;
27
import org.distorted.library.type.Static4D;
28
import org.distorted.main.R;
29
import org.distorted.main.RubikActivity;
30

    
31
import java.lang.reflect.Field;
32

    
33
///////////////////////////////////////////////////////////////////////////////////////////////////
34

    
35
public enum ObjectList
36
  {
37
  CUBE (
38
         new int[][] {
39
                       {2 , 12, R.raw.cube2, R.drawable.ui_small_cube2, R.drawable.ui_medium_cube2, R.drawable.ui_big_cube2, R.drawable.ui_huge_cube2} ,
40
                       {3 , 16, R.raw.cube3, R.drawable.ui_small_cube3, R.drawable.ui_medium_cube3, R.drawable.ui_big_cube3, R.drawable.ui_huge_cube3} ,
41
                       {4 , 20, R.raw.cube4, R.drawable.ui_small_cube4, R.drawable.ui_medium_cube4, R.drawable.ui_big_cube4, R.drawable.ui_huge_cube4} ,
42
                       {5 , 24, R.raw.cube5, R.drawable.ui_small_cube5, R.drawable.ui_medium_cube5, R.drawable.ui_big_cube5, R.drawable.ui_huge_cube5}
43
                     },
44
         TwistyCube.class,
45
         new MovementCube(),
46
         0
47
       ),
48

    
49
  PYRA (
50
         new int[][] {
51
                       {3 , 10, R.raw.pyra3, R.drawable.ui_small_pyra3, R.drawable.ui_medium_pyra3, R.drawable.ui_big_pyra3, R.drawable.ui_huge_pyra3} ,
52
                       {4 , 15, R.raw.pyra4, R.drawable.ui_small_pyra4, R.drawable.ui_medium_pyra4, R.drawable.ui_big_pyra4, R.drawable.ui_huge_pyra4} ,
53
                       {5 , 20, R.raw.pyra5, R.drawable.ui_small_pyra5, R.drawable.ui_medium_pyra5, R.drawable.ui_big_pyra5, R.drawable.ui_huge_pyra5}
54
                     },
55
         TwistyPyraminx.class,
56
         new MovementPyraminx(),
57
         1
58
       ),
59

    
60
  DIAM (
61
         new int[][] {
62
                       {2 , 10, R.raw.diamond, R.drawable.ui_small_diam, R.drawable.ui_medium_diam, R.drawable.ui_big_diam, R.drawable.ui_huge_diam} ,
63
                     },
64
         TwistyDiamond.class,
65
         new MovementDiamond(),
66
         1
67
       ),
68

    
69
  DINO (
70
         new int[][] {
71
                       {3 , 10, R.raw.dino, R.drawable.ui_small_dino, R.drawable.ui_medium_dino, R.drawable.ui_big_dino, R.drawable.ui_huge_dino} ,
72
                     },
73
         TwistyDino6.class,
74
         new MovementDino(),
75
         2
76
       ),
77

    
78
  DIN4 (
79
         new int[][] {
80
                       {3 ,  7, R.raw.dino, R.drawable.ui_small_din4, R.drawable.ui_medium_din4, R.drawable.ui_big_din4, R.drawable.ui_huge_din4} ,
81
                     },
82
         TwistyDino4.class,
83
         new MovementDino(),
84
         2
85
       ),
86

    
87
  REDI (
88
         new int[][] {
89
                       {3 , 14, R.raw.redi, R.drawable.ui_small_redi, R.drawable.ui_medium_redi, R.drawable.ui_big_redi, R.drawable.ui_huge_redi} ,
90
                     },
91
         TwistyRedi.class,
92
         new MovementRedi(),
93
         2
94
       ),
95

    
96
  HELI (
97
         new int[][] {
98
                       {3 , 18, R.raw.heli, R.drawable.ui_small_heli, R.drawable.ui_medium_heli, R.drawable.ui_big_heli, R.drawable.ui_huge_heli} ,
99
                     },
100
         TwistyHelicopter.class,
101
         new MovementHelicopter(),
102
         2
103
       ),
104

    
105
  SKEW (
106
         new int[][] {
107
                       {2 , 11, R.raw.skewb, R.drawable.ui_small_skewb, R.drawable.ui_medium_skewb, R.drawable.ui_big_skewb, R.drawable.ui_huge_skewb} ,
108
                       {3 , 17, R.raw.skewm, R.drawable.ui_small_skewm, R.drawable.ui_medium_skewm, R.drawable.ui_big_skewm, R.drawable.ui_huge_skewm} ,
109
                     },
110
         TwistySkewb.class,
111
         new MovementSkewb(),
112
         3
113
       ),
114

    
115
  IVY  (
116
         new int[][] {
117
                       {2 , 8, R.raw.ivy, R.drawable.ui_small_ivy, R.drawable.ui_medium_ivy, R.drawable.ui_big_ivy, R.drawable.ui_huge_ivy} ,
118
                     },
119
         TwistyIvy.class,
120
         new MovementIvy(),
121
         3
122
       ),
123

    
124
  REX  (
125
         new int[][] {
126
                       {3 , 16, R.raw.rex, R.drawable.ui_small_rex, R.drawable.ui_medium_rex, R.drawable.ui_big_rex, R.drawable.ui_huge_rex} ,
127
                     },
128
         TwistyRex.class,
129
         new MovementRex(),
130
         3
131
       ),
132

    
133
  KILO (
134
         new int[][] {
135
                       {3 , 18, R.raw.minx3, R.drawable.ui_small_minx3, R.drawable.ui_medium_minx3, R.drawable.ui_big_minx3, R.drawable.ui_huge_minx3} ,
136
                     },
137
         TwistyMinx.class,
138
         new MovementMinx(),
139
         4
140
       ),
141
  ;
142

    
143
  public static final int NUM_OBJECTS = values().length;
144
  public static final int MAX_NUM_OBJECTS;
145
  public static final int MAX_LEVEL;
146
  public static final int MAX_OBJECT_SIZE;
147

    
148
  private final int[] mObjectSizes, mMaxLevels, mSmallIconIDs, mMediumIconIDs, mBigIconIDs, mHugeIconIDs, mResourceIDs;
149
  private final Class<? extends TwistyObject> mObjectClass;
150
  private final Movement mObjectMovementClass;
151
  private final int mColumn, mNumSizes;
152

    
153
  private static final ObjectList[] objects;
154
  private static int mNumAll;
155
  private static int[] mIndices;
156
  private static int mColCount, mRowCount;
157

    
158
  static
159
    {
160
    mNumAll = 0;
161
    int num, i = 0;
162
    objects = new ObjectList[NUM_OBJECTS];
163
    int maxNum  = Integer.MIN_VALUE;
164
    int maxLevel= Integer.MIN_VALUE;
165
    int maxSize = Integer.MIN_VALUE;
166

    
167
    for(ObjectList object: ObjectList.values())
168
      {
169
      objects[i] = object;
170
      i++;
171
      num = object.mObjectSizes.length;
172
      mNumAll += num;
173
      if( num> maxNum ) maxNum = num;
174

    
175
      for(int j=0; j<num; j++)
176
        {
177
        if( object.mMaxLevels[j] > maxLevel ) maxLevel = object.mMaxLevels[j];
178
        if( object.mObjectSizes[j] > maxSize) maxSize  = object.mObjectSizes[j];
179
        }
180
      }
181

    
182
    MAX_NUM_OBJECTS = maxNum;
183
    MAX_LEVEL       = maxLevel;
184
    MAX_OBJECT_SIZE = maxSize;
185
    }
186

    
187
///////////////////////////////////////////////////////////////////////////////////////////////////
188

    
189
  private static void setUpColAndRow()
190
    {
191
    mIndices = new int[NUM_OBJECTS];
192
    mColCount= 0;
193

    
194
    for(int obj=0; obj<NUM_OBJECTS; obj++)
195
      {
196
      mIndices[obj] = objects[obj].mColumn;
197
      if( mIndices[obj]>=mColCount ) mColCount = mIndices[obj]+1;
198
      }
199

    
200
    mRowCount = 0;
201

    
202
    for(int col=0; col<mColCount; col++)
203
      {
204
      int numObjects = computeNumObjectsInColumn(col);
205
      if( numObjects>mRowCount ) mRowCount = numObjects;
206
      }
207
    }
208

    
209
///////////////////////////////////////////////////////////////////////////////////////////////////
210

    
211
  private static int computeNumObjectsInColumn(int column)
212
    {
213
    int num=0;
214

    
215
    for(int object=0; object<NUM_OBJECTS; object++)
216
      {
217
      if( objects[object].mColumn == column )
218
        {
219
        num += objects[object].mNumSizes;
220
        }
221
      }
222

    
223
    return num;
224
    }
225

    
226
///////////////////////////////////////////////////////////////////////////////////////////////////
227

    
228
  public static int getColumnCount()
229
    {
230
    if( mIndices==null ) setUpColAndRow();
231

    
232
    return mColCount;
233
    }
234

    
235
///////////////////////////////////////////////////////////////////////////////////////////////////
236

    
237
  public static int getRowCount()
238
    {
239
    if( mIndices==null ) setUpColAndRow();
240

    
241
    return mRowCount;
242
    }
243

    
244
///////////////////////////////////////////////////////////////////////////////////////////////////
245

    
246
  public static int[] getIndices()
247
    {
248
    if( mIndices==null ) setUpColAndRow();
249

    
250
    return mIndices;
251
    }
252

    
253
///////////////////////////////////////////////////////////////////////////////////////////////////
254

    
255
  public static ObjectList getObject(int ordinal)
256
    {
257
    return ordinal>=0 && ordinal<NUM_OBJECTS ? objects[ordinal] : CUBE;
258
    }
259

    
260
///////////////////////////////////////////////////////////////////////////////////////////////////
261

    
262
  public static int pack(int object, int sizeIndex)
263
    {
264
    int ret = 0;
265
    for(int i=0; i<object; i++) ret += objects[i].mObjectSizes.length;
266

    
267
    return ret+sizeIndex;
268
    }
269

    
270
///////////////////////////////////////////////////////////////////////////////////////////////////
271

    
272
  public static int unpackSizeIndex(int number)
273
    {
274
    int num;
275

    
276
    for(int i=0; i<NUM_OBJECTS; i++)
277
      {
278
      num = objects[i].mObjectSizes.length;
279
      if( number<num ) return number;
280
      number -= num;
281
      }
282

    
283
    return -1;
284
    }
285

    
286
///////////////////////////////////////////////////////////////////////////////////////////////////
287

    
288
  public static int unpackObject(int number)
289
    {
290
    int num;
291

    
292
    for(int i=0; i<NUM_OBJECTS; i++)
293
      {
294
      num = objects[i].mObjectSizes.length;
295
      if( number<num ) return i;
296
      number -= num;
297
      }
298

    
299
    return -1;
300
    }
301

    
302
///////////////////////////////////////////////////////////////////////////////////////////////////
303

    
304
  public static int unpackObjectFromString(String obj)
305
    {
306
    int u = obj.indexOf('_');
307
    int l = obj.length();
308

    
309
    if( u>0 )
310
      {
311
      String name = obj.substring(0,u);
312
      int size = Integer.parseInt( obj.substring(u+1,l) );
313

    
314
      for(int i=0; i<NUM_OBJECTS; i++)
315
        {
316
        if( objects[i].name().equals(name) )
317
          {
318
          int sizeIndex = getSizeIndex(i,size);
319
          return pack(i,sizeIndex);
320
          }
321
        }
322
      }
323

    
324
    return -1;
325
    }
326

    
327
///////////////////////////////////////////////////////////////////////////////////////////////////
328

    
329
  public static String getObjectList()
330
    {
331
    String name;
332
    StringBuilder list = new StringBuilder();
333
    int len;
334
    int[] sizes;
335

    
336
    for(int i=0; i<NUM_OBJECTS; i++)
337
      {
338
      sizes = objects[i].mObjectSizes;
339
      len   = sizes.length;
340
      name  = objects[i].name();
341

    
342
      for(int j=0; j<len; j++)
343
        {
344
        if( i>0 || j>0 ) list.append(',');
345
        list.append(name);
346
        list.append('_');
347
        list.append(sizes[j]);
348
        }
349
      }
350

    
351
    return list.toString();
352
    }
353

    
354
///////////////////////////////////////////////////////////////////////////////////////////////////
355

    
356
  public static int getTotal()
357
    {
358
    return mNumAll;
359
    }
360

    
361
///////////////////////////////////////////////////////////////////////////////////////////////////
362

    
363
  public static int getMaxLevel(int ordinal, int sizeIndex)
364
    {
365
    if( ordinal>=0 && ordinal<NUM_OBJECTS )
366
      {
367
      int num = objects[ordinal].mObjectSizes.length;
368
      return sizeIndex>=0 && sizeIndex<num ? objects[ordinal].mMaxLevels[sizeIndex] : 0;
369
      }
370

    
371
    return 0;
372
    }
373

    
374
///////////////////////////////////////////////////////////////////////////////////////////////////
375

    
376
  public static int getOrdinal(String name)
377
    {
378
    for(int i=0; i<NUM_OBJECTS; i++)
379
      {
380
      if(objects[i].name().equals(name)) return i;
381
      }
382

    
383
    return -1;
384
    }
385

    
386
///////////////////////////////////////////////////////////////////////////////////////////////////
387

    
388
  public static int getSizeIndex(int ordinal, int size)
389
    {
390
    if( ordinal>=0 && ordinal<NUM_OBJECTS )
391
      {
392
      int[] sizes = objects[ordinal].getSizes();
393
      int len = sizes.length;
394

    
395
      for(int i=0; i<len; i++)
396
        {
397
        if( sizes[i]==size ) return i;
398
        }
399
      }
400

    
401
    return -1;
402
    }
403

    
404
///////////////////////////////////////////////////////////////////////////////////////////////////
405

    
406
  public static int[] retFaceColors(ObjectList object)
407
    {
408
    Field field;
409
    int[] faceColors=null;
410

    
411
    try
412
      {
413
      field = object.mObjectClass.getDeclaredField("FACE_COLORS");
414
      field.setAccessible(true);
415
      Object obj = field.get(null);
416
      faceColors = (int[]) obj;
417
      }
418
    catch(NoSuchFieldException ex)
419
      {
420
      android.util.Log.e("RubikObjectList", object.mObjectClass.getSimpleName()+": no such field exception getting field: "+ex.getMessage());
421
      }
422
    catch(IllegalAccessException ex)
423
      {
424
      android.util.Log.e("RubikObjectList", object.mObjectClass.getSimpleName()+": illegal access exception getting field: "+ex.getMessage());
425
      }
426

    
427
    return faceColors;
428
    }
429

    
430
///////////////////////////////////////////////////////////////////////////////////////////////////
431

    
432
  ObjectList(int[][] info, Class<? extends TwistyObject> object , Movement movement, int column)
433
    {
434
    mNumSizes = info.length;
435

    
436
    mObjectSizes  = new int[mNumSizes];
437
    mMaxLevels    = new int[mNumSizes];
438
    mResourceIDs  = new int[mNumSizes];
439
    mSmallIconIDs = new int[mNumSizes];
440
    mMediumIconIDs= new int[mNumSizes];
441
    mBigIconIDs   = new int[mNumSizes];
442
    mHugeIconIDs  = new int[mNumSizes];
443

    
444
    for(int i=0; i<mNumSizes; i++)
445
      {
446
      mObjectSizes[i]  = info[i][0];
447
      mMaxLevels[i]    = info[i][1];
448
      mResourceIDs[i]  = info[i][2];
449
      mSmallIconIDs[i] = info[i][3];
450
      mMediumIconIDs[i]= info[i][4];
451
      mBigIconIDs[i]   = info[i][5];
452
      mHugeIconIDs[i]  = info[i][6];
453
      }
454

    
455
    mObjectClass         = object;
456
    mObjectMovementClass = movement;
457
    mColumn              = column;
458
    }
459

    
460
///////////////////////////////////////////////////////////////////////////////////////////////////
461

    
462
  public int[] getSizes()
463
    {
464
    return mObjectSizes;
465
    }
466

    
467
///////////////////////////////////////////////////////////////////////////////////////////////////
468

    
469
  public int[] getMaxLevels()
470
    {
471
    return mMaxLevels;
472
    }
473

    
474
///////////////////////////////////////////////////////////////////////////////////////////////////
475

    
476
  public int[] getIconIDs()
477
    {
478
    int size = RubikActivity.getDrawableSize();
479

    
480
    switch(size)
481
      {
482
      case 0 : return mSmallIconIDs;
483
      case 1 : return mMediumIconIDs;
484
      case 2 : return mBigIconIDs;
485
      default: return mHugeIconIDs;
486
      }
487
    }
488

    
489
///////////////////////////////////////////////////////////////////////////////////////////////////
490

    
491
  public int[] getResourceIDs()
492
    {
493
    return mResourceIDs;
494
    }
495

    
496
///////////////////////////////////////////////////////////////////////////////////////////////////
497

    
498
  public int getNumVariants()
499
    {
500
    return mObjectSizes.length;
501
    }
502

    
503
///////////////////////////////////////////////////////////////////////////////////////////////////
504

    
505
  public TwistyObject create(int size, Static4D quat, int[][] moves, Resources res, int scrWidth)
506
    {
507
    DistortedTexture texture = new DistortedTexture();
508
    DistortedEffects effects = new DistortedEffects();
509
    MeshSquare mesh          = new MeshSquare(20,20);   // mesh of the node, not of the cubits
510

    
511
    switch(ordinal())
512
      {
513
      case  0: return new TwistyCube      (size, quat, texture, mesh, effects, moves, res, scrWidth);
514
      case  1: return new TwistyPyraminx  (size, quat, texture, mesh, effects, moves, res, scrWidth);
515
      case  2: return new TwistyDiamond   (size, quat, texture, mesh, effects, moves, res, scrWidth);
516
      case  3: return new TwistyDino6     (size, quat, texture, mesh, effects, moves, res, scrWidth);
517
      case  4: return new TwistyDino4     (size, quat, texture, mesh, effects, moves, res, scrWidth);
518
      case  5: return new TwistyRedi      (size, quat, texture, mesh, effects, moves, res, scrWidth);
519
      case  6: return new TwistyHelicopter(size, quat, texture, mesh, effects, moves, res, scrWidth);
520
      case  7: return new TwistySkewb     (size, quat, texture, mesh, effects, moves, res, scrWidth);
521
      case  8: return new TwistyIvy       (size, quat, texture, mesh, effects, moves, res, scrWidth);
522
      case  9: return new TwistyRex       (size, quat, texture, mesh, effects, moves, res, scrWidth);
523
      case 10: return new TwistyMinx      (size, quat, texture, mesh, effects, moves, res, scrWidth);
524
      }
525

    
526
    return null;
527
    }
528

    
529
///////////////////////////////////////////////////////////////////////////////////////////////////
530

    
531
  public Movement getObjectMovementClass()
532
    {
533
    return mObjectMovementClass;
534
    }
535
  }
(15-15/28)