Project

General

Profile

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

magiccube / src / main / java / org / distorted / objects / RubikObjectList.java @ eaee1ddc

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 RubikObjectList
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
         RubikCube.class,
45
         new RubikMovementCube(),
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
         RubikPyraminx.class,
56
         new RubikMovementPyraminx(),
57
         1
58
       ),
59

    
60
  DINO (
61
         new int[][] {
62
                       {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} ,
63
                     },
64
         RubikDino6.class,
65
         new RubikMovementDino(),
66
         2
67
       ),
68

    
69
  DIN4 (
70
         new int[][] {
71
                       {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} ,
72
                     },
73
         RubikDino4.class,
74
         new RubikMovementDino(),
75
         2
76
       ),
77

    
78
  SKEW (
79
         new int[][] {
80
                       {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} ,
81
                     },
82
         RubikSkewb.class,
83
         new RubikMovementSkewb(),
84
         2
85
       ),
86

    
87
  HELI (
88
         new int[][] {
89
                       {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} ,
90
                     },
91
         RubikHelicopter.class,
92
         new RubikMovementHelicopter(),
93
         2
94
       ),
95
  ;
96

    
97
  public static final int NUM_OBJECTS = values().length;
98
  public static final int MAX_NUM_OBJECTS;
99
  public static final int MAX_LEVEL;
100
  public static final int MAX_OBJECT_SIZE;
101

    
102
  private final int[] mObjectSizes, mMaxLevels, mSmallIconIDs, mMediumIconIDs, mBigIconIDs, mHugeIconIDs, mResourceIDs;
103
  private final Class<? extends RubikObject> mObjectClass;
104
  private final RubikMovement mObjectMovementClass;
105
  private final int mColumn, mNumSizes;
106

    
107
  private static final RubikObjectList[] objects;
108
  private static int mNumAll;
109
  private static int[] mIndices;
110
  private static int mColCount, mRowCount;
111

    
112
  static
113
    {
114
    mNumAll = 0;
115
    int num, i = 0;
116
    objects = new RubikObjectList[NUM_OBJECTS];
117
    int maxNum  = Integer.MIN_VALUE;
118
    int maxLevel= Integer.MIN_VALUE;
119
    int maxSize = Integer.MIN_VALUE;
120

    
121
    for(RubikObjectList object: RubikObjectList.values())
122
      {
123
      objects[i] = object;
124
      i++;
125
      num = object.mObjectSizes.length;
126
      mNumAll += num;
127
      if( num> maxNum ) maxNum = num;
128

    
129
      for(int j=0; j<num; j++)
130
        {
131
        if( object.mMaxLevels[j] > maxLevel ) maxLevel = object.mMaxLevels[j];
132
        if( object.mObjectSizes[j] > maxSize) maxSize  = object.mObjectSizes[j];
133
        }
134
      }
135

    
136
    MAX_NUM_OBJECTS = maxNum;
137
    MAX_LEVEL       = maxLevel;
138
    MAX_OBJECT_SIZE = maxSize;
139
    }
140

    
141
///////////////////////////////////////////////////////////////////////////////////////////////////
142

    
143
  private static void setUpColAndRow()
144
    {
145
    mIndices = new int[NUM_OBJECTS];
146
    mColCount= 0;
147

    
148
    for(int obj=0; obj<NUM_OBJECTS; obj++)
149
      {
150
      mIndices[obj] = objects[obj].mColumn;
151
      if( mIndices[obj]>=mColCount ) mColCount = mIndices[obj]+1;
152
      }
153

    
154
    mRowCount = 0;
155

    
156
    for(int col=0; col<mColCount; col++)
157
      {
158
      int numObjects = computeNumObjectsInColumn(col);
159
      if( numObjects>mRowCount ) mRowCount = numObjects;
160
      }
161
    }
162

    
163
///////////////////////////////////////////////////////////////////////////////////////////////////
164

    
165
  private static int computeNumObjectsInColumn(int column)
166
    {
167
    int num=0;
168

    
169
    for(int object=0; object<NUM_OBJECTS; object++)
170
      {
171
      if( objects[object].mColumn == column )
172
        {
173
        num += objects[object].mNumSizes;
174
        }
175
      }
176

    
177
    return num;
178
    }
179

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

    
182
  public static int getColumnCount()
183
    {
184
    if( mIndices==null ) setUpColAndRow();
185

    
186
    return mColCount;
187
    }
188

    
189
///////////////////////////////////////////////////////////////////////////////////////////////////
190

    
191
  public static int getRowCount()
192
    {
193
    if( mIndices==null ) setUpColAndRow();
194

    
195
    return mRowCount;
196
    }
197

    
198
///////////////////////////////////////////////////////////////////////////////////////////////////
199

    
200
  public static int[] getIndices()
201
    {
202
    if( mIndices==null ) setUpColAndRow();
203

    
204
    return mIndices;
205
    }
206

    
207
///////////////////////////////////////////////////////////////////////////////////////////////////
208

    
209
  public static RubikObjectList getObject(int ordinal)
210
    {
211
    return ordinal>=0 && ordinal<NUM_OBJECTS ? objects[ordinal] : CUBE;
212
    }
213

    
214
///////////////////////////////////////////////////////////////////////////////////////////////////
215

    
216
  public static int pack(int object, int sizeIndex)
217
    {
218
    int ret = 0;
219
    for(int i=0; i<object; i++) ret += objects[i].mObjectSizes.length;
220

    
221
    return ret+sizeIndex;
222
    }
223

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

    
226
  public static int unpackSizeIndex(int number)
227
    {
228
    int num;
229

    
230
    for(int i=0; i<NUM_OBJECTS; i++)
231
      {
232
      num = objects[i].mObjectSizes.length;
233
      if( number<num ) return number;
234
      number -= num;
235
      }
236

    
237
    return -1;
238
    }
239

    
240
///////////////////////////////////////////////////////////////////////////////////////////////////
241

    
242
  public static int unpackObject(int number)
243
    {
244
    int num;
245

    
246
    for(int i=0; i<NUM_OBJECTS; i++)
247
      {
248
      num = objects[i].mObjectSizes.length;
249
      if( number<num ) return i;
250
      number -= num;
251
      }
252

    
253
    return -1;
254
    }
255

    
256
///////////////////////////////////////////////////////////////////////////////////////////////////
257

    
258
  public static int unpackObjectFromString(String obj)
259
    {
260
    int u = obj.indexOf('_');
261
    int l = obj.length();
262

    
263
    if( u>0 )
264
      {
265
      String name = obj.substring(0,u);
266
      int size = Integer.parseInt( obj.substring(u+1,l) );
267

    
268
      for(int i=0; i<NUM_OBJECTS; i++)
269
        {
270
        if( objects[i].name().equals(name) )
271
          {
272
          int sizeIndex = getSizeIndex(i,size);
273
          return pack(i,sizeIndex);
274
          }
275
        }
276
      }
277

    
278
    return -1;
279
    }
280

    
281
///////////////////////////////////////////////////////////////////////////////////////////////////
282

    
283
  public static String getObjectList()
284
    {
285
    String name;
286
    StringBuilder list = new StringBuilder();
287
    int len;
288
    int[] sizes;
289

    
290
    for(int i=0; i<NUM_OBJECTS; i++)
291
      {
292
      sizes = objects[i].mObjectSizes;
293
      len   = sizes.length;
294
      name  = objects[i].name();
295

    
296
      for(int j=0; j<len; j++)
297
        {
298
        if( i>0 || j>0 ) list.append(',');
299
        list.append(name);
300
        list.append('_');
301
        list.append(sizes[j]);
302
        }
303
      }
304

    
305
    return list.toString();
306
    }
307

    
308
///////////////////////////////////////////////////////////////////////////////////////////////////
309

    
310
  public static int getTotal()
311
    {
312
    return mNumAll;
313
    }
314

    
315
///////////////////////////////////////////////////////////////////////////////////////////////////
316

    
317
  public static int getMaxLevel(int ordinal, int sizeIndex)
318
    {
319
    if( ordinal>=0 && ordinal<NUM_OBJECTS )
320
      {
321
      int num = objects[ordinal].mObjectSizes.length;
322
      return sizeIndex>=0 && sizeIndex<num ? objects[ordinal].mMaxLevels[sizeIndex] : 0;
323
      }
324

    
325
    return 0;
326
    }
327

    
328
///////////////////////////////////////////////////////////////////////////////////////////////////
329

    
330
  public static int getOrdinal(String name)
331
    {
332
    for(int i=0; i<NUM_OBJECTS; i++)
333
      {
334
      if(objects[i].name().equals(name)) return i;
335
      }
336

    
337
    return -1;
338
    }
339

    
340
///////////////////////////////////////////////////////////////////////////////////////////////////
341

    
342
  public static int getSizeIndex(int ordinal, int size)
343
    {
344
    if( ordinal>=0 && ordinal<NUM_OBJECTS )
345
      {
346
      int[] sizes = objects[ordinal].getSizes();
347
      int len = sizes.length;
348

    
349
      for(int i=0; i<len; i++)
350
        {
351
        if( sizes[i]==size ) return i;
352
        }
353
      }
354

    
355
    return -1;
356
    }
357

    
358
///////////////////////////////////////////////////////////////////////////////////////////////////
359

    
360
  public static int[] retFaceColors(RubikObjectList object)
361
    {
362
    Field field;
363
    int[] faceColors=null;
364

    
365
    try
366
      {
367
      field = object.mObjectClass.getDeclaredField("FACE_COLORS");
368
      field.setAccessible(true);
369
      Object obj = field.get(null);
370
      faceColors = (int[]) obj;
371
      }
372
    catch(NoSuchFieldException ex)
373
      {
374
      android.util.Log.e("RubikObjectList", object.mObjectClass.getSimpleName()+": no such field exception getting field: "+ex.getMessage());
375
      }
376
    catch(IllegalAccessException ex)
377
      {
378
      android.util.Log.e("RubikObjectList", object.mObjectClass.getSimpleName()+": illegal access exception getting field: "+ex.getMessage());
379
      }
380

    
381
    return faceColors;
382
    }
383

    
384
///////////////////////////////////////////////////////////////////////////////////////////////////
385

    
386
  RubikObjectList(int[][] info, Class<? extends RubikObject> object , RubikMovement movement, int column)
387
    {
388
    mNumSizes = info.length;
389

    
390
    mObjectSizes  = new int[mNumSizes];
391
    mMaxLevels    = new int[mNumSizes];
392
    mResourceIDs  = new int[mNumSizes];
393
    mSmallIconIDs = new int[mNumSizes];
394
    mMediumIconIDs= new int[mNumSizes];
395
    mBigIconIDs   = new int[mNumSizes];
396
    mHugeIconIDs  = new int[mNumSizes];
397

    
398
    for(int i=0; i<mNumSizes; i++)
399
      {
400
      mObjectSizes[i]  = info[i][0];
401
      mMaxLevels[i]    = info[i][1];
402
      mResourceIDs[i]  = info[i][2];
403
      mSmallIconIDs[i] = info[i][3];
404
      mMediumIconIDs[i]= info[i][4];
405
      mBigIconIDs[i]   = info[i][5];
406
      mHugeIconIDs[i]  = info[i][6];
407
      }
408

    
409
    mObjectClass         = object;
410
    mObjectMovementClass = movement;
411
    mColumn              = column;
412
    }
413

    
414
///////////////////////////////////////////////////////////////////////////////////////////////////
415

    
416
  public int[] getSizes()
417
    {
418
    return mObjectSizes;
419
    }
420

    
421
///////////////////////////////////////////////////////////////////////////////////////////////////
422

    
423
  public int[] getMaxLevels()
424
    {
425
    return mMaxLevels;
426
    }
427

    
428
///////////////////////////////////////////////////////////////////////////////////////////////////
429

    
430
  public int[] getIconIDs()
431
    {
432
    int size = RubikActivity.getDrawableSize();
433

    
434
    switch(size)
435
      {
436
      case 0 : return mSmallIconIDs;
437
      case 1 : return mMediumIconIDs;
438
      case 2 : return mBigIconIDs;
439
      default: return mHugeIconIDs;
440
      }
441
    }
442

    
443
///////////////////////////////////////////////////////////////////////////////////////////////////
444

    
445
  public int[] getResourceIDs()
446
    {
447
    return mResourceIDs;
448
    }
449

    
450
///////////////////////////////////////////////////////////////////////////////////////////////////
451

    
452
  public int getNumVariants()
453
    {
454
    return mObjectSizes.length;
455
    }
456

    
457
///////////////////////////////////////////////////////////////////////////////////////////////////
458

    
459
  public RubikObject create(int size, Static4D quat, int[][] moves, Resources res, int scrWidth)
460
    {
461
    DistortedTexture texture = new DistortedTexture();
462
    DistortedEffects effects = new DistortedEffects();
463
    MeshSquare mesh          = new MeshSquare(20,20);   // mesh of the node, not of the cubits
464

    
465
    switch(ordinal())
466
      {
467
      case 0: return new RubikCube      (size, quat, texture, mesh, effects, moves, res, scrWidth);
468
      case 1: return new RubikPyraminx  (size, quat, texture, mesh, effects, moves, res, scrWidth);
469
      case 2: return new RubikDino6     (size, quat, texture, mesh, effects, moves, res, scrWidth);
470
      case 3: return new RubikDino4     (size, quat, texture, mesh, effects, moves, res, scrWidth);
471
      case 4: return new RubikSkewb     (size, quat, texture, mesh, effects, moves, res, scrWidth);
472
      case 5: return new RubikHelicopter(size, quat, texture, mesh, effects, moves, res, scrWidth);
473
      }
474

    
475
    return null;
476
    }
477

    
478
///////////////////////////////////////////////////////////////////////////////////////////////////
479

    
480
  public RubikMovement getObjectMovementClass()
481
    {
482
    return mObjectMovementClass;
483
    }
484
  }
(14-14/16)