commit 9b763e1cbc1878534db1b2037d39be5fc39e62f5
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Mon Sep 5 12:27:56 2022 +0200

    Progress with marking objects as free

diff --git a/src/main/java/org/distorted/objects/RubikObject.java b/src/main/java/org/distorted/objects/RubikObject.java
index b1307b1b..0ef1e896 100644
--- a/src/main/java/org/distorted/objects/RubikObject.java
+++ b/src/main/java/org/distorted/objects/RubikObject.java
@@ -40,8 +40,8 @@ public class RubikObject
   private final String mLowerName, mUpperName;
   private final int mIconID;
   private final String[][] mPatterns;
-  private final boolean mIsFree;
 
+  private boolean mIsFree;
   private int mJsonID, mMeshID, mExtrasID;
   private int mObjectMinor, mExtrasMinor;
   private int mNumScramble;
@@ -221,6 +221,13 @@ public class RubikObject
     return mIsFree;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void markFree()
+    {
+    mIsFree = true;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public int getObjectMinor()
diff --git a/src/main/java/org/distorted/objects/RubikObjectList.java b/src/main/java/org/distorted/objects/RubikObjectList.java
index 9c009702..519f3cbc 100644
--- a/src/main/java/org/distorted/objects/RubikObjectList.java
+++ b/src/main/java/org/distorted/objects/RubikObjectList.java
@@ -57,6 +57,8 @@ public class RubikObjectList
     }
 
   private static ArrayList<DownloadedObject> mDownloadedObjects;
+  private static String mFreeSolvedObjects;
+  private static String mFreeBoughtObjects;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -204,6 +206,67 @@ public class RubikObjectList
     return (ordinal>=0 && ordinal<mNumObjects) ? mObjects.get(ordinal).getMeshState() : MESH_NICE;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public static void saveMeshState(SharedPreferences.Editor editor)
+    {
+    for(int i=0; i<mNumObjects; i++)
+      {
+      RubikObject obj = getObject(i);
+
+      if( obj!=null )
+        {
+        String name = obj.getUpperName();
+        editor.putInt("rol_"+name, obj.getMeshState() );
+        }
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public static void buyAll()
+    {
+    mFreeBoughtObjects = "*";
+
+    for(int i=0; i<mNumObjects; i++)
+      {
+      RubikObject o = mObjects.get(i);
+      o.markFree();
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public static boolean buyObject(String shortName)
+    {
+    RubikObject o = getObject(shortName);
+
+    if( o!=null && !o.isFree() )
+      {
+      o.markFree();
+      mFreeBoughtObjects += (","+shortName);
+      return true;
+      }
+
+    return false;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public static boolean solveObject(String shortName)
+    {
+    RubikObject o = getObject(shortName);
+
+    if( o!=null && !o.isFree() )
+      {
+      o.markFree();
+      mFreeSolvedObjects += (","+shortName);
+      return true;
+      }
+
+    return false;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public static void savePreferences(SharedPreferences.Editor editor)
@@ -247,22 +310,9 @@ public class RubikObjectList
       {
       editor.putString("rol_downloaded", "" );
       }
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public static void saveMeshState(SharedPreferences.Editor editor)
-    {
-    for(int i=0; i<mNumObjects; i++)
-      {
-      RubikObject obj = getObject(i);
-
-      if( obj!=null )
-        {
-        String name = obj.getUpperName();
-        editor.putInt("rol_"+name, obj.getMeshState() );
-        }
-      }
+    editor.putString("rol_freeSolved", mFreeSolvedObjects);
+    editor.putString("rol_freeBought", mFreeBoughtObjects);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -313,6 +363,42 @@ public class RubikObjectList
     String objName= preferences.getString("rol_objName",defName);
     mObject = getOrdinal(objName);
     if( mObject<0 || mObject>=mNumObjects ) mObject = DEF_OBJECT;
+
+    mFreeSolvedObjects = preferences.getString("rol_freeSolved", "");
+    mFreeBoughtObjects = preferences.getString("rol_freeBought", "");
+
+    if( mFreeBoughtObjects.length()>0 )
+      {
+      if( mFreeBoughtObjects.charAt(0)=='*' )
+        {
+        for(int i=0; i<mNumObjects; i++)
+          {
+          RubikObject o = mObjects.get(i);
+          o.markFree();
+          }
+        }
+      else
+        {
+        String[] objs = mFreeBoughtObjects.split(",");
+
+        for( String obj : objs )
+          {
+          RubikObject o = getObject(obj);
+          if( o!=null ) o.markFree();
+          }
+        }
+      }
+
+    if( mFreeSolvedObjects.length()>0 )
+      {
+      String[] objs = mFreeSolvedObjects.split(",");
+
+      for( String obj : objs )
+        {
+        RubikObject o = getObject(obj);
+        if( o!=null ) o.markFree();
+        }
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
