Project

General

Profile

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

magiccube / src / main / java / org / distorted / objects / RubikObjectList.java @ 298f3977

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

    
61
///////////////////////////////////////////////////////////////////////////////////////////////////
62

    
63
  private RubikObjectList()
64
    {
65
    mNumObjects= 0;
66
    mNumExtras = 0;
67

    
68
    mObjects           = new ArrayList<>();
69
    mDownloadedObjects = new ArrayList<>();
70

    
71
    createBuiltinObjects();
72
    }
73

    
74
///////////////////////////////////////////////////////////////////////////////////////////////////
75

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

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

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

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

    
101
///////////////////////////////////////////////////////////////////////////////////////////////////
102

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

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

    
113
    RubikObject obj = new RubikObject(object);
114
    mObjects.add(obj);
115
    mNumObjects++;
116

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

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

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

    
131
    return true;
132
    }
133

    
134
///////////////////////////////////////////////////////////////////////////////////////////////////
135
// PUBLIC API
136

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

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

    
150
        if( !obj.object ) objectMinor=-1;
151
        if( !obj.extras ) extrasMinor=-1;
152

    
153
        obj.objectMinor = objectMinor;
154
        obj.extrasMinor = extrasMinor;
155

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

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

    
168
        return false;
169
        }
170
      }
171

    
172
    if( !object ) objectMinor=-1;
173
    if( !extras ) extrasMinor=-1;
174

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

    
193
///////////////////////////////////////////////////////////////////////////////////////////////////
194

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

    
200
///////////////////////////////////////////////////////////////////////////////////////////////////
201

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

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

    
209
  public static void savePreferences(SharedPreferences.Editor editor)
210
    {
211
    RubikObject obj = getObject(mObject);
212
    if( obj!=null ) editor.putString("rol_objName", obj.getUpperName() );
213

    
214
    int numDownloaded = mDownloadedObjects.size();
215

    
216
    if( numDownloaded>0 )
217
      {
218
      StringBuilder downloadedObjects = new StringBuilder();
219

    
220
      for(int i=0; i<numDownloaded; i++)
221
        {
222
        if( i>0 ) downloadedObjects.append(',');
223

    
224
        DownloadedObject object = mDownloadedObjects.get(i);
225
        downloadedObjects.append(object.shortName);
226
        downloadedObjects.append(' ');
227
        downloadedObjects.append(object.numScrambles);
228
        downloadedObjects.append(' ');
229
        downloadedObjects.append(object.objectMinor);
230
        downloadedObjects.append(' ');
231
        downloadedObjects.append(object.extrasMinor);
232
        downloadedObjects.append(' ');
233
        downloadedObjects.append(object.icon   ? "1":"0");
234
        downloadedObjects.append(' ');
235
        downloadedObjects.append(object.object ? "1":"0");
236
        downloadedObjects.append(' ');
237
        downloadedObjects.append(object.extras ? "1":"0");
238
        downloadedObjects.append(' ');
239
        downloadedObjects.append(object.free ? "true":"false");
240
        }
241

    
242
      String objects = downloadedObjects.toString();
243
      if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "saving: "+objects);
244
      editor.putString("rol_downloaded", objects );
245
      }
246
    else
247
      {
248
      editor.putString("rol_downloaded", "" );
249
      }
250
    }
251

    
252
///////////////////////////////////////////////////////////////////////////////////////////////////
253

    
254
  public static void saveMeshState(SharedPreferences.Editor editor)
255
    {
256
    for(int i=0; i<mNumObjects; i++)
257
      {
258
      RubikObject obj = getObject(i);
259

    
260
      if( obj!=null )
261
        {
262
        String name = obj.getUpperName();
263
        editor.putInt("rol_"+name, obj.getMeshState() );
264
        }
265
      }
266
    }
267

    
268
///////////////////////////////////////////////////////////////////////////////////////////////////
269

    
270
  public static void restorePreferences(Context context, SharedPreferences preferences)
271
    {
272
    if( mThis==null ) mThis = new RubikObjectList();
273

    
274
    String downloaded = preferences.getString("rol_downloaded","");
275

    
276
    if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", downloaded);
277

    
278
    if( !downloaded.equals(""))
279
      {
280
      String[] dObjects = downloaded.split(",");
281

    
282
      for(String dObj : dObjects)
283
        {
284
        String[] parts = dObj.split(" ");
285
        int length = parts.length;
286

    
287
        if( length==7 || length==8 )
288
          {
289
          String name = parts[0];
290
          String scra = parts[1];
291
          String objM = parts[2];
292
          String extM = parts[3];
293
          String icon = parts[4];
294
          String obje = parts[5];
295
          String extr = parts[6];
296
          boolean isFree = (length==7 || Boolean.parseBoolean(parts[7]));
297

    
298
          int scrambles = Integer.parseInt(scra);
299
          int oMinor    = Integer.parseInt(objM);
300
          int eMinor    = Integer.parseInt(extM);
301

    
302
          boolean bIcon = icon.equals("1");
303
          boolean bObje = obje.equals("1");
304
          boolean bExtr = extr.equals("1");
305

    
306
          addDownloadedObject(context,name,scrambles,isFree,oMinor,eMinor,bIcon,bObje,bExtr);
307
          }
308
        }
309
      }
310

    
311
    RubikObject object = getObject(DEF_OBJECT);
312
    String defName = object==null ? "CUBE_3" : object.getUpperName();
313
    String objName= preferences.getString("rol_objName",defName);
314
    mObject = getOrdinal(objName);
315
    if( mObject<0 || mObject>=mNumObjects ) mObject = DEF_OBJECT;
316
    }
317

    
318
///////////////////////////////////////////////////////////////////////////////////////////////////
319

    
320
  public static void restoreMeshState(SharedPreferences preferences)
321
    {
322
    for(int i=0; i<mNumObjects; i++)
323
      {
324
      RubikObject obj = getObject(i);
325

    
326
      if( obj!=null )
327
        {
328
        String name  = obj.getUpperName();
329
        int meshState= preferences.getInt("rol_"+name,MESH_NICE);
330
        obj.setMeshState(meshState);
331
        }
332
      }
333
    }
334

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

    
337
  public static boolean setCurrObject(int ordinal)
338
    {
339
    if( mObject!=ordinal )
340
      {
341
      mObject = ordinal;
342
      return true;
343
      }
344

    
345
    return false;
346
    }
347

    
348
///////////////////////////////////////////////////////////////////////////////////////////////////
349

    
350
  public static int getCurrObject()
351
    {
352
    return mObject;
353
    }
354

    
355
///////////////////////////////////////////////////////////////////////////////////////////////////
356

    
357
  public static String getCurrentName()
358
    {
359
    RubikObject object = mObjects.get(mObject);
360
    return object==null ? "" : object.getUpperName();
361
    }
362

    
363
///////////////////////////////////////////////////////////////////////////////////////////////////
364

    
365
  public static RubikObject getObject(int ordinal)
366
    {
367
    if( mThis==null ) mThis = new RubikObjectList();
368
    return ordinal>=0 && ordinal<mNumObjects ? mObjects.get(ordinal) : null;
369
    }
370

    
371
///////////////////////////////////////////////////////////////////////////////////////////////////
372

    
373
  public static RubikObject getObject(String shortUpperName)
374
    {
375
    if( mThis==null ) mThis = new RubikObjectList();
376

    
377
    for(int i=0; i<mNumObjects; i++)
378
      {
379
      RubikObject object = mObjects.get(i);
380
      if( object.getUpperName().equals(shortUpperName) )
381
        {
382
        return object;
383
        }
384
      }
385

    
386
    return null;
387
    }
388

    
389
///////////////////////////////////////////////////////////////////////////////////////////////////
390

    
391
  public static int getNumObjects()
392
    {
393
    if( mThis==null ) mThis = new RubikObjectList();
394
    return mNumObjects;
395
    }
396

    
397
///////////////////////////////////////////////////////////////////////////////////////////////////
398

    
399
  public static int getOrdinal(String name)
400
    {
401
    if( mThis==null ) mThis = new RubikObjectList();
402

    
403
    String lowerName = name.toLowerCase(Locale.ENGLISH);
404

    
405
    for(int i=0; i<mNumObjects; i++)
406
      {
407
      RubikObject obj = mObjects.get(i);
408
      if( obj.getLowerName().equals(lowerName) ) return i;
409
      }
410

    
411
    return -1;
412
    }
413

    
414
///////////////////////////////////////////////////////////////////////////////////////////////////
415

    
416
  public static int getNumExtrasObjects()
417
    {
418
    return mNumExtras;
419
    }
420

    
421
///////////////////////////////////////////////////////////////////////////////////////////////////
422

    
423
  public static int getNumTutorialObjects()
424
    {
425
    return mNumExtras;
426
    }
427

    
428
///////////////////////////////////////////////////////////////////////////////////////////////////
429

    
430
  public static int getObjectOrdinal(int extrasOrdinal)
431
    {
432
    for(int i=extrasOrdinal; i<mNumObjects; i++)
433
      {
434
      RubikObject object = getObject(i);
435
      int extOrd = object!=null ? object.getExtrasOrdinal() : -1;
436
      if( extOrd==extrasOrdinal ) return i;
437
      }
438

    
439
    return -1;
440
    }
441

    
442
///////////////////////////////////////////////////////////////////////////////////////////////////
443

    
444
  public static int getExtrasOrdinal(int objectOrdinal)
445
    {
446
    RubikObject object = getObject(objectOrdinal);
447
    return object!=null ? object.getExtrasOrdinal() : -1;
448
    }
449

    
450
///////////////////////////////////////////////////////////////////////////////////////////////////
451

    
452
  public static int getTutorialOrdinal(int objectOrdinal)
453
    {
454
    RubikObject object = getObject(objectOrdinal);
455
    return object!=null ? object.getExtrasOrdinal() : -1;
456
    }
457

    
458
///////////////////////////////////////////////////////////////////////////////////////////////////
459

    
460
  public static int getLocalObjectMinor(int objectOrdinal)
461
    {
462
    RubikObject object = getObject(objectOrdinal);
463
    return object!=null ? object.getObjectMinor() : -1;
464
    }
465

    
466
///////////////////////////////////////////////////////////////////////////////////////////////////
467

    
468
  public static int getLocalExtrasMinor(int objectOrdinal)
469
    {
470
    RubikObject object = getObject(objectOrdinal);
471
    return object!=null ? object.getExtrasMinor() : -1;
472
    }
473
}
(2-2/2)