Project

General

Profile

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

magiccube / src / main / java / org / distorted / objects / RubikObjectList.java @ 50a82b23

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