commit efa81f0c9030aeb809182e546a3d69c4884527e6
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Tue Sep 21 01:43:47 2021 +0200

    Introduce abstract 4,6,8 adn 12 classes.

diff --git a/src/main/java/org/distorted/objects/Twisty12.java b/src/main/java/org/distorted/objects/Twisty12.java
new file mode 100644
index 00000000..48119f17
--- /dev/null
+++ b/src/main/java/org/distorted/objects/Twisty12.java
@@ -0,0 +1,88 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2019 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Magic Cube.                                                              //
+//                                                                                               //
+// Magic Cube is free software: you can redistribute it and/or modify                            //
+// it under the terms of the GNU General Public License as published by                          //
+// the Free Software Foundation, either version 2 of the License, or                             //
+// (at your option) any later version.                                                           //
+//                                                                                               //
+// Magic Cube is distributed in the hope that it will be useful,                                 //
+// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
+// GNU General Public License for more details.                                                  //
+//                                                                                               //
+// You should have received a copy of the GNU General Public License                             //
+// along with Magic Cube.  If not, see <http://www.gnu.org/licenses/>.                           //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.objects;
+
+import android.content.res.Resources;
+
+import org.distorted.library.main.DistortedEffects;
+import org.distorted.library.main.DistortedTexture;
+import org.distorted.library.mesh.MeshSquare;
+import org.distorted.library.type.Static4D;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+abstract class Twisty12 extends TwistyObject
+{
+  static final int MINX_LGREEN = 0xff53aa00;
+  static final int MINX_PINK   = 0xfffd7ab7;
+  static final int MINX_SANDY  = 0xffefd48b;
+  static final int MINX_LBLUE  = 0xff00a2d7;
+  static final int MINX_ORANGE = 0xffff6200;
+  static final int MINX_VIOLET = 0xff7d59a4;
+  static final int MINX_DGREEN = 0xff007a47;
+  static final int MINX_DRED   = 0xffbd0000;
+  static final int MINX_DBLUE  = 0xff1a29b2;
+  static final int MINX_DYELLOW= 0xffffc400;
+  static final int MINX_WHITE  = 0xffffffff;
+  static final int MINX_GREY   = 0xff727c7b;
+
+  static final int[] FACE_COLORS = new int[]
+         {
+           MINX_LGREEN, MINX_PINK   , MINX_SANDY , MINX_LBLUE,
+           MINX_ORANGE, MINX_VIOLET , MINX_DGREEN, MINX_DRED ,
+           MINX_DBLUE , MINX_DYELLOW, MINX_WHITE , MINX_GREY
+         };
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  Twisty12(int numLayers, int realSize, Static4D quat, DistortedTexture texture, MeshSquare mesh,
+           DistortedEffects effects, int[][] moves, ObjectList list, Resources res, int scrWidth)
+    {
+    super(numLayers, realSize, quat, texture, mesh, effects, moves, list, res, scrWidth);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getColor(int face)
+    {
+    return FACE_COLORS[face];
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getNumFaceColors()
+    {
+    return 12;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  float getScreenRatio()
+    {
+    return 0.33f;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  float returnMultiplier()
+    {
+    return 1.0f;
+    }
+}
diff --git a/src/main/java/org/distorted/objects/Twisty4.java b/src/main/java/org/distorted/objects/Twisty4.java
new file mode 100644
index 00000000..e5f574b5
--- /dev/null
+++ b/src/main/java/org/distorted/objects/Twisty4.java
@@ -0,0 +1,74 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2019 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Magic Cube.                                                              //
+//                                                                                               //
+// Magic Cube is free software: you can redistribute it and/or modify                            //
+// it under the terms of the GNU General Public License as published by                          //
+// the Free Software Foundation, either version 2 of the License, or                             //
+// (at your option) any later version.                                                           //
+//                                                                                               //
+// Magic Cube is distributed in the hope that it will be useful,                                 //
+// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
+// GNU General Public License for more details.                                                  //
+//                                                                                               //
+// You should have received a copy of the GNU General Public License                             //
+// along with Magic Cube.  If not, see <http://www.gnu.org/licenses/>.                           //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.objects;
+
+import android.content.res.Resources;
+
+import org.distorted.library.main.DistortedEffects;
+import org.distorted.library.main.DistortedTexture;
+import org.distorted.library.mesh.MeshSquare;
+import org.distorted.library.type.Static4D;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+abstract class Twisty4 extends TwistyObject
+{
+  private static final int[] FACE_COLORS = new int[]
+         {
+           COLOR_GREEN , COLOR_YELLOW,
+           COLOR_BLUE  , COLOR_RED
+         };
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  Twisty4(int numLayers, int realSize, Static4D quat, DistortedTexture texture, MeshSquare mesh,
+          DistortedEffects effects, int[][] moves, ObjectList list, Resources res, int scrWidth)
+    {
+    super(numLayers, realSize, quat, texture, mesh, effects, moves, list, res, scrWidth);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getColor(int face)
+    {
+    return FACE_COLORS[face];
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getNumFaceColors()
+    {
+    return 4;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  float getScreenRatio()
+    {
+    return 0.88f;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  float returnMultiplier()
+    {
+    return getNumLayers()/(SQ6/3);
+    }
+}
diff --git a/src/main/java/org/distorted/objects/Twisty6.java b/src/main/java/org/distorted/objects/Twisty6.java
new file mode 100644
index 00000000..7bf50be0
--- /dev/null
+++ b/src/main/java/org/distorted/objects/Twisty6.java
@@ -0,0 +1,75 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2019 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Magic Cube.                                                              //
+//                                                                                               //
+// Magic Cube is free software: you can redistribute it and/or modify                            //
+// it under the terms of the GNU General Public License as published by                          //
+// the Free Software Foundation, either version 2 of the License, or                             //
+// (at your option) any later version.                                                           //
+//                                                                                               //
+// Magic Cube is distributed in the hope that it will be useful,                                 //
+// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
+// GNU General Public License for more details.                                                  //
+//                                                                                               //
+// You should have received a copy of the GNU General Public License                             //
+// along with Magic Cube.  If not, see <http://www.gnu.org/licenses/>.                           //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.objects;
+
+import android.content.res.Resources;
+
+import org.distorted.library.main.DistortedEffects;
+import org.distorted.library.main.DistortedTexture;
+import org.distorted.library.mesh.MeshSquare;
+import org.distorted.library.type.Static4D;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+abstract class Twisty6 extends TwistyObject
+{
+  private static final int[] FACE_COLORS = new int[]
+         {
+           COLOR_YELLOW, COLOR_WHITE,
+           COLOR_BLUE  , COLOR_GREEN,
+           COLOR_RED   , COLOR_ORANGE
+         };
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  Twisty6(int numLayers, int realSize, Static4D quat, DistortedTexture texture, MeshSquare mesh,
+          DistortedEffects effects, int[][] moves, ObjectList list, Resources res, int scrWidth)
+    {
+    super(numLayers, realSize, quat, texture, mesh, effects, moves, list, res, scrWidth);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getColor(int face)
+    {
+    return FACE_COLORS[face];
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getNumFaceColors()
+    {
+    return 6;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  float getScreenRatio()
+    {
+    return 0.5f;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  float returnMultiplier()
+    {
+    return getNumLayers();
+    }
+}
diff --git a/src/main/java/org/distorted/objects/Twisty8.java b/src/main/java/org/distorted/objects/Twisty8.java
new file mode 100644
index 00000000..8ad09809
--- /dev/null
+++ b/src/main/java/org/distorted/objects/Twisty8.java
@@ -0,0 +1,76 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2019 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Magic Cube.                                                              //
+//                                                                                               //
+// Magic Cube is free software: you can redistribute it and/or modify                            //
+// it under the terms of the GNU General Public License as published by                          //
+// the Free Software Foundation, either version 2 of the License, or                             //
+// (at your option) any later version.                                                           //
+//                                                                                               //
+// Magic Cube is distributed in the hope that it will be useful,                                 //
+// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
+// GNU General Public License for more details.                                                  //
+//                                                                                               //
+// You should have received a copy of the GNU General Public License                             //
+// along with Magic Cube.  If not, see <http://www.gnu.org/licenses/>.                           //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.objects;
+
+import android.content.res.Resources;
+
+import org.distorted.library.main.DistortedEffects;
+import org.distorted.library.main.DistortedTexture;
+import org.distorted.library.mesh.MeshSquare;
+import org.distorted.library.type.Static4D;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+abstract class Twisty8 extends TwistyObject
+{
+  private static final int[] FACE_COLORS = new int[]
+         {
+           COLOR_ORANGE, COLOR_VIOLET,
+           COLOR_WHITE , COLOR_BLUE  ,
+           COLOR_YELLOW, COLOR_RED   ,
+           COLOR_GREEN , COLOR_GREY
+         };
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  Twisty8(int numLayers, int realSize, Static4D quat, DistortedTexture texture, MeshSquare mesh,
+          DistortedEffects effects, int[][] moves, ObjectList list, Resources res, int scrWidth)
+    {
+    super(numLayers, realSize, quat, texture, mesh, effects, moves, list, res, scrWidth);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getColor(int face)
+    {
+    return FACE_COLORS[face];
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getNumFaceColors()
+    {
+    return 8;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  float getScreenRatio()
+    {
+    return 0.65f;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  float returnMultiplier()
+    {
+    return 1.5f;
+    }
+}
diff --git a/src/main/java/org/distorted/objects/TwistyBandagedAbstract.java b/src/main/java/org/distorted/objects/TwistyBandagedAbstract.java
index 3997c7a3..dfe39d7f 100644
--- a/src/main/java/org/distorted/objects/TwistyBandagedAbstract.java
+++ b/src/main/java/org/distorted/objects/TwistyBandagedAbstract.java
@@ -32,7 +32,7 @@ import org.distorted.library.type.Static4D;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-abstract class TwistyBandagedAbstract extends TwistyObject
+abstract class TwistyBandagedAbstract extends Twisty6
 {
   // the three rotation axis of a 3x3 Cube. Must be normalized.
   static final Static3D[] ROT_AXIS = new Static3D[]
@@ -42,13 +42,6 @@ abstract class TwistyBandagedAbstract extends TwistyObject
            new Static3D(0,0,1)
          };
 
-  private static final int[] FACE_COLORS = new int[]
-         {
-           COLOR_YELLOW, COLOR_WHITE,
-           COLOR_BLUE  , COLOR_GREEN,
-           COLOR_RED   , COLOR_ORANGE
-         };
-
   private static final int[][] mDimensions = new int[][]
         {
          {1,1,1},  // has to be X>=Z>=Y so that all
@@ -258,13 +251,6 @@ abstract class TwistyBandagedAbstract extends TwistyObject
     return 1;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  int getColor(int face)
-    {
-    return FACE_COLORS[face];
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   ObjectSticker retSticker(int face)
@@ -323,20 +309,6 @@ abstract class TwistyBandagedAbstract extends TwistyObject
     return mQuats;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  boolean shouldResetTextureMaps()
-    {
-    return false;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  int getNumFaceColors()
-    {
-    return FACE_COLORS.length;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   float[][] getCuts(int numLayers)
@@ -372,14 +344,7 @@ abstract class TwistyBandagedAbstract extends TwistyObject
 
   int getNumCubitFaces()
     {
-    return FACE_COLORS.length;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  float getScreenRatio()
-    {
-    return 0.5f;
+    return 6;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -454,13 +419,6 @@ abstract class TwistyBandagedAbstract extends TwistyObject
     return reaches ? stickerIndex*NUM_FACE_COLORS + face : NUM_TEXTURES;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  float returnMultiplier()
-    {
-    return getNumLayers();
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // PUBLIC API
 
diff --git a/src/main/java/org/distorted/objects/TwistyBandagedFused.java b/src/main/java/org/distorted/objects/TwistyBandagedFused.java
index f8febc7d..b699efd7 100644
--- a/src/main/java/org/distorted/objects/TwistyBandagedFused.java
+++ b/src/main/java/org/distorted/objects/TwistyBandagedFused.java
@@ -99,11 +99,7 @@ class TwistyBandagedFused extends TwistyBandagedAbstract
 
   int[] getQuatIndices()
     {
-    if( QUAT_INDICES==null )
-      {
-      QUAT_INDICES = new int[] { 0 };
-      }
-
+    if( QUAT_INDICES==null ) QUAT_INDICES = new int[] { 0 };
     return QUAT_INDICES;
     }
 
diff --git a/src/main/java/org/distorted/objects/TwistyCube.java b/src/main/java/org/distorted/objects/TwistyCube.java
index ad94e408..5053bf9f 100644
--- a/src/main/java/org/distorted/objects/TwistyCube.java
+++ b/src/main/java/org/distorted/objects/TwistyCube.java
@@ -33,7 +33,7 @@ import org.distorted.main.R;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class TwistyCube extends TwistyObject
+class TwistyCube extends Twisty6
 {
   static final Static3D[] ROT_AXIS = new Static3D[]
          {
@@ -42,13 +42,6 @@ class TwistyCube extends TwistyObject
            new Static3D(0,0,1)
          };
 
-  private static final int[] FACE_COLORS = new int[]
-         {
-           COLOR_YELLOW, COLOR_WHITE,
-           COLOR_BLUE  , COLOR_GREEN,
-           COLOR_RED   , COLOR_ORANGE
-         };
-
   private ScrambleState[] mStates;
   private Static4D[] mQuats;
   private int[] mBasicAngle;
@@ -232,13 +225,6 @@ class TwistyCube extends TwistyObject
     return 0;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  int getColor(int face)
-    {
-    return FACE_COLORS[face];
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   ObjectSticker retSticker(int face)
@@ -285,20 +271,6 @@ class TwistyCube extends TwistyObject
     return mQuats;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  boolean shouldResetTextureMaps()
-    {
-    return false;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  int getNumFaceColors()
-    {
-    return FACE_COLORS.length;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   float[][] getCuts(int numLayers)
@@ -334,14 +306,7 @@ class TwistyCube extends TwistyObject
 
   int getNumCubitFaces()
     {
-    return FACE_COLORS.length;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  float getScreenRatio()
-    {
-    return 0.5f;
+    return 6;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -351,13 +316,6 @@ class TwistyCube extends TwistyObject
     return CUBITS[cubit].mRotationRow[cubitface/2] == (cubitface%2==0 ? (1<<(numLayers-1)):1) ? cubitface : NUM_TEXTURES;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  float returnMultiplier()
-    {
-    return getNumLayers();
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // PUBLIC API
 
diff --git a/src/main/java/org/distorted/objects/TwistyDiamond.java b/src/main/java/org/distorted/objects/TwistyDiamond.java
index d5ae7b73..9db6ca72 100644
--- a/src/main/java/org/distorted/objects/TwistyDiamond.java
+++ b/src/main/java/org/distorted/objects/TwistyDiamond.java
@@ -33,7 +33,7 @@ import org.distorted.main.R;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-public class TwistyDiamond extends TwistyObject
+public class TwistyDiamond extends Twisty8
 {
   // the four rotation axis of a Diamond. Must be normalized.
   static final Static3D[] ROT_AXIS = new Static3D[]
@@ -44,16 +44,6 @@ public class TwistyDiamond extends TwistyObject
            new Static3D(     0,-SQ3/3,+SQ6/3)
          };
 
-  private static final int[] FACE_COLORS = new int[]
-         {
-           COLOR_ORANGE, COLOR_VIOLET,
-           COLOR_WHITE , COLOR_BLUE  ,
-           COLOR_YELLOW, COLOR_RED   ,
-           COLOR_GREEN , COLOR_GREY
-         };
-
-  private static final int FACES_PER_CUBIT =8;
-
   private ScrambleState[] mStates;
   private int[] mBasicAngle;
   private int[] mFaceMap;
@@ -127,13 +117,6 @@ public class TwistyDiamond extends TwistyObject
     return status<0 ? null : buildSolvedQuats(MovementDiamond.FACE_AXIS[mFaceMap[status]],mQuats);
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  float getScreenRatio()
-    {
-    return 0.65f;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   Static4D[] getQuats()
@@ -142,20 +125,6 @@ public class TwistyDiamond extends TwistyObject
     return mQuats;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  int getNumFaceColors()
-    {
-    return FACE_COLORS.length;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  boolean shouldResetTextureMaps()
-    {
-    return false;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int getSolvedFunctionIndex()
@@ -201,7 +170,7 @@ public class TwistyDiamond extends TwistyObject
 
   int getNumCubitFaces()
     {
-    return FACES_PER_CUBIT;
+    return 8;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -481,13 +450,6 @@ public class TwistyDiamond extends TwistyObject
       }
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  int getColor(int face)
-    {
-    return FACE_COLORS[face];
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   ObjectSticker retSticker(int face)
@@ -505,13 +467,6 @@ public class TwistyDiamond extends TwistyObject
     return mStickers[face/NUM_FACE_COLORS];
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  float returnMultiplier()
-    {
-    return 1.5f;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // PUBLIC API
 
diff --git a/src/main/java/org/distorted/objects/TwistyDino.java b/src/main/java/org/distorted/objects/TwistyDino.java
index c24b902f..0a09df01 100644
--- a/src/main/java/org/distorted/objects/TwistyDino.java
+++ b/src/main/java/org/distorted/objects/TwistyDino.java
@@ -32,7 +32,7 @@ import org.distorted.library.type.Static4D;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-public abstract class TwistyDino extends TwistyObject
+public abstract class TwistyDino extends Twisty6
 {
   // the four rotation axis of a RubikDino. Must be normalized.
   static final Static3D[] ROT_AXIS = new Static3D[]
@@ -43,13 +43,6 @@ public abstract class TwistyDino extends TwistyObject
            new Static3D(+SQ3/3,-SQ3/3,-SQ3/3)
          };
 
-  private static final int[] FACE_COLORS = new int[]
-         {
-           COLOR_YELLOW, COLOR_WHITE,
-           COLOR_BLUE  , COLOR_GREEN,
-           COLOR_RED   , COLOR_ORANGE
-         };
-
   private int[] mBasicAngle;
   private Static4D[] mQuats;
   private ObjectSticker[] mStickers;
@@ -86,13 +79,6 @@ public abstract class TwistyDino extends TwistyObject
          };
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  float getScreenRatio()
-    {
-    return 0.5f;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   Static4D[] getQuats()
@@ -101,13 +87,6 @@ public abstract class TwistyDino extends TwistyObject
     return mQuats;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  int getNumFaceColors()
-    {
-    return FACE_COLORS.length;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   float[][] getCuts(int size)
@@ -193,13 +172,6 @@ public abstract class TwistyDino extends TwistyObject
     return 0;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  int getColor(int face)
-    {
-    return FACE_COLORS[face];
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   ObjectSticker retSticker(int face)
@@ -217,13 +189,6 @@ public abstract class TwistyDino extends TwistyObject
     return mStickers[face/NUM_FACE_COLORS];
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  float returnMultiplier()
-    {
-    return 2.0f;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // PUBLIC API
 
diff --git a/src/main/java/org/distorted/objects/TwistyDino6.java b/src/main/java/org/distorted/objects/TwistyDino6.java
index 3408e669..76da2944 100644
--- a/src/main/java/org/distorted/objects/TwistyDino6.java
+++ b/src/main/java/org/distorted/objects/TwistyDino6.java
@@ -96,13 +96,6 @@ public class TwistyDino6 extends TwistyDino
     return 2;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  boolean shouldResetTextureMaps()
-    {
-    return false;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public int getObjectName(int numLayers)
diff --git a/src/main/java/org/distorted/objects/TwistyHelicopter.java b/src/main/java/org/distorted/objects/TwistyHelicopter.java
index c45b9237..08042db6 100644
--- a/src/main/java/org/distorted/objects/TwistyHelicopter.java
+++ b/src/main/java/org/distorted/objects/TwistyHelicopter.java
@@ -33,7 +33,7 @@ import org.distorted.main.R;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-public class TwistyHelicopter extends TwistyObject
+public class TwistyHelicopter extends Twisty6
 {
   // the six rotation axis of a Helicopter. Must be normalized.
   static final Static3D[] ROT_AXIS = new Static3D[]
@@ -46,15 +46,6 @@ public class TwistyHelicopter extends TwistyObject
            new Static3D(-SQ2/2, -SQ2/2,      0)
          };
 
-  private static final int[] FACE_COLORS = new int[]
-         {
-           COLOR_YELLOW, COLOR_WHITE,
-           COLOR_BLUE  , COLOR_GREEN,
-           COLOR_RED   , COLOR_ORANGE
-         };
-
-  private static final int FACES_PER_CUBIT =6;
-
   private ScrambleState[] mStates;
   private int[] mBasicAngle;
   private Static4D[] mQuats;
@@ -143,13 +134,6 @@ public class TwistyHelicopter extends TwistyObject
     return status<0 ? null : buildSolvedQuats(MovementHelicopter.FACE_AXIS[status],mQuats);
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  float getScreenRatio()
-    {
-    return 0.5f;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   Static4D[] getQuats()
@@ -158,20 +142,6 @@ public class TwistyHelicopter extends TwistyObject
     return mQuats;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  boolean shouldResetTextureMaps()
-    {
-    return false;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  int getNumFaceColors()
-    {
-    return FACE_COLORS.length;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int getSolvedFunctionIndex()
@@ -198,7 +168,7 @@ public class TwistyHelicopter extends TwistyObject
 
   int getNumCubitFaces()
     {
-    return FACES_PER_CUBIT;
+    return 4;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -395,13 +365,6 @@ public class TwistyHelicopter extends TwistyObject
     return mFaceMap[cubit][cubitface];
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  int getColor(int face)
-    {
-    return FACE_COLORS[face];
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   ObjectSticker retSticker(int face)
@@ -419,13 +382,6 @@ public class TwistyHelicopter extends TwistyObject
     return mStickers[face/NUM_FACE_COLORS];
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  float returnMultiplier()
-    {
-    return 2.0f;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // PUBLIC API
 
diff --git a/src/main/java/org/distorted/objects/TwistyIvy.java b/src/main/java/org/distorted/objects/TwistyIvy.java
index 54a61ba0..21a328bd 100644
--- a/src/main/java/org/distorted/objects/TwistyIvy.java
+++ b/src/main/java/org/distorted/objects/TwistyIvy.java
@@ -33,9 +33,8 @@ import org.distorted.main.R;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-public class TwistyIvy extends TwistyObject
+public class TwistyIvy extends Twisty6
 {
-  // the four rotation axis of a RubikIvy. Must be normalized.
   static final Static3D[] ROT_AXIS = new Static3D[]
          {
            new Static3D(+SQ3/3,+SQ3/3,+SQ3/3),
@@ -44,17 +43,9 @@ public class TwistyIvy extends TwistyObject
            new Static3D(+SQ3/3,-SQ3/3,-SQ3/3)
          };
 
-  private static final int[] FACE_COLORS = new int[]
-         {
-           COLOR_YELLOW, COLOR_WHITE,
-           COLOR_BLUE  , COLOR_GREEN,
-           COLOR_RED   , COLOR_ORANGE
-         };
-
   private static final int NUM_STICKERS = 2;
   public static final float IVY_D = 0.006f;
   private static final int  IVY_N = 8;
-  private static final int FACES_PER_CUBIT =6;
 
   private ScrambleState[] mStates;
   private int[] mBasicAngle;
@@ -69,13 +60,6 @@ public class TwistyIvy extends TwistyObject
             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 ScrambleState[]
-      {
-      new ScrambleState( new int[][] {tmp,tmp,tmp,tmp} )
-      };
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -126,13 +110,6 @@ public class TwistyIvy extends TwistyObject
     return status<0 ? null : buildSolvedQuats(MovementIvy.FACE_AXIS[status],mQuats);
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  float getScreenRatio()
-    {
-    return 0.5f;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   Static4D[] getQuats()
@@ -141,20 +118,6 @@ public class TwistyIvy extends TwistyObject
     return mQuats;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  int getNumFaceColors()
-    {
-    return FACE_COLORS.length;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  boolean shouldResetTextureMaps()
-    {
-    return false;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int getSolvedFunctionIndex()
@@ -181,7 +144,7 @@ public class TwistyIvy extends TwistyObject
 
   int getNumCubitFaces()
     {
-    return FACES_PER_CUBIT;
+    return 6;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -427,13 +390,6 @@ public class TwistyIvy extends TwistyObject
     return mFaceMap[cubit][cubitface];
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  int getColor(int face)
-    {
-    return FACE_COLORS[face];
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   ObjectSticker retSticker(int face)
@@ -452,13 +408,6 @@ public class TwistyIvy extends TwistyObject
     return mStickers[face/NUM_FACE_COLORS];
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  float returnMultiplier()
-    {
-    return 2.0f;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // PUBLIC API
 
diff --git a/src/main/java/org/distorted/objects/TwistyJing.java b/src/main/java/org/distorted/objects/TwistyJing.java
index 91d55509..e2be52c1 100644
--- a/src/main/java/org/distorted/objects/TwistyJing.java
+++ b/src/main/java/org/distorted/objects/TwistyJing.java
@@ -33,7 +33,7 @@ import org.distorted.main.R;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-public class TwistyJing extends TwistyObject
+public class TwistyJing extends Twisty4
 {
   static final Static3D[] ROT_AXIS = new Static3D[]
          {
@@ -43,12 +43,6 @@ public class TwistyJing extends TwistyObject
            new Static3D(-SQ6/3,+SQ3/3,     0),
          };
 
-  private static final int[] FACE_COLORS = new int[]
-         {
-           COLOR_GREEN , COLOR_YELLOW,
-           COLOR_BLUE  , COLOR_RED
-         };
-
   static final float F = 0.48f;  // length of the edge of the corner cubit. Keep<0.5
                                  // Assuming the length of the edge of the whole
                                  // tetrahedron is 2.0 (ie standard, equal to numLayers
@@ -155,13 +149,6 @@ public class TwistyJing extends TwistyObject
     return mQuats;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  int getNumFaceColors()
-    {
-    return FACE_COLORS.length;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int getSolvedFunctionIndex()
@@ -191,20 +178,6 @@ public class TwistyJing extends TwistyObject
     return 6;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  float getScreenRatio()
-    {
-    return 0.88f;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  boolean shouldResetTextureMaps()
-    {
-    return false;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int getFaceColor(int cubit, int cubitface, int size)
@@ -370,13 +343,6 @@ public class TwistyJing extends TwistyObject
     return cubit<4 ? 0 : (cubit<10?1:2);
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  int getColor(int face)
-    {
-    return FACE_COLORS[face];
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   ObjectSticker retSticker(int face)
@@ -406,14 +372,6 @@ public class TwistyJing extends TwistyObject
     return mStickers[face/NUM_FACE_COLORS];
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// SQ6/3 = height of the tetrahedron
-
-  float returnMultiplier()
-    {
-    return getNumLayers()/(SQ6/3);
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // PUBLIC API
 
diff --git a/src/main/java/org/distorted/objects/TwistyKilominx.java b/src/main/java/org/distorted/objects/TwistyKilominx.java
index a05fd9e7..37b00513 100644
--- a/src/main/java/org/distorted/objects/TwistyKilominx.java
+++ b/src/main/java/org/distorted/objects/TwistyKilominx.java
@@ -86,13 +86,6 @@ public class TwistyKilominx extends TwistyMinx
     return numLayers<5 ? 1 : numLayers/2 + 1;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  float getScreenRatio()
-    {
-    return 0.33f;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   float[][] getCuts(int numLayers)
@@ -657,13 +650,6 @@ public class TwistyKilominx extends TwistyMinx
       }
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  int getColor(int face)
-    {
-    return FACE_COLORS[face];
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   ObjectSticker retSticker(int face)
diff --git a/src/main/java/org/distorted/objects/TwistyMegaminx.java b/src/main/java/org/distorted/objects/TwistyMegaminx.java
index fcd7160e..75ecb37b 100644
--- a/src/main/java/org/distorted/objects/TwistyMegaminx.java
+++ b/src/main/java/org/distorted/objects/TwistyMegaminx.java
@@ -66,13 +66,6 @@ public class TwistyMegaminx extends TwistyMinx
     return numLayers-2;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  float getScreenRatio()
-    {
-    return 0.356f;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int getNumStickerTypes(int numLayers)
@@ -562,13 +555,6 @@ public class TwistyMegaminx extends TwistyMinx
       }
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  int getColor(int face)
-    {
-    return FACE_COLORS[face];
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   ObjectSticker retSticker(int face)
diff --git a/src/main/java/org/distorted/objects/TwistyMinx.java b/src/main/java/org/distorted/objects/TwistyMinx.java
index d6e46aa8..35e26833 100644
--- a/src/main/java/org/distorted/objects/TwistyMinx.java
+++ b/src/main/java/org/distorted/objects/TwistyMinx.java
@@ -31,10 +31,8 @@ import org.distorted.library.type.Static4D;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-abstract class TwistyMinx extends TwistyObject
+abstract class TwistyMinx extends Twisty12
 {
-  private static final int FACES_PER_CUBIT =6;
-
   static final int NUM_CORNERS = 20;
   static final int NUM_CENTERS = 12;
   static final int NUM_EDGES   = 30;
@@ -59,26 +57,6 @@ abstract class TwistyMinx extends TwistyObject
            new Static3D( SIN54/LEN,    0     ,   -C2/LEN )
          };
 
-  static final int MINX_LGREEN = 0xff53aa00;
-  static final int MINX_PINK   = 0xfffd7ab7;
-  static final int MINX_SANDY  = 0xffefd48b;
-  static final int MINX_LBLUE  = 0xff00a2d7;
-  static final int MINX_ORANGE = 0xffff6200;
-  static final int MINX_VIOLET = 0xff7d59a4;
-  static final int MINX_DGREEN = 0xff007a47;
-  static final int MINX_DRED   = 0xffbd0000;
-  static final int MINX_DBLUE  = 0xff1a29b2;
-  static final int MINX_DYELLOW= 0xffffc400;
-  static final int MINX_WHITE  = 0xffffffff;
-  static final int MINX_GREY   = 0xff727c7b;
-
-  static final int[] FACE_COLORS = new int[]
-         {
-           MINX_LGREEN, MINX_PINK   , MINX_SANDY , MINX_LBLUE,
-           MINX_ORANGE, MINX_VIOLET , MINX_DGREEN, MINX_DRED ,
-           MINX_DBLUE , MINX_DYELLOW, MINX_WHITE , MINX_GREY
-         };
-
   private ScrambleState[] mStates;
   private int[] mBasicAngle;
   private int[] mFaceMap;
@@ -527,13 +505,6 @@ abstract class TwistyMinx extends TwistyObject
     return mQuats;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  int getNumFaceColors()
-    {
-    return FACE_COLORS.length;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int getSolvedFunctionIndex()
@@ -541,25 +512,11 @@ abstract class TwistyMinx extends TwistyObject
     return 0;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  boolean shouldResetTextureMaps()
-    {
-    return false;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int getNumCubitFaces()
     {
-    return FACES_PER_CUBIT;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  float returnMultiplier()
-    {
-    return 2.0f;
+    return 6;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistyMirror.java b/src/main/java/org/distorted/objects/TwistyMirror.java
index b823d5ed..853cc0f3 100644
--- a/src/main/java/org/distorted/objects/TwistyMirror.java
+++ b/src/main/java/org/distorted/objects/TwistyMirror.java
@@ -33,7 +33,7 @@ import org.distorted.main.R;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class TwistyMirror extends TwistyObject
+class TwistyMirror extends Twisty6
 {
   static final Static3D[] ROT_AXIS = new Static3D[]
          {
@@ -580,18 +580,11 @@ class TwistyMirror extends TwistyObject
     return mQuats;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  boolean shouldResetTextureMaps()
-    {
-    return false;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int getNumFaceColors()
     {
-    return FACE_COLORS.length;
+    return 1;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -625,20 +618,6 @@ class TwistyMirror extends TwistyObject
     return 6;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  float getScreenRatio()
-    {
-    return 0.5f;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  float returnMultiplier()
-    {
-    return getNumLayers();
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // PUBLIC API
 
diff --git a/src/main/java/org/distorted/objects/TwistyObject.java b/src/main/java/org/distorted/objects/TwistyObject.java
index c6d68f5b..977a7bd5 100644
--- a/src/main/java/org/distorted/objects/TwistyObject.java
+++ b/src/main/java/org/distorted/objects/TwistyObject.java
@@ -388,6 +388,13 @@ public abstract class TwistyObject extends DistortedNode
     return nonBlackIndex;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  boolean shouldResetTextureMaps()
+    {
+    return false;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int[] buildSolvedQuats(Static3D faceAx, Static4D[] quats)
@@ -1293,7 +1300,6 @@ public abstract class TwistyObject extends DistortedNode
   abstract int getFaceColor(int cubit, int cubitface, int numLayers);
   abstract float returnMultiplier();
   abstract float[][] getCuts(int numLayers);
-  abstract boolean shouldResetTextureMaps();
   abstract int getCubitVariant(int cubit, int numLayers);
   abstract int getNumCubitVariants(int numLayers);
   abstract Static4D getQuat(int cubit, int numLayers);
diff --git a/src/main/java/org/distorted/objects/TwistyPyraminx.java b/src/main/java/org/distorted/objects/TwistyPyraminx.java
index 6f7ee7a2..5ca6705e 100644
--- a/src/main/java/org/distorted/objects/TwistyPyraminx.java
+++ b/src/main/java/org/distorted/objects/TwistyPyraminx.java
@@ -33,7 +33,7 @@ import org.distorted.main.R;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-public class TwistyPyraminx extends TwistyObject
+public class TwistyPyraminx extends Twisty4
 {
   static final Static3D[] ROT_AXIS = new Static3D[]
          {
@@ -43,12 +43,6 @@ public class TwistyPyraminx extends TwistyObject
            new Static3D(-SQ6/3,+SQ3/3,     0),
          };
 
-  private static final int[] FACE_COLORS = new int[]
-         {
-           COLOR_GREEN , COLOR_YELLOW,
-           COLOR_BLUE  , COLOR_RED
-         };
-
   private ScrambleState[] mStates;
   private int[] mBasicAngle;
   private Static4D[] mQuats;
@@ -202,13 +196,6 @@ public class TwistyPyraminx extends TwistyObject
     return mQuats;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  int getNumFaceColors()
-    {
-    return FACE_COLORS.length;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int getSolvedFunctionIndex()
@@ -248,20 +235,6 @@ public class TwistyPyraminx extends TwistyObject
     return 8;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  float getScreenRatio()
-    {
-    return 0.88f;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  boolean shouldResetTextureMaps()
-    {
-    return false;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   private int getNumOctahedrons(int numLayers)
@@ -355,13 +328,6 @@ public class TwistyPyraminx extends TwistyObject
     return cubit<getNumOctahedrons(numLayers) ? 0:1;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  int getColor(int face)
-    {
-    return FACE_COLORS[face];
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   ObjectSticker retSticker(int face)
@@ -379,14 +345,6 @@ public class TwistyPyraminx extends TwistyObject
     return mStickers[face/NUM_FACE_COLORS];
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// SQ6/3 = height of the tetrahedron
-
-  float returnMultiplier()
-    {
-    return getNumLayers()/(SQ6/3);
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // public API
 
diff --git a/src/main/java/org/distorted/objects/TwistyRedi.java b/src/main/java/org/distorted/objects/TwistyRedi.java
index e24eda23..78d37568 100644
--- a/src/main/java/org/distorted/objects/TwistyRedi.java
+++ b/src/main/java/org/distorted/objects/TwistyRedi.java
@@ -33,9 +33,8 @@ import org.distorted.main.R;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-public class TwistyRedi extends TwistyObject
+public class TwistyRedi extends Twisty6
 {
-  // the four rotation axis of a Redi. Must be normalized.
   static final Static3D[] ROT_AXIS = new Static3D[]
          {
            new Static3D(+SQ3/3,+SQ3/3,+SQ3/3),
@@ -44,15 +43,6 @@ public class TwistyRedi extends TwistyObject
            new Static3D(+SQ3/3,-SQ3/3,-SQ3/3)
          };
 
-  private static final int[] FACE_COLORS = new int[]
-         {
-           COLOR_YELLOW, COLOR_WHITE,
-           COLOR_BLUE  , COLOR_GREEN,
-           COLOR_RED   , COLOR_ORANGE
-         };
-
-  private static final int FACES_PER_CUBIT =9;
-
   private ScrambleState[] mStates;
   private int[] mBasicAngle;
   private Static4D[] mQuats;
@@ -123,13 +113,6 @@ public class TwistyRedi extends TwistyObject
     return status<0 ? null : buildSolvedQuats(MovementCornerTwisting.FACE_AXIS[status],mQuats);
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  float getScreenRatio()
-    {
-    return 0.50f;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   Static4D[] getQuats()
@@ -138,13 +121,6 @@ public class TwistyRedi extends TwistyObject
     return mQuats;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  int getNumFaceColors()
-    {
-    return FACE_COLORS.length;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int getSolvedFunctionIndex()
@@ -152,13 +128,6 @@ public class TwistyRedi extends TwistyObject
     return 0;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  boolean shouldResetTextureMaps()
-    {
-    return false;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int getNumStickerTypes(int numLayers)
@@ -179,7 +148,7 @@ public class TwistyRedi extends TwistyObject
 
   int getNumCubitFaces()
     {
-    return FACES_PER_CUBIT;
+    return 9;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -382,13 +351,6 @@ public class TwistyRedi extends TwistyObject
     return cubitface<3 ? mFaceMap[cubit][cubitface] : NUM_TEXTURES;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  int getColor(int face)
-    {
-    return FACE_COLORS[face];
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   ObjectSticker retSticker(int face)
@@ -417,13 +379,6 @@ public class TwistyRedi extends TwistyObject
     return mStickers[face/NUM_FACE_COLORS];
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  float returnMultiplier()
-    {
-    return 2.0f;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // PUBLIC API
 
diff --git a/src/main/java/org/distorted/objects/TwistyRex.java b/src/main/java/org/distorted/objects/TwistyRex.java
index d8052b4b..2ef8d01e 100644
--- a/src/main/java/org/distorted/objects/TwistyRex.java
+++ b/src/main/java/org/distorted/objects/TwistyRex.java
@@ -33,9 +33,8 @@ import org.distorted.main.R;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-public class TwistyRex extends TwistyObject
+public class TwistyRex extends Twisty6
 {
-  // the four rotation axis of a RubikRex. Must be normalized.
   static final Static3D[] ROT_AXIS = new Static3D[]
          {
            new Static3D(+SQ3/3,+SQ3/3,+SQ3/3),
@@ -44,13 +43,6 @@ public class TwistyRex extends TwistyObject
            new Static3D(+SQ3/3,-SQ3/3,-SQ3/3)
          };
 
-  private static final int[] FACE_COLORS = new int[]
-         {
-           COLOR_YELLOW, COLOR_WHITE,
-           COLOR_BLUE  , COLOR_GREEN,
-           COLOR_RED   , COLOR_ORANGE
-         };
-
   public static final float REX_D = 0.2f;
 
   private ScrambleState[] mStates;
@@ -116,13 +108,6 @@ public class TwistyRex extends TwistyObject
     return status<0 ? null : buildSolvedQuats(MovementCornerTwisting.FACE_AXIS[status],mQuats);
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  float getScreenRatio()
-    {
-    return 0.5f;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   Static4D[] getQuats()
@@ -131,20 +116,6 @@ public class TwistyRex extends TwistyObject
     return mQuats;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  int getNumFaceColors()
-    {
-    return FACE_COLORS.length;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  boolean shouldResetTextureMaps()
-    {
-    return false;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int getSolvedFunctionIndex()
@@ -409,13 +380,6 @@ public class TwistyRex extends TwistyObject
     return mFaceMap[cubit][cubitface];
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  int getColor(int face)
-    {
-    return FACE_COLORS[face];
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   ObjectSticker retSticker(int face)
@@ -448,13 +412,6 @@ public class TwistyRex extends TwistyObject
     return mStickers[face/NUM_FACE_COLORS];
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  float returnMultiplier()
-    {
-    return 2.0f;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // PUBLIC API
 
diff --git a/src/main/java/org/distorted/objects/TwistySkewb.java b/src/main/java/org/distorted/objects/TwistySkewb.java
index a6238763..0e651d54 100644
--- a/src/main/java/org/distorted/objects/TwistySkewb.java
+++ b/src/main/java/org/distorted/objects/TwistySkewb.java
@@ -33,9 +33,8 @@ import org.distorted.main.R;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-public class TwistySkewb extends TwistyObject
+public class TwistySkewb extends Twisty6
 {
-  // the four rotation axis of a RubikSkewb. Must be normalized.
   static final Static3D[] ROT_AXIS = new Static3D[]
          {
            new Static3D(+SQ3/3,+SQ3/3,+SQ3/3),
@@ -44,13 +43,6 @@ public class TwistySkewb extends TwistyObject
            new Static3D(+SQ3/3,-SQ3/3,-SQ3/3)
          };
 
-  private static final int[] FACE_COLORS = new int[]
-         {
-           COLOR_YELLOW, COLOR_WHITE,
-           COLOR_BLUE  , COLOR_GREEN,
-           COLOR_RED   , COLOR_ORANGE
-         };
-
   private ScrambleState[] mStates;
   private int[] mBasicAngle;
   private Static4D[] mQuats;
@@ -136,13 +128,6 @@ public class TwistySkewb extends TwistyObject
     return ((layers-2)*(layers-2) + (layers-1)*(layers-1));
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  float getScreenRatio()
-    {
-    return 0.5f;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   Static4D[] getQuats()
@@ -151,13 +136,6 @@ public class TwistySkewb extends TwistyObject
     return mQuats;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  int getNumFaceColors()
-    {
-    return FACE_COLORS.length;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int getSolvedFunctionIndex()
@@ -165,13 +143,6 @@ public class TwistySkewb extends TwistyObject
     return 0;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  boolean shouldResetTextureMaps()
-    {
-    return false;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int getNumStickerTypes(int numLayers)
@@ -520,13 +491,6 @@ public class TwistySkewb extends TwistyObject
       }
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  int getColor(int face)
-    {
-    return FACE_COLORS[face];
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   ObjectSticker retSticker(int face)
@@ -557,13 +521,6 @@ public class TwistySkewb extends TwistyObject
     return mStickers[face/NUM_FACE_COLORS];
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  float returnMultiplier()
-    {
-    return 2.0f;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // PUBLIC API
 
diff --git a/src/main/java/org/distorted/objects/TwistySquare.java b/src/main/java/org/distorted/objects/TwistySquare.java
index 6e65a5b3..5d1059ed 100644
--- a/src/main/java/org/distorted/objects/TwistySquare.java
+++ b/src/main/java/org/distorted/objects/TwistySquare.java
@@ -29,7 +29,7 @@ import org.distorted.library.type.Static4D;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-abstract class TwistySquare extends TwistyObject
+abstract class TwistySquare extends Twisty6
 {
   static final float COS15 = (SQ6+SQ2)/4;
   static final float SIN15 = (SQ6-SQ2)/4;
@@ -46,13 +46,6 @@ abstract class TwistySquare extends TwistyObject
       new Static3D(0,-1,0),
     };
 
-  static final int[] FACE_COLORS = new int[]
-    {
-      COLOR_YELLOW, COLOR_WHITE,
-      COLOR_BLUE  , COLOR_GREEN,
-      COLOR_RED   , COLOR_ORANGE
-    };
-
   private int[] mBasicAngle;
   private Movement mMovement;
   Static4D[] mQuats;
@@ -114,20 +107,6 @@ abstract class TwistySquare extends TwistyObject
     return mQuats;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  boolean shouldResetTextureMaps()
-    {
-    return false;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  int getNumFaceColors()
-    {
-    return FACE_COLORS.length;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   int getNumCubitFaces()
@@ -135,20 +114,6 @@ abstract class TwistySquare extends TwistyObject
     return 6;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  float getScreenRatio()
-    {
-    return 0.5f;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  float returnMultiplier()
-    {
-    return 1.0f;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   float[][] getCuts(int numLayers)
@@ -156,13 +121,6 @@ abstract class TwistySquare extends TwistyObject
     return new float[][] { {-0.5f,+0.5f}, {0.0f}, {-0.5f,+0.5f} };
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  int getColor(int face)
-    {
-    return FACE_COLORS[face];
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // PUBLIC API
 
diff --git a/src/main/java/org/distorted/objects/TwistySquare1.java b/src/main/java/org/distorted/objects/TwistySquare1.java
index e46cd9f9..d6891e12 100644
--- a/src/main/java/org/distorted/objects/TwistySquare1.java
+++ b/src/main/java/org/distorted/objects/TwistySquare1.java
@@ -334,7 +334,7 @@ class TwistySquare1 extends TwistySquare
       }
 
     int variant = getCubitVariant(cubit,numLayers);
-    return mStickerType[variant][cubitface]*FACE_COLORS.length + mStickerColor[cubit][cubitface];
+    return 6*mStickerType[variant][cubitface] + mStickerColor[cubit][cubitface];
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistySquare2.java b/src/main/java/org/distorted/objects/TwistySquare2.java
index 9e96175e..5d320b16 100644
--- a/src/main/java/org/distorted/objects/TwistySquare2.java
+++ b/src/main/java/org/distorted/objects/TwistySquare2.java
@@ -368,7 +368,7 @@ class TwistySquare2 extends TwistySquare
     else if( cubit>13 && cubit<22 ) type = 3;
     else                            type = 2;
 
-    return mStickerType[type][cubitface]*FACE_COLORS.length + mStickerColor[cubit][cubitface];
+    return 6*mStickerType[type][cubitface] + mStickerColor[cubit][cubitface];
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/TwistyUltimate.java b/src/main/java/org/distorted/objects/TwistyUltimate.java
index d750dd0f..ddcf1ee1 100644
--- a/src/main/java/org/distorted/objects/TwistyUltimate.java
+++ b/src/main/java/org/distorted/objects/TwistyUltimate.java
@@ -31,22 +31,9 @@ import org.distorted.library.type.Static3D;
 import org.distorted.library.type.Static4D;
 import org.distorted.main.R;
 
-import static org.distorted.objects.TwistyMinx.MINX_DBLUE;
-import static org.distorted.objects.TwistyMinx.MINX_DGREEN;
-import static org.distorted.objects.TwistyMinx.MINX_DRED;
-import static org.distorted.objects.TwistyMinx.MINX_DYELLOW;
-import static org.distorted.objects.TwistyMinx.MINX_GREY;
-import static org.distorted.objects.TwistyMinx.MINX_LBLUE;
-import static org.distorted.objects.TwistyMinx.MINX_LGREEN;
-import static org.distorted.objects.TwistyMinx.MINX_ORANGE;
-import static org.distorted.objects.TwistyMinx.MINX_PINK;
-import static org.distorted.objects.TwistyMinx.MINX_SANDY;
-import static org.distorted.objects.TwistyMinx.MINX_VIOLET;
-import static org.distorted.objects.TwistyMinx.MINX_WHITE;
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-class TwistyUltimate extends TwistyObject
+class TwistyUltimate extends Twisty12
 {
   private static final float A = (float)Math.sqrt(21*SQ5+47);
   private static final float B = SQ6*(5*SQ5+11)/(6*A);
@@ -64,13 +51,6 @@ class TwistyUltimate extends TwistyObject
            new Static3D( 0,C,-B)
          };
 
-  private static final int[] FACE_COLORS = new int[]
-         {
-           MINX_LGREEN, MINX_PINK   , MINX_SANDY , MINX_LBLUE,
-           MINX_ORANGE, MINX_VIOLET , MINX_DGREEN, MINX_DRED ,
-           MINX_DBLUE , MINX_DYELLOW, MINX_WHITE , MINX_GREY
-         };
-
   private ScrambleState[] mStates;
   private int[] mBasicAngle;
   private Static4D[] mQuats;
@@ -324,13 +304,6 @@ class TwistyUltimate extends TwistyObject
     return mFaceMap[cubit][cubitface];
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  int getColor(int face)
-    {
-    return FACE_COLORS[face];
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   ObjectSticker retSticker(int face)
@@ -361,13 +334,6 @@ class TwistyUltimate extends TwistyObject
     return mStickers[face/NUM_FACE_COLORS];
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  float returnMultiplier()
-    {
-    return 1.0f;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   Static4D[] getQuats()
@@ -383,20 +349,6 @@ class TwistyUltimate extends TwistyObject
     return 0;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  boolean shouldResetTextureMaps()
-    {
-    return false;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  int getNumFaceColors()
-    {
-    return FACE_COLORS.length;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   float[][] getCuts(int numLayers)
@@ -419,13 +371,6 @@ class TwistyUltimate extends TwistyObject
     return 8;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  float getScreenRatio()
-    {
-    return 0.33f;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // PUBLIC API
 
