Project

General

Profile

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

magiccube / src / main / java / org / distorted / objects / RubikObjectList.java @ 314e9ff0

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2021 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// Magic Cube is free software: you can redistribute it and/or modify                            //
7
// it under the terms of the GNU General Public License as published by                          //
8
// the Free Software Foundation, either version 2 of the License, or                             //
9
// (at your option) any later version.                                                           //
10
//                                                                                               //
11
// Magic Cube is distributed in the hope that it will be useful,                                 //
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
14
// GNU General Public License for more details.                                                  //
15
//                                                                                               //
16
// You should have received a copy of the GNU General Public License                             //
17
// along with Magic Cube.  If not, see <http://www.gnu.org/licenses/>.                           //
18
///////////////////////////////////////////////////////////////////////////////////////////////////
19

    
20
package org.distorted.objects;
21

    
22
import java.util.ArrayList;
23

    
24
import android.content.SharedPreferences;
25

    
26
import org.distorted.main.RubikActivity;
27
import org.distorted.objectlib.main.ObjectConstants;
28
import org.distorted.objectlib.main.ObjectType;
29
import org.distorted.screens.RubikScreenPlay;
30
import org.distorted.screens.ScreenList;
31

    
32
import static org.distorted.objectlib.main.TwistyObject.MESH_NICE;
33
import static org.distorted.objectlib.main.ObjectType.NUM_OBJECTS;
34

    
35
///////////////////////////////////////////////////////////////////////////////////////////////////
36

    
37
public class RubikObjectList
38
{
39
  public static final int DEF_OBJECT= ObjectConstants.CUBE_3;
40
  public static int MAX_LEVEL;
41

    
42
  private static RubikObjectList mThis;
43
  private static int mNumObjects;
44
  private static int mNumExtras;
45
  private static ArrayList<RubikObject> mObjects;
46
  private static int mObject = DEF_OBJECT;
47

    
48
  public static class DownloadedObject
49
    {
50
    String shortName;
51
    boolean icon,object,extras;
52

    
53
    DownloadedObject(String sName, boolean i, boolean o, boolean e)
54
      {
55
      shortName = sName;
56
      icon   = i;
57
      object = o;
58
      extras = e;
59
      }
60
    }
61

    
62
  private static ArrayList<DownloadedObject> mDownloadedObjects;
63

    
64
  static
65
    {
66
    int max = Integer.MIN_VALUE;
67

    
68
    for (int i=0; i<NUM_OBJECTS; i++)
69
      {
70
      int cur = getDBLevel(i);
71
      if( cur>max ) max = cur;
72
      }
73

    
74
    MAX_LEVEL = max;
75
    }
76

    
77
///////////////////////////////////////////////////////////////////////////////////////////////////
78

    
79
  private RubikObjectList()
80
    {
81
    mNumObjects= 0;
82
    mNumExtras = 0;
83

    
84
    mObjects           = new ArrayList<>();
85
    mDownloadedObjects = new ArrayList<>();
86

    
87
    createBuiltinObjects();
88
    }
89

    
90
///////////////////////////////////////////////////////////////////////////////////////////////////
91

    
92
  private void createBuiltinObjects()
93
    {
94
    for(int i=0; i<NUM_OBJECTS; i++)
95
      {
96
      ObjectType type = ObjectType.getObject(i);
97
      RubikObject obj = new RubikObject(type);
98
      mObjects.add(obj);
99
      mNumObjects++;
100

    
101
      if( obj.hasExtras() )
102
        {
103
        obj.setExtrasOrdinal(mNumExtras);
104
        mNumExtras++;
105
        }
106
      }
107
    }
108

    
109
///////////////////////////////////////////////////////////////////////////////////////////////////
110

    
111
  private static void internalAddDownloadedObject(DownloadedObject object)
112
    {
113
    /*
114
    boolean existsAlready = false;
115
    String name = object.shortName;
116

    
117
    for(RubikObject ro : mObjects )
118
      if( ro.getName().equals(name) )
119
        {
120
        ro.updateObject(object);
121
        existsAlready = true;
122
        break;
123
        }
124

    
125
    if( !existsAlready )
126
      {
127
      RubikObject obj = new RubikObject(object);
128
      mObjects.add(obj);
129
      mNumObjects++;
130

    
131
      if( obj.getExtrasJsonID()!=0 )
132
        {
133
        obj.setExtrasOrdinal(mNumExtras);
134
        mNumExtras++;
135
        }
136
      }
137
     */
138
    }
139

    
140
///////////////////////////////////////////////////////////////////////////////////////////////////
141
// PUBLIC API
142
///////////////////////////////////////////////////////////////////////////////////////////////////
143
// historically older versions of the app had lower 'maxScrambles' in case of several objects and
144
// those got remembered in the server-side DB already, so we need to keep using them. This function
145
// provides a map between 'maxScramble' of an object and its 'dbLevel'. All new objects will have
146
// those two values the same.
147

    
148
  public static int getDBLevel(int ordinal)
149
    {
150
    if( ordinal==ObjectConstants.CUBE_3 ) return 16;
151
    if( ordinal==ObjectConstants.CUBE_4 ) return 20;
152
    if( ordinal==ObjectConstants.CUBE_5 ) return 24;
153
    if( ordinal==ObjectConstants.PYRA_4 ) return 15;
154
    if( ordinal==ObjectConstants.PYRA_5 ) return 20;
155
    if( ordinal==ObjectConstants.MEGA_5 ) return 35;
156
    if( ordinal==ObjectConstants.DIAM_2 ) return 10;
157
    if( ordinal==ObjectConstants.DIAM_3 ) return 18;
158
    if( ordinal==ObjectConstants.REDI_3 ) return 14;
159
    if( ordinal==ObjectConstants.HELI_3 ) return 18;
160
    if( ordinal==ObjectConstants.SKEW_3 ) return 17;
161
    if( ordinal==ObjectConstants.REX_3  ) return 16;
162
    if( ordinal==ObjectConstants.MIRR_3 ) return 16;
163

    
164
    ObjectType type = ObjectType.getObject(ordinal);
165
    return type.getNumScramble();
166
    }
167

    
168
///////////////////////////////////////////////////////////////////////////////////////////////////
169

    
170
  public static void addDownloadedObject(String shortName, boolean icon, boolean object, boolean extras)
171
    {
172
    for( DownloadedObject obj : mDownloadedObjects )
173
      {
174
      if( obj.shortName.equals(shortName) )
175
        {
176
        obj.icon  |= icon;
177
        obj.object|= object;
178
        obj.extras|= extras;
179

    
180
        android.util.Log.e("D", "UPDATING "+shortName);
181

    
182
        return;
183
        }
184
      }
185

    
186
    DownloadedObject extra = new DownloadedObject(shortName,icon,object,extras);
187
    mDownloadedObjects.add(extra);
188

    
189
    internalAddDownloadedObject(extra);
190
    }
191

    
192
///////////////////////////////////////////////////////////////////////////////////////////////////
193

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

    
199
///////////////////////////////////////////////////////////////////////////////////////////////////
200

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

    
206
///////////////////////////////////////////////////////////////////////////////////////////////////
207

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

    
213
    int numDownloaded = mDownloadedObjects.size();
214

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

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

    
223
        DownloadedObject object = mDownloadedObjects.get(i);
224
        downloadedObjects.append(object.shortName);
225
        downloadedObjects.append(' ');
226
        downloadedObjects.append(object.icon   ? "1":"0");
227
        downloadedObjects.append(' ');
228
        downloadedObjects.append(object.object ? "1":"0");
229
        downloadedObjects.append(' ');
230
        downloadedObjects.append(object.extras ? "1":"0");
231
        }
232

    
233
      editor.putString("rol_downloaded", downloadedObjects.toString() );
234
      }
235
    }
236

    
237
///////////////////////////////////////////////////////////////////////////////////////////////////
238

    
239
  public static void saveMeshState(SharedPreferences.Editor editor)
240
    {
241
    for(int i=0; i<mNumObjects; i++)
242
      {
243
      RubikObject obj = getObject(i);
244

    
245
      if( obj!=null )
246
        {
247
        String name = obj.getName();
248
        editor.putInt("rol_"+name, obj.getMeshState() );
249
        }
250
      }
251
    }
252

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

    
255
  public static void restorePreferences(SharedPreferences preferences)
256
    {
257
    RubikObject object = getObject(DEF_OBJECT);
258
    String defName = object==null ? "CUBE_3" : object.getName();
259
    String objName= preferences.getString("rol_objName",defName);
260
    mObject = getOrdinal(objName);
261

    
262
    if( mObject<0 || mObject>=mNumObjects ) mObject = DEF_OBJECT;
263

    
264
    String downloaded = preferences.getString("rol_downloaded","");
265

    
266
    android.util.Log.e("D", downloaded);
267

    
268
    if( !downloaded.equals(""))
269
      {
270
      String[] dObjects = downloaded.split(",");
271

    
272
      for(String dObj : dObjects)
273
        {
274
        String[] parts = dObj.split(" ");
275

    
276
        if( parts.length==4 )
277
          {
278
          String name = parts[0];
279
          String icon = parts[1];
280
          String obje = parts[2];
281
          String extr = parts[3];
282

    
283
          boolean bIcon = icon.equals("1");
284
          boolean bObje = obje.equals("1");
285
          boolean bExtr = extr.equals("1");
286

    
287
          android.util.Log.e("D", "adding: "+name);
288

    
289
          addDownloadedObject(name,bIcon,bObje,bExtr);
290
          }
291
        }
292
      }
293
    }
294

    
295
///////////////////////////////////////////////////////////////////////////////////////////////////
296

    
297
  public static void restoreMeshState(SharedPreferences preferences)
298
    {
299
    for(int i=0; i<mNumObjects; i++)
300
      {
301
      RubikObject obj = getObject(i);
302

    
303
      if( obj!=null )
304
        {
305
        String name  = obj.getName();
306
        int meshState= preferences.getInt("rol_"+name,MESH_NICE);
307
        obj.setMeshState(meshState);
308
        }
309
      }
310
    }
311

    
312
///////////////////////////////////////////////////////////////////////////////////////////////////
313

    
314
  public static boolean setCurrObject(RubikActivity act, int ordinal)
315
    {
316
    if( mObject!=ordinal )
317
      {
318
      mObject = ordinal;
319
      RubikScreenPlay play = (RubikScreenPlay) ScreenList.PLAY.getScreenClass();
320
      play.setCurrObject(act);
321
      return true;
322
      }
323

    
324
    return false;
325
    }
326

    
327
///////////////////////////////////////////////////////////////////////////////////////////////////
328

    
329
  public static int getCurrObject()
330
    {
331
    return mObject;
332
    }
333

    
334
///////////////////////////////////////////////////////////////////////////////////////////////////
335

    
336
  public static RubikObject getObject(int ordinal)
337
    {
338
    if( mThis==null ) mThis = new RubikObjectList();
339
    return ordinal>=0 && ordinal<mNumObjects ? mObjects.get(ordinal) : null;
340
    }
341

    
342
///////////////////////////////////////////////////////////////////////////////////////////////////
343

    
344
  public static int getNumObjects()
345
    {
346
    if( mThis==null ) mThis = new RubikObjectList();
347
    return mNumObjects;
348
    }
349

    
350
///////////////////////////////////////////////////////////////////////////////////////////////////
351

    
352
  public static int getOrdinal(String name)
353
    {
354
    if( mThis==null ) mThis = new RubikObjectList();
355

    
356
    for(int i=0; i<mNumObjects; i++)
357
      {
358
      RubikObject obj = mObjects.get(i);
359

    
360
      if( obj.getName().equals(name) ) return i;
361
      }
362

    
363
    return -1;
364
    }
365

    
366
///////////////////////////////////////////////////////////////////////////////////////////////////
367

    
368
  public static int getNumExtrasObjects()
369
    {
370
    return mNumExtras;
371
    }
372

    
373
///////////////////////////////////////////////////////////////////////////////////////////////////
374

    
375
  public static int getNumTutorialObjects()
376
    {
377
    return mNumExtras;
378
    }
379

    
380
///////////////////////////////////////////////////////////////////////////////////////////////////
381

    
382
  public static int getObjectOrdinal(int extrasOrdinal)
383
    {
384
    for(int i=extrasOrdinal; i<mNumObjects; i++)
385
      {
386
      RubikObject object = getObject(i);
387
      int extOrd = object!=null ? object.getExtrasOrdinal() : -1;
388
      if( extOrd==extrasOrdinal ) return i;
389
      }
390

    
391
    return -1;
392
    }
393

    
394
///////////////////////////////////////////////////////////////////////////////////////////////////
395

    
396
  public static int getExtrasOrdinal(int objectOrdinal)
397
    {
398
    RubikObject object = getObject(objectOrdinal);
399
    return object!=null ? object.getExtrasOrdinal() : -1;
400
    }
401

    
402
///////////////////////////////////////////////////////////////////////////////////////////////////
403

    
404
  public static int getTutorialOrdinal(int objectOrdinal)
405
    {
406
    RubikObject object = getObject(objectOrdinal);
407
    return object!=null ? object.getExtrasOrdinal() : -1;
408
    }
409

    
410
///////////////////////////////////////////////////////////////////////////////////////////////////
411

    
412
  public static int getLocalObjectMinor(int objectOrdinal)
413
    {
414
    RubikObject object = getObject(objectOrdinal);
415
    return object!=null ? object.getObjectMinor() : -1;
416
    }
417

    
418
///////////////////////////////////////////////////////////////////////////////////////////////////
419

    
420
  public static int getLocalExtrasMinor(int objectOrdinal)
421
    {
422
    RubikObject object = getObject(objectOrdinal);
423
    return object!=null ? object.getExtrasMinor() : -1;
424
    }
425
}
(2-2/2)