Project

General

Profile

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

magiccube / src / main / java / org / distorted / objects / RubikObjectList.java @ 05c044a5

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.external.RubikScores;
20
import org.distorted.main.RubikActivity;
21
import org.distorted.objectlib.main.ObjectSignatures;
22
import org.distorted.objectlib.main.ObjectType;
23

    
24
import static org.distorted.objectlib.main.TwistyObject.MESH_NICE;
25
import static org.distorted.objectlib.main.ObjectType.NUM_OBJECTS;
26
import static org.distorted.main.RubikActivity.SHOW_DOWNLOADED_DEBUG;
27
import static org.distorted.screens.RubikScreenPlay.LEVELS_SHOWN;
28

    
29
///////////////////////////////////////////////////////////////////////////////////////////////////
30

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

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

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

    
50
      numScrambles= scrambles;
51
      free        = isFree;
52
      objectMinor = oMinor;
53
      extrasMinor = eMinor;
54

    
55
      icon   = i;
56
      object = o;
57
      extras = e;
58
      }
59
    }
60

    
61
  private static ArrayList<DownloadedObject> mDownloadedObjects;
62
  /*
63
  private static String mFreeSolvedObjects;
64
  private static String mFreeBoughtObjects;
65
  private static int mNumFreeSolved;
66
  */
67
///////////////////////////////////////////////////////////////////////////////////////////////////
68

    
69
  private RubikObjectList()
70
    {
71
    mNumObjects    = 0;
72
    mNumExtras     = 0;
73
    //mNumFreeSolved = 0;
74

    
75
    mObjects           = new ArrayList<>();
76
    mDownloadedObjects = new ArrayList<>();
77

    
78
    createBuiltinObjects();
79
    }
80

    
81
///////////////////////////////////////////////////////////////////////////////////////////////////
82

    
83
  private void createBuiltinObjects()
84
    {
85
    for(int i=0; i<NUM_OBJECTS; i++)
86
      {
87
      ObjectType type = ObjectType.getObject(i);
88
      RubikObject obj = new RubikObject(type);
89
      mObjects.add(obj);
90
      mNumObjects++;
91

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

    
94
      if( obj.hasExtras() )
95
        {
96
        if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "has extras "+mNumExtras );
97

    
98
        obj.setExtrasOrdinal(mNumExtras);
99
        mNumExtras++;
100
        }
101
      else
102
        {
103
        if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "no extras");
104
        }
105
      }
106
    }
107

    
108
///////////////////////////////////////////////////////////////////////////////////////////////////
109

    
110
  private static boolean internalAddDownloadedObject(DownloadedObject object)
111
    {
112
    String name = object.shortName;
113

    
114
    for(RubikObject ro : mObjects )
115
      if( ro.getLowerName().equals(name) )
116
        {
117
        return ro.updateObject(object);
118
        }
119

    
120
    RubikObject obj = new RubikObject(object);
121
    mObjects.add(obj);
122
    mNumObjects++;
123
    /*
124
    int numUnclaimed = getNumUnclaimedSolves();
125

    
126
    if( numUnclaimed>0 && !obj.isFree() )
127
      {
128
      String objname = obj.getUpperName();
129
      if( SHOW_SOLVED_DEBUG ) android.util.Log.e("D", "downloadedObject: "+objname+" making it solved. Unclaimed: "+numUnclaimed);
130
      solveObject(obj,objname);
131
      }
132
    */
133
    if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "creating downloaded object "+obj.getUpperName() );
134

    
135
    if( obj.hasExtras() )
136
      {
137
      if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "has extras "+mNumExtras );
138

    
139
      obj.setExtrasOrdinal(mNumExtras);
140
      mNumExtras++;
141
      }
142
    else
143
      {
144
      if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "no extras");
145
      }
146

    
147
    return true;
148
    }
149

    
150
///////////////////////////////////////////////////////////////////////////////////////////////////
151

    
152
  public static int computeNumStars(int level)
153
    {
154
    return level>=LEVELS_SHOWN ? 50 : level;
155
    }
156

    
157
///////////////////////////////////////////////////////////////////////////////////////////////////
158

    
159
  private static void restoreFreedObjects(SharedPreferences preferences)
160
    {
161
    /*
162
    mFreeSolvedObjects = preferences.getString("rol_freeSolved", "");
163
    mFreeBoughtObjects = preferences.getString("rol_freeBought", "");
164

    
165
    if( SHOW_SOLVED_DEBUG )
166
      {
167
      android.util.Log.e("D", "freeSolved: "+mFreeSolvedObjects);
168
      android.util.Log.e("D", "freeBought: "+mFreeBoughtObjects);
169
      }
170

    
171
    if( mFreeBoughtObjects.length()>0 )
172
      {
173
      if( mFreeBoughtObjects.charAt(0)=='*' )
174
        {
175
        for(int i=0; i<mNumObjects; i++)
176
          {
177
          RubikObject o = mObjects.get(i);
178
          o.markFree();
179
          }
180
        }
181
      else
182
        {
183
        String[] objs = mFreeBoughtObjects.split(",");
184

    
185
        for( String obj : objs )
186
          {
187
          RubikObject o = getObject(obj);
188
          if( o!=null ) o.markFree();
189
          }
190
        }
191
      }
192

    
193
    if( mFreeSolvedObjects.length()>0 )
194
      {
195
      String[] objs = mFreeSolvedObjects.split(",");
196
      mNumFreeSolved = objs.length;
197

    
198
      for( String obj : objs )
199
        {
200
        RubikObject o = getObject(obj);
201
        if( o!=null ) o.markFree();
202
        }
203
      }
204
     */
205
    }
206

    
207
///////////////////////////////////////////////////////////////////////////////////////////////////
208

    
209
  private static int getNumUnclaimedSolves()
210
    {
211
    /*
212
    RubikScores scores = RubikScores.getInstance();
213
    int numMAXes = scores.numberOfSolvedMAXes();
214
    return numMAXes-mNumFreeSolved;
215
     */
216

    
217
    return 0;
218
    }
219

    
220
///////////////////////////////////////////////////////////////////////////////////////////////////
221

    
222
  private static int markAllSolvedAsFree()
223
    {
224
    RubikScores scores = RubikScores.getInstance();
225
    int numObjects = RubikObjectList.getNumObjects();
226
    int ret = 0;
227

    
228
    for(int obj=0; obj<numObjects; obj++)
229
      {
230
      RubikObject object = getObject(obj);
231

    
232
      if( object!=null && !object.isFree() && scores.isSolved(obj,LEVELS_SHOWN) )
233
        {
234
        solveObject(object.getUpperName());
235
        ret++;
236
        }
237
      }
238

    
239
    return ret;
240
    }
241

    
242
///////////////////////////////////////////////////////////////////////////////////////////////////
243

    
244
  private static void markAsFree(int numToBeMarked)
245
    {
246
    int numObjects = RubikObjectList.getNumObjects();
247

    
248
    for(int obj=0; obj<numObjects && numToBeMarked>0; obj++)
249
      {
250
      RubikObject object = getObject(obj);
251

    
252
      if( object!=null && !object.isFree() )
253
        {
254
        solveObject(object.getUpperName());
255
        numToBeMarked--;
256
        }
257
      }
258
    }
259

    
260
///////////////////////////////////////////////////////////////////////////////////////////////////
261

    
262
  public static boolean solveObject(RubikObject object, String shortName)
263
    {
264
    /*
265
    if( object!=null && !object.isFree() )
266
      {
267
      if( SHOW_SOLVED_DEBUG ) android.util.Log.e("D", "object "+shortName+" marked as solved");
268
      object.markFree();
269
      String add = mFreeSolvedObjects.length()==0 ? shortName : (","+shortName);
270
      mFreeSolvedObjects += add;
271
      mNumFreeSolved++;
272
      return true;
273
      }
274
    */
275
    return false;
276
    }
277

    
278
///////////////////////////////////////////////////////////////////////////////////////////////////
279
// PUBLIC API
280

    
281
  public static boolean addDownloadedObject(Context context, String shortName, int numScrambles, boolean isFree, int objectMinor,
282
                                         int extrasMinor, boolean icon, boolean object, boolean extras)
283
    {
284
    if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "New downloaded object "+shortName+" icon="+icon+" object="+object+" extras="+extras);
285

    
286
    for( DownloadedObject obj : mDownloadedObjects )
287
      {
288
      if( obj.shortName.equals(shortName) )
289
        {
290
        obj.icon  |= icon;
291
        obj.object|= object;
292
        obj.extras|= extras;
293

    
294
        if( !obj.object ) objectMinor=-1;
295
        if( !obj.extras ) extrasMinor=-1;
296

    
297
        obj.objectMinor = objectMinor;
298
        obj.extrasMinor = extrasMinor;
299

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

    
302
        try
303
          {
304
          RubikActivity ract = (RubikActivity)context;
305
          ract.reloadObject(shortName);
306
          }
307
        catch(Exception ex)
308
          {
309
          android.util.Log.e("D", "exception trying to reload object: "+ex.getMessage() );
310
          }
311

    
312
        return false;
313
        }
314
      }
315

    
316
    if( !object ) objectMinor=-1;
317
    if( !extras ) extrasMinor=-1;
318

    
319
    DownloadedObject obj = new DownloadedObject(shortName,numScrambles,isFree,objectMinor,extrasMinor,icon,object,extras);
320
    if ( internalAddDownloadedObject(obj) )
321
      {
322
      if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "Adding new downloaded object "+shortName+" icon="+obj.icon+" object="+obj.object+" extras="+obj.extras);
323
      mDownloadedObjects.add(obj);
324
      return true;
325
      }
326
    else
327
      {
328
      if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "New downloaded object "+shortName+" is already built-in, deleting");
329
      RubikFiles files = RubikFiles.getInstance();
330
      files.deleteIcon(context,shortName);
331
      files.deleteJsonObject(context,shortName);
332
      files.deleteJsonExtras(context,shortName);
333
      return false;
334
      }
335
    }
336

    
337
///////////////////////////////////////////////////////////////////////////////////////////////////
338

    
339
  public static void setMeshState(int ordinal, int state)
340
    {
341
    if( ordinal>=0 && ordinal<mNumObjects ) mObjects.get(ordinal).setMeshState(state);
342
    }
343

    
344
///////////////////////////////////////////////////////////////////////////////////////////////////
345

    
346
  public static int getMeshState(int ordinal)
347
    {
348
    return (ordinal>=0 && ordinal<mNumObjects) ? mObjects.get(ordinal).getMeshState() : MESH_NICE;
349
    }
350

    
351
///////////////////////////////////////////////////////////////////////////////////////////////////
352

    
353
  public static void saveMeshState(SharedPreferences.Editor editor)
354
    {
355
    for(int i=0; i<mNumObjects; i++)
356
      {
357
      RubikObject obj = getObject(i);
358

    
359
      if( obj!=null )
360
        {
361
        String name = obj.getUpperName();
362
        editor.putInt("rol_"+name, obj.getMeshState() );
363
        }
364
      }
365
    }
366

    
367
///////////////////////////////////////////////////////////////////////////////////////////////////
368

    
369
  public static boolean allAlreadyBought()
370
    {
371
    //return mFreeBoughtObjects.equals("*");
372
    return false;
373
    }
374

    
375
///////////////////////////////////////////////////////////////////////////////////////////////////
376

    
377
  public static boolean thereAreLockedObjects()
378
    {
379
    for(int i=0; i<mNumObjects; i++)
380
      {
381
      RubikObject o = mObjects.get(i);
382
      if( !o.isFree() ) return true;
383
      }
384

    
385
    return false;
386
    }
387

    
388
///////////////////////////////////////////////////////////////////////////////////////////////////
389

    
390
  public static boolean objectAlreadyBought(String shortName)
391
    {
392
    RubikObject o = getObject(shortName);
393
    return ( o!=null && o.isFree() );
394
    }
395

    
396
///////////////////////////////////////////////////////////////////////////////////////////////////
397

    
398
  public static void buyAll()
399
    {
400
    /*
401
    mFreeBoughtObjects = "*";
402
    if( SHOW_SOLVED_DEBUG ) android.util.Log.e("D", "all objects marked as bought");
403

    
404
    for(int i=0; i<mNumObjects; i++)
405
      {
406
      RubikObject o = mObjects.get(i);
407
      o.markFree();
408
      }
409
    */
410
    }
411

    
412
///////////////////////////////////////////////////////////////////////////////////////////////////
413

    
414
  public static boolean buyObject(String shortName)
415
    {
416
    /*
417
    RubikObject o = getObject(shortName);
418

    
419
    if( o!=null && !o.isFree() )
420
      {
421
      if( SHOW_SOLVED_DEBUG ) android.util.Log.e("D", "object "+shortName+" marked as bought");
422
      o.markFree();
423
      String add = mFreeBoughtObjects.length()==0 ? shortName : (","+shortName);
424
      mFreeBoughtObjects += add;
425
      return true;
426
      }
427
    */
428
    return false;
429
    }
430

    
431
///////////////////////////////////////////////////////////////////////////////////////////////////
432

    
433
  public static boolean solveObject(String shortName)
434
    {
435
    RubikObject object = getObject(shortName);
436
    return solveObject(object,shortName);
437
    }
438

    
439
///////////////////////////////////////////////////////////////////////////////////////////////////
440

    
441
  public static void savePreferences(SharedPreferences.Editor editor)
442
    {
443
    RubikObject obj = getObject(mObject);
444
    if( obj!=null ) editor.putString("rol_objName", obj.getUpperName() );
445

    
446
    int numDownloaded = mDownloadedObjects.size();
447

    
448
    if( numDownloaded>0 )
449
      {
450
      StringBuilder downloadedObjects = new StringBuilder();
451

    
452
      for(int i=0; i<numDownloaded; i++)
453
        {
454
        if( i>0 ) downloadedObjects.append(',');
455

    
456
        DownloadedObject object = mDownloadedObjects.get(i);
457
        downloadedObjects.append(object.shortName);
458
        downloadedObjects.append(' ');
459
        downloadedObjects.append(object.numScrambles);
460
        downloadedObjects.append(' ');
461
        downloadedObjects.append(object.objectMinor);
462
        downloadedObjects.append(' ');
463
        downloadedObjects.append(object.extrasMinor);
464
        downloadedObjects.append(' ');
465
        downloadedObjects.append(object.icon   ? "1":"0");
466
        downloadedObjects.append(' ');
467
        downloadedObjects.append(object.object ? "1":"0");
468
        downloadedObjects.append(' ');
469
        downloadedObjects.append(object.extras ? "1":"0");
470
        downloadedObjects.append(' ');
471
        downloadedObjects.append(object.free ? "true":"false");
472
        }
473

    
474
      String objects = downloadedObjects.toString();
475
      if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "saving: "+objects);
476
      editor.putString("rol_downloaded", objects );
477
      }
478
    else
479
      {
480
      editor.putString("rol_downloaded", "" );
481
      }
482
/*
483
    editor.putString("rol_freeSolved", mFreeSolvedObjects);
484
    editor.putString("rol_freeBought", mFreeBoughtObjects);
485

    
486
    if( SHOW_SOLVED_DEBUG )
487
      {
488
      android.util.Log.e("D", "saving solved objects: "+mFreeSolvedObjects);
489
      android.util.Log.e("D", "saving bought objects: "+mFreeBoughtObjects);
490
      }
491
 */
492
    }
493

    
494
///////////////////////////////////////////////////////////////////////////////////////////////////
495

    
496
  public static void restorePreferences(Context context, SharedPreferences preferences, boolean justStarted)
497
    {
498
    if( mThis==null ) mThis = new RubikObjectList();
499

    
500
    String downloaded = preferences.getString("rol_downloaded","");
501

    
502
    if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", downloaded);
503

    
504
    if( !downloaded.equals(""))
505
      {
506
      String[] dObjects = downloaded.split(",");
507

    
508
      for(String dObj : dObjects)
509
        {
510
        String[] parts = dObj.split(" ");
511
        int length = parts.length;
512

    
513
        if( length==7 || length==8 )
514
          {
515
          String name = parts[0];
516
          String scra = parts[1];
517
          String objM = parts[2];
518
          String extM = parts[3];
519
          String icon = parts[4];
520
          String obje = parts[5];
521
          String extr = parts[6];
522
          boolean isFree = (length==7 || Boolean.parseBoolean(parts[7]));
523

    
524
          int scrambles = Integer.parseInt(scra);
525
          int oMinor    = Integer.parseInt(objM);
526
          int eMinor    = Integer.parseInt(extM);
527

    
528
          boolean bIcon = icon.equals("1");
529
          boolean bObje = obje.equals("1");
530
          boolean bExtr = extr.equals("1");
531

    
532
          addDownloadedObject(context,name,scrambles,isFree,oMinor,eMinor,bIcon,bObje,bExtr);
533
          }
534
        }
535
      }
536

    
537
    RubikObject object = getObject(DEF_OBJECT);
538
    String defName = object==null ? "CUBE_3" : object.getUpperName();
539
    String objName= preferences.getString("rol_objName",defName);
540
    mObject = getOrdinal(objName);
541
    if( mObject<0 || mObject>=mNumObjects ) mObject = DEF_OBJECT;
542

    
543
    if( justStarted) restoreFreedObjects(preferences);
544
    }
545

    
546
///////////////////////////////////////////////////////////////////////////////////////////////////
547

    
548
  public static void restoreMeshState(SharedPreferences preferences)
549
    {
550
    for(int i=0; i<mNumObjects; i++)
551
      {
552
      RubikObject obj = getObject(i);
553

    
554
      if( obj!=null )
555
        {
556
        String name  = obj.getUpperName();
557
        int meshState= preferences.getInt("rol_"+name,MESH_NICE);
558
        obj.setMeshState(meshState);
559
        }
560
      }
561
    }
562

    
563
///////////////////////////////////////////////////////////////////////////////////////////////////
564

    
565
  public static void setObjectFreeState()
566
    {
567
    int numUnclaimed = getNumUnclaimedSolves();
568

    
569
    if( numUnclaimed>0 )
570
      {
571
      int marked = markAllSolvedAsFree();
572
      int stillUnclaimed = numUnclaimed-marked;
573
      if( stillUnclaimed>0) markAsFree(stillUnclaimed);
574
      }
575
    }
576

    
577
///////////////////////////////////////////////////////////////////////////////////////////////////
578

    
579
  public static boolean setCurrObject(int ordinal)
580
    {
581
    if( mObject!=ordinal )
582
      {
583
      mObject = ordinal;
584
      return true;
585
      }
586

    
587
    return false;
588
    }
589

    
590
///////////////////////////////////////////////////////////////////////////////////////////////////
591

    
592
  public static int getCurrObject()
593
    {
594
    return mObject;
595
    }
596

    
597
///////////////////////////////////////////////////////////////////////////////////////////////////
598

    
599
  public static String getCurrentName()
600
    {
601
    RubikObject object = mObjects.get(mObject);
602
    return object==null ? "" : object.getUpperName();
603
    }
604

    
605
///////////////////////////////////////////////////////////////////////////////////////////////////
606

    
607
  public static RubikObject getObject(int ordinal)
608
    {
609
    if( mThis==null ) mThis = new RubikObjectList();
610
    return ordinal>=0 && ordinal<mNumObjects ? mObjects.get(ordinal) : null;
611
    }
612

    
613
///////////////////////////////////////////////////////////////////////////////////////////////////
614

    
615
  public static RubikObject getObject(String shortUpperName)
616
    {
617
    if( mThis==null ) mThis = new RubikObjectList();
618

    
619
    for(int i=0; i<mNumObjects; i++)
620
      {
621
      RubikObject object = mObjects.get(i);
622
      if( object.getUpperName().equals(shortUpperName) )
623
        {
624
        return object;
625
        }
626
      }
627

    
628
    return null;
629
    }
630

    
631
///////////////////////////////////////////////////////////////////////////////////////////////////
632

    
633
  public static int getNumObjects()
634
    {
635
    if( mThis==null ) mThis = new RubikObjectList();
636
    return mNumObjects;
637
    }
638

    
639
///////////////////////////////////////////////////////////////////////////////////////////////////
640

    
641
  public static int getOrdinal(String name)
642
    {
643
    if( mThis==null ) mThis = new RubikObjectList();
644

    
645
    String lowerName = name.toLowerCase(Locale.ENGLISH);
646

    
647
    for(int i=0; i<mNumObjects; i++)
648
      {
649
      RubikObject obj = mObjects.get(i);
650
      if( obj.getLowerName().equals(lowerName) ) return i;
651
      }
652

    
653
    return -1;
654
    }
655

    
656
///////////////////////////////////////////////////////////////////////////////////////////////////
657

    
658
  public static int getNumExtrasObjects()
659
    {
660
    return mNumExtras;
661
    }
662

    
663
///////////////////////////////////////////////////////////////////////////////////////////////////
664

    
665
  public static int getNumTutorialObjects()
666
    {
667
    return mNumExtras;
668
    }
669

    
670
///////////////////////////////////////////////////////////////////////////////////////////////////
671

    
672
  public static int getObjectOrdinal(int extrasOrdinal)
673
    {
674
    for(int i=extrasOrdinal; i<mNumObjects; i++)
675
      {
676
      RubikObject object = getObject(i);
677
      int extOrd = object!=null ? object.getExtrasOrdinal() : -1;
678
      if( extOrd==extrasOrdinal ) return i;
679
      }
680

    
681
    return -1;
682
    }
683

    
684
///////////////////////////////////////////////////////////////////////////////////////////////////
685

    
686
  public static int getExtrasOrdinal(int objectOrdinal)
687
    {
688
    RubikObject object = getObject(objectOrdinal);
689
    return object!=null ? object.getExtrasOrdinal() : -1;
690
    }
691

    
692
///////////////////////////////////////////////////////////////////////////////////////////////////
693

    
694
  public static int getTutorialOrdinal(int objectOrdinal)
695
    {
696
    RubikObject object = getObject(objectOrdinal);
697
    return object!=null ? object.getExtrasOrdinal() : -1;
698
    }
699

    
700
///////////////////////////////////////////////////////////////////////////////////////////////////
701

    
702
  public static int getLocalObjectMinor(int objectOrdinal)
703
    {
704
    RubikObject object = getObject(objectOrdinal);
705
    return object!=null ? object.getObjectMinor() : -1;
706
    }
707

    
708
///////////////////////////////////////////////////////////////////////////////////////////////////
709

    
710
  public static int getLocalExtrasMinor(int objectOrdinal)
711
    {
712
    RubikObject object = getObject(objectOrdinal);
713
    return object!=null ? object.getExtrasMinor() : -1;
714
    }
715
}
(2-2/2)