Project

General

Profile

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

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

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