Project

General

Profile

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

magiccube / src / main / java / org / distorted / objects / RubikObjectList.java @ 4c6cbfa2

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