Project

General

Profile

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

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

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
  SKEW (
88
         new int[][] {
89
                       {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} ,
90
                     },
91
         TwistySkewb.class,
92
         new MovementSkewb(),
93
         2
94
       ),
95

    
96
  REDI (
97
         new int[][] {
98
                       {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} ,
99
                     },
100
         TwistyRedi.class,
101
         new MovementRedi(),
102
         2
103
       ),
104

    
105
  HELI (
106
         new int[][] {
107
                       {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} ,
108
                     },
109
         TwistyHelicopter.class,
110
         new MovementHelicopter(),
111
         3
112
       ),
113
  ;
114

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

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

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

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

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

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

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

    
159
///////////////////////////////////////////////////////////////////////////////////////////////////
160

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

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

    
172
    mRowCount = 0;
173

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

    
181
///////////////////////////////////////////////////////////////////////////////////////////////////
182

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

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

    
195
    return num;
196
    }
197

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

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

    
204
    return mColCount;
205
    }
206

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

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

    
213
    return mRowCount;
214
    }
215

    
216
///////////////////////////////////////////////////////////////////////////////////////////////////
217

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

    
222
    return mIndices;
223
    }
224

    
225
///////////////////////////////////////////////////////////////////////////////////////////////////
226

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

    
232
///////////////////////////////////////////////////////////////////////////////////////////////////
233

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

    
239
    return ret+sizeIndex;
240
    }
241

    
242
///////////////////////////////////////////////////////////////////////////////////////////////////
243

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

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

    
255
    return -1;
256
    }
257

    
258
///////////////////////////////////////////////////////////////////////////////////////////////////
259

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

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

    
271
    return -1;
272
    }
273

    
274
///////////////////////////////////////////////////////////////////////////////////////////////////
275

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

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

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

    
296
    return -1;
297
    }
298

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

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

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

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

    
323
    return list.toString();
324
    }
325

    
326
///////////////////////////////////////////////////////////////////////////////////////////////////
327

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

    
333
///////////////////////////////////////////////////////////////////////////////////////////////////
334

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

    
343
    return 0;
344
    }
345

    
346
///////////////////////////////////////////////////////////////////////////////////////////////////
347

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

    
355
    return -1;
356
    }
357

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

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

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

    
373
    return -1;
374
    }
375

    
376
///////////////////////////////////////////////////////////////////////////////////////////////////
377

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

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

    
399
    return faceColors;
400
    }
401

    
402
///////////////////////////////////////////////////////////////////////////////////////////////////
403

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

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

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

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

    
432
///////////////////////////////////////////////////////////////////////////////////////////////////
433

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

    
439
///////////////////////////////////////////////////////////////////////////////////////////////////
440

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

    
446
///////////////////////////////////////////////////////////////////////////////////////////////////
447

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

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

    
461
///////////////////////////////////////////////////////////////////////////////////////////////////
462

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

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

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

    
475
///////////////////////////////////////////////////////////////////////////////////////////////////
476

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

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

    
495
    return null;
496
    }
497

    
498
///////////////////////////////////////////////////////////////////////////////////////////////////
499

    
500
  public Movement getObjectMovementClass()
501
    {
502
    return mObjectMovementClass;
503
    }
504
  }
(11-11/21)