commit 0ad6b867a47de193c73802bfc0f020e7349107c8
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Mon Aug 30 17:02:09 2021 +0200

    Convert Skewb Ultimate, Jing Pyraminx & Ivy Cube to the new, unified scrambling method.

diff --git a/src/main/java/org/distorted/objects/TwistyBandaged2Bar.java b/src/main/java/org/distorted/objects/TwistyBandaged2Bar.java
index b2c59f17..b198def0 100644
--- a/src/main/java/org/distorted/objects/TwistyBandaged2Bar.java
+++ b/src/main/java/org/distorted/objects/TwistyBandaged2Bar.java
@@ -28,8 +28,6 @@ import org.distorted.library.mesh.MeshSquare;
 import org.distorted.library.type.Static4D;
 import org.distorted.main.R;
 
-import java.util.Random;
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 class TwistyBandaged2Bar extends TwistyBandagedAbstract
diff --git a/src/main/java/org/distorted/objects/TwistyBandaged3Plate.java b/src/main/java/org/distorted/objects/TwistyBandaged3Plate.java
index 24efdfe4..5e5597e1 100644
--- a/src/main/java/org/distorted/objects/TwistyBandaged3Plate.java
+++ b/src/main/java/org/distorted/objects/TwistyBandaged3Plate.java
@@ -28,8 +28,6 @@ import org.distorted.library.type.Static4D;
 import org.distorted.helpers.ScrambleStateGraph;
 import org.distorted.main.R;
 
-import java.util.Random;
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 class TwistyBandaged3Plate extends TwistyBandagedAbstract
diff --git a/src/main/java/org/distorted/objects/TwistyBandagedEvil.java b/src/main/java/org/distorted/objects/TwistyBandagedEvil.java
index b03be895..b762584f 100644
--- a/src/main/java/org/distorted/objects/TwistyBandagedEvil.java
+++ b/src/main/java/org/distorted/objects/TwistyBandagedEvil.java
@@ -28,8 +28,6 @@ import org.distorted.library.mesh.MeshSquare;
 import org.distorted.library.type.Static4D;
 import org.distorted.main.R;
 
-import java.util.Random;
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 class TwistyBandagedEvil extends TwistyBandagedAbstract
diff --git a/src/main/java/org/distorted/objects/TwistyBandagedFused.java b/src/main/java/org/distorted/objects/TwistyBandagedFused.java
index ffe23986..3850b8f5 100644
--- a/src/main/java/org/distorted/objects/TwistyBandagedFused.java
+++ b/src/main/java/org/distorted/objects/TwistyBandagedFused.java
@@ -28,8 +28,6 @@ import org.distorted.library.mesh.MeshSquare;
 import org.distorted.library.type.Static4D;
 import org.distorted.main.R;
 
-import java.util.Random;
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 class TwistyBandagedFused extends TwistyBandagedAbstract
@@ -74,14 +72,11 @@ class TwistyBandagedFused extends TwistyBandagedAbstract
     {
     super(size, quat, texture, mesh, effects, moves, ObjectList.BAN1, res, scrWidth);
 
+    int[] tmp = {0,-1,0, 0,1,0, 0,2,0, 2,-1,0, 2,1,0, 2,2,0};
+
     mStates = new ScrambleStateGraph[]
       {
-      new ScrambleStateGraph( new int[][] {
-                                           {0,-1,0, 0,1,0, 0,2,0, 2,-1,0, 2,1,0, 2,2,0},
-                                           {0,-1,0, 0,1,0, 0,2,0, 2,-1,0, 2,1,0, 2,2,0},
-                                           {0,-1,0, 0,1,0, 0,2,0, 2,-1,0, 2,1,0, 2,2,0},
-                                          }
-                            )
+      new ScrambleStateGraph( new int[][] {tmp,tmp,tmp} )
       };
     }
 
diff --git a/src/main/java/org/distorted/objects/TwistyIvy.java b/src/main/java/org/distorted/objects/TwistyIvy.java
index 2b0521b6..434da856 100644
--- a/src/main/java/org/distorted/objects/TwistyIvy.java
+++ b/src/main/java/org/distorted/objects/TwistyIvy.java
@@ -23,6 +23,7 @@ import android.content.res.Resources;
 
 import org.distorted.helpers.ObjectShape;
 import org.distorted.helpers.ObjectSticker;
+import org.distorted.helpers.ScrambleStateGraph;
 import org.distorted.library.main.DistortedEffects;
 import org.distorted.library.main.DistortedTexture;
 import org.distorted.library.mesh.MeshSquare;
@@ -116,12 +117,23 @@ public class TwistyIvy extends TwistyObject
       }
     }
 
+  private int mCurrState;
+  private int mIndexExcluded;
+  private final ScrambleStateGraph[] mStates;
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   TwistyIvy(int size, Static4D quat, DistortedTexture texture,
             MeshSquare mesh, DistortedEffects effects, int[][] moves, Resources res, int scrWidth)
     {
     super(size, size, quat, texture, mesh, effects, moves, ObjectList.IVY, res, scrWidth);
+
+    int[] tmp = {0,-1,0, 0,1,0, 1,-1,0, 1,1,0 };
+
+    mStates = new ScrambleStateGraph[]
+      {
+      new ScrambleStateGraph( new int[][] {tmp,tmp,tmp,tmp} )
+      };
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -450,25 +462,24 @@ public class TwistyIvy extends TwistyObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void randomizeNewScramble(int[][] scramble, Random rnd, int curr, int total)
+  public void randomizeNewScramble(int[][] scramble, Random rnd, int curr, int totalScrambles)
     {
     if( curr==0 )
       {
-      scramble[curr][0] = rnd.nextInt(NUM_AXIS);
-      }
-    else
-      {
-      int newVector = rnd.nextInt(NUM_AXIS -1);
-      scramble[curr][0] = (newVector>=scramble[curr-1][0] ? newVector+1 : newVector);
+      mCurrState     = 0;
+      mIndexExcluded =-1;
       }
 
-    scramble[curr][1] = rnd.nextFloat()<=0.5f ? 0 : 1;
+    int total = mStates[mCurrState].getTotal(mIndexExcluded);
+    int random= rnd.nextInt(total);
+    int[] info= mStates[mCurrState].getInfo(random,mIndexExcluded);
 
-    switch( rnd.nextInt(2) )
-      {
-      case 0: scramble[curr][2] = -1; break;
-      case 1: scramble[curr][2] =  1; break;
-      }
+    scramble[curr][0] = info[0];
+    scramble[curr][1] = info[1];
+    scramble[curr][2] = info[2];
+
+    mCurrState     = info[3];
+    mIndexExcluded = info[0];
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistyJing.java b/src/main/java/org/distorted/objects/TwistyJing.java
index 8031400a..2f01aa40 100644
--- a/src/main/java/org/distorted/objects/TwistyJing.java
+++ b/src/main/java/org/distorted/objects/TwistyJing.java
@@ -23,6 +23,7 @@ import android.content.res.Resources;
 
 import org.distorted.helpers.ObjectShape;
 import org.distorted.helpers.ObjectSticker;
+import org.distorted.helpers.ScrambleStateGraph;
 import org.distorted.library.main.DistortedEffects;
 import org.distorted.library.main.DistortedTexture;
 import org.distorted.library.mesh.MeshSquare;
@@ -215,12 +216,23 @@ public class TwistyJing extends TwistyObject
       }
     }
 
+  private int mCurrState;
+  private int mIndexExcluded;
+  private final ScrambleStateGraph[] mStates;
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   TwistyJing(int size, Static4D quat, DistortedTexture texture, MeshSquare mesh,
              DistortedEffects effects, int[][] moves, Resources res, int scrWidth)
     {
     super(size, size, quat, texture, mesh, effects, moves, ObjectList.JING, res, scrWidth);
+
+    int[] tmp = {0,-1,0, 0,1,0, 1,-1,0, 1,1,0 };
+
+    mStates = new ScrambleStateGraph[]
+      {
+      new ScrambleStateGraph( new int[][] {tmp,tmp,tmp,tmp} )
+      };
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -400,25 +412,24 @@ public class TwistyJing extends TwistyObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void randomizeNewScramble(int[][] scramble, Random rnd, int curr, int total)
+  public void randomizeNewScramble(int[][] scramble, Random rnd, int curr, int totalScrambles)
     {
     if( curr==0 )
       {
-      scramble[curr][0] = rnd.nextInt(NUM_AXIS);
-      }
-    else
-      {
-      int newVector = rnd.nextInt(NUM_AXIS-1);
-      scramble[curr][0] = (newVector>=scramble[curr-1][0] ? newVector+1 : newVector);
+      mCurrState     = 0;
+      mIndexExcluded =-1;
       }
 
-    scramble[curr][1] = rnd.nextInt(2);
+    int total = mStates[mCurrState].getTotal(mIndexExcluded);
+    int random= rnd.nextInt(total);
+    int[] info= mStates[mCurrState].getInfo(random,mIndexExcluded);
 
-    switch( rnd.nextInt(2) )
-      {
-      case 0: scramble[curr][2] = -1; break;
-      case 1: scramble[curr][2] =  1; break;
-      }
+    scramble[curr][0] = info[0];
+    scramble[curr][1] = info[1];
+    scramble[curr][2] = info[2];
+
+    mCurrState     = info[3];
+    mIndexExcluded = info[0];
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistyUltimate.java b/src/main/java/org/distorted/objects/TwistyUltimate.java
index 275acdf6..51df5987 100644
--- a/src/main/java/org/distorted/objects/TwistyUltimate.java
+++ b/src/main/java/org/distorted/objects/TwistyUltimate.java
@@ -23,6 +23,7 @@ import android.content.res.Resources;
 
 import org.distorted.helpers.ObjectShape;
 import org.distorted.helpers.ObjectSticker;
+import org.distorted.helpers.ScrambleStateGraph;
 import org.distorted.library.main.DistortedEffects;
 import org.distorted.library.main.DistortedTexture;
 import org.distorted.library.mesh.MeshSquare;
@@ -232,12 +233,23 @@ class TwistyUltimate extends TwistyObject
       }
     }
 
+  private int mCurrState;
+  private int mIndexExcluded;
+  private final ScrambleStateGraph[] mStates;
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   TwistyUltimate(int size, Static4D quat, DistortedTexture texture,
                  MeshSquare mesh, DistortedEffects effects, int[][] moves, Resources res, int scrWidth)
     {
     super(size, size, quat, texture, mesh, effects, moves, ObjectList.ULTI, res, scrWidth);
+
+    int[] tmp = {0,-1,0, 0,1,0, 1,-1,0, 1,1,0 };
+
+    mStates = new ScrambleStateGraph[]
+      {
+      new ScrambleStateGraph( new int[][] {tmp,tmp,tmp,tmp} )
+      };
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -416,25 +428,24 @@ class TwistyUltimate extends TwistyObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void randomizeNewScramble(int[][] scramble, Random rnd, int curr, int total)
+  public void randomizeNewScramble(int[][] scramble, Random rnd, int curr, int totalScrambles)
     {
     if( curr==0 )
       {
-      scramble[curr][0] = rnd.nextInt(NUM_AXIS);
-      }
-    else
-      {
-      int newVector = rnd.nextInt(NUM_AXIS -1);
-      scramble[curr][0] = (newVector>=scramble[curr-1][0] ? newVector+1 : newVector);
+      mCurrState     = 0;
+      mIndexExcluded =-1;
       }
 
-    scramble[curr][1] = rnd.nextFloat()<=0.5f ? 0 : 1;
+    int total = mStates[mCurrState].getTotal(mIndexExcluded);
+    int random= rnd.nextInt(total);
+    int[] info= mStates[mCurrState].getInfo(random,mIndexExcluded);
 
-    switch( rnd.nextInt(2) )
-      {
-      case 0: scramble[curr][2] =  1; break;
-      case 1: scramble[curr][2] = -1; break;
-      }
+    scramble[curr][0] = info[0];
+    scramble[curr][1] = info[1];
+    scramble[curr][2] = info[2];
+
+    mCurrState     = info[3];
+    mIndexExcluded = info[0];
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
