Project

General

Profile

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

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

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 ebaa194f LeszekKoltunski
import android.app.Activity;
16 81493402 Leszek Koltunski
import android.content.Context;
17 400ff34d Leszek Koltunski
import android.content.SharedPreferences;
18
19 7ff3cacb leszek
import org.distorted.helpers.RubikFiles;
20
import org.distorted.helpers.RubikScores;
21 eb9263dd leszek
import org.distorted.objectlib.metadata.ListObjects;
22 a7d8c3cd Leszek Koltunski
23 eb9263dd leszek
import static org.distorted.objectlib.metadata.ListObjects.NUM_OBJECTS;
24 a7d8c3cd Leszek Koltunski
25
///////////////////////////////////////////////////////////////////////////////////////////////////
26
27
public class RubikObjectList
28
{
29 7bb30586 leszek
  public static final boolean SHOW_DOWNLOADED_DEBUG = false;
30
  public static final boolean SHOW_IAP_DEBUG        = false;
31
  public static final boolean USE_IAP               = false;
32
33 506f7ceb Leszek Koltunski
  private static RubikObjectList mThis;
34 a7d8c3cd Leszek Koltunski
  private static int mNumObjects;
35 fcf7320f Leszek Koltunski
  private static int mNumExtras;
36 a7d8c3cd Leszek Koltunski
  private static ArrayList<RubikObject> mObjects;
37
38 314e9ff0 Leszek Koltunski
  public static class DownloadedObject
39 506f7ceb Leszek Koltunski
    {
40
    String shortName;
41 988e3d33 leszek
    boolean icon,object,extras,adjColors;
42 0effd5a9 leszek
    int numScrambles, objectVersion, extrasVersion, price;
43 ff4a2a13 leszek
    int category, year;
44
    float difficulty;
45
    String author;
46 506f7ceb Leszek Koltunski
47 ff4a2a13 leszek
    DownloadedObject(String sName, int scrambles, int pr, int oVersion, int eVersion, boolean i,
48 988e3d33 leszek
                     boolean o, boolean e, float diff, int cat, int y, String a, boolean c)
49 506f7ceb Leszek Koltunski
      {
50 0effd5a9 leszek
      shortName     = sName;
51
      numScrambles  = scrambles;
52
      price         = pr;
53
      objectVersion = oVersion;
54
      extrasVersion = eVersion;
55 ff4a2a13 leszek
      difficulty    = diff;
56
      category      = cat;
57
      year          = y;
58
      author        = a;
59 988e3d33 leszek
      adjColors     = c;
60 84d746d7 Leszek Koltunski
61 506f7ceb Leszek Koltunski
      icon   = i;
62
      object = o;
63
      extras = e;
64
      }
65
    }
66
67
  private static ArrayList<DownloadedObject> mDownloadedObjects;
68 e9e744f7 Leszek Koltunski
  private static String mBoughtObjects;
69
70 a7d8c3cd Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
71
72
  private RubikObjectList()
73
    {
74 e9e744f7 Leszek Koltunski
    mNumObjects        = 0;
75
    mNumExtras         = 0;
76 506f7ceb Leszek Koltunski
    mObjects           = new ArrayList<>();
77
    mDownloadedObjects = new ArrayList<>();
78 a7d8c3cd Leszek Koltunski
79
    createBuiltinObjects();
80
    }
81
82 fa18f764 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
83
84
  private static boolean allObjectsUnlocked()
85
    {
86 ebaa194f LeszekKoltunski
    return mBoughtObjects!=null && !mBoughtObjects.isEmpty() && mBoughtObjects.charAt(0)=='*';
87 fa18f764 Leszek Koltunski
    }
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 ebaa194f LeszekKoltunski
    if( !mBoughtObjects.isEmpty() )
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 988e3d33 leszek
                                         int extrasVersion, boolean icon, boolean object, boolean extras, float diff,
198
                                         int category, int year, String author, boolean adjColors)
199 806329e3 Leszek Koltunski
    {
200 c89c3b1b Leszek Koltunski
    if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "New downloaded object "+shortName+" icon="+icon+" object="+object+" extras="+extras);
201
202 506f7ceb Leszek Koltunski
    for( DownloadedObject obj : mDownloadedObjects )
203
      {
204
      if( obj.shortName.equals(shortName) )
205
        {
206
        obj.icon  |= icon;
207
        obj.object|= object;
208
        obj.extras|= extras;
209
210 0effd5a9 leszek
        if( !obj.object ) objectVersion=-1;
211
        if( !obj.extras ) extrasVersion=-1;
212 c89c3b1b Leszek Koltunski
213 0effd5a9 leszek
        obj.objectVersion = objectVersion;
214
        obj.extrasVersion = extrasVersion;
215 c89c3b1b Leszek Koltunski
216
        if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "Updating downloaded object "+shortName+" icon="+obj.icon+" object="+obj.object+" extras="+obj.extras);
217 506f7ceb Leszek Koltunski
218 ac1900c3 Leszek Koltunski
        return false;
219 506f7ceb Leszek Koltunski
        }
220
      }
221
222 0effd5a9 leszek
    if( !object ) objectVersion=-1;
223
    if( !extras ) extrasVersion=-1;
224 c89c3b1b Leszek Koltunski
225 988e3d33 leszek
    DownloadedObject obj = new DownloadedObject(shortName,numScrambles,price,objectVersion,extrasVersion,icon,object,extras,diff,category,year,author,adjColors);
226 c89c3b1b Leszek Koltunski
    if ( internalAddDownloadedObject(obj) )
227 84d746d7 Leszek Koltunski
      {
228 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);
229
      mDownloadedObjects.add(obj);
230 ac1900c3 Leszek Koltunski
      return true;
231 84d746d7 Leszek Koltunski
      }
232 81493402 Leszek Koltunski
    else
233
      {
234
      if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "New downloaded object "+shortName+" is already built-in, deleting");
235
      RubikFiles files = RubikFiles.getInstance();
236
      files.deleteIcon(context,shortName);
237
      files.deleteJsonObject(context,shortName);
238
      files.deleteJsonExtras(context,shortName);
239 ac1900c3 Leszek Koltunski
      return false;
240 81493402 Leszek Koltunski
      }
241 806329e3 Leszek Koltunski
    }
242
243 24679c47 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
244
245
  public static boolean thereAreLockedObjects()
246
    {
247
    for(int i=0; i<mNumObjects; i++)
248
      {
249
      RubikObject o = mObjects.get(i);
250
      if( !o.isFree() ) return true;
251
      }
252
253
    return false;
254
    }
255
256 7480fbab Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
257
258 e9e744f7 Leszek Koltunski
  public static boolean objectAlreadyBought(RubikObject object)
259 7480fbab Leszek Koltunski
    {
260 e9e744f7 Leszek Koltunski
    return ( object!=null && object.isFree() );
261 7480fbab Leszek Koltunski
    }
262
263 9b763e1c Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
264 e9e744f7 Leszek Koltunski
// calling PurchaseScreenPane charges the user.
265 9b763e1c Leszek Koltunski
266
  public static void buyAll()
267
    {
268 e9e744f7 Leszek Koltunski
    mBoughtObjects = "*";
269 82c02259 Leszek Koltunski
    if( SHOW_IAP_DEBUG ) android.util.Log.e("D", "all objects marked as bought");
270 9b763e1c Leszek Koltunski
271
    for(int i=0; i<mNumObjects; i++)
272
      {
273
      RubikObject o = mObjects.get(i);
274
      o.markFree();
275
      }
276
    }
277
278
///////////////////////////////////////////////////////////////////////////////////////////////////
279 e9e744f7 Leszek Koltunski
// calling PurchaseScreenPane charges the user.
280 9b763e1c Leszek Koltunski
281 e9e744f7 Leszek Koltunski
  public static void buyObject(RubikObject object)
282 9b763e1c Leszek Koltunski
    {
283 e9e744f7 Leszek Koltunski
    if( object!=null && !object.isFree() )
284 9b763e1c Leszek Koltunski
      {
285 e9e744f7 Leszek Koltunski
      String shortName = object.getUpperName();
286 82c02259 Leszek Koltunski
      if( SHOW_IAP_DEBUG ) android.util.Log.e("D", "object "+shortName+" marked as bought");
287 e9e744f7 Leszek Koltunski
      object.markFree();
288 ebaa194f LeszekKoltunski
      String add = mBoughtObjects.isEmpty() ? shortName : (","+shortName);
289 e9e744f7 Leszek Koltunski
      mBoughtObjects += add;
290 9b763e1c Leszek Koltunski
      }
291
    }
292 05c044a5 Leszek Koltunski
293 400ff34d Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
294
295
  public static void savePreferences(SharedPreferences.Editor editor)
296
    {
297 506f7ceb Leszek Koltunski
    int numDownloaded = mDownloadedObjects.size();
298
299
    if( numDownloaded>0 )
300
      {
301
      StringBuilder downloadedObjects = new StringBuilder();
302
303
      for(int i=0; i<numDownloaded; i++)
304
        {
305
        if( i>0 ) downloadedObjects.append(',');
306
307
        DownloadedObject object = mDownloadedObjects.get(i);
308
        downloadedObjects.append(object.shortName);
309
        downloadedObjects.append(' ');
310 84d746d7 Leszek Koltunski
        downloadedObjects.append(object.numScrambles);
311
        downloadedObjects.append(' ');
312 0effd5a9 leszek
        downloadedObjects.append(object.objectVersion);
313 84d746d7 Leszek Koltunski
        downloadedObjects.append(' ');
314 0effd5a9 leszek
        downloadedObjects.append(object.extrasVersion);
315 84d746d7 Leszek Koltunski
        downloadedObjects.append(' ');
316 506f7ceb Leszek Koltunski
        downloadedObjects.append(object.icon   ? "1":"0");
317
        downloadedObjects.append(' ');
318
        downloadedObjects.append(object.object ? "1":"0");
319
        downloadedObjects.append(' ');
320
        downloadedObjects.append(object.extras ? "1":"0");
321 80f574a1 Leszek Koltunski
        downloadedObjects.append(' ');
322 ff4a2a13 leszek
        downloadedObjects.append(object.difficulty);
323
        downloadedObjects.append(' ');
324
        downloadedObjects.append(object.category);
325
        downloadedObjects.append(' ');
326
        downloadedObjects.append(object.year);
327
        downloadedObjects.append(' ');
328 50a82b23 leszek
        downloadedObjects.append(object.author.replace(' ','_'));
329 ff4a2a13 leszek
        downloadedObjects.append(' ');
330 e9e744f7 Leszek Koltunski
        downloadedObjects.append(object.price);
331 988e3d33 leszek
        downloadedObjects.append(' ');
332
        downloadedObjects.append(object.adjColors ? "1":"0");
333 506f7ceb Leszek Koltunski
        }
334
335 84d746d7 Leszek Koltunski
      String objects = downloadedObjects.toString();
336 e847c553 Leszek Koltunski
      if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "saving: "+objects);
337 84d746d7 Leszek Koltunski
      editor.putString("rol_downloaded", objects );
338 506f7ceb Leszek Koltunski
      }
339 7e9139c1 Leszek Koltunski
    else
340
      {
341
      editor.putString("rol_downloaded", "" );
342
      }
343 6142069a Leszek Koltunski
344 fa18f764 Leszek Koltunski
    if( USE_IAP )
345 6142069a Leszek Koltunski
      {
346 e9e744f7 Leszek Koltunski
      editor.putString("rol_bought", mBoughtObjects);
347
348 82c02259 Leszek Koltunski
      if( SHOW_IAP_DEBUG )
349 e9e744f7 Leszek Koltunski
        {
350
        android.util.Log.e("D", "saving bought objects: "+mBoughtObjects);
351
        }
352 6142069a Leszek Koltunski
      }
353 400ff34d Leszek Koltunski
    }
354
355
///////////////////////////////////////////////////////////////////////////////////////////////////
356
357 7480fbab Leszek Koltunski
  public static void restorePreferences(Context context, SharedPreferences preferences, boolean justStarted)
358 400ff34d Leszek Koltunski
    {
359 526a5906 Leszek Koltunski
    if( mThis==null ) mThis = new RubikObjectList();
360
361 506f7ceb Leszek Koltunski
    String downloaded = preferences.getString("rol_downloaded","");
362
363 e847c553 Leszek Koltunski
    if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", downloaded);
364 506f7ceb Leszek Koltunski
365 ebaa194f LeszekKoltunski
    if( !downloaded.isEmpty() )
366 506f7ceb Leszek Koltunski
      {
367
      String[] dObjects = downloaded.split(",");
368
369
      for(String dObj : dObjects)
370
        {
371
        String[] parts = dObj.split(" ");
372 80f574a1 Leszek Koltunski
        int length = parts.length;
373 506f7ceb Leszek Koltunski
374 ff4a2a13 leszek
        if( length>=7 )
375 506f7ceb Leszek Koltunski
          {
376
          String name = parts[0];
377 84d746d7 Leszek Koltunski
          String scra = parts[1];
378 0effd5a9 leszek
          String objV = parts[2];
379
          String extV = parts[3];
380 84d746d7 Leszek Koltunski
          String icon = parts[4];
381
          String obje = parts[5];
382
          String extr = parts[6];
383 e9e744f7 Leszek Koltunski
384 ff4a2a13 leszek
          int price=0,category=0,year=0;
385 988e3d33 leszek
          boolean supportsAdjColors=true;
386 ff4a2a13 leszek
          float diff=0.0f;
387
          String author="";
388 e9e744f7 Leszek Koltunski
389 ff4a2a13 leszek
          if( length>=11 )
390
            {
391
            diff     = Float.parseFloat(parts[7]);
392
            category = Integer.parseInt(parts[8]);
393
            year     = Integer.parseInt(parts[9]);
394 50a82b23 leszek
            author   = parts[10].replace('_',' ');
395 ff4a2a13 leszek
            }
396
          if( length>=12 )
397 e9e744f7 Leszek Koltunski
            {
398 ff4a2a13 leszek
            char c = parts[11].charAt(0);
399 e9e744f7 Leszek Koltunski
            if( c=='t' )      price = 0;
400 eb9263dd leszek
            else if( c=='f' ) price = ListObjects.DEFAULT_PRICE_OF_OLD_OBJECTS;
401 50a82b23 leszek
            else              price = Integer.parseInt(parts[11]);
402 e9e744f7 Leszek Koltunski
            }
403 988e3d33 leszek
          if( length>=13 )
404
            {
405
            char s = parts[12].charAt(0);
406
            supportsAdjColors = (s=='1');
407
            }
408 84d746d7 Leszek Koltunski
409
          int scrambles = Integer.parseInt(scra);
410 0effd5a9 leszek
          int oVersion  = Integer.parseInt(objV);
411
          int eVersion  = Integer.parseInt(extV);
412 506f7ceb Leszek Koltunski
413
          boolean bIcon = icon.equals("1");
414
          boolean bObje = obje.equals("1");
415
          boolean bExtr = extr.equals("1");
416
417 988e3d33 leszek
          addDownloadedObject(context,name,scrambles,price,oVersion,eVersion,bIcon,bObje,bExtr,diff,category,year,author,supportsAdjColors);
418 506f7ceb Leszek Koltunski
          }
419
        }
420
      }
421 d9d2c5fb Leszek Koltunski
422 fa18f764 Leszek Koltunski
    if( USE_IAP && justStarted ) restoreFreedObjects(preferences);
423 400ff34d Leszek Koltunski
    }
424
425 6142069a Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
426 05c044a5 Leszek Koltunski
427 ebaa194f LeszekKoltunski
  public static void firstUpgradeMarkAllSolvedAsFree(Activity act)
428 6142069a Leszek Koltunski
    {
429 ebaa194f LeszekKoltunski
    RubikScores scores = RubikScores.getInstance(act);
430 e9e744f7 Leszek Koltunski
    int numUnclaimed = scores.numberOfSolvedMAXes();
431 6142069a Leszek Koltunski
432
    if( numUnclaimed>0 )
433
      {
434 e9e744f7 Leszek Koltunski
      int marked = markAllSolvedAsFree(scores);
435 6142069a Leszek Koltunski
      int stillUnclaimed = numUnclaimed-marked;
436 e9e744f7 Leszek Koltunski
      if( stillUnclaimed>0) markObjectsAsFree(scores,stillUnclaimed);
437
      }
438
    }
439
440
///////////////////////////////////////////////////////////////////////////////////////////////////
441
442
  private static int markAllSolvedAsFree(RubikScores scores)
443
    {
444
    int numObjects = RubikObjectList.getNumObjects();
445
    int ret = 0;
446
447
    for(int obj=0; obj<numObjects; obj++)
448
      {
449
      RubikObject object = getObject(obj);
450
451 7bb30586 leszek
      if( object!=null && !object.isFree() && scores.isSolved(obj,RubikScores.LEVELS_SHOWN) )
452 e9e744f7 Leszek Koltunski
        {
453 43382be6 Leszek Koltunski
        markAsFree(object,scores);
454 e9e744f7 Leszek Koltunski
        ret++;
455
        }
456
      }
457
458
    return ret;
459
    }
460
461
///////////////////////////////////////////////////////////////////////////////////////////////////
462
463
  private static void markObjectsAsFree(RubikScores scores, int numToBeMarked)
464
    {
465
    int numObjects = RubikObjectList.getNumObjects();
466
467
    for(int obj=0; obj<numObjects && numToBeMarked>0; obj++)
468
      {
469
      RubikObject object = getObject(obj);
470
471
      if( object!=null && !object.isFree() )
472
        {
473 43382be6 Leszek Koltunski
        markAsFree(object,scores);
474 e9e744f7 Leszek Koltunski
        numToBeMarked--;
475
        }
476 6142069a Leszek Koltunski
      }
477
    }
478 05c044a5 Leszek Koltunski
479 43382be6 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
480
481
  private static void markAsFree(RubikObject object, RubikScores scores)
482
    {
483 9af27f9c Leszek Koltunski
    String shortName = object.getUpperName();
484 43382be6 Leszek Koltunski
    if( SHOW_IAP_DEBUG ) android.util.Log.e("D", "object "+object.getUpperName()+" marked as free");
485
    object.markFree();
486 ebaa194f LeszekKoltunski
    String add = mBoughtObjects.isEmpty() ? shortName : (","+shortName);
487 9af27f9c Leszek Koltunski
    mBoughtObjects += add;
488 43382be6 Leszek Koltunski
    }
489
490 d433b50e Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
491 a7d8c3cd Leszek Koltunski
492
  public static RubikObject getObject(int ordinal)
493
    {
494 506f7ceb Leszek Koltunski
    if( mThis==null ) mThis = new RubikObjectList();
495 a7d8c3cd Leszek Koltunski
    return ordinal>=0 && ordinal<mNumObjects ? mObjects.get(ordinal) : null;
496
    }
497
498 41a5dd89 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
499
500
  public static RubikObject getObject(String shortUpperName)
501
    {
502
    if( mThis==null ) mThis = new RubikObjectList();
503
504
    for(int i=0; i<mNumObjects; i++)
505
      {
506
      RubikObject object = mObjects.get(i);
507
      if( object.getUpperName().equals(shortUpperName) )
508
        {
509
        return object;
510
        }
511
      }
512
513
    return null;
514
    }
515
516 a7d8c3cd Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
517
518
  public static int getNumObjects()
519
    {
520 506f7ceb Leszek Koltunski
    if( mThis==null ) mThis = new RubikObjectList();
521 a7d8c3cd Leszek Koltunski
    return mNumObjects;
522
    }
523
524
///////////////////////////////////////////////////////////////////////////////////////////////////
525
526
  public static int getOrdinal(String name)
527
    {
528 506f7ceb Leszek Koltunski
    if( mThis==null ) mThis = new RubikObjectList();
529 a7d8c3cd Leszek Koltunski
530 5e048300 Leszek Koltunski
    String lowerName = name.toLowerCase(Locale.ENGLISH);
531 84d746d7 Leszek Koltunski
532 a7d8c3cd Leszek Koltunski
    for(int i=0; i<mNumObjects; i++)
533
      {
534
      RubikObject obj = mObjects.get(i);
535 84d746d7 Leszek Koltunski
      if( obj.getLowerName().equals(lowerName) ) return i;
536 a7d8c3cd Leszek Koltunski
      }
537
538
    return -1;
539
    }
540 804293f0 Leszek Koltunski
541 fcf7320f Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
542
543
  public static int getNumExtrasObjects()
544
    {
545
    return mNumExtras;
546
    }
547
548 804293f0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
549
550
  public static int getNumTutorialObjects()
551
    {
552 fcf7320f Leszek Koltunski
    return mNumExtras;
553 804293f0 Leszek Koltunski
    }
554
555
///////////////////////////////////////////////////////////////////////////////////////////////////
556
557 fcf7320f Leszek Koltunski
  public static int getObjectOrdinal(int extrasOrdinal)
558 804293f0 Leszek Koltunski
    {
559 fcf7320f Leszek Koltunski
    for(int i=extrasOrdinal; i<mNumObjects; i++)
560 804293f0 Leszek Koltunski
      {
561
      RubikObject object = getObject(i);
562 fcf7320f Leszek Koltunski
      int extOrd = object!=null ? object.getExtrasOrdinal() : -1;
563
      if( extOrd==extrasOrdinal ) return i;
564 804293f0 Leszek Koltunski
      }
565
566
    return -1;
567
    }
568
569 fcf7320f Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
570
571
  public static int getExtrasOrdinal(int objectOrdinal)
572
    {
573
    RubikObject object = getObject(objectOrdinal);
574
    return object!=null ? object.getExtrasOrdinal() : -1;
575
    }
576
577 804293f0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
578
579
  public static int getTutorialOrdinal(int objectOrdinal)
580
    {
581
    RubikObject object = getObject(objectOrdinal);
582 fcf7320f Leszek Koltunski
    return object!=null ? object.getExtrasOrdinal() : -1;
583
    }
584
585
///////////////////////////////////////////////////////////////////////////////////////////////////
586
587 0effd5a9 leszek
  public static int getLocalObjectVersion(int objectOrdinal)
588 fcf7320f Leszek Koltunski
    {
589
    RubikObject object = getObject(objectOrdinal);
590 0effd5a9 leszek
    return object!=null ? object.getObjectVersion() : -1;
591 fcf7320f Leszek Koltunski
    }
592
593
///////////////////////////////////////////////////////////////////////////////////////////////////
594
595 0effd5a9 leszek
  public static int getLocalExtrasVersion(int objectOrdinal)
596 fcf7320f Leszek Koltunski
    {
597
    RubikObject object = getObject(objectOrdinal);
598 0effd5a9 leszek
    return object!=null ? object.getExtrasVersion() : -1;
599 804293f0 Leszek Koltunski
    }
600 a7d8c3cd Leszek Koltunski
}