commit 916f5dda71d57669b40c4d79a48f8612a2cc4592
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Thu May 27 01:47:49 2021 +0200

    Bugfix: make it impossible to rotate a cube when it is being scrambled in the Tutorial mode.

diff --git a/src/main/java/org/distorted/effects/scramble/ScrambleEffect.java b/src/main/java/org/distorted/effects/scramble/ScrambleEffect.java
index f16c7090..30914588 100644
--- a/src/main/java/org/distorted/effects/scramble/ScrambleEffect.java
+++ b/src/main/java/org/distorted/effects/scramble/ScrambleEffect.java
@@ -242,11 +242,8 @@ public abstract class ScrambleEffect extends BaseEffect implements EffectListene
       {
       disassignEffects();
 
-      if( mNumScramblesLeft==0 )
-        {
-        mPluginReady = true;
-        if( mRotReady ) mController.effectFinished(FAKE_EFFECT_ID);
-        }
+      mPluginReady = true;
+      if( mRotReady ) mController.effectFinished(FAKE_EFFECT_ID);
       }
     }
 
diff --git a/src/main/java/org/distorted/tutorials/TutorialPreRender.java b/src/main/java/org/distorted/tutorials/TutorialPreRender.java
index 4d4c6817..93e4f57a 100644
--- a/src/main/java/org/distorted/tutorials/TutorialPreRender.java
+++ b/src/main/java/org/distorted/tutorials/TutorialPreRender.java
@@ -34,11 +34,11 @@ import org.distorted.network.RubikScores;
 public class TutorialPreRender implements EffectController
   {
   private ActionFinishedListener mAddActionListener;
-  private TutorialSurfaceView mView;
+  private final TutorialSurfaceView mView;
   private boolean mFinishRotation, mRemoveRotation, mAddRotation,
                   mSetQuat, mChangeObject, mSetupObject, mSolveObject, mScrambleObject,
                   mInitializeObject, mResetAllTextureMaps, mRemovePatternRotation;
-  private boolean mCanPlay;
+  private boolean mCanPlay, mCanRotate;
   private boolean mIsSolved;
   private ObjectList mNextObject;
   private int mNextSize;
@@ -67,6 +67,7 @@ public class TutorialPreRender implements EffectController
     mSolveObject    = false;
     mScrambleObject = false;
 
+    mCanRotate      = true;
     mCanPlay        = true;
     mOldObject      = null;
     mNewObject      = null;
@@ -113,7 +114,8 @@ public class TutorialPreRender implements EffectController
       }
     catch( Exception ex )
       {
-      mCanPlay= true;
+      mCanPlay  = true;
+      mCanRotate= true;
       }
     }
 
@@ -171,7 +173,8 @@ public class TutorialPreRender implements EffectController
 
     if( mAddRotationID==0 ) // failed to add effect - should never happen
       {
-      mCanPlay = true;
+      mCanPlay  = true;
+      mCanRotate= true;
       }
     }
 
@@ -236,8 +239,9 @@ public class TutorialPreRender implements EffectController
     {
     mScrambleObject = false;
     mCanPlay        = false;
+    mCanRotate      = false;
     mIsSolved       = false;
-    RubikScores.getInstance().incrementNumPlays();
+
     doEffectNow( BaseEffect.Type.SCRAMBLE );
     }
 
@@ -342,10 +346,9 @@ public class TutorialPreRender implements EffectController
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void initializeObject(int[][] moves)
+  boolean canRotate()
     {
-    mInitializeObject = true;
-    mNextMoves = moves;
+    return mCanRotate;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -415,6 +418,7 @@ public class TutorialPreRender implements EffectController
     else
       {
       mCanPlay   = true;
+      mCanRotate = true;
       }
     }
   }
diff --git a/src/main/java/org/distorted/tutorials/TutorialState.java b/src/main/java/org/distorted/tutorials/TutorialState.java
index 11c19b9c..c58c23fd 100644
--- a/src/main/java/org/distorted/tutorials/TutorialState.java
+++ b/src/main/java/org/distorted/tutorials/TutorialState.java
@@ -46,7 +46,7 @@ public class TutorialState implements RubikPreRender.ActionFinishedListener
 
   private static class Move
     {
-    private int mAxis, mRow, mAngle;
+    private final int mAxis, mRow, mAngle;
 
     Move(int axis, int row, int angle)
       {
diff --git a/src/main/java/org/distorted/tutorials/TutorialSurfaceView.java b/src/main/java/org/distorted/tutorials/TutorialSurfaceView.java
index 53080bc0..b6f53b78 100644
--- a/src/main/java/org/distorted/tutorials/TutorialSurfaceView.java
+++ b/src/main/java/org/distorted/tutorials/TutorialSurfaceView.java
@@ -70,8 +70,8 @@ public class TutorialSurfaceView extends GLSurfaceView
     private int mFirstIndex, mLastIndex;
     private int mDensity;
 
-    private static Static4D mQuat= new Static4D(-0.25189602f,0.3546389f,0.009657208f,0.90038127f);
-    private static Static4D mTemp= new Static4D(0,0,0,1);
+    private static final Static4D mQuat= new Static4D(-0.25189602f,0.3546389f,0.009657208f,0.90038127f);
+    private static final Static4D mTemp= new Static4D(0,0,0,1);
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -293,7 +293,7 @@ public class TutorialSurfaceView extends GLSurfaceView
           {
           mDragging           = false;
           mContinuingRotation = false;
-          mBeginningRotation  = true;
+          mBeginningRotation  = mPreRender.canRotate();
           }
         else
           {
