Project

General

Profile

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

magiccube / src / main / java / org / distorted / objects / ObjectList.java @ b3da2f16

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.skewb, 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

    
116
  public static final int NUM_OBJECTS = values().length;
117
  public static final int MAX_NUM_OBJECTS;
118
  public static final int MAX_LEVEL;
119
  public static final int MAX_OBJECT_SIZE;
120

    
121
  private final int[] mObjectSizes, mMaxLevels, mSmallIconIDs, mMediumIconIDs, mBigIconIDs, mHugeIconIDs, mResourceIDs;
122
  private final Class<? extends TwistyObject> mObjectClass;
123
  private final Movement mObjectMovementClass;
124
  private final int mColumn, mNumSizes;
125

    
126
  private static final ObjectList[] objects;
127
  private static int mNumAll;
128
  private static int[] mIndices;
129
  private static int mColCount, mRowCount;
130

    
131
  static
132
    {
133
    mNumAll = 0;
134
    int num, i = 0;
135
    objects = new ObjectList[NUM_OBJECTS];
136
    int maxNum  = Integer.MIN_VALUE;
137
    int maxLevel= Integer.MIN_VALUE;
138
    int maxSize = Integer.MIN_VALUE;
139

    
140
    for(ObjectList object: ObjectList.values())
141
      {
142
      objects[i] = object;
143
      i++;
144
      num = object.mObjectSizes.length;
145
      mNumAll += num;
146
      if( num> maxNum ) maxNum = num;
147

    
148
      for(int j=0; j<num; j++)
149
        {
150
        if( object.mMaxLevels[j] > maxLevel ) maxLevel = object.mMaxLevels[j];
151
        if( object.mObjectSizes[j] > maxSize) maxSize  = object.mObjectSizes[j];
152
        }
153
      }
154

    
155
    MAX_NUM_OBJECTS = maxNum;
156
    MAX_LEVEL       = maxLevel;
157
    MAX_OBJECT_SIZE = maxSize;
158
    }
159

    
160
///////////////////////////////////////////////////////////////////////////////////////////////////
161

    
162
  private static void setUpColAndRow()
163
    {
164
    mIndices = new int[NUM_OBJECTS];
165
    mColCount= 0;
166

    
167
    for(int obj=0; obj<NUM_OBJECTS; obj++)
168
      {
169
      mIndices[obj] = objects[obj].mColumn;
170
      if( mIndices[obj]>=mColCount ) mColCount = mIndices[obj]+1;
171
      }
172

    
173
    mRowCount = 0;
174

    
175
    for(int col=0; col<mColCount; col++)
176
      {
177
      int numObjects = computeNumObjectsInColumn(col);
178
      if( numObjects>mRowCount ) mRowCount = numObjects;
179
      }
180
    }
181

    
182
///////////////////////////////////////////////////////////////////////////////////////////////////
183

    
184
  private static int computeNumObjectsInColumn(int column)
185
    {
186
    int num=0;
187

    
188
    for(int object=0; object<NUM_OBJECTS; object++)
189
      {
190
      if( objects[object].mColumn == column )
191
        {
192
        num += objects[object].mNumSizes;
193
        }
194
      }
195

    
196
    return num;
197
    }
198

    
199
///////////////////////////////////////////////////////////////////////////////////////////////////
200

    
201
  public static int getColumnCount()
202
    {
203
    if( mIndices==null ) setUpColAndRow();
204

    
205
    return mColCount;
206
    }
207

    
208
///////////////////////////////////////////////////////////////////////////////////////////////////
209

    
210
  public static int getRowCount()
211
    {
212
    if( mIndices==null ) setUpColAndRow();
213

    
214
    return mRowCount;
215
    }
216

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

    
219
  public static int[] getIndices()
220
    {
221
    if( mIndices==null ) setUpColAndRow();
222

    
223
    return mIndices;
224
    }
225

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

    
228
  public static ObjectList getObject(int ordinal)
229
    {
230
    return ordinal>=0 && ordinal<NUM_OBJECTS ? objects[ordinal] : CUBE;
231
    }
232

    
233
///////////////////////////////////////////////////////////////////////////////////////////////////
234

    
235
  public static int pack(int object, int sizeIndex)
236
    {
237
    int ret = 0;
238
    for(int i=0; i<object; i++) ret += objects[i].mObjectSizes.length;
239

    
240
    return ret+sizeIndex;
241
    }
242

    
243
///////////////////////////////////////////////////////////////////////////////////////////////////
244

    
245
  public static int unpackSizeIndex(int number)
246
    {
247
    int num;
248

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

    
256
    return -1;
257
    }
258

    
259
///////////////////////////////////////////////////////////////////////////////////////////////////
260

    
261
  public static int unpackObject(int number)
262
    {
263
    int num;
264

    
265
    for(int i=0; i<NUM_OBJECTS; i++)
266
      {
267
      num = objects[i].mObjectSizes.length;
268
      if( number<num ) return i;
269
      number -= num;
270
      }
271

    
272
    return -1;
273
    }
274

    
275
///////////////////////////////////////////////////////////////////////////////////////////////////
276

    
277
  public static int unpackObjectFromString(String obj)
278
    {
279
    int u = obj.indexOf('_');
280
    int l = obj.length();
281

    
282
    if( u>0 )
283
      {
284
      String name = obj.substring(0,u);
285
      int size = Integer.parseInt( obj.substring(u+1,l) );
286

    
287
      for(int i=0; i<NUM_OBJECTS; i++)
288
        {
289
        if( objects[i].name().equals(name) )
290
          {
291
          int sizeIndex = getSizeIndex(i,size);
292
          return pack(i,sizeIndex);
293
          }
294
        }
295
      }
296

    
297
    return -1;
298
    }
299

    
300
///////////////////////////////////////////////////////////////////////////////////////////////////
301

    
302
  public static String getObjectList()
303
    {
304
    String name;
305
    StringBuilder list = new StringBuilder();
306
    int len;
307
    int[] sizes;
308

    
309
    for(int i=0; i<NUM_OBJECTS; i++)
310
      {
311
      sizes = objects[i].mObjectSizes;
312
      len   = sizes.length;
313
      name  = objects[i].name();
314

    
315
      for(int j=0; j<len; j++)
316
        {
317
        if( i>0 || j>0 ) list.append(',');
318
        list.append(name);
319
        list.append('_');
320
        list.append(sizes[j]);
321
        }
322
      }
323

    
324
    return list.toString();
325
    }
326

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

    
329
  public static int getTotal()
330
    {
331
    return mNumAll;
332
    }
333

    
334
///////////////////////////////////////////////////////////////////////////////////////////////////
335

    
336
  public static int getMaxLevel(int ordinal, int sizeIndex)
337
    {
338
    if( ordinal>=0 && ordinal<NUM_OBJECTS )
339
      {
340
      int num = objects[ordinal].mObjectSizes.length;
341
      return sizeIndex>=0 && sizeIndex<num ? objects[ordinal].mMaxLevels[sizeIndex] : 0;
342
      }
343

    
344
    return 0;
345
    }
346

    
347
///////////////////////////////////////////////////////////////////////////////////////////////////
348

    
349
  public static int getOrdinal(String name)
350
    {
351
    for(int i=0; i<NUM_OBJECTS; i++)
352
      {
353
      if(objects[i].name().equals(name)) return i;
354
      }
355

    
356
    return -1;
357
    }
358

    
359
///////////////////////////////////////////////////////////////////////////////////////////////////
360

    
361
  public static int getSizeIndex(int ordinal, int size)
362
    {
363
    if( ordinal>=0 && ordinal<NUM_OBJECTS )
364
      {
365
      int[] sizes = objects[ordinal].getSizes();
366
      int len = sizes.length;
367

    
368
      for(int i=0; i<len; i++)
369
        {
370
        if( sizes[i]==size ) return i;
371
        }
372
      }
373

    
374
    return -1;
375
    }
376

    
377
///////////////////////////////////////////////////////////////////////////////////////////////////
378

    
379
  public static int[] retFaceColors(ObjectList object)
380
    {
381
    Field field;
382
    int[] faceColors=null;
383

    
384
    try
385
      {
386
      field = object.mObjectClass.getDeclaredField("FACE_COLORS");
387
      field.setAccessible(true);
388
      Object obj = field.get(null);
389
      faceColors = (int[]) obj;
390
      }
391
    catch(NoSuchFieldException ex)
392
      {
393
      android.util.Log.e("RubikObjectList", object.mObjectClass.getSimpleName()+": no such field exception getting field: "+ex.getMessage());
394
      }
395
    catch(IllegalAccessException ex)
396
      {
397
      android.util.Log.e("RubikObjectList", object.mObjectClass.getSimpleName()+": illegal access exception getting field: "+ex.getMessage());
398
      }
399

    
400
    return faceColors;
401
    }
402

    
403
///////////////////////////////////////////////////////////////////////////////////////////////////
404

    
405
  ObjectList(int[][] info, Class<? extends TwistyObject> object , Movement movement, int column)
406
    {
407
    mNumSizes = info.length;
408

    
409
    mObjectSizes  = new int[mNumSizes];
410
    mMaxLevels    = new int[mNumSizes];
411
    mResourceIDs  = new int[mNumSizes];
412
    mSmallIconIDs = new int[mNumSizes];
413
    mMediumIconIDs= new int[mNumSizes];
414
    mBigIconIDs   = new int[mNumSizes];
415
    mHugeIconIDs  = new int[mNumSizes];
416

    
417
    for(int i=0; i<mNumSizes; i++)
418
      {
419
      mObjectSizes[i]  = info[i][0];
420
      mMaxLevels[i]    = info[i][1];
421
      mResourceIDs[i]  = info[i][2];
422
      mSmallIconIDs[i] = info[i][3];
423
      mMediumIconIDs[i]= info[i][4];
424
      mBigIconIDs[i]   = info[i][5];
425
      mHugeIconIDs[i]  = info[i][6];
426
      }
427

    
428
    mObjectClass         = object;
429
    mObjectMovementClass = movement;
430
    mColumn              = column;
431
    }
432

    
433
///////////////////////////////////////////////////////////////////////////////////////////////////
434

    
435
  public int[] getSizes()
436
    {
437
    return mObjectSizes;
438
    }
439

    
440
///////////////////////////////////////////////////////////////////////////////////////////////////
441

    
442
  public int[] getMaxLevels()
443
    {
444
    return mMaxLevels;
445
    }
446

    
447
///////////////////////////////////////////////////////////////////////////////////////////////////
448

    
449
  public int[] getIconIDs()
450
    {
451
    int size = RubikActivity.getDrawableSize();
452

    
453
    switch(size)
454
      {
455
      case 0 : return mSmallIconIDs;
456
      case 1 : return mMediumIconIDs;
457
      case 2 : return mBigIconIDs;
458
      default: return mHugeIconIDs;
459
      }
460
    }
461

    
462
///////////////////////////////////////////////////////////////////////////////////////////////////
463

    
464
  public int[] getResourceIDs()
465
    {
466
    return mResourceIDs;
467
    }
468

    
469
///////////////////////////////////////////////////////////////////////////////////////////////////
470

    
471
  public int getNumVariants()
472
    {
473
    return mObjectSizes.length;
474
    }
475

    
476
///////////////////////////////////////////////////////////////////////////////////////////////////
477

    
478
  public TwistyObject create(int size, Static4D quat, int[][] moves, Resources res, int scrWidth)
479
    {
480
    DistortedTexture texture = new DistortedTexture();
481
    DistortedEffects effects = new DistortedEffects();
482
    MeshSquare mesh          = new MeshSquare(20,20);   // mesh of the node, not of the cubits
483

    
484
    switch(ordinal())
485
      {
486
      case 0: return new TwistyCube      (size, quat, texture, mesh, effects, moves, res, scrWidth);
487
      case 1: return new TwistyPyraminx  (size, quat, texture, mesh, effects, moves, res, scrWidth);
488
      case 2: return new TwistyDiamond   (size, quat, texture, mesh, effects, moves, res, scrWidth);
489
      case 3: return new TwistyDino6     (size, quat, texture, mesh, effects, moves, res, scrWidth);
490
      case 4: return new TwistyDino4     (size, quat, texture, mesh, effects, moves, res, scrWidth);
491
      case 5: return new TwistyRedi      (size, quat, texture, mesh, effects, moves, res, scrWidth);
492
      case 6: return new TwistyHelicopter(size, quat, texture, mesh, effects, moves, res, scrWidth);
493
      case 7: return new TwistySkewb     (size, quat, texture, mesh, effects, moves, res, scrWidth);
494
      }
495

    
496
    return null;
497
    }
498

    
499
///////////////////////////////////////////////////////////////////////////////////////////////////
500

    
501
  public Movement getObjectMovementClass()
502
    {
503
    return mObjectMovementClass;
504
    }
505
  }
(12-12/22)