commit 5043d5d01ca4daac675018e83c816c459dd926aa
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Sun Mar 21 00:44:02 2021 +0100

    Refactor the automatic scrambling. From now on, it is not needed to care about single and double turns when randomizing a new turn.

diff --git a/src/main/java/org/distorted/effects/scramble/ScrambleEffect.java b/src/main/java/org/distorted/effects/scramble/ScrambleEffect.java
index a310a58e..12855f4e 100644
--- a/src/main/java/org/distorted/effects/scramble/ScrambleEffect.java
+++ b/src/main/java/org/distorted/effects/scramble/ScrambleEffect.java
@@ -26,6 +26,7 @@ import org.distorted.library.main.DistortedScreen;
 import org.distorted.library.message.EffectListener;
 import org.distorted.main.RubikPreRender;
 import org.distorted.effects.EffectController;
+import org.distorted.objects.ObjectList;
 import org.distorted.objects.TwistyObject;
 
 import java.lang.reflect.Method;
@@ -64,13 +65,9 @@ public abstract class ScrambleEffect extends BaseEffect implements EffectListene
       }
     }
 
-  private static final int START_AXIS = -2;
-  private static final int STOP_AXIS  = -1;
-
   private EffectController mController;
   private int mEffectReturned;
   private int mNumDoubleScramblesLeft, mNumScramblesLeft;
-  private int mLastRotAxis, mLastRow;
   private long mDurationSingleTurn;
   private final Random mRnd;
   private int mBasicAngle;
@@ -82,15 +79,14 @@ public abstract class ScrambleEffect extends BaseEffect implements EffectListene
   int[] mCubeEffectPosition;
   int mCubeEffectNumber, mNodeEffectNumber;
   int mNumScrambles;
-  int[] mScramble;
+  int[][] mScrambles;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   ScrambleEffect()
     {
     mRnd = new Random( System.currentTimeMillis() );
-    mScramble = new int[3];
-    mLastRotAxis = START_AXIS;
+    mScrambles = new int[ObjectList.MAX_LEVEL][3];
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -111,20 +107,13 @@ public abstract class ScrambleEffect extends BaseEffect implements EffectListene
   private void createBaseEffects(int duration, int numScrambles)
     {
     mNumScramblesLeft = numScrambles;
-
     mNumDoubleScramblesLeft=0;
 
-    if( mBasicAngle>=4 )
+    for(int scramble=0; scramble<mNumScramblesLeft; scramble++)
       {
-      int chance = mBasicAngle==4 ? 3:2;
-
-      for(int i=0; i<numScrambles; i++)
-        {
-        if( (mRnd.nextInt() % chance) == 0 )
-          {
-          mNumDoubleScramblesLeft++;
-          }
-        }
+      mObject.randomizeNewScramble(mScrambles, mRnd, scramble);
+      int angle = mScrambles[scramble][2];
+      if( angle==2 || angle==-2 ) mNumDoubleScramblesLeft++;
       }
 
     mDurationSingleTurn = duration/(mNumScramblesLeft+mNumDoubleScramblesLeft);
@@ -140,15 +129,11 @@ public abstract class ScrambleEffect extends BaseEffect implements EffectListene
     {
     if( mNumScramblesLeft>0 )
       {
-      mNumScrambles++;
-
-      mObject.randomizeNewScramble(mScramble, mRnd,mLastRotAxis, mLastRow, mNumScrambles,
-                                  mNumScramblesLeft, mNumDoubleScramblesLeft);
-      mLastRotAxis = mScramble[0];
-      mLastRow     = mScramble[1];
-      int angle    = mScramble[2];
+      int axis = mScrambles[mNumScrambles][0];
+      int row  = mScrambles[mNumScrambles][1];
+      int angle= mScrambles[mNumScrambles][2];
 
-      int rowBitmap  = (1<<mLastRow);
+      int rowBitmap  = (1<<row);
       int absAngle = (angle<0 ? -angle : angle);
       long durationMillis = absAngle*mDurationSingleTurn;
 
@@ -160,12 +145,12 @@ public abstract class ScrambleEffect extends BaseEffect implements EffectListene
         android.util.Log.e("effect", "ERROR: "+mNumDoubleScramblesLeft);
         }
 
-      mController.addRotation(this, mLastRotAxis, rowBitmap, angle*(360/mBasicAngle), durationMillis);
+      mController.addRotation(this, axis, rowBitmap, angle*(360/mBasicAngle), durationMillis);
+
+      mNumScrambles++;
       }
     else
       {
-      mLastRotAxis = STOP_AXIS;
-
       if( mEffectReturned == mCubeEffectNumber+mNodeEffectNumber )
         {
         mController.effectFinished(FAKE_EFFECT_ID);
diff --git a/src/main/java/org/distorted/objects/TwistyBandaged2Bar.java b/src/main/java/org/distorted/objects/TwistyBandaged2Bar.java
index bea33921..5d4a193c 100644
--- a/src/main/java/org/distorted/objects/TwistyBandaged2Bar.java
+++ b/src/main/java/org/distorted/objects/TwistyBandaged2Bar.java
@@ -101,17 +101,16 @@ class TwistyBandaged2Bar extends TwistyBandagedAbstract
 // PUBLIC API
 // TODO
 
-  public void randomizeNewScramble(int[] scramble, Random rnd, int oldRotAxis, int oldRow,
-                                   int numScramble, int remScrambles, int remDoubleScrambles)
+  public void randomizeNewScramble(int[][] scramble, Random rnd, int num)
     {
-    if( numScramble==1 )
+    if( num==0 )
       {
-      scramble[0] = rnd.nextInt(ROTATION_AXIS.length);
+      scramble[num][0] = rnd.nextInt(ROTATION_AXIS.length);
       }
     else
       {
       int newVector = rnd.nextInt(ROTATION_AXIS.length-1);
-      scramble[0] = (newVector>=oldRotAxis ? newVector+1 : newVector);
+      scramble[num][0] = (newVector>=scramble[num-1][0] ? newVector+1 : newVector);
       }
 
     float rowFloat = rnd.nextFloat();
@@ -120,16 +119,18 @@ class TwistyBandaged2Bar extends TwistyBandagedAbstract
       {
       if( rowFloat<=mRowChances[row] )
         {
-        scramble[1] = row;
+        scramble[num][1] = row;
         break;
         }
       }
 
-    int random = rnd.nextInt(remScrambles);
-    int result = random<remDoubleScrambles ? 2:1;
-    int sign   = rnd.nextInt(2);
-
-    scramble[2] = sign==0 ? result : -result;
+    switch( rnd.nextInt(4) )
+      {
+      case 0: scramble[num][2] = -2; break;
+      case 1: scramble[num][2] = -1; break;
+      case 2: scramble[num][2] =  1; break;
+      case 3: scramble[num][2] =  2; break;
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistyBandaged3Plate.java b/src/main/java/org/distorted/objects/TwistyBandaged3Plate.java
index 8fed7e19..0158d8e2 100644
--- a/src/main/java/org/distorted/objects/TwistyBandaged3Plate.java
+++ b/src/main/java/org/distorted/objects/TwistyBandaged3Plate.java
@@ -107,17 +107,16 @@ class TwistyBandaged3Plate extends TwistyBandagedAbstract
 // PUBLIC API
 // TODO
 
-  public void randomizeNewScramble(int[] scramble, Random rnd, int oldRotAxis, int oldRow,
-                                   int numScramble, int remScrambles, int remDoubleScrambles)
+  public void randomizeNewScramble(int[][] scramble, Random rnd, int num)
     {
-    if( numScramble==1 )
+    if( num==0 )
       {
-      scramble[0] = rnd.nextInt(ROTATION_AXIS.length);
+      scramble[num][0] = rnd.nextInt(ROTATION_AXIS.length);
       }
     else
       {
       int newVector = rnd.nextInt(ROTATION_AXIS.length-1);
-      scramble[0] = (newVector>=oldRotAxis ? newVector+1 : newVector);
+      scramble[num][0] = (newVector>=scramble[num-1][0] ? newVector+1 : newVector);
       }
 
     float rowFloat = rnd.nextFloat();
@@ -126,16 +125,18 @@ class TwistyBandaged3Plate extends TwistyBandagedAbstract
       {
       if( rowFloat<=mRowChances[row] )
         {
-        scramble[1] = row;
+        scramble[num][1] = row;
         break;
         }
       }
 
-    int random = rnd.nextInt(remScrambles);
-    int result = random<remDoubleScrambles ? 2:1;
-    int sign   = rnd.nextInt(2);
-
-    scramble[2] = sign==0 ? result : -result;
+    switch( rnd.nextInt(4) )
+      {
+      case 0: scramble[num][2] = -2; break;
+      case 1: scramble[num][2] = -1; break;
+      case 2: scramble[num][2] =  1; break;
+      case 3: scramble[num][2] =  2; break;
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistyBandagedEvil.java b/src/main/java/org/distorted/objects/TwistyBandagedEvil.java
index cb03fd46..7708c2aa 100644
--- a/src/main/java/org/distorted/objects/TwistyBandagedEvil.java
+++ b/src/main/java/org/distorted/objects/TwistyBandagedEvil.java
@@ -119,17 +119,16 @@ class TwistyBandagedEvil extends TwistyBandagedAbstract
 // PUBLIC API
 // TODO
 
-  public void randomizeNewScramble(int[] scramble, Random rnd, int oldRotAxis, int oldRow,
-                                   int numScramble, int remScrambles, int remDoubleScrambles)
+  public void randomizeNewScramble(int[][] scramble, Random rnd, int num)
     {
-    if( numScramble==1 )
+    if( num==0 )
       {
-      scramble[0] = rnd.nextInt(ROTATION_AXIS.length);
+      scramble[num][0] = rnd.nextInt(ROTATION_AXIS.length);
       }
     else
       {
       int newVector = rnd.nextInt(ROTATION_AXIS.length-1);
-      scramble[0] = (newVector>=oldRotAxis ? newVector+1 : newVector);
+      scramble[num][0] = (newVector>=scramble[num-1][0] ? newVector+1 : newVector);
       }
 
     float rowFloat = rnd.nextFloat();
@@ -138,16 +137,18 @@ class TwistyBandagedEvil extends TwistyBandagedAbstract
       {
       if( rowFloat<=mRowChances[row] )
         {
-        scramble[1] = row;
+        scramble[num][1] = row;
         break;
         }
       }
 
-    int random = rnd.nextInt(remScrambles);
-    int result = random<remDoubleScrambles ? 2:1;
-    int sign   = rnd.nextInt(2);
-
-    scramble[2] = sign==0 ? result : -result;
+    switch( rnd.nextInt(4) )
+      {
+      case 0: scramble[num][2] = -2; break;
+      case 1: scramble[num][2] = -1; break;
+      case 2: scramble[num][2] =  1; break;
+      case 3: scramble[num][2] =  2; break;
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistyBandagedFused.java b/src/main/java/org/distorted/objects/TwistyBandagedFused.java
index ade8b196..a736bf89 100644
--- a/src/main/java/org/distorted/objects/TwistyBandagedFused.java
+++ b/src/main/java/org/distorted/objects/TwistyBandagedFused.java
@@ -100,17 +100,16 @@ class TwistyBandagedFused extends TwistyBandagedAbstract
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void randomizeNewScramble(int[] scramble, Random rnd, int oldRotAxis, int oldRow,
-                                   int numScramble, int remScrambles, int remDoubleScrambles)
+  public void randomizeNewScramble(int[][] scramble, Random rnd, int num)
     {
-    if( numScramble==1 )
+    if( num==0 )
       {
-      scramble[0] = rnd.nextInt(ROTATION_AXIS.length);
+      scramble[num][0] = rnd.nextInt(ROTATION_AXIS.length);
       }
     else
       {
       int newVector = rnd.nextInt(ROTATION_AXIS.length-1);
-      scramble[0] = (newVector>=oldRotAxis ? newVector+1 : newVector);
+      scramble[num][0] = (newVector>=scramble[num-1][0] ? newVector+1 : newVector);
       }
 
     float rowFloat = rnd.nextFloat();
@@ -119,16 +118,18 @@ class TwistyBandagedFused extends TwistyBandagedAbstract
       {
       if( rowFloat<=mRowChances[row] )
         {
-        scramble[1] = row;
+        scramble[num][1] = row;
         break;
         }
       }
 
-    int random = rnd.nextInt(remScrambles);
-    int result = random<remDoubleScrambles ? 2:1;
-    int sign   = rnd.nextInt(2);
-
-    scramble[2] = sign==0 ? result : -result;
+    switch( rnd.nextInt(4) )
+      {
+      case 0: scramble[num][2] = -2; break;
+      case 1: scramble[num][2] = -1; break;
+      case 2: scramble[num][2] =  1; break;
+      case 3: scramble[num][2] =  2; break;
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistyCube.java b/src/main/java/org/distorted/objects/TwistyCube.java
index dbae693f..625dca38 100644
--- a/src/main/java/org/distorted/objects/TwistyCube.java
+++ b/src/main/java/org/distorted/objects/TwistyCube.java
@@ -254,17 +254,16 @@ class TwistyCube extends TwistyObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void randomizeNewScramble(int[] scramble, Random rnd, int oldRotAxis, int oldRow,
-                                   int numScramble, int remScrambles, int remDoubleScrambles)
+  public void randomizeNewScramble(int[][] scramble, Random rnd, int num)
     {
-    if( numScramble==1 )
+    if( num==0 )
       {
-      scramble[0] = rnd.nextInt(ROTATION_AXIS.length);
+      scramble[num][0] = rnd.nextInt(ROTATION_AXIS.length);
       }
     else
       {
       int newVector = rnd.nextInt(ROTATION_AXIS.length-1);
-      scramble[0] = (newVector>=oldRotAxis ? newVector+1 : newVector);
+      scramble[num][0] = (newVector>=scramble[num-1][0] ? newVector+1 : newVector);
       }
 
     float rowFloat = rnd.nextFloat();
@@ -273,16 +272,18 @@ class TwistyCube extends TwistyObject
       {
       if( rowFloat<=mRowChances[row] )
         {
-        scramble[1] = row;
+        scramble[num][1] = row;
         break;
         }
       }
 
-    int random = rnd.nextInt(remScrambles);
-    int result = random<remDoubleScrambles ? 2:1;
-    int sign   = rnd.nextInt(2);
-
-    scramble[2] = sign==0 ? result : -result;
+    switch( rnd.nextInt(4) )
+      {
+      case 0: scramble[num][2] = -2; break;
+      case 1: scramble[num][2] = -1; break;
+      case 2: scramble[num][2] =  1; break;
+      case 3: scramble[num][2] =  2; break;
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistyDiamond.java b/src/main/java/org/distorted/objects/TwistyDiamond.java
index dfee2c28..5ada7ff3 100644
--- a/src/main/java/org/distorted/objects/TwistyDiamond.java
+++ b/src/main/java/org/distorted/objects/TwistyDiamond.java
@@ -291,17 +291,16 @@ public class TwistyDiamond extends TwistyObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void randomizeNewScramble(int[] scramble, Random rnd, int oldRotAxis, int oldRow,
-                                   int numScramble, int remScrambles, int remDoubleScrambles)
+  public void randomizeNewScramble(int[][] scramble, Random rnd, int num)
     {
-    if( numScramble==1 )
+    if( num==0 )
       {
-      scramble[0] = rnd.nextInt(ROTATION_AXIS.length);
+      scramble[num][0] = rnd.nextInt(ROTATION_AXIS.length);
       }
     else
       {
       int newVector = rnd.nextInt(ROTATION_AXIS.length-1);
-      scramble[0] = (newVector>=oldRotAxis ? newVector+1 : newVector);
+      scramble[num][0] = (newVector>=scramble[num-1][0] ? newVector+1 : newVector);
       }
 
     float rowFloat = rnd.nextFloat();
@@ -310,16 +309,16 @@ public class TwistyDiamond extends TwistyObject
       {
       if( rowFloat<=mRowChances[row] )
         {
-        scramble[1] = row;
+        scramble[num][1] = row;
         break;
         }
       }
 
-    int random = rnd.nextInt(remScrambles);
-    int result = random<remDoubleScrambles ? 2:1;
-    int sign   = rnd.nextInt(2);
-
-    scramble[2] = sign==0 ? result : -result;
+    switch( rnd.nextInt(2) )
+      {
+      case 0: scramble[num][2] = -1; break;
+      case 1: scramble[num][2] =  1; break;
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistyDino4.java b/src/main/java/org/distorted/objects/TwistyDino4.java
index fb0124c6..13c33d2d 100644
--- a/src/main/java/org/distorted/objects/TwistyDino4.java
+++ b/src/main/java/org/distorted/objects/TwistyDino4.java
@@ -66,26 +66,25 @@ public class TwistyDino4 extends TwistyDino
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void randomizeNewScramble(int[] scramble, Random rnd, int oldRotAxis, int oldRow,
-                                   int numScramble, int remScrambles, int remDoubleScrambles)
+  public void randomizeNewScramble(int[][] scramble, Random rnd, int num)
     {
-    if( numScramble==1 )
+    if( num==0 )
       {
-      scramble[0] = rnd.nextInt(ROTATION_AXIS.length);
+      scramble[num][0] = rnd.nextInt(ROTATION_AXIS.length);
+      scramble[num][1] = (scramble[num][0]==1 || scramble[num][0]==2) ? 0:2;
       }
     else
       {
       int newVector = rnd.nextInt(ROTATION_AXIS.length-1);
-      scramble[0] = (newVector>=oldRotAxis ? newVector+1 : newVector);
+      scramble[num][0] = (newVector>=scramble[num-1][0] ? newVector+1 : newVector);
+      scramble[num][1] = scramble[num-1][0]+scramble[num][0]==3 ? 2-scramble[num-1][1] : scramble[num-1][1];
       }
 
-    scramble[1] = (numScramble==1) ? ((scramble[0]==1 || scramble[0]==2) ? 0:2) : (oldRotAxis+scramble[0]==3 ? 2-oldRow : oldRow);
-
-    int random = rnd.nextInt(remScrambles);
-    int result = random<remDoubleScrambles ? 2:1;
-    int sign   = rnd.nextInt(2);
-
-    scramble[2] = sign==0 ? result : -result;
+    switch( rnd.nextInt(2) )
+      {
+      case 0: scramble[num][2] = -1; break;
+      case 1: scramble[num][2] =  1; break;
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistyDino6.java b/src/main/java/org/distorted/objects/TwistyDino6.java
index 1b9e9753..d805b200 100644
--- a/src/main/java/org/distorted/objects/TwistyDino6.java
+++ b/src/main/java/org/distorted/objects/TwistyDino6.java
@@ -66,26 +66,25 @@ public class TwistyDino6 extends TwistyDino
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void randomizeNewScramble(int[] scramble, Random rnd, int oldRotAxis, int oldRow,
-                                   int numScramble, int remScrambles, int remDoubleScrambles)
+  public void randomizeNewScramble(int[][] scramble, Random rnd, int num)
     {
-    if( numScramble==1 )
+    if( num==0 )
       {
-      scramble[0] = rnd.nextInt(ROTATION_AXIS.length);
+      scramble[num][0] = rnd.nextInt(ROTATION_AXIS.length);
+      scramble[num][1] = rnd.nextFloat()<=0.5f ? 0:2;
       }
     else
       {
       int newVector = rnd.nextInt(ROTATION_AXIS.length-1);
-      scramble[0] = (newVector>=oldRotAxis ? newVector+1 : newVector);
+      scramble[num][0] = (newVector>=scramble[num-1][0] ? newVector+1 : newVector);
+      scramble[num][1] = scramble[num-1][0]+scramble[num][0]==3 ? 2-scramble[num-1][1] : scramble[num-1][1];
       }
 
-    scramble[1] = (numScramble==1) ? (rnd.nextFloat()<=0.5f ? 0:2) : (oldRotAxis+scramble[0]==3 ? 2-oldRow : oldRow);
-
-    int random = rnd.nextInt(remScrambles);
-    int result = random<remDoubleScrambles ? 2:1;
-    int sign   = rnd.nextInt(2);
-
-    scramble[2] = sign==0 ? result : -result;
+    switch( rnd.nextInt(2) )
+      {
+      case 0: scramble[num][2] = -1; break;
+      case 1: scramble[num][2] =  1; break;
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistyHelicopter.java b/src/main/java/org/distorted/objects/TwistyHelicopter.java
index c3094d58..2553b7cd 100644
--- a/src/main/java/org/distorted/objects/TwistyHelicopter.java
+++ b/src/main/java/org/distorted/objects/TwistyHelicopter.java
@@ -335,26 +335,25 @@ public class TwistyHelicopter extends TwistyObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void randomizeNewScramble(int[] scramble, Random rnd, int oldRotAxis, int oldRow,
-                                   int numScramble, int remScrambles, int remDoubleScrambles)
+  public void randomizeNewScramble(int[][] scramble, Random rnd, int num)
     {
-    if( numScramble==1 )
+    if( num==0 )
       {
-      scramble[0] = rnd.nextInt(ROTATION_AXIS.length);
+      scramble[num][0] = rnd.nextInt(ROTATION_AXIS.length);
       }
     else
       {
       int newVector = rnd.nextInt(ROTATION_AXIS.length-2);
 
-      switch(oldRotAxis)
+      switch(scramble[num-1][0])
         {
         case  0:
-        case  1: scramble[0] = newVector+2;
+        case  1: scramble[num][0] = newVector+2;
                  break;
         case  2:
-        case  3: scramble[0] = (newVector==0 || newVector==1) ? newVector:newVector+2;
+        case  3: scramble[num][0] = (newVector==0 || newVector==1) ? newVector:newVector+2;
                  break;
-        default: scramble[0] = newVector;
+        default: scramble[num][0] = newVector;
                  break;
         }
       }
@@ -365,16 +364,16 @@ public class TwistyHelicopter extends TwistyObject
       {
       if( rowFloat<=mRowChances[row] )
         {
-        scramble[1] = row;
+        scramble[num][1] = row;
         break;
         }
       }
 
-    int random = rnd.nextInt(remScrambles);
-    int result = random<remDoubleScrambles ? 2:1;
-    int sign   = rnd.nextInt(2);
-
-    scramble[2] = sign==0 ? result : -result;
+    switch( rnd.nextInt(2) )
+      {
+      case 0: scramble[num][2] = -1; break;
+      case 1: scramble[num][2] =  1; break;
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistyIvy.java b/src/main/java/org/distorted/objects/TwistyIvy.java
index 4e7fe6c9..9ddc5b6c 100644
--- a/src/main/java/org/distorted/objects/TwistyIvy.java
+++ b/src/main/java/org/distorted/objects/TwistyIvy.java
@@ -281,17 +281,16 @@ public class TwistyIvy extends TwistyObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void randomizeNewScramble(int[] scramble, Random rnd, int oldRotAxis, int oldRow,
-                                   int numScramble, int remScrambles, int remDoubleScrambles)
+  public void randomizeNewScramble(int[][] scramble, Random rnd, int num)
     {
-    if( numScramble==1 )
+    if( num==0 )
       {
-      scramble[0] = rnd.nextInt(ROTATION_AXIS.length);
+      scramble[num][0] = rnd.nextInt(ROTATION_AXIS.length);
       }
     else
       {
       int newVector = rnd.nextInt(ROTATION_AXIS.length-1);
-      scramble[0] = (newVector>=oldRotAxis ? newVector+1 : newVector);
+      scramble[num][0] = (newVector>=scramble[num-1][0] ? newVector+1 : newVector);
       }
 
     float rowFloat = rnd.nextFloat();
@@ -300,16 +299,16 @@ public class TwistyIvy extends TwistyObject
       {
       if( rowFloat<=mRowChances[row] )
         {
-        scramble[1] = row;
+        scramble[num][1] = row;
         break;
         }
       }
 
-    int random = rnd.nextInt(remScrambles);
-    int result = random<remDoubleScrambles ? 2:1;
-    int sign   = rnd.nextInt(2);
-
-    scramble[2] = sign==0 ? result : -result;
+    switch( rnd.nextInt(2) )
+      {
+      case 0: scramble[num][2] = -1; break;
+      case 1: scramble[num][2] =  1; break;
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistyMinx.java b/src/main/java/org/distorted/objects/TwistyMinx.java
index 82baffae..c480c9ef 100644
--- a/src/main/java/org/distorted/objects/TwistyMinx.java
+++ b/src/main/java/org/distorted/objects/TwistyMinx.java
@@ -280,20 +280,19 @@ abstract class TwistyMinx extends TwistyObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void randomizeNewScramble(int[] scramble, Random rnd, int oldRotAxis, int oldRow,
-                                   int numScramble, int remScrambles, int remDoubleScrambles)
+  public void randomizeNewScramble(int[][] scramble, Random rnd, int num)
     {
-    if( numScramble==1 )
+    if( num==0 )
       {
-      scramble[0] = rnd.nextInt(ROTATION_AXIS.length);
+      scramble[num][0] = rnd.nextInt(ROTATION_AXIS.length);
       }
     else
       {
       int newVector = rnd.nextInt(ROTATION_AXIS.length-1);
-      scramble[0] = (newVector>=oldRotAxis ? newVector+1 : newVector);
+      scramble[num][0] = (newVector>=scramble[num-1][0] ? newVector+1 : newVector);
       }
 
-    if( numScramble==1 )
+    if( num==0 )
       {
       float rowFloat = rnd.nextFloat();
 
@@ -301,7 +300,7 @@ abstract class TwistyMinx extends TwistyObject
         {
         if( rowFloat<=mRowChances[row] )
           {
-          scramble[1] = row;
+          scramble[num][1] = row;
           break;
           }
         }
@@ -309,18 +308,20 @@ abstract class TwistyMinx extends TwistyObject
     else
       {
       int size = mRowChances.length;
-      int num = (size-1)/2;
-      int row = rnd.nextInt(num);
-      boolean opposite = OPPOSITE_ROWS[oldRotAxis][scramble[0]];
-      boolean low = opposite^(oldRow<num);
-      scramble[1] = low ? row : size-1-row;
+      int nom = (size-1)/2;
+      int row = rnd.nextInt(nom);
+      boolean opposite = OPPOSITE_ROWS[scramble[num-1][0]][scramble[num][0]];
+      boolean low = opposite^(scramble[num-1][1]<nom);
+      scramble[num][1] = low ? row : size-1-row;
       }
 
-    int random = rnd.nextInt(remScrambles);
-    int result = random<remDoubleScrambles ? 2:1;
-    int sign   = rnd.nextInt(2);
-
-    scramble[2] = sign==0 ? result : -result;
+    switch( rnd.nextInt(4) )
+      {
+      case 0: scramble[num][2] = -2; break;
+      case 1: scramble[num][2] = -1; break;
+      case 2: scramble[num][2] =  1; break;
+      case 3: scramble[num][2] =  2; break;
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistyObject.java b/src/main/java/org/distorted/objects/TwistyObject.java
index e1f2056b..9393f43f 100644
--- a/src/main/java/org/distorted/objects/TwistyObject.java
+++ b/src/main/java/org/distorted/objects/TwistyObject.java
@@ -913,7 +913,7 @@ public abstract class TwistyObject extends DistortedNode
   public abstract Static3D[] getRotationAxis();
   public abstract int getBasicAngle();
   public abstract String retObjectString();
-  public abstract void randomizeNewScramble(int[] scramble, Random rnd, int oldRotAxis, int oldRow, int numScramble, int remScrambles, int remDoubleScrambles);
+  public abstract void randomizeNewScramble(int[][] scramble, Random rnd, int numScramble);
   public abstract int getObjectName(int numLayers);
   public abstract int getInventor(int numLayers);
   public abstract int getComplexity(int numLayers);
diff --git a/src/main/java/org/distorted/objects/TwistyPyraminx.java b/src/main/java/org/distorted/objects/TwistyPyraminx.java
index 720a64fb..c892a99b 100644
--- a/src/main/java/org/distorted/objects/TwistyPyraminx.java
+++ b/src/main/java/org/distorted/objects/TwistyPyraminx.java
@@ -286,17 +286,16 @@ public class TwistyPyraminx extends TwistyObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void randomizeNewScramble(int[] scramble, Random rnd, int oldRotAxis, int oldRow,
-                                   int numScramble, int remScrambles, int remDoubleScrambles)
+  public void randomizeNewScramble(int[][] scramble, Random rnd, int num)
     {
-    if( numScramble==1 )
+    if( num==0 )
       {
-      scramble[0] = rnd.nextInt(ROTATION_AXIS.length);
+      scramble[num][0] = rnd.nextInt(ROTATION_AXIS.length);
       }
     else
       {
       int newVector = rnd.nextInt(ROTATION_AXIS.length-1);
-      scramble[0] = (newVector>=oldRotAxis ? newVector+1 : newVector);
+      scramble[num][0] = (newVector>=scramble[num-1][0] ? newVector+1 : newVector);
       }
 
     float rowFloat = rnd.nextFloat();
@@ -305,16 +304,16 @@ public class TwistyPyraminx extends TwistyObject
       {
       if( rowFloat<=mRowChances[row] )
         {
-        scramble[1] = row;
+        scramble[num][1] = row;
         break;
         }
       }
 
-    int random = rnd.nextInt(remScrambles);
-    int result = random<remDoubleScrambles ? 2:1;
-    int sign   = rnd.nextInt(2);
-
-    scramble[2] = sign==0 ? result : -result;
+    switch( rnd.nextInt(2) )
+      {
+      case 0: scramble[num][2] = -1; break;
+      case 1: scramble[num][2] =  1; break;
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistyRedi.java b/src/main/java/org/distorted/objects/TwistyRedi.java
index b8088e26..2853dd87 100644
--- a/src/main/java/org/distorted/objects/TwistyRedi.java
+++ b/src/main/java/org/distorted/objects/TwistyRedi.java
@@ -328,26 +328,25 @@ public class TwistyRedi extends TwistyObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void randomizeNewScramble(int[] scramble, Random rnd, int oldRotAxis, int oldRow,
-                                   int numScramble, int remScrambles, int remDoubleScrambles)
+  public void randomizeNewScramble(int[][] scramble, Random rnd, int num)
     {
-    if( numScramble==1 )
+    if( num==0 )
       {
-      scramble[0] = rnd.nextInt(ROTATION_AXIS.length);
+      scramble[num][0] = rnd.nextInt(ROTATION_AXIS.length);
+      scramble[num][1] = rnd.nextFloat()<=0.5f ? 0:2;
       }
     else
       {
       int newVector = rnd.nextInt(ROTATION_AXIS.length-1);
-      scramble[0] = (newVector>=oldRotAxis ? newVector+1 : newVector);
+      scramble[num][0] = (newVector>=scramble[num-1][0] ? newVector+1 : newVector);
+      scramble[num][1] = (scramble[num-1][0]+scramble[num][0]==3 ? 2-scramble[num-1][1] : scramble[num-1][1]);
       }
 
-    scramble[1] = (numScramble==1) ? (rnd.nextFloat()<=0.5f ? 0:2) : (oldRotAxis+scramble[0]==3 ? 2-oldRow : oldRow);
-
-    int random = rnd.nextInt(remScrambles);
-    int result = random<remDoubleScrambles ? 2:1;
-    int sign   = rnd.nextInt(2);
-
-    scramble[2] = sign==0 ? result : -result;
+    switch( rnd.nextInt(2) )
+      {
+      case 0: scramble[num][2] = -1; break;
+      case 1: scramble[num][2] =  1; break;
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistyRex.java b/src/main/java/org/distorted/objects/TwistyRex.java
index aa47497d..e634f275 100644
--- a/src/main/java/org/distorted/objects/TwistyRex.java
+++ b/src/main/java/org/distorted/objects/TwistyRex.java
@@ -392,17 +392,16 @@ public class TwistyRex extends TwistyObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void randomizeNewScramble(int[] scramble, Random rnd, int oldRotAxis, int oldRow,
-                                   int numScramble, int remScrambles, int remDoubleScrambles)
+  public void randomizeNewScramble(int[][] scramble, Random rnd, int num)
     {
-    if( numScramble==1 )
+    if( num==0 )
       {
-      scramble[0] = rnd.nextInt(ROTATION_AXIS.length);
+      scramble[num][0] = rnd.nextInt(ROTATION_AXIS.length);
       }
     else
       {
       int newVector = rnd.nextInt(ROTATION_AXIS.length-1);
-      scramble[0] = (newVector>=oldRotAxis ? newVector+1 : newVector);
+      scramble[num][0] = (newVector>=scramble[num-1][0] ? newVector+1 : newVector);
       }
 
     float rowFloat = rnd.nextFloat();
@@ -411,16 +410,16 @@ public class TwistyRex extends TwistyObject
       {
       if( rowFloat<=mRowChances[row] )
         {
-        scramble[1] = row;
+        scramble[num][1] = row;
         break;
         }
       }
 
-    int random = rnd.nextInt(remScrambles);
-    int result = random<remDoubleScrambles ? 2:1;
-    int sign   = rnd.nextInt(2);
-
-    scramble[2] = sign==0 ? result : -result;
+    switch( rnd.nextInt(2) )
+      {
+      case 0: scramble[num][2] = -1; break;
+      case 1: scramble[num][2] =  1; break;
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistySkewb.java b/src/main/java/org/distorted/objects/TwistySkewb.java
index 8fbb4b94..925e9634 100644
--- a/src/main/java/org/distorted/objects/TwistySkewb.java
+++ b/src/main/java/org/distorted/objects/TwistySkewb.java
@@ -539,17 +539,16 @@ public class TwistySkewb extends TwistyObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void randomizeNewScramble(int[] scramble, Random rnd, int oldRotAxis, int oldRow,
-                                   int numScramble, int remScrambles, int remDoubleScrambles)
+  public void randomizeNewScramble(int[][] scramble, Random rnd, int num)
     {
-    if( numScramble==1 )
+    if( num==0 )
       {
-      scramble[0] = rnd.nextInt(ROTATION_AXIS.length);
+      scramble[num][0] = rnd.nextInt(ROTATION_AXIS.length);
       }
     else
       {
       int newVector = rnd.nextInt(ROTATION_AXIS.length-1);
-      scramble[0] = (newVector>=oldRotAxis ? newVector+1 : newVector);
+      scramble[num][0] = (newVector>=scramble[num-1][0] ? newVector+1 : newVector);
       }
 
     float rowFloat = rnd.nextFloat();
@@ -558,16 +557,16 @@ public class TwistySkewb extends TwistyObject
       {
       if( rowFloat<=mRowChances[row] )
         {
-        scramble[1] = row;
+        scramble[num][1] = row;
         break;
         }
       }
 
-    int random = rnd.nextInt(remScrambles);
-    int result = random<remDoubleScrambles ? 2:1;
-    int sign   = rnd.nextInt(2);
-
-    scramble[2] = sign==0 ? result : -result;
+    switch( rnd.nextInt(2) )
+      {
+      case 0: scramble[num][2] = -1; break;
+      case 1: scramble[num][2] =  1; break;
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
