commit 74c9af0dc78d860f89ebd04fbb0e5207139f18e7
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Fri Sep 24 17:27:43 2021 +0200

    Next step on the way to completely do away with object Movement classes.

diff --git a/src/main/java/org/distorted/objects/MovementCornerTwisting.java b/src/main/java/org/distorted/objects/MovementCornerTwisting.java
index 5e45e76f..1c255594 100644
--- a/src/main/java/org/distorted/objects/MovementCornerTwisting.java
+++ b/src/main/java/org/distorted/objects/MovementCornerTwisting.java
@@ -23,14 +23,16 @@ package org.distorted.objects;
 
 class MovementCornerTwisting extends Movement6
 {
+  private static final int[] NUM_ENABLED = {2,2,2,2,2,2};
+
   private static final int[][][] ENABLED = new int[][][]
       {
-          {{2,0,1},{2,3,1},{2,2,3},{2,0,2}},
-          {{2,2,3},{2,3,1},{2,0,1},{2,0,2}},
-          {{2,1,2},{2,0,1},{2,0,3},{2,2,3}},
-          {{2,1,2},{2,2,3},{2,0,3},{2,0,1}},
-          {{2,0,3},{2,0,2},{2,1,2},{2,1,3}},
-          {{2,1,2},{2,0,2},{2,0,3},{2,1,3}},
+          {{0,1},{3,1},{2,3},{0,2}},
+          {{2,3},{3,1},{0,1},{0,2}},
+          {{1,2},{0,1},{0,3},{2,3}},
+          {{1,2},{2,3},{0,3},{0,1}},
+          {{0,3},{0,2},{1,2},{1,3}},
+          {{1,2},{0,2},{0,3},{1,3}},
       };
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -41,23 +43,16 @@ class MovementCornerTwisting extends Movement6
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-// _____________
-// |  \  0  /  |
-// |   \   /   |
-// | 3 |   | 1 |
-// |   /   \   |
-// |  /  2  \  |
-// -------------
 
   void computeEnabledAxis(int face, float[] touchPoint, int[] enabled)
     {
     boolean p0 = touchPoint[1] >= touchPoint[0];
     boolean p1 = touchPoint[1] >=-touchPoint[0];
-    int quarter = p0 ? (p1 ? 0:3) : (p1 ? 1:2);
+    int part = p0 ? (p1 ? 0:3) : (p1 ? 1:2);
 
-    enabled[0] = ENABLED[face][quarter][0];
-    enabled[1] = ENABLED[face][quarter][1];
-    enabled[2] = ENABLED[face][quarter][2];
+    int num = NUM_ENABLED[face];
+    enabled[0] = num;
+    System.arraycopy(ENABLED[face][part], 0, enabled, 1, num);
     }
 }
 
diff --git a/src/main/java/org/distorted/objects/MovementCube.java b/src/main/java/org/distorted/objects/MovementCube.java
index 12ea035f..4423a8f7 100644
--- a/src/main/java/org/distorted/objects/MovementCube.java
+++ b/src/main/java/org/distorted/objects/MovementCube.java
@@ -23,9 +23,11 @@ package org.distorted.objects;
 
 class MovementCube extends Movement6
 {
+  private static final int[] NUM_ENABLED = {2,2,2,2,2,2};
+
   private static final int[][][] ENABLED = new int[][][]
       {
-          {{2,1,2}},{{2,1,2}},{{2,0,2}},{{2,0,2}},{{2,0,1}},{{2,0,1}},
+          {{1,2}},{{1,2}},{{0,2}},{{0,2}},{{0,1}},{{0,1}},
       };
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -39,8 +41,8 @@ class MovementCube extends Movement6
 
   void computeEnabledAxis(int face, float[] touchPoint, int[] enabled)
     {
-    enabled[0] = ENABLED[face][0][0];
-    enabled[1] = ENABLED[face][0][1];
-    enabled[2] = ENABLED[face][0][2];
+    int num = NUM_ENABLED[face];
+    enabled[0] = num;
+    System.arraycopy(ENABLED[face][0], 0, enabled, 1, num);
     }
 }
diff --git a/src/main/java/org/distorted/objects/MovementDiamond.java b/src/main/java/org/distorted/objects/MovementDiamond.java
index 3502ff11..fa6519ae 100644
--- a/src/main/java/org/distorted/objects/MovementDiamond.java
+++ b/src/main/java/org/distorted/objects/MovementDiamond.java
@@ -23,6 +23,15 @@ package org.distorted.objects;
 
 class MovementDiamond extends Movement8
 {
+  private static final int[] NUM_ENABLED = {3,3,3,3,3,3,3,3};
+
+  private static final int[][][] ENABLED = new int[][][]
+      {
+          {{1,2,3}},{{1,2,3}},{{0,2,3}},{{0,2,3}},{{0,1,3}},{{0,1,3}},{{0,1,2}},{{0,1,2}}
+      };
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
   MovementDiamond(float[][] cuts, boolean[][] rotatable, int size)
     {
     super(TwistyDiamond.ROT_AXIS,cuts,rotatable,size);
@@ -32,14 +41,8 @@ class MovementDiamond extends Movement8
 
   void computeEnabledAxis(int face, float[] touchPoint, int[] enabled)
     {
-    enabled[0] = 3;
-
-    switch(face/2)
-      {
-      case 0: enabled[1]=1; enabled[2]=2; enabled[3]=3; break;
-      case 1: enabled[1]=0; enabled[2]=2; enabled[3]=3; break;
-      case 2: enabled[1]=0; enabled[2]=1; enabled[3]=3; break;
-      case 3: enabled[1]=0; enabled[2]=1; enabled[3]=2; break;
-      }
+    int num = NUM_ENABLED[face];
+    enabled[0] = num;
+    System.arraycopy(ENABLED[face][0], 0, enabled, 1, num);
     }
 }
diff --git a/src/main/java/org/distorted/objects/MovementHelicopter.java b/src/main/java/org/distorted/objects/MovementHelicopter.java
index d6f369a5..cb41405f 100644
--- a/src/main/java/org/distorted/objects/MovementHelicopter.java
+++ b/src/main/java/org/distorted/objects/MovementHelicopter.java
@@ -23,85 +23,35 @@ package org.distorted.objects;
 
 class MovementHelicopter extends Movement6
 {
-  MovementHelicopter(float[][] cuts, boolean[][] rotatable, int size)
-    {
-    super(TwistyHelicopter.ROT_AXIS,cuts,rotatable,size);
-    }
+  private static final int[] NUM_ENABLED = {2,2,2,2,2,2};
+
+  private static final int[][][] ENABLED = new int[][][]
+      {
+          {{2,5},{2,4},{3,4},{3,5}},
+          {{2,4},{2,5},{3,5},{3,4}},
+          {{0,5},{1,5},{1,4},{0,4}},
+          {{0,4},{1,4},{1,5},{0,5}},
+          {{1,3},{0,3},{0,2},{1,2}},
+          {{0,3},{1,3},{1,2},{0,2}},
+      };
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-// _____________
-// |     |     |
-// |  3  |  0  |
-// |-----------|
-// |     |     |
-// |  2  |  1  |
-// -------------
 
-  private int getQuarter(float[] touchPoint)
+  MovementHelicopter(float[][] cuts, boolean[][] rotatable, int size)
     {
-    boolean p0 = touchPoint[0] > 0;
-    boolean p1 = touchPoint[1] > 0;
-    return p0 ? (p1 ? 0:1) : (p1 ? 3:2);
+    super(TwistyHelicopter.ROT_AXIS,cuts,rotatable,size);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   void computeEnabledAxis(int face, float[] touchPoint, int[] enabled)
     {
-    enabled[0] = 2;
-
-    int quarter = getQuarter(touchPoint);
+    boolean p0 = touchPoint[0] > 0;
+    boolean p1 = touchPoint[1] > 0;
+    int part = p0 ? (p1 ? 0:1) : (p1 ? 3:2);
 
-    switch(face)
-      {
-      case 0: switch(quarter)
-                {
-                case 0: enabled[1]=2; enabled[2]=5; break;
-                case 1: enabled[1]=2; enabled[2]=4; break;
-                case 2: enabled[1]=3; enabled[2]=4; break;
-                case 3: enabled[1]=3; enabled[2]=5; break;
-                }
-              break;
-      case 1: switch(quarter)
-                {
-                case 0: enabled[1]=2; enabled[2]=4; break;
-                case 1: enabled[1]=2; enabled[2]=5; break;
-                case 2: enabled[1]=5; enabled[2]=3; break;
-                case 3: enabled[1]=3; enabled[2]=4; break;
-                }
-              break;
-      case 2: switch(quarter)
-                {
-                case 0: enabled[1]=0; enabled[2]=5; break;
-                case 1: enabled[1]=1; enabled[2]=5; break;
-                case 2: enabled[1]=1; enabled[2]=4; break;
-                case 3: enabled[1]=0; enabled[2]=4; break;
-                }
-              break;
-      case 3: switch(quarter)
-                {
-                case 0: enabled[1]=0; enabled[2]=4; break;
-                case 1: enabled[1]=1; enabled[2]=4; break;
-                case 2: enabled[1]=1; enabled[2]=5; break;
-                case 3: enabled[1]=0; enabled[2]=5; break;
-                }
-              break;
-      case 4: switch(quarter)
-                {
-                case 0: enabled[1]=1; enabled[2]=3; break;
-                case 1: enabled[1]=0; enabled[2]=3; break;
-                case 2: enabled[1]=0; enabled[2]=2; break;
-                case 3: enabled[1]=1; enabled[2]=2; break;
-                }
-              break;
-      case 5: switch(quarter)
-                {
-                case 0: enabled[1]=0; enabled[2]=3; break;
-                case 1: enabled[1]=1; enabled[2]=3; break;
-                case 2: enabled[1]=1; enabled[2]=2; break;
-                case 3: enabled[1]=0; enabled[2]=2; break;
-                }
-              break;
-      }
+    int num = NUM_ENABLED[face];
+    enabled[0] = num;
+    System.arraycopy(ENABLED[face][part], 0, enabled, 1, num);
     }
 }
diff --git a/src/main/java/org/distorted/objects/MovementIvy.java b/src/main/java/org/distorted/objects/MovementIvy.java
index 629e7d7d..c008c511 100644
--- a/src/main/java/org/distorted/objects/MovementIvy.java
+++ b/src/main/java/org/distorted/objects/MovementIvy.java
@@ -23,41 +23,35 @@ package org.distorted.objects;
 
 class MovementIvy extends Movement6
 {
-  MovementIvy(float[][] cuts, boolean[][] rotatable, int size)
-    {
-    super(TwistyIvy.ROT_AXIS,cuts,rotatable,size);
-    }
+  private static final int[] NUM_ENABLED = {1,1,1,1,1,1};
+
+  private static final int[][][] ENABLED = new int[][][]
+      {
+          {{0},{3},{3},{0}},
+          {{2},{1},{1},{2}},
+          {{2},{0},{0},{2}},
+          {{1},{3},{3},{1}},
+          {{0},{0},{1},{1}},
+          {{2},{2},{3},{3}},
+      };
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-// faces 0,1,2,3  --> /
-// faces 4,5      --> \
 
-  private boolean isTopHalf(int face, float[] touchPoint)
+  MovementIvy(float[][] cuts, boolean[][] rotatable, int size)
     {
-    if( face==4 || face==5 ) return touchPoint[1] >=-touchPoint[0];
-    else                     return touchPoint[1] >= touchPoint[0];
+    super(TwistyIvy.ROT_AXIS,cuts,rotatable,size);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-// 0 +++
-// 1 ++-
-// 2 +-+
-// 3 +--
 
   void computeEnabledAxis(int face, float[] touchPoint, int[] enabled)
     {
-    enabled[0] = 1;
+    boolean p0 = touchPoint[1] >= touchPoint[0];
+    boolean p1 = touchPoint[1] >=-touchPoint[0];
+    int part = p0 ? (p1 ? 0:3) : (p1 ? 1:2);
 
-    boolean isTop = isTopHalf(face,touchPoint);
-
-    switch(face)
-      {
-      case 0: enabled[1] = isTop ? 0:3; break;
-      case 1: enabled[1] = isTop ? 2:1; break;
-      case 2: enabled[1] = isTop ? 2:0; break;
-      case 3: enabled[1] = isTop ? 1:3; break;
-      case 4: enabled[1] = isTop ? 0:1; break;
-      case 5: enabled[1] = isTop ? 2:3; break;
-      }
+    int num = NUM_ENABLED[face];
+    enabled[0] = num;
+    System.arraycopy(ENABLED[face][part], 0, enabled, 1, num);
     }
 }
diff --git a/src/main/java/org/distorted/objects/MovementJing.java b/src/main/java/org/distorted/objects/MovementJing.java
index a02d6530..84af3ba0 100644
--- a/src/main/java/org/distorted/objects/MovementJing.java
+++ b/src/main/java/org/distorted/objects/MovementJing.java
@@ -23,6 +23,15 @@ package org.distorted.objects;
 
 class MovementJing extends Movement4
 {
+  private static final int[] NUM_ENABLED = {3,3,3,3};
+
+  private static final int[][][] ENABLED = new int[][][]
+      {
+          {{1,2,3}},{{0,2,3}},{{0,1,3}},{{0,1,2}}
+      };
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
   MovementJing(float[][] cuts, boolean[][] rotatable, int size)
     {
     super(TwistyJing.ROT_AXIS,cuts,rotatable,size);
@@ -32,14 +41,8 @@ class MovementJing extends Movement4
 
   void computeEnabledAxis(int face, float[] touchPoint, int[] enabled)
     {
-    enabled[0] = 3;
-
-    switch(face)
-      {
-      case 0: enabled[1]=1; enabled[2]=2; enabled[3]=3; break;
-      case 1: enabled[1]=0; enabled[2]=2; enabled[3]=3; break;
-      case 2: enabled[1]=0; enabled[2]=1; enabled[3]=3; break;
-      case 3: enabled[1]=0; enabled[2]=1; enabled[3]=2; break;
-      }
+    int num = NUM_ENABLED[face];
+    enabled[0] = num;
+    System.arraycopy(ENABLED[face][0], 0, enabled, 1, num);
     }
 }
diff --git a/src/main/java/org/distorted/objects/MovementMinx.java b/src/main/java/org/distorted/objects/MovementMinx.java
index ef728a30..1043cf72 100644
--- a/src/main/java/org/distorted/objects/MovementMinx.java
+++ b/src/main/java/org/distorted/objects/MovementMinx.java
@@ -23,6 +23,26 @@ package org.distorted.objects;
 
 class MovementMinx extends Movement12
 {
+  private static final int[] NUM_ENABLED = {2,2,2,2,2,2,2,2,2,2,2,2};
+
+  private static final int[][][] ENABLED = new int[][][]
+      {
+          {{2,3},{3,5},{1,5},{1,4},{2,4}},
+          {{0,5},{2,5},{2,3},{3,4},{0,4}},
+          {{2,3},{2,5},{0,5},{0,4},{3,4}},
+          {{1,5},{3,5},{2,3},{2,4},{1,4}},
+          {{0,3},{0,4},{4,5},{1,5},{1,3}},
+          {{1,2},{1,4},{4,5},{0,5},{0,2}},
+          {{4,5},{1,4},{1,2},{0,2},{0,5}},
+          {{4,5},{0,4},{0,3},{1,3},{1,5}},
+          {{0,2},{0,1},{1,3},{3,5},{2,5}},
+          {{3,4},{2,4},{1,2},{0,1},{0,3}},
+          {{2,4},{3,4},{0,3},{0,1},{1,2}},
+          {{1,3},{0,1},{0,2},{2,5},{3,5}},
+      };
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
   MovementMinx(float[][] cuts, boolean[][] rotatable, int size)
     {
     super(TwistyMinx.ROT_AXIS,cuts,rotatable,size);
@@ -36,134 +56,10 @@ class MovementMinx extends Movement12
 
     if( part>0 )
       {
-      enabled[0] = 2;
-
-      switch(face)
-        {
-        case  0:  switch(part)
-                    {
-                    case 1: enabled[1]=2; enabled[2]=3; break;
-                    case 2: enabled[1]=3; enabled[2]=5; break;
-                    case 3: enabled[1]=5; enabled[2]=1; break;
-                    case 4: enabled[1]=1; enabled[2]=4; break;
-                    case 5: enabled[1]=4; enabled[2]=2; break;
-                    }
-                  break;
-
-        case  1:  switch(part)
-                    {
-                    case 1: enabled[1]=0; enabled[2]=5; break;
-                    case 2: enabled[1]=5; enabled[2]=2; break;
-                    case 3: enabled[1]=2; enabled[2]=3; break;
-                    case 4: enabled[1]=3; enabled[2]=4; break;
-                    case 5: enabled[1]=4; enabled[2]=0; break;
-                    }
-                  break;
-
-        case  2:  switch(part)
-                    {
-                    case 1: enabled[1]=3; enabled[2]=2; break;
-                    case 2: enabled[1]=2; enabled[2]=5; break;
-                    case 3: enabled[1]=5; enabled[2]=0; break;
-                    case 4: enabled[1]=0; enabled[2]=4; break;
-                    case 5: enabled[1]=4; enabled[2]=3; break;
-                    }
-                  break;
-
-        case  3:  switch(part)
-                    {
-                    case 1: enabled[1]=1; enabled[2]=5; break;
-                    case 2: enabled[1]=5; enabled[2]=3; break;
-                    case 3: enabled[1]=3; enabled[2]=2; break;
-                    case 4: enabled[1]=2; enabled[2]=4; break;
-                    case 5: enabled[1]=4; enabled[2]=1; break;
-                    }
-                  break;
-
-        case  4:  switch(part)
-                    {
-                    case 1: enabled[1]=3; enabled[2]=0; break;
-                    case 2: enabled[1]=0; enabled[2]=4; break;
-                    case 3: enabled[1]=4; enabled[2]=5; break;
-                    case 4: enabled[1]=5; enabled[2]=1; break;
-                    case 5: enabled[1]=1; enabled[2]=3; break;
-                    }
-                  break;
-
-        case  5:  switch(part)
-                    {
-                    case 1: enabled[1]=2; enabled[2]=1; break;
-                    case 2: enabled[1]=1; enabled[2]=4; break;
-                    case 3: enabled[1]=4; enabled[2]=5; break;
-                    case 4: enabled[1]=5; enabled[2]=0; break;
-                    case 5: enabled[1]=0; enabled[2]=2; break;
-                    }
-                  break;
-
-        case  6:  switch(part)
-                    {
-                    case 1: enabled[1]=5; enabled[2]=4; break;
-                    case 2: enabled[1]=4; enabled[2]=1; break;
-                    case 3: enabled[1]=1; enabled[2]=2; break;
-                    case 4: enabled[1]=2; enabled[2]=0; break;
-                    case 5: enabled[1]=0; enabled[2]=5; break;
-                    }
-                  break;
-
-        case  7:  switch(part)
-                    {
-                    case 1: enabled[1]=5; enabled[2]=4; break;
-                    case 2: enabled[1]=4; enabled[2]=0; break;
-                    case 3: enabled[1]=0; enabled[2]=3; break;
-                    case 4: enabled[1]=3; enabled[2]=1; break;
-                    case 5: enabled[1]=1; enabled[2]=5; break;
-                    }
-                  break;
-
-        case  8: switch(part)
-                    {
-                    case 1: enabled[1]=2; enabled[2]=0; break;
-                    case 2: enabled[1]=0; enabled[2]=1; break;
-                    case 3: enabled[1]=1; enabled[2]=3; break;
-                    case 4: enabled[1]=3; enabled[2]=5; break;
-                    case 5: enabled[1]=5; enabled[2]=2; break;
-                    }
-                  break;
-
-        case  9:  switch(part)
-                    {
-                    case 1: enabled[1]=3; enabled[2]=4; break;
-                    case 2: enabled[1]=4; enabled[2]=2; break;
-                    case 3: enabled[1]=2; enabled[2]=1; break;
-                    case 4: enabled[1]=1; enabled[2]=0; break;
-                    case 5: enabled[1]=0; enabled[2]=3; break;
-                    }
-                  break;
-
-        case 10:  switch(part)
-                    {
-                    case 1: enabled[1]=2; enabled[2]=4; break;
-                    case 2: enabled[1]=4; enabled[2]=3; break;
-                    case 3: enabled[1]=3; enabled[2]=0; break;
-                    case 4: enabled[1]=0; enabled[2]=1; break;
-                    case 5: enabled[1]=1; enabled[2]=2; break;
-                    }
-                  break;
-
-        case 11:  switch(part)
-                    {
-                    case 1: enabled[1]=3; enabled[2]=1; break;
-                    case 2: enabled[1]=1; enabled[2]=0; break;
-                    case 3: enabled[1]=0; enabled[2]=2; break;
-                    case 4: enabled[1]=2; enabled[2]=5; break;
-                    case 5: enabled[1]=5; enabled[2]=3; break;
-                    }
-                  break;
-        }
-      }
-    else
-      {
-      enabled[0] = 0;
+      int num = NUM_ENABLED[face];
+      enabled[0] = num;
+      System.arraycopy(ENABLED[face][part-1], 0, enabled, 1, num);
       }
+    else enabled[0] = 0;
     }
 }
diff --git a/src/main/java/org/distorted/objects/MovementPyraminx.java b/src/main/java/org/distorted/objects/MovementPyraminx.java
index 6c32f05f..ad1977e3 100644
--- a/src/main/java/org/distorted/objects/MovementPyraminx.java
+++ b/src/main/java/org/distorted/objects/MovementPyraminx.java
@@ -23,6 +23,15 @@ package org.distorted.objects;
 
 class MovementPyraminx extends Movement4
 {
+  private static final int[] NUM_ENABLED = {3,3,3,3};
+
+  private static final int[][][] ENABLED = new int[][][]
+      {
+          {{1,2,3}},{{0,2,3}},{{0,1,3}},{{0,1,2}}
+      };
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
   MovementPyraminx(float[][] cuts, boolean[][] rotatable, int size)
     {
     super(TwistyPyraminx.ROT_AXIS,cuts,rotatable,size);
@@ -32,14 +41,8 @@ class MovementPyraminx extends Movement4
 
   void computeEnabledAxis(int face, float[] touchPoint, int[] enabled)
     {
-    enabled[0] = 3;
-
-    switch(face)
-      {
-      case 0: enabled[1]=1; enabled[2]=2; enabled[3]=3; break;
-      case 1: enabled[1]=0; enabled[2]=2; enabled[3]=3; break;
-      case 2: enabled[1]=0; enabled[2]=1; enabled[3]=3; break;
-      case 3: enabled[1]=0; enabled[2]=1; enabled[3]=2; break;
-      }
+    int num = NUM_ENABLED[face];
+    enabled[0] = num;
+    System.arraycopy(ENABLED[face][0], 0, enabled, 1, num);
     }
 }
diff --git a/src/main/java/org/distorted/objects/MovementSquare.java b/src/main/java/org/distorted/objects/MovementSquare.java
index f035c151..77d65841 100644
--- a/src/main/java/org/distorted/objects/MovementSquare.java
+++ b/src/main/java/org/distorted/objects/MovementSquare.java
@@ -23,6 +23,15 @@ package org.distorted.objects;
 
 class MovementSquare extends Movement6
 {
+  private static final int[] NUM_ENABLED = {1,1,1,1,2,2};
+
+  private static final int[][][] ENABLED = new int[][][]
+    {
+      {{0}},{{0}},{{1}},{{1}},{{0,1}},{{0,1}}
+    };
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
   MovementSquare(float[][] cuts, boolean[][] rotatable, int size)
     {
     super(TwistySquare.ROT_AXIS,cuts,rotatable,size);
@@ -32,11 +41,8 @@ class MovementSquare extends Movement6
 
   void computeEnabledAxis(int face, float[] touchPoint, int[] enabled)
     {
-    switch(face/2)
-      {
-      case 0: enabled[0]=1; enabled[1]=0; break;
-      case 1: enabled[0]=1; enabled[1]=1; break;
-      case 2: enabled[0]=2; enabled[1]=0; enabled[2]=1; break;
-      }
+    int num = NUM_ENABLED[face];
+    enabled[0] = num;
+    System.arraycopy(ENABLED[face][0], 0, enabled, 1, num);
     }
 }
diff --git a/src/main/java/org/distorted/objects/MovementUltimate.java b/src/main/java/org/distorted/objects/MovementUltimate.java
index 3cbefb25..bbc74156 100644
--- a/src/main/java/org/distorted/objects/MovementUltimate.java
+++ b/src/main/java/org/distorted/objects/MovementUltimate.java
@@ -23,6 +23,15 @@ package org.distorted.objects;
 
 class MovementUltimate extends Movement12
 {
+  private static final int[] NUM_ENABLED = {2,2,2,2,2,2,2,2,2,2,2,2};
+
+  private static final int[][][] ENABLED = new int[][][]
+    {
+      {{2,3}},{{1,3}},{{1,3}},{{2,3}},{{0,3}},{{0,2}},{{0,2}},{{0,3}},{{1,2}},{{0,1}},{{0,1}},{{1,2}}
+    };
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
   MovementUltimate(float[][] cuts, boolean[][] rotatable, int size)
     {
     super(TwistyUltimate.ROT_AXIS,cuts,rotatable,size);
@@ -32,16 +41,8 @@ class MovementUltimate extends Movement12
 
   void computeEnabledAxis(int face, float[] touchPoint, int[] enabled)
     {
-    enabled[0] = 2;
-
-    switch(face)
-      {
-      case  0: case 3: enabled[1] = 2; enabled[2] = 3; break;
-      case  1: case 2: enabled[1] = 1; enabled[2] = 3; break;
-      case  4: case 7: enabled[1] = 0; enabled[2] = 3; break;
-      case  5: case 6: enabled[1] = 0; enabled[2] = 2; break;
-      case  8: case 11:enabled[1] = 1; enabled[2] = 2; break;
-      case  9: case 10:enabled[1] = 0; enabled[2] = 1; break;
-      }
+    int num = NUM_ENABLED[face];
+    enabled[0] = num;
+    System.arraycopy(ENABLED[face][0], 0, enabled, 1, num);
     }
 }
\ No newline at end of file
