Project

General

Profile

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

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

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 400ff34d Leszek Koltunski
import org.distorted.main.RubikActivity;
20 e4733ed7 Leszek Koltunski
import org.distorted.objectlib.main.ObjectSignatures;
21 a7d8c3cd Leszek Koltunski
import org.distorted.objectlib.main.ObjectType;
22
23 09cf2a36 Leszek Koltunski
import static org.distorted.objectlib.main.TwistyObject.MESH_NICE;
24 a7d8c3cd Leszek Koltunski
import static org.distorted.objectlib.main.ObjectType.NUM_OBJECTS;
25 e847c553 Leszek Koltunski
import static org.distorted.main.RubikActivity.SHOW_DOWNLOADED_DEBUG;
26 a7d8c3cd Leszek Koltunski
27
///////////////////////////////////////////////////////////////////////////////////////////////////
28
29
public class RubikObjectList
30
{
31 e4733ed7 Leszek Koltunski
  public static final int DEF_OBJECT= ObjectSignatures.CUBE_3;
32 506f7ceb Leszek Koltunski
  private static RubikObjectList mThis;
33 a7d8c3cd Leszek Koltunski
  private static int mNumObjects;
34 fcf7320f Leszek Koltunski
  private static int mNumExtras;
35 a7d8c3cd Leszek Koltunski
  private static ArrayList<RubikObject> mObjects;
36 400ff34d Leszek Koltunski
  private static int mObject = DEF_OBJECT;
37 a7d8c3cd Leszek Koltunski
38 314e9ff0 Leszek Koltunski
  public static class DownloadedObject
39 506f7ceb Leszek Koltunski
    {
40
    String shortName;
41 298f3977 Leszek Koltunski
    boolean icon,object,extras,free;
42 84d746d7 Leszek Koltunski
    int numScrambles, objectMinor, extrasMinor;
43 506f7ceb Leszek Koltunski
44 298f3977 Leszek Koltunski
    DownloadedObject(String sName, int scrambles, boolean isFree, int oMinor, int eMinor, boolean i, boolean o, boolean e)
45 506f7ceb Leszek Koltunski
      {
46
      shortName = sName;
47 84d746d7 Leszek Koltunski
48
      numScrambles= scrambles;
49 298f3977 Leszek Koltunski
      free        = isFree;
50 84d746d7 Leszek Koltunski
      objectMinor = oMinor;
51
      extrasMinor = eMinor;
52
53 506f7ceb Leszek Koltunski
      icon   = i;
54
      object = o;
55
      extras = e;
56
      }
57
    }
58
59
  private static ArrayList<DownloadedObject> mDownloadedObjects;
60
61 a7d8c3cd Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
62
63
  private RubikObjectList()
64
    {
65 fcf7320f Leszek Koltunski
    mNumObjects= 0;
66
    mNumExtras = 0;
67 804293f0 Leszek Koltunski
68 506f7ceb Leszek Koltunski
    mObjects           = new ArrayList<>();
69
    mDownloadedObjects = new ArrayList<>();
70 a7d8c3cd Leszek Koltunski
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 d433b50e Leszek Koltunski
      RubikObject obj = new RubikObject(type);
82 a7d8c3cd Leszek Koltunski
      mObjects.add(obj);
83
      mNumObjects++;
84 804293f0 Leszek Koltunski
85 e847c553 Leszek Koltunski
      if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "creating local object "+type.name() );
86 84d746d7 Leszek Koltunski
87 314e9ff0 Leszek Koltunski
      if( obj.hasExtras() )
88 804293f0 Leszek Koltunski
        {
89 e847c553 Leszek Koltunski
        if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "has extras "+mNumExtras );
90 84d746d7 Leszek Koltunski
91 fcf7320f Leszek Koltunski
        obj.setExtrasOrdinal(mNumExtras);
92
        mNumExtras++;
93 84d746d7 Leszek Koltunski
        }
94
      else
95
        {
96 e847c553 Leszek Koltunski
        if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "no extras");
97 804293f0 Leszek Koltunski
        }
98 a7d8c3cd Leszek Koltunski
      }
99
    }
100
101 506f7ceb Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
102
103 84d746d7 Leszek Koltunski
  private static boolean internalAddDownloadedObject(DownloadedObject object)
104 506f7ceb Leszek Koltunski
    {
105 314e9ff0 Leszek Koltunski
    String name = object.shortName;
106
107
    for(RubikObject ro : mObjects )
108 84d746d7 Leszek Koltunski
      if( ro.getLowerName().equals(name) )
109 314e9ff0 Leszek Koltunski
        {
110 84d746d7 Leszek Koltunski
        return ro.updateObject(object);
111 314e9ff0 Leszek Koltunski
        }
112
113 84d746d7 Leszek Koltunski
    RubikObject obj = new RubikObject(object);
114
    mObjects.add(obj);
115
    mNumObjects++;
116
117 e847c553 Leszek Koltunski
    if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "creating downloaded object "+obj.getUpperName() );
118 84d746d7 Leszek Koltunski
119
    if( obj.hasExtras() )
120 314e9ff0 Leszek Koltunski
      {
121 e847c553 Leszek Koltunski
      if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "has extras "+mNumExtras );
122 506f7ceb Leszek Koltunski
123 84d746d7 Leszek Koltunski
      obj.setExtrasOrdinal(mNumExtras);
124
      mNumExtras++;
125
      }
126
    else
127
      {
128 e847c553 Leszek Koltunski
      if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "no extras");
129 314e9ff0 Leszek Koltunski
      }
130 84d746d7 Leszek Koltunski
131
    return true;
132 506f7ceb Leszek Koltunski
    }
133
134 a7d8c3cd Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
135
// PUBLIC API
136 806329e3 Leszek Koltunski
137 298f3977 Leszek Koltunski
  public static boolean addDownloadedObject(Context context, String shortName, int numScrambles, boolean isFree, int objectMinor,
138 81493402 Leszek Koltunski
                                         int extrasMinor, boolean icon, boolean object, boolean extras)
139 806329e3 Leszek Koltunski
    {
140 c89c3b1b Leszek Koltunski
    if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "New downloaded object "+shortName+" icon="+icon+" object="+object+" extras="+extras);
141
142 506f7ceb Leszek Koltunski
    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 c89c3b1b Leszek Koltunski
        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 506f7ceb Leszek Koltunski
158 41a5dd89 Leszek Koltunski
        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 ac1900c3 Leszek Koltunski
        return false;
169 506f7ceb Leszek Koltunski
        }
170
      }
171
172 c89c3b1b Leszek Koltunski
    if( !object ) objectMinor=-1;
173
    if( !extras ) extrasMinor=-1;
174
175 298f3977 Leszek Koltunski
    DownloadedObject obj = new DownloadedObject(shortName,numScrambles,isFree,objectMinor,extrasMinor,icon,object,extras);
176 c89c3b1b Leszek Koltunski
    if ( internalAddDownloadedObject(obj) )
177 84d746d7 Leszek Koltunski
      {
178 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);
179
      mDownloadedObjects.add(obj);
180 ac1900c3 Leszek Koltunski
      return true;
181 84d746d7 Leszek Koltunski
      }
182 81493402 Leszek Koltunski
    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 ac1900c3 Leszek Koltunski
      return false;
190 81493402 Leszek Koltunski
      }
191 806329e3 Leszek Koltunski
    }
192
193 f12e4de9 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
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 400ff34d Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
208
209
  public static void savePreferences(SharedPreferences.Editor editor)
210
    {
211 f12e4de9 Leszek Koltunski
    RubikObject obj = getObject(mObject);
212 84d746d7 Leszek Koltunski
    if( obj!=null ) editor.putString("rol_objName", obj.getUpperName() );
213 506f7ceb Leszek Koltunski
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 84d746d7 Leszek Koltunski
        downloadedObjects.append(object.numScrambles);
228
        downloadedObjects.append(' ');
229
        downloadedObjects.append(object.objectMinor);
230
        downloadedObjects.append(' ');
231
        downloadedObjects.append(object.extrasMinor);
232
        downloadedObjects.append(' ');
233 506f7ceb Leszek Koltunski
        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 298f3977 Leszek Koltunski
        downloadedObjects.append(' ');
239
        downloadedObjects.append(object.free ? "true":"false");
240 506f7ceb Leszek Koltunski
        }
241
242 84d746d7 Leszek Koltunski
      String objects = downloadedObjects.toString();
243 e847c553 Leszek Koltunski
      if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "saving: "+objects);
244 84d746d7 Leszek Koltunski
      editor.putString("rol_downloaded", objects );
245 506f7ceb Leszek Koltunski
      }
246 7e9139c1 Leszek Koltunski
    else
247
      {
248
      editor.putString("rol_downloaded", "" );
249
      }
250 f12e4de9 Leszek Koltunski
    }
251 400ff34d Leszek Koltunski
252 f12e4de9 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
253
254
  public static void saveMeshState(SharedPreferences.Editor editor)
255
    {
256
    for(int i=0; i<mNumObjects; i++)
257 400ff34d Leszek Koltunski
      {
258 f12e4de9 Leszek Koltunski
      RubikObject obj = getObject(i);
259
260
      if( obj!=null )
261
        {
262 84d746d7 Leszek Koltunski
        String name = obj.getUpperName();
263 f12e4de9 Leszek Koltunski
        editor.putInt("rol_"+name, obj.getMeshState() );
264
        }
265 400ff34d Leszek Koltunski
      }
266
    }
267
268
///////////////////////////////////////////////////////////////////////////////////////////////////
269
270 81493402 Leszek Koltunski
  public static void restorePreferences(Context context, SharedPreferences preferences)
271 400ff34d Leszek Koltunski
    {
272 526a5906 Leszek Koltunski
    if( mThis==null ) mThis = new RubikObjectList();
273
274 506f7ceb Leszek Koltunski
    String downloaded = preferences.getString("rol_downloaded","");
275
276 e847c553 Leszek Koltunski
    if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", downloaded);
277 506f7ceb Leszek Koltunski
278
    if( !downloaded.equals(""))
279
      {
280
      String[] dObjects = downloaded.split(",");
281
282
      for(String dObj : dObjects)
283
        {
284
        String[] parts = dObj.split(" ");
285 298f3977 Leszek Koltunski
        int length = parts.length;
286 506f7ceb Leszek Koltunski
287 298f3977 Leszek Koltunski
        if( length==7 || length==8 )
288 506f7ceb Leszek Koltunski
          {
289
          String name = parts[0];
290 84d746d7 Leszek Koltunski
          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 298f3977 Leszek Koltunski
          boolean isFree = (length==7 || Boolean.parseBoolean(parts[7]));
297 84d746d7 Leszek Koltunski
298
          int scrambles = Integer.parseInt(scra);
299
          int oMinor    = Integer.parseInt(objM);
300
          int eMinor    = Integer.parseInt(extM);
301 506f7ceb Leszek Koltunski
302
          boolean bIcon = icon.equals("1");
303
          boolean bObje = obje.equals("1");
304
          boolean bExtr = extr.equals("1");
305
306 298f3977 Leszek Koltunski
          addDownloadedObject(context,name,scrambles,isFree,oMinor,eMinor,bIcon,bObje,bExtr);
307 506f7ceb Leszek Koltunski
          }
308
        }
309
      }
310 d9d2c5fb Leszek Koltunski
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 400ff34d Leszek Koltunski
    }
317
318 f12e4de9 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
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 84d746d7 Leszek Koltunski
        String name  = obj.getUpperName();
329 f12e4de9 Leszek Koltunski
        int meshState= preferences.getInt("rol_"+name,MESH_NICE);
330
        obj.setMeshState(meshState);
331
        }
332
      }
333
    }
334
335 400ff34d Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
336
337 1088a219 Leszek Koltunski
  public static boolean setCurrObject(int ordinal)
338 400ff34d Leszek Koltunski
    {
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 69b66386 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
356
357
  public static String getCurrentName()
358
    {
359
    RubikObject object = mObjects.get(mObject);
360
    return object==null ? "" : object.getUpperName();
361
    }
362
363 d433b50e Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
364 a7d8c3cd Leszek Koltunski
365
  public static RubikObject getObject(int ordinal)
366
    {
367 506f7ceb Leszek Koltunski
    if( mThis==null ) mThis = new RubikObjectList();
368 a7d8c3cd Leszek Koltunski
    return ordinal>=0 && ordinal<mNumObjects ? mObjects.get(ordinal) : null;
369
    }
370
371 41a5dd89 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
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 a7d8c3cd Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
390
391
  public static int getNumObjects()
392
    {
393 506f7ceb Leszek Koltunski
    if( mThis==null ) mThis = new RubikObjectList();
394 a7d8c3cd Leszek Koltunski
    return mNumObjects;
395
    }
396
397
///////////////////////////////////////////////////////////////////////////////////////////////////
398
399
  public static int getOrdinal(String name)
400
    {
401 506f7ceb Leszek Koltunski
    if( mThis==null ) mThis = new RubikObjectList();
402 a7d8c3cd Leszek Koltunski
403 5e048300 Leszek Koltunski
    String lowerName = name.toLowerCase(Locale.ENGLISH);
404 84d746d7 Leszek Koltunski
405 a7d8c3cd Leszek Koltunski
    for(int i=0; i<mNumObjects; i++)
406
      {
407
      RubikObject obj = mObjects.get(i);
408 84d746d7 Leszek Koltunski
      if( obj.getLowerName().equals(lowerName) ) return i;
409 a7d8c3cd Leszek Koltunski
      }
410
411
    return -1;
412
    }
413 804293f0 Leszek Koltunski
414 fcf7320f Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
415
416
  public static int getNumExtrasObjects()
417
    {
418
    return mNumExtras;
419
    }
420
421 804293f0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
422
423
  public static int getNumTutorialObjects()
424
    {
425 fcf7320f Leszek Koltunski
    return mNumExtras;
426 804293f0 Leszek Koltunski
    }
427
428
///////////////////////////////////////////////////////////////////////////////////////////////////
429
430 fcf7320f Leszek Koltunski
  public static int getObjectOrdinal(int extrasOrdinal)
431 804293f0 Leszek Koltunski
    {
432 fcf7320f Leszek Koltunski
    for(int i=extrasOrdinal; i<mNumObjects; i++)
433 804293f0 Leszek Koltunski
      {
434
      RubikObject object = getObject(i);
435 fcf7320f Leszek Koltunski
      int extOrd = object!=null ? object.getExtrasOrdinal() : -1;
436
      if( extOrd==extrasOrdinal ) return i;
437 804293f0 Leszek Koltunski
      }
438
439
    return -1;
440
    }
441
442 fcf7320f Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
443
444
  public static int getExtrasOrdinal(int objectOrdinal)
445
    {
446
    RubikObject object = getObject(objectOrdinal);
447
    return object!=null ? object.getExtrasOrdinal() : -1;
448
    }
449
450 804293f0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
451
452
  public static int getTutorialOrdinal(int objectOrdinal)
453
    {
454
    RubikObject object = getObject(objectOrdinal);
455 fcf7320f Leszek Koltunski
    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 804293f0 Leszek Koltunski
    }
473 a7d8c3cd Leszek Koltunski
}