Project

General

Profile

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

magiccube / src / main / java / org / distorted / objects / RubikObjectList.java @ 7480fbab

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2021 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// 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
///////////////////////////////////////////////////////////////////////////////////////////////////
9

    
10
package org.distorted.objects;
11

    
12
import java.util.ArrayList;
13
import java.util.Locale;
14

    
15
import android.content.Context;
16
import android.content.SharedPreferences;
17

    
18
import org.distorted.external.RubikFiles;
19
import org.distorted.main.RubikActivity;
20
import org.distorted.objectlib.main.ObjectSignatures;
21
import org.distorted.objectlib.main.ObjectType;
22

    
23
import static org.distorted.objectlib.main.TwistyObject.MESH_NICE;
24
import static org.distorted.objectlib.main.ObjectType.NUM_OBJECTS;
25
import static org.distorted.main.RubikActivity.SHOW_DOWNLOADED_DEBUG;
26

    
27
///////////////////////////////////////////////////////////////////////////////////////////////////
28

    
29
public class RubikObjectList
30
{
31
  public static final int DEF_OBJECT= ObjectSignatures.CUBE_3;
32
  private static RubikObjectList mThis;
33
  private static int mNumObjects;
34
  private static int mNumExtras;
35
  private static ArrayList<RubikObject> mObjects;
36
  private static int mObject = DEF_OBJECT;
37

    
38
  public static class DownloadedObject
39
    {
40
    String shortName;
41
    boolean icon,object,extras,free;
42
    int numScrambles, objectMinor, extrasMinor;
43

    
44
    DownloadedObject(String sName, int scrambles, boolean isFree, int oMinor, int eMinor, boolean i, boolean o, boolean e)
45
      {
46
      shortName = sName;
47

    
48
      numScrambles= scrambles;
49
      free        = isFree;
50
      objectMinor = oMinor;
51
      extrasMinor = eMinor;
52

    
53
      icon   = i;
54
      object = o;
55
      extras = e;
56
      }
57
    }
58

    
59
  private static ArrayList<DownloadedObject> mDownloadedObjects;
60
  private static String mFreeSolvedObjects;
61
  private static String mFreeBoughtObjects;
62

    
63
///////////////////////////////////////////////////////////////////////////////////////////////////
64

    
65
  private RubikObjectList()
66
    {
67
    mNumObjects= 0;
68
    mNumExtras = 0;
69

    
70
    mObjects           = new ArrayList<>();
71
    mDownloadedObjects = new ArrayList<>();
72

    
73
    createBuiltinObjects();
74
    }
75

    
76
///////////////////////////////////////////////////////////////////////////////////////////////////
77

    
78
  private void createBuiltinObjects()
79
    {
80
    for(int i=0; i<NUM_OBJECTS; i++)
81
      {
82
      ObjectType type = ObjectType.getObject(i);
83
      RubikObject obj = new RubikObject(type);
84
      mObjects.add(obj);
85
      mNumObjects++;
86

    
87
      if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "creating local object "+type.name() );
88

    
89
      if( obj.hasExtras() )
90
        {
91
        if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "has extras "+mNumExtras );
92

    
93
        obj.setExtrasOrdinal(mNumExtras);
94
        mNumExtras++;
95
        }
96
      else
97
        {
98
        if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "no extras");
99
        }
100
      }
101
    }
102

    
103
///////////////////////////////////////////////////////////////////////////////////////////////////
104

    
105
  private static boolean internalAddDownloadedObject(DownloadedObject object)
106
    {
107
    String name = object.shortName;
108

    
109
    for(RubikObject ro : mObjects )
110
      if( ro.getLowerName().equals(name) )
111
        {
112
        return ro.updateObject(object);
113
        }
114

    
115
    RubikObject obj = new RubikObject(object);
116
    mObjects.add(obj);
117
    mNumObjects++;
118

    
119
    if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "creating downloaded object "+obj.getUpperName() );
120

    
121
    if( obj.hasExtras() )
122
      {
123
      if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "has extras "+mNumExtras );
124

    
125
      obj.setExtrasOrdinal(mNumExtras);
126
      mNumExtras++;
127
      }
128
    else
129
      {
130
      if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "no extras");
131
      }
132

    
133
    return true;
134
    }
135

    
136
///////////////////////////////////////////////////////////////////////////////////////////////////
137
// PUBLIC API
138

    
139
  public static boolean addDownloadedObject(Context context, String shortName, int numScrambles, boolean isFree, int objectMinor,
140
                                         int extrasMinor, boolean icon, boolean object, boolean extras)
141
    {
142
    if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "New downloaded object "+shortName+" icon="+icon+" object="+object+" extras="+extras);
143

    
144
    for( DownloadedObject obj : mDownloadedObjects )
145
      {
146
      if( obj.shortName.equals(shortName) )
147
        {
148
        obj.icon  |= icon;
149
        obj.object|= object;
150
        obj.extras|= extras;
151

    
152
        if( !obj.object ) objectMinor=-1;
153
        if( !obj.extras ) extrasMinor=-1;
154

    
155
        obj.objectMinor = objectMinor;
156
        obj.extrasMinor = extrasMinor;
157

    
158
        if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "Updating downloaded object "+shortName+" icon="+obj.icon+" object="+obj.object+" extras="+obj.extras);
159

    
160
        try
161
          {
162
          RubikActivity ract = (RubikActivity)context;
163
          ract.reloadObject(shortName);
164
          }
165
        catch(Exception ex)
166
          {
167
          android.util.Log.e("D", "exception trying to reload object: "+ex.getMessage() );
168
          }
169

    
170
        return false;
171
        }
172
      }
173

    
174
    if( !object ) objectMinor=-1;
175
    if( !extras ) extrasMinor=-1;
176

    
177
    DownloadedObject obj = new DownloadedObject(shortName,numScrambles,isFree,objectMinor,extrasMinor,icon,object,extras);
178
    if ( internalAddDownloadedObject(obj) )
179
      {
180
      if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "Adding new downloaded object "+shortName+" icon="+obj.icon+" object="+obj.object+" extras="+obj.extras);
181
      mDownloadedObjects.add(obj);
182
      return true;
183
      }
184
    else
185
      {
186
      if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "New downloaded object "+shortName+" is already built-in, deleting");
187
      RubikFiles files = RubikFiles.getInstance();
188
      files.deleteIcon(context,shortName);
189
      files.deleteJsonObject(context,shortName);
190
      files.deleteJsonExtras(context,shortName);
191
      return false;
192
      }
193
    }
194

    
195
///////////////////////////////////////////////////////////////////////////////////////////////////
196

    
197
  public static void setMeshState(int ordinal, int state)
198
    {
199
    if( ordinal>=0 && ordinal<mNumObjects ) mObjects.get(ordinal).setMeshState(state);
200
    }
201

    
202
///////////////////////////////////////////////////////////////////////////////////////////////////
203

    
204
  public static int getMeshState(int ordinal)
205
    {
206
    return (ordinal>=0 && ordinal<mNumObjects) ? mObjects.get(ordinal).getMeshState() : MESH_NICE;
207
    }
208

    
209
///////////////////////////////////////////////////////////////////////////////////////////////////
210

    
211
  public static void saveMeshState(SharedPreferences.Editor editor)
212
    {
213
    for(int i=0; i<mNumObjects; i++)
214
      {
215
      RubikObject obj = getObject(i);
216

    
217
      if( obj!=null )
218
        {
219
        String name = obj.getUpperName();
220
        editor.putInt("rol_"+name, obj.getMeshState() );
221
        }
222
      }
223
    }
224

    
225
///////////////////////////////////////////////////////////////////////////////////////////////////
226

    
227
  public static boolean allAlreadyBought()
228
    {
229
    return mFreeBoughtObjects.equals("*");
230
    }
231

    
232
///////////////////////////////////////////////////////////////////////////////////////////////////
233

    
234
  public static boolean objectAlreadyBought(String shortName)
235
    {
236
    RubikObject o = getObject(shortName);
237
    return ( o!=null && o.isFree() );
238
    }
239

    
240
///////////////////////////////////////////////////////////////////////////////////////////////////
241

    
242
  public static void buyAll()
243
    {
244
    mFreeBoughtObjects = "*";
245

    
246
    for(int i=0; i<mNumObjects; i++)
247
      {
248
      RubikObject o = mObjects.get(i);
249
      o.markFree();
250
      }
251
    }
252

    
253
///////////////////////////////////////////////////////////////////////////////////////////////////
254

    
255
  public static boolean buyObject(String shortName)
256
    {
257
    RubikObject o = getObject(shortName);
258

    
259
    if( o!=null && !o.isFree() )
260
      {
261
      o.markFree();
262
      String add = mFreeBoughtObjects.length()==0 ? shortName : (","+shortName);
263
      mFreeBoughtObjects += add;
264
      return true;
265
      }
266

    
267
    return false;
268
    }
269

    
270
///////////////////////////////////////////////////////////////////////////////////////////////////
271

    
272
  public static boolean solveObject(String shortName)
273
    {
274
    RubikObject o = getObject(shortName);
275

    
276
    if( o!=null && !o.isFree() )
277
      {
278
      o.markFree();
279
      String add = mFreeSolvedObjects.length()==0 ? shortName : (","+shortName);
280
      mFreeSolvedObjects += add;
281
      return true;
282
      }
283

    
284
    return false;
285
    }
286

    
287
///////////////////////////////////////////////////////////////////////////////////////////////////
288

    
289
  public static void savePreferences(SharedPreferences.Editor editor)
290
    {
291
    RubikObject obj = getObject(mObject);
292
    if( obj!=null ) editor.putString("rol_objName", obj.getUpperName() );
293

    
294
    int numDownloaded = mDownloadedObjects.size();
295

    
296
    if( numDownloaded>0 )
297
      {
298
      StringBuilder downloadedObjects = new StringBuilder();
299

    
300
      for(int i=0; i<numDownloaded; i++)
301
        {
302
        if( i>0 ) downloadedObjects.append(',');
303

    
304
        DownloadedObject object = mDownloadedObjects.get(i);
305
        downloadedObjects.append(object.shortName);
306
        downloadedObjects.append(' ');
307
        downloadedObjects.append(object.numScrambles);
308
        downloadedObjects.append(' ');
309
        downloadedObjects.append(object.objectMinor);
310
        downloadedObjects.append(' ');
311
        downloadedObjects.append(object.extrasMinor);
312
        downloadedObjects.append(' ');
313
        downloadedObjects.append(object.icon   ? "1":"0");
314
        downloadedObjects.append(' ');
315
        downloadedObjects.append(object.object ? "1":"0");
316
        downloadedObjects.append(' ');
317
        downloadedObjects.append(object.extras ? "1":"0");
318
        downloadedObjects.append(' ');
319
        downloadedObjects.append(object.free ? "true":"false");
320
        }
321

    
322
      String objects = downloadedObjects.toString();
323
      if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "saving: "+objects);
324
      editor.putString("rol_downloaded", objects );
325
      }
326
    else
327
      {
328
      editor.putString("rol_downloaded", "" );
329
      }
330

    
331
    editor.putString("rol_freeSolved", mFreeSolvedObjects);
332
    editor.putString("rol_freeBought", mFreeBoughtObjects);
333
    }
334

    
335
///////////////////////////////////////////////////////////////////////////////////////////////////
336

    
337
  public static void restorePreferences(Context context, SharedPreferences preferences, boolean justStarted)
338
    {
339
    if( mThis==null ) mThis = new RubikObjectList();
340

    
341
    String downloaded = preferences.getString("rol_downloaded","");
342

    
343
    if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", downloaded);
344

    
345
    if( !downloaded.equals(""))
346
      {
347
      String[] dObjects = downloaded.split(",");
348

    
349
      for(String dObj : dObjects)
350
        {
351
        String[] parts = dObj.split(" ");
352
        int length = parts.length;
353

    
354
        if( length==7 || length==8 )
355
          {
356
          String name = parts[0];
357
          String scra = parts[1];
358
          String objM = parts[2];
359
          String extM = parts[3];
360
          String icon = parts[4];
361
          String obje = parts[5];
362
          String extr = parts[6];
363
          boolean isFree = (length==7 || Boolean.parseBoolean(parts[7]));
364

    
365
          int scrambles = Integer.parseInt(scra);
366
          int oMinor    = Integer.parseInt(objM);
367
          int eMinor    = Integer.parseInt(extM);
368

    
369
          boolean bIcon = icon.equals("1");
370
          boolean bObje = obje.equals("1");
371
          boolean bExtr = extr.equals("1");
372

    
373
          addDownloadedObject(context,name,scrambles,isFree,oMinor,eMinor,bIcon,bObje,bExtr);
374
          }
375
        }
376
      }
377

    
378
    RubikObject object = getObject(DEF_OBJECT);
379
    String defName = object==null ? "CUBE_3" : object.getUpperName();
380
    String objName= preferences.getString("rol_objName",defName);
381
    mObject = getOrdinal(objName);
382
    if( mObject<0 || mObject>=mNumObjects ) mObject = DEF_OBJECT;
383

    
384
    if( justStarted )
385
      {
386
      mFreeSolvedObjects = preferences.getString("rol_freeSolved", "");
387
      mFreeBoughtObjects = preferences.getString("rol_freeBought", "");
388

    
389
      if( mFreeBoughtObjects.length()>0 )
390
        {
391
        if( mFreeBoughtObjects.charAt(0)=='*' )
392
          {
393
          for(int i=0; i<mNumObjects; i++)
394
            {
395
            RubikObject o = mObjects.get(i);
396
            o.markFree();
397
            }
398
          }
399
        else
400
          {
401
          String[] objs = mFreeBoughtObjects.split(",");
402

    
403
          for( String obj : objs )
404
            {
405
            RubikObject o = getObject(obj);
406
            if( o!=null ) o.markFree();
407
            }
408
          }
409
        }
410

    
411
      if( mFreeSolvedObjects.length()>0 )
412
        {
413
        String[] objs = mFreeSolvedObjects.split(",");
414

    
415
        for( String obj : objs )
416
          {
417
          RubikObject o = getObject(obj);
418
          if( o!=null ) o.markFree();
419
          }
420
        }
421
      }
422
    }
423

    
424
///////////////////////////////////////////////////////////////////////////////////////////////////
425

    
426
  public static void restoreMeshState(SharedPreferences preferences)
427
    {
428
    for(int i=0; i<mNumObjects; i++)
429
      {
430
      RubikObject obj = getObject(i);
431

    
432
      if( obj!=null )
433
        {
434
        String name  = obj.getUpperName();
435
        int meshState= preferences.getInt("rol_"+name,MESH_NICE);
436
        obj.setMeshState(meshState);
437
        }
438
      }
439
    }
440

    
441
///////////////////////////////////////////////////////////////////////////////////////////////////
442

    
443
  public static boolean setCurrObject(int ordinal)
444
    {
445
    if( mObject!=ordinal )
446
      {
447
      mObject = ordinal;
448
      return true;
449
      }
450

    
451
    return false;
452
    }
453

    
454
///////////////////////////////////////////////////////////////////////////////////////////////////
455

    
456
  public static int getCurrObject()
457
    {
458
    return mObject;
459
    }
460

    
461
///////////////////////////////////////////////////////////////////////////////////////////////////
462

    
463
  public static String getCurrentName()
464
    {
465
    RubikObject object = mObjects.get(mObject);
466
    return object==null ? "" : object.getUpperName();
467
    }
468

    
469
///////////////////////////////////////////////////////////////////////////////////////////////////
470

    
471
  public static RubikObject getObject(int ordinal)
472
    {
473
    if( mThis==null ) mThis = new RubikObjectList();
474
    return ordinal>=0 && ordinal<mNumObjects ? mObjects.get(ordinal) : null;
475
    }
476

    
477
///////////////////////////////////////////////////////////////////////////////////////////////////
478

    
479
  public static RubikObject getObject(String shortUpperName)
480
    {
481
    if( mThis==null ) mThis = new RubikObjectList();
482

    
483
    for(int i=0; i<mNumObjects; i++)
484
      {
485
      RubikObject object = mObjects.get(i);
486
      if( object.getUpperName().equals(shortUpperName) )
487
        {
488
        return object;
489
        }
490
      }
491

    
492
    return null;
493
    }
494

    
495
///////////////////////////////////////////////////////////////////////////////////////////////////
496

    
497
  public static int getNumObjects()
498
    {
499
    if( mThis==null ) mThis = new RubikObjectList();
500
    return mNumObjects;
501
    }
502

    
503
///////////////////////////////////////////////////////////////////////////////////////////////////
504

    
505
  public static int getOrdinal(String name)
506
    {
507
    if( mThis==null ) mThis = new RubikObjectList();
508

    
509
    String lowerName = name.toLowerCase(Locale.ENGLISH);
510

    
511
    for(int i=0; i<mNumObjects; i++)
512
      {
513
      RubikObject obj = mObjects.get(i);
514
      if( obj.getLowerName().equals(lowerName) ) return i;
515
      }
516

    
517
    return -1;
518
    }
519

    
520
///////////////////////////////////////////////////////////////////////////////////////////////////
521

    
522
  public static int getNumExtrasObjects()
523
    {
524
    return mNumExtras;
525
    }
526

    
527
///////////////////////////////////////////////////////////////////////////////////////////////////
528

    
529
  public static int getNumTutorialObjects()
530
    {
531
    return mNumExtras;
532
    }
533

    
534
///////////////////////////////////////////////////////////////////////////////////////////////////
535

    
536
  public static int getObjectOrdinal(int extrasOrdinal)
537
    {
538
    for(int i=extrasOrdinal; i<mNumObjects; i++)
539
      {
540
      RubikObject object = getObject(i);
541
      int extOrd = object!=null ? object.getExtrasOrdinal() : -1;
542
      if( extOrd==extrasOrdinal ) return i;
543
      }
544

    
545
    return -1;
546
    }
547

    
548
///////////////////////////////////////////////////////////////////////////////////////////////////
549

    
550
  public static int getExtrasOrdinal(int objectOrdinal)
551
    {
552
    RubikObject object = getObject(objectOrdinal);
553
    return object!=null ? object.getExtrasOrdinal() : -1;
554
    }
555

    
556
///////////////////////////////////////////////////////////////////////////////////////////////////
557

    
558
  public static int getTutorialOrdinal(int objectOrdinal)
559
    {
560
    RubikObject object = getObject(objectOrdinal);
561
    return object!=null ? object.getExtrasOrdinal() : -1;
562
    }
563

    
564
///////////////////////////////////////////////////////////////////////////////////////////////////
565

    
566
  public static int getLocalObjectMinor(int objectOrdinal)
567
    {
568
    RubikObject object = getObject(objectOrdinal);
569
    return object!=null ? object.getObjectMinor() : -1;
570
    }
571

    
572
///////////////////////////////////////////////////////////////////////////////////////////////////
573

    
574
  public static int getLocalExtrasMinor(int objectOrdinal)
575
    {
576
    RubikObject object = getObject(objectOrdinal);
577
    return object!=null ? object.getExtrasMinor() : -1;
578
    }
579
}
(2-2/2)