Project

General

Profile

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

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

1 27a70eae Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
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 1f9772f3 Leszek Koltunski
package org.distorted.objects;
21 27a70eae Leszek Koltunski
22 ccf9fec5 Leszek Koltunski
import android.content.res.Resources;
23
24 27a70eae Leszek Koltunski
import org.distorted.library.main.DistortedEffects;
25
import org.distorted.library.main.DistortedTexture;
26 97c012ae Leszek Koltunski
import org.distorted.library.mesh.MeshRectangles;
27 27a70eae Leszek Koltunski
import org.distorted.library.type.Static4D;
28 1f9772f3 Leszek Koltunski
import org.distorted.main.R;
29 f6a9c538 Leszek Koltunski
import org.distorted.main.RubikActivity;
30 27a70eae Leszek Koltunski
31 20931cf6 Leszek Koltunski
import java.lang.reflect.Field;
32
33 27a70eae Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
34
35
public enum RubikObjectList
36
  {
37 4c0cd600 Leszek Koltunski
  CUBE (
38
         new int[][] {
39 31a9f38d Leszek Koltunski
                       {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 4c0cd600 Leszek Koltunski
                     },
44 20931cf6 Leszek Koltunski
         RubikCube.class,
45 ad38d800 Leszek Koltunski
         new RubikMovementCube()
46 4c0cd600 Leszek Koltunski
       ),
47
48
  PYRA (
49
         new int[][] {
50 31a9f38d Leszek Koltunski
                       {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} ,
51
                       {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} ,
52
                       {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}
53 4c0cd600 Leszek Koltunski
                     },
54 20931cf6 Leszek Koltunski
         RubikPyraminx.class,
55 ad38d800 Leszek Koltunski
         new RubikMovementPyraminx()
56 4c0cd600 Leszek Koltunski
       ),
57 418aa554 Leszek Koltunski
58
  DINO (
59
         new int[][] {
60 2c699055 Leszek Koltunski
                       {3 , 10, R.raw.pyra3, R.drawable.ui_small_dino, R.drawable.ui_medium_dino, R.drawable.ui_big_dino, R.drawable.ui_huge_dino} ,
61 418aa554 Leszek Koltunski
                     },
62
         RubikDino.class,
63 ad38d800 Leszek Koltunski
         new RubikMovementDino()
64 418aa554 Leszek Koltunski
       ),
65 27a70eae Leszek Koltunski
  ;
66
67 4888e97c Leszek Koltunski
  public static final int NUM_OBJECTS = values().length;
68 8cccfb10 Leszek Koltunski
  public static final int MAX_NUM_OBJECTS;
69 8e3898c8 Leszek Koltunski
  public static final int MAX_LEVEL;
70 8cccfb10 Leszek Koltunski
  public static final int MAX_OBJECT_SIZE;
71 4888e97c Leszek Koltunski
72 31a9f38d Leszek Koltunski
  private final int[] mObjectSizes, mMaxLevels, mSmallIconIDs, mMediumIconIDs, mBigIconIDs, mHugeIconIDs, mResourceIDs;
73 20931cf6 Leszek Koltunski
  private final Class<? extends RubikObject> mObjectClass;
74 ad38d800 Leszek Koltunski
  private final RubikMovementObject mObjectMovementClass;
75 27a70eae Leszek Koltunski
  private static final RubikObjectList[] objects;
76 4888e97c Leszek Koltunski
  private static int mNumAll;
77 27a70eae Leszek Koltunski
78
  static
79
    {
80 4888e97c Leszek Koltunski
    mNumAll = 0;
81 8cccfb10 Leszek Koltunski
    int num, i = 0;
82 4888e97c Leszek Koltunski
    objects = new RubikObjectList[NUM_OBJECTS];
83 8cccfb10 Leszek Koltunski
    int maxNum  = Integer.MIN_VALUE;
84
    int maxLevel= Integer.MIN_VALUE;
85
    int maxSize = Integer.MIN_VALUE;
86 27a70eae Leszek Koltunski
87 4888e97c Leszek Koltunski
    for(RubikObjectList object: RubikObjectList.values())
88 27a70eae Leszek Koltunski
      {
89 4888e97c Leszek Koltunski
      objects[i] = object;
90 27a70eae Leszek Koltunski
      i++;
91 8cccfb10 Leszek Koltunski
      num = object.mObjectSizes.length;
92
      mNumAll += num;
93
      if( num> maxNum ) maxNum = num;
94 8e3898c8 Leszek Koltunski
95 8cccfb10 Leszek Koltunski
      for(int j=0; j<num; j++)
96 8e3898c8 Leszek Koltunski
        {
97
        if( object.mMaxLevels[j] > maxLevel ) maxLevel = object.mMaxLevels[j];
98 8cccfb10 Leszek Koltunski
        if( object.mObjectSizes[j] > maxSize) maxSize  = object.mObjectSizes[j];
99 8e3898c8 Leszek Koltunski
        }
100 27a70eae Leszek Koltunski
      }
101 4888e97c Leszek Koltunski
102 8cccfb10 Leszek Koltunski
    MAX_NUM_OBJECTS = maxNum;
103
    MAX_LEVEL       = maxLevel;
104
    MAX_OBJECT_SIZE = maxSize;
105 27a70eae Leszek Koltunski
    }
106
107
///////////////////////////////////////////////////////////////////////////////////////////////////
108
109
  public static RubikObjectList getObject(int ordinal)
110
    {
111 7ec268b1 Leszek Koltunski
    return ordinal>=0 && ordinal<NUM_OBJECTS ? objects[ordinal] : CUBE;
112 27a70eae Leszek Koltunski
    }
113
114
///////////////////////////////////////////////////////////////////////////////////////////////////
115
116 b498f3f6 Leszek Koltunski
  public static int pack(int object, int sizeIndex)
117 4888e97c Leszek Koltunski
    {
118
    int ret = 0;
119
    for(int i=0; i<object; i++) ret += objects[i].mObjectSizes.length;
120
121 b498f3f6 Leszek Koltunski
    return ret+sizeIndex;
122 4888e97c Leszek Koltunski
    }
123
124
///////////////////////////////////////////////////////////////////////////////////////////////////
125
126 8e3898c8 Leszek Koltunski
  public static int unpackSizeIndex(int number)
127 4888e97c Leszek Koltunski
    {
128
    int num;
129
130
    for(int i=0; i<NUM_OBJECTS; i++)
131
      {
132
      num = objects[i].mObjectSizes.length;
133
      if( number<num ) return number;
134
      number -= num;
135
      }
136
137
    return -1;
138
    }
139
140
///////////////////////////////////////////////////////////////////////////////////////////////////
141
142
  public static int unpackObject(int number)
143 27a70eae Leszek Koltunski
    {
144 4888e97c Leszek Koltunski
    int num;
145
146
    for(int i=0; i<NUM_OBJECTS; i++)
147
      {
148
      num = objects[i].mObjectSizes.length;
149
      if( number<num ) return i;
150
      number -= num;
151
      }
152
153
    return -1;
154
    }
155
156 286d73ae Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
157
158
  public static int unpackObjectFromString(String obj)
159
    {
160
    int u = obj.indexOf('_');
161
    int l = obj.length();
162
163
    if( u>0 )
164
      {
165
      String name = obj.substring(0,u);
166
      int size = Integer.parseInt( obj.substring(u+1,l) );
167
168
      for(int i=0; i<NUM_OBJECTS; i++)
169
        {
170
        if( objects[i].name().equals(name) )
171
          {
172 53f23b64 Leszek Koltunski
          int sizeIndex = getSizeIndex(i,size);
173
          return pack(i,sizeIndex);
174 286d73ae Leszek Koltunski
          }
175
        }
176
      }
177
178
    return -1;
179
    }
180
181
///////////////////////////////////////////////////////////////////////////////////////////////////
182
183
  public static String getObjectList()
184
    {
185
    String name;
186
    StringBuilder list = new StringBuilder();
187
    int len;
188
    int[] sizes;
189
190
    for(int i=0; i<NUM_OBJECTS; i++)
191
      {
192
      sizes = objects[i].mObjectSizes;
193
      len   = sizes.length;
194
      name  = objects[i].name();
195
196
      for(int j=0; j<len; j++)
197
        {
198
        if( i>0 || j>0 ) list.append(',');
199
        list.append(name);
200
        list.append('_');
201
        list.append(sizes[j]);
202
        }
203
      }
204
205
    return list.toString();
206
    }
207
208 4888e97c Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
209
210
  public static int getTotal()
211
    {
212
    return mNumAll;
213
    }
214
215 8e3898c8 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
216
217
  public static int getMaxLevel(int ordinal, int sizeIndex)
218
    {
219
    if( ordinal>=0 && ordinal<NUM_OBJECTS )
220
      {
221
      int num = objects[ordinal].mObjectSizes.length;
222
      return sizeIndex>=0 && sizeIndex<num ? objects[ordinal].mMaxLevels[sizeIndex] : 0;
223
      }
224
225
    return 0;
226
    }
227
228 c86f9f1f Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
229
230
  public static int getOrdinal(String name)
231
    {
232
    for(int i=0; i<NUM_OBJECTS; i++)
233
      {
234
      if(objects[i].name().equals(name)) return i;
235
      }
236
237
    return -1;
238
    }
239
240
///////////////////////////////////////////////////////////////////////////////////////////////////
241
242 53f23b64 Leszek Koltunski
  public static int getSizeIndex(int ordinal, int size)
243 c86f9f1f Leszek Koltunski
    {
244 7ec268b1 Leszek Koltunski
    if( ordinal>=0 && ordinal<NUM_OBJECTS )
245 c86f9f1f Leszek Koltunski
      {
246 7ec268b1 Leszek Koltunski
      int[] sizes = objects[ordinal].getSizes();
247
      int len = sizes.length;
248
249
      for(int i=0; i<len; i++)
250
        {
251
        if( sizes[i]==size ) return i;
252
        }
253 c86f9f1f Leszek Koltunski
      }
254
255
    return -1;
256
    }
257
258 4888e97c Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
259
260 20931cf6 Leszek Koltunski
  public static int[] retFaceColors(RubikObjectList object)
261
    {
262
    Field field;
263
    int[] faceColors=null;
264
265
    try
266
      {
267
      field = object.mObjectClass.getDeclaredField("FACE_COLORS");
268
      field.setAccessible(true);
269
      Object obj = field.get(null);
270
      faceColors = (int[]) obj;
271
      }
272
    catch(NoSuchFieldException ex)
273
      {
274
      android.util.Log.e("RubikObjectList", object.mObjectClass.getSimpleName()+": no such field exception getting field: "+ex.getMessage());
275
      }
276
    catch(IllegalAccessException ex)
277
      {
278
      android.util.Log.e("RubikObjectList", object.mObjectClass.getSimpleName()+": illegal access exception getting field: "+ex.getMessage());
279
      }
280
281
    return faceColors;
282
    }
283
284
///////////////////////////////////////////////////////////////////////////////////////////////////
285
286 ad38d800 Leszek Koltunski
  RubikObjectList(int[][] info, Class<? extends RubikObject> object , RubikMovementObject movement)
287 4888e97c Leszek Koltunski
    {
288 ea6ee91b Leszek Koltunski
    int length = info.length;
289
290 f6a9c538 Leszek Koltunski
    mObjectSizes  = new int[length];
291
    mMaxLevels    = new int[length];
292
    mResourceIDs  = new int[length];
293
    mSmallIconIDs = new int[length];
294
    mMediumIconIDs= new int[length];
295
    mBigIconIDs   = new int[length];
296 31a9f38d Leszek Koltunski
    mHugeIconIDs  = new int[length];
297 ea6ee91b Leszek Koltunski
298
    for(int i=0; i<length; i++)
299
      {
300 f6a9c538 Leszek Koltunski
      mObjectSizes[i]  = info[i][0];
301
      mMaxLevels[i]    = info[i][1];
302
      mResourceIDs[i]  = info[i][2];
303
      mSmallIconIDs[i] = info[i][3];
304
      mMediumIconIDs[i]= info[i][4];
305
      mBigIconIDs[i]   = info[i][5];
306 31a9f38d Leszek Koltunski
      mHugeIconIDs[i]  = info[i][6];
307 ea6ee91b Leszek Koltunski
      }
308
309 20931cf6 Leszek Koltunski
    mObjectClass         = object;
310 27a70eae Leszek Koltunski
    mObjectMovementClass = movement;
311
    }
312
313
///////////////////////////////////////////////////////////////////////////////////////////////////
314
315 8e3898c8 Leszek Koltunski
  public int[] getSizes()
316 27a70eae Leszek Koltunski
    {
317 8e3898c8 Leszek Koltunski
    return mObjectSizes;
318 27a70eae Leszek Koltunski
    }
319
320
///////////////////////////////////////////////////////////////////////////////////////////////////
321
322 8e3898c8 Leszek Koltunski
  public int[] getMaxLevels()
323 4888e97c Leszek Koltunski
    {
324 8e3898c8 Leszek Koltunski
    return mMaxLevels;
325
    }
326
327
///////////////////////////////////////////////////////////////////////////////////////////////////
328
329
  public int[] getIconIDs()
330
    {
331 f6a9c538 Leszek Koltunski
    int size = RubikActivity.getDrawableSize();
332
333
    switch(size)
334
      {
335
      case 0 : return mSmallIconIDs;
336
      case 1 : return mMediumIconIDs;
337 31a9f38d Leszek Koltunski
      case 2 : return mBigIconIDs;
338
      default: return mHugeIconIDs;
339 f6a9c538 Leszek Koltunski
      }
340 4888e97c Leszek Koltunski
    }
341
342
///////////////////////////////////////////////////////////////////////////////////////////////////
343
344 ccf9fec5 Leszek Koltunski
  public int[] getResourceIDs()
345
    {
346
    return mResourceIDs;
347
    }
348
349 fbca0033 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
350
351
  public int getNumVariants()
352
    {
353
    return mObjectSizes.length;
354
    }
355
356 ccf9fec5 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
357
358 5b893eee Leszek Koltunski
  public RubikObject create(int size, Static4D quat, int[][] moves, Resources res, int scrWidth)
359 27a70eae Leszek Koltunski
    {
360 5974d2ae Leszek Koltunski
    DistortedTexture texture = new DistortedTexture();
361 36273130 Leszek Koltunski
    DistortedEffects effects = new DistortedEffects();
362 b32444ee Leszek Koltunski
    MeshRectangles mesh      = new MeshRectangles(20,20);   // mesh of the node, not of the cubits
363 74686c71 Leszek Koltunski
364 4888e97c Leszek Koltunski
    switch(ordinal())
365
      {
366 5b893eee Leszek Koltunski
      case 0: return new RubikCube    (size, quat, texture, mesh, effects, moves, res, scrWidth);
367
      case 1: return new RubikPyraminx(size, quat, texture, mesh, effects, moves, res, scrWidth);
368 418aa554 Leszek Koltunski
      case 2: return new RubikDino    (size, quat, texture, mesh, effects, moves, res, scrWidth);
369 4888e97c Leszek Koltunski
      }
370
371
    return null;
372 27a70eae Leszek Koltunski
    }
373
374
///////////////////////////////////////////////////////////////////////////////////////////////////
375
376 ad38d800 Leszek Koltunski
  public RubikMovementObject getObjectMovementClass()
377 27a70eae Leszek Koltunski
    {
378 4888e97c Leszek Koltunski
    return mObjectMovementClass;
379 27a70eae Leszek Koltunski
    }
380
  }