Project

General

Profile

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

magiccube / src / main / java / org / distorted / objects / RubikObjectList.java @ 475cbfe7

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
         RubikDino.class,
65
         new RubikMovementDino(),
66
         2
67
       ),
68

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

    
78
  HELI (
79
         new int[][] {
80
                       {3 , 18, R.raw.skewb, R.drawable.ui_small_heli, R.drawable.ui_medium_heli, R.drawable.ui_big_heli, R.drawable.ui_huge_heli} ,
81
                     },
82
         RubikHelicopter.class,
83
         new RubikMovementHelicopter(),
84
         2
85
       ),
86
  ;
87

    
88
  public static final int NUM_OBJECTS = values().length;
89
  public static final int MAX_NUM_OBJECTS;
90
  public static final int MAX_LEVEL;
91
  public static final int MAX_OBJECT_SIZE;
92

    
93
  private final int[] mObjectSizes, mMaxLevels, mSmallIconIDs, mMediumIconIDs, mBigIconIDs, mHugeIconIDs, mResourceIDs;
94
  private final Class<? extends RubikObject> mObjectClass;
95
  private final RubikMovement mObjectMovementClass;
96
  private final int mColumn, mNumSizes;
97

    
98
  private static final RubikObjectList[] objects;
99
  private static int mNumAll;
100
  private static int[] mIndices;
101
  private static int mColCount, mRowCount;
102

    
103
  static
104
    {
105
    mNumAll = 0;
106
    int num, i = 0;
107
    objects = new RubikObjectList[NUM_OBJECTS];
108
    int maxNum  = Integer.MIN_VALUE;
109
    int maxLevel= Integer.MIN_VALUE;
110
    int maxSize = Integer.MIN_VALUE;
111

    
112
    for(RubikObjectList object: RubikObjectList.values())
113
      {
114
      objects[i] = object;
115
      i++;
116
      num = object.mObjectSizes.length;
117
      mNumAll += num;
118
      if( num> maxNum ) maxNum = num;
119

    
120
      for(int j=0; j<num; j++)
121
        {
122
        if( object.mMaxLevels[j] > maxLevel ) maxLevel = object.mMaxLevels[j];
123
        if( object.mObjectSizes[j] > maxSize) maxSize  = object.mObjectSizes[j];
124
        }
125
      }
126

    
127
    MAX_NUM_OBJECTS = maxNum;
128
    MAX_LEVEL       = maxLevel;
129
    MAX_OBJECT_SIZE = maxSize;
130
    }
131

    
132
///////////////////////////////////////////////////////////////////////////////////////////////////
133

    
134
  private static void setUpColAndRow()
135
    {
136
    mIndices = new int[NUM_OBJECTS];
137
    mColCount= 0;
138

    
139
    for(int obj=0; obj<NUM_OBJECTS; obj++)
140
      {
141
      mIndices[obj] = objects[obj].mColumn;
142
      if( mIndices[obj]>=mColCount ) mColCount = mIndices[obj]+1;
143
      }
144

    
145
    mRowCount = 0;
146

    
147
    for(int col=0; col<mColCount; col++)
148
      {
149
      int numObjects = computeNumObjectsInColumn(col);
150
      if( numObjects>mRowCount ) mRowCount = numObjects;
151
      }
152
    }
153

    
154
///////////////////////////////////////////////////////////////////////////////////////////////////
155

    
156
  private static int computeNumObjectsInColumn(int column)
157
    {
158
    int num=0;
159

    
160
    for(int object=0; object<NUM_OBJECTS; object++)
161
      {
162
      if( objects[object].mColumn == column )
163
        {
164
        num += objects[object].mNumSizes;
165
        }
166
      }
167

    
168
    return num;
169
    }
170

    
171
///////////////////////////////////////////////////////////////////////////////////////////////////
172

    
173
  public static int getColumnCount()
174
    {
175
    if( mIndices==null ) setUpColAndRow();
176

    
177
    return mColCount;
178
    }
179

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

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

    
186
    return mRowCount;
187
    }
188

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

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

    
195
    return mIndices;
196
    }
197

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

    
200
  public static RubikObjectList getObject(int ordinal)
201
    {
202
    return ordinal>=0 && ordinal<NUM_OBJECTS ? objects[ordinal] : CUBE;
203
    }
204

    
205
///////////////////////////////////////////////////////////////////////////////////////////////////
206

    
207
  public static int pack(int object, int sizeIndex)
208
    {
209
    int ret = 0;
210
    for(int i=0; i<object; i++) ret += objects[i].mObjectSizes.length;
211

    
212
    return ret+sizeIndex;
213
    }
214

    
215
///////////////////////////////////////////////////////////////////////////////////////////////////
216

    
217
  public static int unpackSizeIndex(int number)
218
    {
219
    int num;
220

    
221
    for(int i=0; i<NUM_OBJECTS; i++)
222
      {
223
      num = objects[i].mObjectSizes.length;
224
      if( number<num ) return number;
225
      number -= num;
226
      }
227

    
228
    return -1;
229
    }
230

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

    
233
  public static int unpackObject(int number)
234
    {
235
    int num;
236

    
237
    for(int i=0; i<NUM_OBJECTS; i++)
238
      {
239
      num = objects[i].mObjectSizes.length;
240
      if( number<num ) return i;
241
      number -= num;
242
      }
243

    
244
    return -1;
245
    }
246

    
247
///////////////////////////////////////////////////////////////////////////////////////////////////
248

    
249
  public static int unpackObjectFromString(String obj)
250
    {
251
    int u = obj.indexOf('_');
252
    int l = obj.length();
253

    
254
    if( u>0 )
255
      {
256
      String name = obj.substring(0,u);
257
      int size = Integer.parseInt( obj.substring(u+1,l) );
258

    
259
      for(int i=0; i<NUM_OBJECTS; i++)
260
        {
261
        if( objects[i].name().equals(name) )
262
          {
263
          int sizeIndex = getSizeIndex(i,size);
264
          return pack(i,sizeIndex);
265
          }
266
        }
267
      }
268

    
269
    return -1;
270
    }
271

    
272
///////////////////////////////////////////////////////////////////////////////////////////////////
273

    
274
  public static String getObjectList()
275
    {
276
    String name;
277
    StringBuilder list = new StringBuilder();
278
    int len;
279
    int[] sizes;
280

    
281
    for(int i=0; i<NUM_OBJECTS; i++)
282
      {
283
      sizes = objects[i].mObjectSizes;
284
      len   = sizes.length;
285
      name  = objects[i].name();
286

    
287
      for(int j=0; j<len; j++)
288
        {
289
        if( i>0 || j>0 ) list.append(',');
290
        list.append(name);
291
        list.append('_');
292
        list.append(sizes[j]);
293
        }
294
      }
295

    
296
    return list.toString();
297
    }
298

    
299
///////////////////////////////////////////////////////////////////////////////////////////////////
300

    
301
  public static int getTotal()
302
    {
303
    return mNumAll;
304
    }
305

    
306
///////////////////////////////////////////////////////////////////////////////////////////////////
307

    
308
  public static int getMaxLevel(int ordinal, int sizeIndex)
309
    {
310
    if( ordinal>=0 && ordinal<NUM_OBJECTS )
311
      {
312
      int num = objects[ordinal].mObjectSizes.length;
313
      return sizeIndex>=0 && sizeIndex<num ? objects[ordinal].mMaxLevels[sizeIndex] : 0;
314
      }
315

    
316
    return 0;
317
    }
318

    
319
///////////////////////////////////////////////////////////////////////////////////////////////////
320

    
321
  public static int getOrdinal(String name)
322
    {
323
    for(int i=0; i<NUM_OBJECTS; i++)
324
      {
325
      if(objects[i].name().equals(name)) return i;
326
      }
327

    
328
    return -1;
329
    }
330

    
331
///////////////////////////////////////////////////////////////////////////////////////////////////
332

    
333
  public static int getSizeIndex(int ordinal, int size)
334
    {
335
    if( ordinal>=0 && ordinal<NUM_OBJECTS )
336
      {
337
      int[] sizes = objects[ordinal].getSizes();
338
      int len = sizes.length;
339

    
340
      for(int i=0; i<len; i++)
341
        {
342
        if( sizes[i]==size ) return i;
343
        }
344
      }
345

    
346
    return -1;
347
    }
348

    
349
///////////////////////////////////////////////////////////////////////////////////////////////////
350

    
351
  public static int[] retFaceColors(RubikObjectList object)
352
    {
353
    Field field;
354
    int[] faceColors=null;
355

    
356
    try
357
      {
358
      field = object.mObjectClass.getDeclaredField("FACE_COLORS");
359
      field.setAccessible(true);
360
      Object obj = field.get(null);
361
      faceColors = (int[]) obj;
362
      }
363
    catch(NoSuchFieldException ex)
364
      {
365
      android.util.Log.e("RubikObjectList", object.mObjectClass.getSimpleName()+": no such field exception getting field: "+ex.getMessage());
366
      }
367
    catch(IllegalAccessException ex)
368
      {
369
      android.util.Log.e("RubikObjectList", object.mObjectClass.getSimpleName()+": illegal access exception getting field: "+ex.getMessage());
370
      }
371

    
372
    return faceColors;
373
    }
374

    
375
///////////////////////////////////////////////////////////////////////////////////////////////////
376

    
377
  RubikObjectList(int[][] info, Class<? extends RubikObject> object , RubikMovement movement, int column)
378
    {
379
    mNumSizes = info.length;
380

    
381
    mObjectSizes  = new int[mNumSizes];
382
    mMaxLevels    = new int[mNumSizes];
383
    mResourceIDs  = new int[mNumSizes];
384
    mSmallIconIDs = new int[mNumSizes];
385
    mMediumIconIDs= new int[mNumSizes];
386
    mBigIconIDs   = new int[mNumSizes];
387
    mHugeIconIDs  = new int[mNumSizes];
388

    
389
    for(int i=0; i<mNumSizes; i++)
390
      {
391
      mObjectSizes[i]  = info[i][0];
392
      mMaxLevels[i]    = info[i][1];
393
      mResourceIDs[i]  = info[i][2];
394
      mSmallIconIDs[i] = info[i][3];
395
      mMediumIconIDs[i]= info[i][4];
396
      mBigIconIDs[i]   = info[i][5];
397
      mHugeIconIDs[i]  = info[i][6];
398
      }
399

    
400
    mObjectClass         = object;
401
    mObjectMovementClass = movement;
402
    mColumn              = column;
403
    }
404

    
405
///////////////////////////////////////////////////////////////////////////////////////////////////
406

    
407
  public int[] getSizes()
408
    {
409
    return mObjectSizes;
410
    }
411

    
412
///////////////////////////////////////////////////////////////////////////////////////////////////
413

    
414
  public int[] getMaxLevels()
415
    {
416
    return mMaxLevels;
417
    }
418

    
419
///////////////////////////////////////////////////////////////////////////////////////////////////
420

    
421
  public int[] getIconIDs()
422
    {
423
    int size = RubikActivity.getDrawableSize();
424

    
425
    switch(size)
426
      {
427
      case 0 : return mSmallIconIDs;
428
      case 1 : return mMediumIconIDs;
429
      case 2 : return mBigIconIDs;
430
      default: return mHugeIconIDs;
431
      }
432
    }
433

    
434
///////////////////////////////////////////////////////////////////////////////////////////////////
435

    
436
  public int[] getResourceIDs()
437
    {
438
    return mResourceIDs;
439
    }
440

    
441
///////////////////////////////////////////////////////////////////////////////////////////////////
442

    
443
  public int getNumVariants()
444
    {
445
    return mObjectSizes.length;
446
    }
447

    
448
///////////////////////////////////////////////////////////////////////////////////////////////////
449

    
450
  public RubikObject create(int size, Static4D quat, int[][] moves, Resources res, int scrWidth)
451
    {
452
    DistortedTexture texture = new DistortedTexture();
453
    DistortedEffects effects = new DistortedEffects();
454
    MeshSquare mesh          = new MeshSquare(20,20);   // mesh of the node, not of the cubits
455

    
456
    switch(ordinal())
457
      {
458
      case 0: return new RubikCube      (size, quat, texture, mesh, effects, moves, res, scrWidth);
459
      case 1: return new RubikPyraminx  (size, quat, texture, mesh, effects, moves, res, scrWidth);
460
      case 2: return new RubikDino      (size, quat, texture, mesh, effects, moves, res, scrWidth);
461
      case 3: return new RubikSkewb     (size, quat, texture, mesh, effects, moves, res, scrWidth);
462
      case 4: return new RubikHelicopter(size, quat, texture, mesh, effects, moves, res, scrWidth);
463
      }
464

    
465
    return null;
466
    }
467

    
468
///////////////////////////////////////////////////////////////////////////////////////////////////
469

    
470
  public RubikMovement getObjectMovementClass()
471
    {
472
    return mObjectMovementClass;
473
    }
474
  }
(12-12/14)