Project

General

Profile

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

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

1 a7d8c3cd Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2021 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6 f05e0259 Leszek Koltunski
// Magic Cube is proprietary software licensed under an EULA which you should have received      //
7
// along with the code. If not, check https://distorted.org/magic/License-Magic-Cube.html        //
8 a7d8c3cd Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
9
10
package org.distorted.objects;
11
12 804293f0 Leszek Koltunski
import java.util.ArrayList;
13 5e048300 Leszek Koltunski
import java.util.Locale;
14 804293f0 Leszek Koltunski
15 81493402 Leszek Koltunski
import android.content.Context;
16 400ff34d Leszek Koltunski
import android.content.SharedPreferences;
17
18 81493402 Leszek Koltunski
import org.distorted.external.RubikFiles;
19 05c044a5 Leszek Koltunski
import org.distorted.external.RubikScores;
20 eb9263dd leszek
import org.distorted.objectlib.metadata.ListObjects;
21 a7d8c3cd Leszek Koltunski
22 eb9263dd leszek
import static org.distorted.objectlib.metadata.ListObjects.NUM_OBJECTS;
23 a7d8c3cd Leszek Koltunski
24
///////////////////////////////////////////////////////////////////////////////////////////////////
25
26
public class RubikObjectList
27
{
28 7bb30586 leszek
  public static final boolean SHOW_DOWNLOADED_DEBUG = false;
29
  public static final boolean SHOW_IAP_DEBUG        = false;
30
  public static final boolean USE_IAP               = false;
31
32 506f7ceb Leszek Koltunski
  private static RubikObjectList mThis;
33 a7d8c3cd Leszek Koltunski
  private static int mNumObjects;
34 fcf7320f Leszek Koltunski
  private static int mNumExtras;
35 a7d8c3cd Leszek Koltunski
  private static ArrayList<RubikObject> mObjects;
36
37 314e9ff0 Leszek Koltunski
  public static class DownloadedObject
38 506f7ceb Leszek Koltunski
    {
39
    String shortName;
40 e9e744f7 Leszek Koltunski
    boolean icon,object,extras;
41 0effd5a9 leszek
    int numScrambles, objectVersion, extrasVersion, price;
42 506f7ceb Leszek Koltunski
43 0effd5a9 leszek
    DownloadedObject(String sName, int scrambles, int pr, int oVersion, int eVersion, boolean i, boolean o, boolean e)
44 506f7ceb Leszek Koltunski
      {
45 0effd5a9 leszek
      shortName     = sName;
46
      numScrambles  = scrambles;
47
      price         = pr;
48
      objectVersion = oVersion;
49
      extrasVersion = eVersion;
50 84d746d7 Leszek Koltunski
51 506f7ceb Leszek Koltunski
      icon   = i;
52
      object = o;
53
      extras = e;
54
      }
55
    }
56
57
  private static ArrayList<DownloadedObject> mDownloadedObjects;
58 e9e744f7 Leszek Koltunski
  private static String mBoughtObjects;
59
60 a7d8c3cd Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
61
62
  private RubikObjectList()
63
    {
64 e9e744f7 Leszek Koltunski
    mNumObjects        = 0;
65
    mNumExtras         = 0;
66 506f7ceb Leszek Koltunski
    mObjects           = new ArrayList<>();
67
    mDownloadedObjects = new ArrayList<>();
68 a7d8c3cd Leszek Koltunski
69
    createBuiltinObjects();
70
    }
71
72 fa18f764 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
73
74
  private static boolean allObjectsUnlocked()
75
    {
76
    return mBoughtObjects!=null       &&
77
           mBoughtObjects.length()>0  &&
78
           mBoughtObjects.charAt(0)=='*';
79
    }
80
81 a7d8c3cd Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
82
83
  private void createBuiltinObjects()
84
    {
85
    for(int i=0; i<NUM_OBJECTS; i++)
86
      {
87 c9f87559 leszek
      ListObjects lo = ListObjects.getObject(i);
88 804293f0 Leszek Koltunski
89 c9f87559 leszek
      if( lo.isEnabled() )
90 84d746d7 Leszek Koltunski
        {
91 c9f87559 leszek
        RubikObject obj = new RubikObject(lo);
92
        mObjects.add(obj);
93
        mNumObjects++;
94
95
        if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "creating local object "+lo.name() );
96
97
        if( obj.hasExtras() )
98
          {
99
          if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "has extras "+mNumExtras );
100
101
          obj.setExtrasOrdinal(mNumExtras);
102
          mNumExtras++;
103
          }
104
        else
105
          {
106
          if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "no extras");
107
          }
108 804293f0 Leszek Koltunski
        }
109 a7d8c3cd Leszek Koltunski
      }
110
    }
111
112 506f7ceb Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
113
114 84d746d7 Leszek Koltunski
  private static boolean internalAddDownloadedObject(DownloadedObject object)
115 506f7ceb Leszek Koltunski
    {
116 314e9ff0 Leszek Koltunski
    String name = object.shortName;
117
118
    for(RubikObject ro : mObjects )
119 84d746d7 Leszek Koltunski
      if( ro.getLowerName().equals(name) )
120 314e9ff0 Leszek Koltunski
        {
121 84d746d7 Leszek Koltunski
        return ro.updateObject(object);
122 314e9ff0 Leszek Koltunski
        }
123
124 84d746d7 Leszek Koltunski
    RubikObject obj = new RubikObject(object);
125
    mObjects.add(obj);
126
    mNumObjects++;
127 6142069a Leszek Koltunski
128 fa18f764 Leszek Koltunski
    if( USE_IAP && !obj.isFree() && allObjectsUnlocked() )
129
      {
130
      if( SHOW_IAP_DEBUG ) android.util.Log.e("D", "everything unlocked, so setting downloaded object free: "+obj.getUpperName() );
131
      obj.markFree();
132
      }
133
134 e847c553 Leszek Koltunski
    if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "creating downloaded object "+obj.getUpperName() );
135 84d746d7 Leszek Koltunski
136
    if( obj.hasExtras() )
137 314e9ff0 Leszek Koltunski
      {
138 e847c553 Leszek Koltunski
      if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "has extras "+mNumExtras );
139 506f7ceb Leszek Koltunski
140 84d746d7 Leszek Koltunski
      obj.setExtrasOrdinal(mNumExtras);
141
      mNumExtras++;
142
      }
143
    else
144
      {
145 e847c553 Leszek Koltunski
      if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "no extras");
146 314e9ff0 Leszek Koltunski
      }
147 84d746d7 Leszek Koltunski
148
    return true;
149 506f7ceb Leszek Koltunski
    }
150
151 6142069a Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
152 05c044a5 Leszek Koltunski
153 6142069a Leszek Koltunski
  private static void restoreFreedObjects(SharedPreferences preferences)
154
    {
155 e9e744f7 Leszek Koltunski
    mBoughtObjects = preferences.getString("rol_bought", "");
156 6142069a Leszek Koltunski
157 82c02259 Leszek Koltunski
    if( SHOW_IAP_DEBUG )
158 6142069a Leszek Koltunski
      {
159 e9e744f7 Leszek Koltunski
      android.util.Log.e("D", "bought objects: "+mBoughtObjects);
160 6142069a Leszek Koltunski
      }
161
162 e9e744f7 Leszek Koltunski
    if( mBoughtObjects.length()>0 )
163 6142069a Leszek Koltunski
      {
164 e9e744f7 Leszek Koltunski
      if( mBoughtObjects.charAt(0)=='*' )
165 6142069a Leszek Koltunski
        {
166
        for(int i=0; i<mNumObjects; i++)
167
          {
168
          RubikObject o = mObjects.get(i);
169 e9e744f7 Leszek Koltunski
          if( o!=null ) o.markFree();
170 6142069a Leszek Koltunski
          }
171
        }
172
      else
173
        {
174 e9e744f7 Leszek Koltunski
        String[] objs = mBoughtObjects.split(",");
175 6142069a Leszek Koltunski
176
        for( String obj : objs )
177
          {
178
          RubikObject o = getObject(obj);
179
          if( o!=null ) o.markFree();
180
          }
181
        }
182
      }
183
    }
184 05c044a5 Leszek Koltunski
185 a7d8c3cd Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
186
// PUBLIC API
187 806329e3 Leszek Koltunski
188 0effd5a9 leszek
  public static boolean addDownloadedObject(Context context, String shortName, int numScrambles, int price, int objectVersion,
189
                                         int extrasVersion, boolean icon, boolean object, boolean extras)
190 806329e3 Leszek Koltunski
    {
191 c89c3b1b Leszek Koltunski
    if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "New downloaded object "+shortName+" icon="+icon+" object="+object+" extras="+extras);
192
193 506f7ceb Leszek Koltunski
    for( DownloadedObject obj : mDownloadedObjects )
194
      {
195
      if( obj.shortName.equals(shortName) )
196
        {
197
        obj.icon  |= icon;
198
        obj.object|= object;
199
        obj.extras|= extras;
200
201 0effd5a9 leszek
        if( !obj.object ) objectVersion=-1;
202
        if( !obj.extras ) extrasVersion=-1;
203 c89c3b1b Leszek Koltunski
204 0effd5a9 leszek
        obj.objectVersion = objectVersion;
205
        obj.extrasVersion = extrasVersion;
206 c89c3b1b Leszek Koltunski
207
        if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "Updating downloaded object "+shortName+" icon="+obj.icon+" object="+obj.object+" extras="+obj.extras);
208 506f7ceb Leszek Koltunski
209 ac1900c3 Leszek Koltunski
        return false;
210 506f7ceb Leszek Koltunski
        }
211
      }
212
213 0effd5a9 leszek
    if( !object ) objectVersion=-1;
214
    if( !extras ) extrasVersion=-1;
215 c89c3b1b Leszek Koltunski
216 0effd5a9 leszek
    DownloadedObject obj = new DownloadedObject(shortName,numScrambles,price,objectVersion,extrasVersion,icon,object,extras);
217 c89c3b1b Leszek Koltunski
    if ( internalAddDownloadedObject(obj) )
218 84d746d7 Leszek Koltunski
      {
219 c89c3b1b Leszek Koltunski
      if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "Adding new downloaded object "+shortName+" icon="+obj.icon+" object="+obj.object+" extras="+obj.extras);
220
      mDownloadedObjects.add(obj);
221 ac1900c3 Leszek Koltunski
      return true;
222 84d746d7 Leszek Koltunski
      }
223 81493402 Leszek Koltunski
    else
224
      {
225
      if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "New downloaded object "+shortName+" is already built-in, deleting");
226
      RubikFiles files = RubikFiles.getInstance();
227
      files.deleteIcon(context,shortName);
228
      files.deleteJsonObject(context,shortName);
229
      files.deleteJsonExtras(context,shortName);
230 ac1900c3 Leszek Koltunski
      return false;
231 81493402 Leszek Koltunski
      }
232 806329e3 Leszek Koltunski
    }
233
234 24679c47 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
235
236
  public static boolean thereAreLockedObjects()
237
    {
238
    for(int i=0; i<mNumObjects; i++)
239
      {
240
      RubikObject o = mObjects.get(i);
241
      if( !o.isFree() ) return true;
242
      }
243
244
    return false;
245
    }
246
247 7480fbab Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
248
249 e9e744f7 Leszek Koltunski
  public static boolean objectAlreadyBought(RubikObject object)
250 7480fbab Leszek Koltunski
    {
251 e9e744f7 Leszek Koltunski
    return ( object!=null && object.isFree() );
252 7480fbab Leszek Koltunski
    }
253
254 9b763e1c Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
255 e9e744f7 Leszek Koltunski
// calling PurchaseScreenPane charges the user.
256 9b763e1c Leszek Koltunski
257
  public static void buyAll()
258
    {
259 e9e744f7 Leszek Koltunski
    mBoughtObjects = "*";
260 82c02259 Leszek Koltunski
    if( SHOW_IAP_DEBUG ) android.util.Log.e("D", "all objects marked as bought");
261 9b763e1c Leszek Koltunski
262
    for(int i=0; i<mNumObjects; i++)
263
      {
264
      RubikObject o = mObjects.get(i);
265
      o.markFree();
266
      }
267
    }
268
269
///////////////////////////////////////////////////////////////////////////////////////////////////
270 e9e744f7 Leszek Koltunski
// calling PurchaseScreenPane charges the user.
271 9b763e1c Leszek Koltunski
272 e9e744f7 Leszek Koltunski
  public static void buyObject(RubikObject object)
273 9b763e1c Leszek Koltunski
    {
274 e9e744f7 Leszek Koltunski
    if( object!=null && !object.isFree() )
275 9b763e1c Leszek Koltunski
      {
276 e9e744f7 Leszek Koltunski
      String shortName = object.getUpperName();
277 82c02259 Leszek Koltunski
      if( SHOW_IAP_DEBUG ) android.util.Log.e("D", "object "+shortName+" marked as bought");
278 e9e744f7 Leszek Koltunski
      object.markFree();
279
      String add = mBoughtObjects.length()==0 ? shortName : (","+shortName);
280
      mBoughtObjects += add;
281 9b763e1c Leszek Koltunski
      }
282
    }
283 05c044a5 Leszek Koltunski
284 400ff34d Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
285
286
  public static void savePreferences(SharedPreferences.Editor editor)
287
    {
288 506f7ceb Leszek Koltunski
    int numDownloaded = mDownloadedObjects.size();
289
290
    if( numDownloaded>0 )
291
      {
292
      StringBuilder downloadedObjects = new StringBuilder();
293
294
      for(int i=0; i<numDownloaded; i++)
295
        {
296
        if( i>0 ) downloadedObjects.append(',');
297
298
        DownloadedObject object = mDownloadedObjects.get(i);
299
        downloadedObjects.append(object.shortName);
300
        downloadedObjects.append(' ');
301 84d746d7 Leszek Koltunski
        downloadedObjects.append(object.numScrambles);
302
        downloadedObjects.append(' ');
303 0effd5a9 leszek
        downloadedObjects.append(object.objectVersion);
304 84d746d7 Leszek Koltunski
        downloadedObjects.append(' ');
305 0effd5a9 leszek
        downloadedObjects.append(object.extrasVersion);
306 84d746d7 Leszek Koltunski
        downloadedObjects.append(' ');
307 506f7ceb Leszek Koltunski
        downloadedObjects.append(object.icon   ? "1":"0");
308
        downloadedObjects.append(' ');
309
        downloadedObjects.append(object.object ? "1":"0");
310
        downloadedObjects.append(' ');
311
        downloadedObjects.append(object.extras ? "1":"0");
312 80f574a1 Leszek Koltunski
        downloadedObjects.append(' ');
313 e9e744f7 Leszek Koltunski
        downloadedObjects.append(object.price);
314 506f7ceb Leszek Koltunski
        }
315
316 84d746d7 Leszek Koltunski
      String objects = downloadedObjects.toString();
317 e847c553 Leszek Koltunski
      if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "saving: "+objects);
318 84d746d7 Leszek Koltunski
      editor.putString("rol_downloaded", objects );
319 506f7ceb Leszek Koltunski
      }
320 7e9139c1 Leszek Koltunski
    else
321
      {
322
      editor.putString("rol_downloaded", "" );
323
      }
324 6142069a Leszek Koltunski
325 fa18f764 Leszek Koltunski
    if( USE_IAP )
326 6142069a Leszek Koltunski
      {
327 e9e744f7 Leszek Koltunski
      editor.putString("rol_bought", mBoughtObjects);
328
329 82c02259 Leszek Koltunski
      if( SHOW_IAP_DEBUG )
330 e9e744f7 Leszek Koltunski
        {
331
        android.util.Log.e("D", "saving bought objects: "+mBoughtObjects);
332
        }
333 6142069a Leszek Koltunski
      }
334 400ff34d Leszek Koltunski
    }
335
336
///////////////////////////////////////////////////////////////////////////////////////////////////
337
338 7480fbab Leszek Koltunski
  public static void restorePreferences(Context context, SharedPreferences preferences, boolean justStarted)
339 400ff34d Leszek Koltunski
    {
340 526a5906 Leszek Koltunski
    if( mThis==null ) mThis = new RubikObjectList();
341
342 506f7ceb Leszek Koltunski
    String downloaded = preferences.getString("rol_downloaded","");
343
344 e847c553 Leszek Koltunski
    if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", downloaded);
345 506f7ceb Leszek Koltunski
346
    if( !downloaded.equals(""))
347
      {
348
      String[] dObjects = downloaded.split(",");
349
350
      for(String dObj : dObjects)
351
        {
352
        String[] parts = dObj.split(" ");
353 80f574a1 Leszek Koltunski
        int length = parts.length;
354 506f7ceb Leszek Koltunski
355 80f574a1 Leszek Koltunski
        if( length==7 || length==8 )
356 506f7ceb Leszek Koltunski
          {
357
          String name = parts[0];
358 84d746d7 Leszek Koltunski
          String scra = parts[1];
359 0effd5a9 leszek
          String objV = parts[2];
360
          String extV = parts[3];
361 84d746d7 Leszek Koltunski
          String icon = parts[4];
362
          String obje = parts[5];
363
          String extr = parts[6];
364 e9e744f7 Leszek Koltunski
365
          int price;
366
367
          if( length==7 ) price=0;
368
          else
369
            {
370
            char c = parts[7].charAt(0);
371
            if( c=='t' )      price = 0;
372 eb9263dd leszek
            else if( c=='f' ) price = ListObjects.DEFAULT_PRICE_OF_OLD_OBJECTS;
373 e9e744f7 Leszek Koltunski
            else              price = Integer.parseInt(parts[7]);
374
            }
375 84d746d7 Leszek Koltunski
376
          int scrambles = Integer.parseInt(scra);
377 0effd5a9 leszek
          int oVersion  = Integer.parseInt(objV);
378
          int eVersion  = Integer.parseInt(extV);
379 506f7ceb Leszek Koltunski
380
          boolean bIcon = icon.equals("1");
381
          boolean bObje = obje.equals("1");
382
          boolean bExtr = extr.equals("1");
383
384 0effd5a9 leszek
          addDownloadedObject(context,name,scrambles,price,oVersion,eVersion,bIcon,bObje,bExtr);
385 506f7ceb Leszek Koltunski
          }
386
        }
387
      }
388 d9d2c5fb Leszek Koltunski
389 fa18f764 Leszek Koltunski
    if( USE_IAP && justStarted ) restoreFreedObjects(preferences);
390 400ff34d Leszek Koltunski
    }
391
392 6142069a Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
393 05c044a5 Leszek Koltunski
394 e9e744f7 Leszek Koltunski
  public static void firstUpgradeMarkAllSolvedAsFree()
395 6142069a Leszek Koltunski
    {
396 e9e744f7 Leszek Koltunski
    RubikScores scores = RubikScores.getInstance();
397
    int numUnclaimed = scores.numberOfSolvedMAXes();
398 6142069a Leszek Koltunski
399
    if( numUnclaimed>0 )
400
      {
401 e9e744f7 Leszek Koltunski
      int marked = markAllSolvedAsFree(scores);
402 6142069a Leszek Koltunski
      int stillUnclaimed = numUnclaimed-marked;
403 e9e744f7 Leszek Koltunski
      if( stillUnclaimed>0) markObjectsAsFree(scores,stillUnclaimed);
404
      }
405
    }
406
407
///////////////////////////////////////////////////////////////////////////////////////////////////
408
409
  private static int markAllSolvedAsFree(RubikScores scores)
410
    {
411
    int numObjects = RubikObjectList.getNumObjects();
412
    int ret = 0;
413
414
    for(int obj=0; obj<numObjects; obj++)
415
      {
416
      RubikObject object = getObject(obj);
417
418 7bb30586 leszek
      if( object!=null && !object.isFree() && scores.isSolved(obj,RubikScores.LEVELS_SHOWN) )
419 e9e744f7 Leszek Koltunski
        {
420 43382be6 Leszek Koltunski
        markAsFree(object,scores);
421 e9e744f7 Leszek Koltunski
        ret++;
422
        }
423
      }
424
425
    return ret;
426
    }
427
428
///////////////////////////////////////////////////////////////////////////////////////////////////
429
430
  private static void markObjectsAsFree(RubikScores scores, int numToBeMarked)
431
    {
432
    int numObjects = RubikObjectList.getNumObjects();
433
434
    for(int obj=0; obj<numObjects && numToBeMarked>0; obj++)
435
      {
436
      RubikObject object = getObject(obj);
437
438
      if( object!=null && !object.isFree() )
439
        {
440 43382be6 Leszek Koltunski
        markAsFree(object,scores);
441 e9e744f7 Leszek Koltunski
        numToBeMarked--;
442
        }
443 6142069a Leszek Koltunski
      }
444
    }
445 05c044a5 Leszek Koltunski
446 43382be6 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
447
448
  private static void markAsFree(RubikObject object, RubikScores scores)
449
    {
450 9af27f9c Leszek Koltunski
    String shortName = object.getUpperName();
451 43382be6 Leszek Koltunski
    if( SHOW_IAP_DEBUG ) android.util.Log.e("D", "object "+object.getUpperName()+" marked as free");
452
    object.markFree();
453
    int price = object.getPrice();
454
    scores.changeNumStars(-price);
455 9af27f9c Leszek Koltunski
    String add = mBoughtObjects.length()==0 ? shortName : (","+shortName);
456
    mBoughtObjects += add;
457 43382be6 Leszek Koltunski
    }
458
459 d433b50e Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
460 a7d8c3cd Leszek Koltunski
461
  public static RubikObject getObject(int ordinal)
462
    {
463 506f7ceb Leszek Koltunski
    if( mThis==null ) mThis = new RubikObjectList();
464 a7d8c3cd Leszek Koltunski
    return ordinal>=0 && ordinal<mNumObjects ? mObjects.get(ordinal) : null;
465
    }
466
467 41a5dd89 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
468
469
  public static RubikObject getObject(String shortUpperName)
470
    {
471
    if( mThis==null ) mThis = new RubikObjectList();
472
473
    for(int i=0; i<mNumObjects; i++)
474
      {
475
      RubikObject object = mObjects.get(i);
476
      if( object.getUpperName().equals(shortUpperName) )
477
        {
478
        return object;
479
        }
480
      }
481
482
    return null;
483
    }
484
485 a7d8c3cd Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
486
487
  public static int getNumObjects()
488
    {
489 506f7ceb Leszek Koltunski
    if( mThis==null ) mThis = new RubikObjectList();
490 a7d8c3cd Leszek Koltunski
    return mNumObjects;
491
    }
492
493
///////////////////////////////////////////////////////////////////////////////////////////////////
494
495
  public static int getOrdinal(String name)
496
    {
497 506f7ceb Leszek Koltunski
    if( mThis==null ) mThis = new RubikObjectList();
498 a7d8c3cd Leszek Koltunski
499 5e048300 Leszek Koltunski
    String lowerName = name.toLowerCase(Locale.ENGLISH);
500 84d746d7 Leszek Koltunski
501 a7d8c3cd Leszek Koltunski
    for(int i=0; i<mNumObjects; i++)
502
      {
503
      RubikObject obj = mObjects.get(i);
504 84d746d7 Leszek Koltunski
      if( obj.getLowerName().equals(lowerName) ) return i;
505 a7d8c3cd Leszek Koltunski
      }
506
507
    return -1;
508
    }
509 804293f0 Leszek Koltunski
510 fcf7320f Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
511
512
  public static int getNumExtrasObjects()
513
    {
514
    return mNumExtras;
515
    }
516
517 804293f0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
518
519
  public static int getNumTutorialObjects()
520
    {
521 fcf7320f Leszek Koltunski
    return mNumExtras;
522 804293f0 Leszek Koltunski
    }
523
524
///////////////////////////////////////////////////////////////////////////////////////////////////
525
526 fcf7320f Leszek Koltunski
  public static int getObjectOrdinal(int extrasOrdinal)
527 804293f0 Leszek Koltunski
    {
528 fcf7320f Leszek Koltunski
    for(int i=extrasOrdinal; i<mNumObjects; i++)
529 804293f0 Leszek Koltunski
      {
530
      RubikObject object = getObject(i);
531 fcf7320f Leszek Koltunski
      int extOrd = object!=null ? object.getExtrasOrdinal() : -1;
532
      if( extOrd==extrasOrdinal ) return i;
533 804293f0 Leszek Koltunski
      }
534
535
    return -1;
536
    }
537
538 fcf7320f Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
539
540
  public static int getExtrasOrdinal(int objectOrdinal)
541
    {
542
    RubikObject object = getObject(objectOrdinal);
543
    return object!=null ? object.getExtrasOrdinal() : -1;
544
    }
545
546 804293f0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
547
548
  public static int getTutorialOrdinal(int objectOrdinal)
549
    {
550
    RubikObject object = getObject(objectOrdinal);
551 fcf7320f Leszek Koltunski
    return object!=null ? object.getExtrasOrdinal() : -1;
552
    }
553
554
///////////////////////////////////////////////////////////////////////////////////////////////////
555
556 0effd5a9 leszek
  public static int getLocalObjectVersion(int objectOrdinal)
557 fcf7320f Leszek Koltunski
    {
558
    RubikObject object = getObject(objectOrdinal);
559 0effd5a9 leszek
    return object!=null ? object.getObjectVersion() : -1;
560 fcf7320f Leszek Koltunski
    }
561
562
///////////////////////////////////////////////////////////////////////////////////////////////////
563
564 0effd5a9 leszek
  public static int getLocalExtrasVersion(int objectOrdinal)
565 fcf7320f Leszek Koltunski
    {
566
    RubikObject object = getObject(objectOrdinal);
567 0effd5a9 leszek
    return object!=null ? object.getExtrasVersion() : -1;
568 804293f0 Leszek Koltunski
    }
569 a7d8c3cd Leszek Koltunski
}