Project

General

Profile

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

magiccube / src / main / java / org / distorted / objects / RubikObjectList.java @ 8c8a9fb9

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