Project

General

Profile

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