commit d2556e792f962322d8e23b4ae44396616417f3dc
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Fri Oct 1 23:31:16 2021 +0200

    Move yet more code to objectlib.

diff --git a/src/main/java/org/distorted/dialogs/RubikDialogEffects.java b/src/main/java/org/distorted/dialogs/RubikDialogEffects.java
index 949323f0..90c1ad49 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogEffects.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogEffects.java
@@ -34,7 +34,6 @@ import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.Window;
-import android.view.WindowManager;
 import android.widget.AdapterView;
 import android.widget.ArrayAdapter;
 import android.widget.Button;
@@ -43,7 +42,7 @@ import android.widget.SeekBar;
 import android.widget.Spinner;
 import android.widget.TextView;
 
-import org.distorted.effects.BaseEffect;
+import org.distorted.objectlib.effects.BaseEffect;
 import org.distorted.main.R;
 import org.distorted.main.RubikActivity;
 
diff --git a/src/main/java/org/distorted/effects/BaseEffect.java b/src/main/java/org/distorted/effects/BaseEffect.java
deleted file mode 100644
index 27a51fa4..00000000
--- a/src/main/java/org/distorted/effects/BaseEffect.java
+++ /dev/null
@@ -1,225 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Copyright 2020 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.effects;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import android.content.SharedPreferences;
-
-import org.distorted.library.main.DistortedScreen;
-
-import org.distorted.effects.scramble.ScrambleEffect;
-import org.distorted.effects.objectchange.ObjectChangeEffect;
-import org.distorted.effects.solve.SolveEffect;
-import org.distorted.effects.win.WinEffect;
-import org.distorted.main.R;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-public class BaseEffect
-  {
-  public enum Type
-    {
-    SIZECHANGE  ( 20, 1, R.string.objectchange_effect, ObjectChangeEffect.class),
-    SOLVE       ( 20, 1, R.string.solve_effect      , SolveEffect.class     ),
-    SCRAMBLE    ( 60, 1, R.string.scramble_effect   , ScrambleEffect.class  ),
-    WIN         ( 20, 1, R.string.win_effect        , WinEffect.class       ),
-    ;
-
-    private final int mDefaultPos, mDefaultType;
-    private final Class<? extends BaseEffect> mClass;
-    private int mCurrentPos, mCurrentType;
-    private int mText;
-
-    Type(int dPos, int dType, int text, Class<? extends BaseEffect> clazz )
-      {
-      mDefaultPos  = mCurrentPos = dPos;
-      mDefaultType = mCurrentType= dType;
-      mText        = text;
-      mClass       = clazz;
-      }
-
-    public static final int LENGTH = Type.values().length;
-    private static final Type[] types;  // copy the values() to a local variable so that we
-                                        // don't have to keep recreating the array every time
-    static
-      {
-      int i=0;
-
-      types= new Type[LENGTH];
-
-      for(Type type: Type.values())
-        {
-        types[i] = type;
-        i++;
-        }
-      }
-
-  ////////////////////////////////////////////////////////////////////////////////
-
-    public int getText()
-      {
-      return mText;
-      }
-
-  ////////////////////////////////////////////////////////////////////////////////
-
-    public int getCurrentPos()
-      {
-      return mCurrentPos;
-      }
-
-  ////////////////////////////////////////////////////////////////////////////////
-
-    public int getCurrentType()
-      {
-      return mCurrentType;
-      }
-
-  ////////////////////////////////////////////////////////////////////////////////
-
-    public void setCurrentPos(int pos)
-      {
-      mCurrentPos = pos;
-      }
-
-  ////////////////////////////////////////////////////////////////////////////////
-
-    public void setCurrentType(int type)
-      {
-      mCurrentType = type;
-      }
-
-  ////////////////////////////////////////////////////////////////////////////////
-
-    public void savePreferences(SharedPreferences.Editor editor)
-      {
-      String name = name();
-
-      editor.putInt(name+"_Pos" , mCurrentPos );
-      editor.putInt(name+"_Type", mCurrentType);
-      }
-
-  ////////////////////////////////////////////////////////////////////////////////
-
-    public void restorePreferences(SharedPreferences preferences)
-      {
-      String name = name();
-
-      mCurrentPos  = preferences.getInt(name+"_Pos" , mDefaultPos );
-      mCurrentType = preferences.getInt(name+"_Type", mDefaultType);
-      }
-
-  ////////////////////////////////////////////////////////////////////////////////
-
-    public String[] getNames()
-      {
-      Method method;
-
-      try
-        {
-        method = mClass.getDeclaredMethod("getNames");
-        }
-      catch(NoSuchMethodException ex)
-        {
-        android.util.Log.e("BaseEffect", mClass.getSimpleName()+": exception getting method: "+ex.getMessage());
-        method = null;
-        }
-
-      try
-        {
-        if( method!=null )
-          {
-          Object value = method.invoke(null);
-          return (String[]) value;
-          }
-        }
-      catch(Exception ex)
-        {
-        android.util.Log.e("BaseEffect", mClass.getSimpleName()+": exception invoking method: "+ex.getMessage());
-        }
-
-      return null;
-      }
-
-  ////////////////////////////////////////////////////////////////////////////////
-
-    public static Type getType(int ordinal)
-      {
-      return types[ordinal];
-      }
-
-  ////////////////////////////////////////////////////////////////////////////////
-
-    public static void enableEffects()
-      {
-      Method method;
-
-      for(Type type: values())
-        {
-        try
-          {
-          method = type.mClass.getDeclaredMethod("enableEffects");
-          }
-        catch(NoSuchMethodException ex)
-          {
-          android.util.Log.e("BaseEffect", type.mClass.getSimpleName()+": exception getting method: "+ex.getMessage());
-          method = null;
-          }
-
-        try
-          {
-          if( method!=null ) method.invoke(null);
-          }
-        catch(Exception ex)
-          {
-          android.util.Log.e("BaseEffect", type.mClass.getSimpleName()+": exception invoking method: "+ex.getMessage());
-          }
-        }
-      }
-
-  ////////////////////////////////////////////////////////////////////////////////
-
-    public long startEffect(DistortedScreen screen, EffectController cont) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException
-      {
-      Method method1 = mClass.getDeclaredMethod("create", int.class);
-
-      Object value1 = method1.invoke(null,mCurrentType);
-      BaseEffect baseEffect = (BaseEffect)value1;
-
-      Method method2 = mClass.getDeclaredMethod("start", int.class, DistortedScreen.class, EffectController.class);
-
-      Integer translated = translatePos(mCurrentPos)+1;
-      Object value2 = method2.invoke(baseEffect,translated,screen,cont);
-      return (Long)value2;
-      }
-
-  ////////////////////////////////////////////////////////////////////////////////
-  // map the (0..100) range of the SeekBar into (0..5000) milliseconds, in 100ms
-  // increments.
-
-    public static int translatePos(int pos)
-      {
-      return (pos/2)*100;
-      }
-    }
-
-  // END ENUM ////////////////////////////////////////////////////////////////////
-  }
diff --git a/src/main/java/org/distorted/effects/EffectController.java b/src/main/java/org/distorted/effects/EffectController.java
deleted file mode 100644
index a93b6806..00000000
--- a/src/main/java/org/distorted/effects/EffectController.java
+++ /dev/null
@@ -1,35 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Copyright 2020 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.effects;
-
-import org.distorted.library.message.EffectListener;
-import org.distorted.objectlib.main.TwistyObject;
-import org.distorted.objectlib.helpers.MovesFinished;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-public interface EffectController extends EffectListener
-  {
-  void addRotation(MovesFinished listener, int axis, int rowBitmap, int angle, long duration);
-  TwistyObject getOldObject();
-  TwistyObject getObject();
-  int getNumScrambles();
-  void solve();
-  }
diff --git a/src/main/java/org/distorted/effects/objectchange/ObjectChangeEffect.java b/src/main/java/org/distorted/effects/objectchange/ObjectChangeEffect.java
deleted file mode 100644
index fb6e816b..00000000
--- a/src/main/java/org/distorted/effects/objectchange/ObjectChangeEffect.java
+++ /dev/null
@@ -1,283 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// 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.effects.objectchange;
-
-import java.lang.reflect.Method;
-
-import org.distorted.library.effect.Effect;
-import org.distorted.library.main.DistortedEffects;
-import org.distorted.library.main.DistortedScreen;
-import org.distorted.library.message.EffectListener;
-
-import org.distorted.objectlib.main.TwistyObject;
-
-import org.distorted.effects.BaseEffect;
-import org.distorted.effects.EffectController;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-public abstract class ObjectChangeEffect extends BaseEffect implements EffectListener
-{
-  public enum Type
-    {
-    NONE         (ObjectChangeEffectNone.class        ),
-    TRANSPARENCY (ObjectChangeEffectTransparency.class),
-    MOVE         (ObjectChangeEffectMove.class        ),
-    ROUND        (ObjectChangeEffectRound.class       ),
-    SCALE        (ObjectChangeEffectScale.class       ),
-    ;
-
-    final Class<? extends ObjectChangeEffect> effect;
-
-    Type(Class<? extends ObjectChangeEffect> effect)
-      {
-      this.effect= effect;
-      }
-    }
-
-  private static final int NUM_EFFECTS = Type.values().length;
-  private static final int NUM_PHASES  = 2;
-  private static final int FAKE_EFFECT_ID  = -1;
-  private static final Type[] types;
-
-  static
-    {
-    int i=0;
-    types = new Type[NUM_EFFECTS];
-
-    for(Type type: Type.values())
-      {
-      types[i++] = type;
-      }
-    }
-
-  private EffectController mController;
-  private int mDuration;
-  private final int[] mEffectReturned;
-  private final int[] mCubeEffectNumber, mNodeEffectNumber;
-  private final int[] mEffectFinished;
-  private final boolean[] mPhaseActive;
-
-  TwistyObject[] mObject;
-  DistortedScreen mScreen;
-  Effect[][] mCubeEffects;
-  int[][] mCubeEffectPosition;
-  Effect[][] mNodeEffects;
-  int[][] mNodeEffectPosition;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  ObjectChangeEffect()
-    {
-    mPhaseActive        = new boolean[NUM_PHASES];
-    mEffectReturned     = new int[NUM_PHASES];
-    mCubeEffectNumber   = new int[NUM_PHASES];
-    mNodeEffectNumber   = new int[NUM_PHASES];
-    mEffectFinished     = new int[NUM_PHASES];
-    mCubeEffectPosition = new int[NUM_PHASES][];
-    mNodeEffectPosition = new int[NUM_PHASES][];
-    mCubeEffects        = new Effect[NUM_PHASES][];
-    mNodeEffects        = new Effect[NUM_PHASES][];
-    mObject             = new TwistyObject[NUM_PHASES];
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  abstract int createEffectsPhase0(int duration);
-  abstract int createEffectsPhase1(int duration);
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  private void effectFinishedPhase(final long effectID, int phase)
-    {
-    for(int i=0; i<mCubeEffectNumber[phase]; i++)
-      {
-      long id = mCubeEffects[phase][i].getID();
-
-      if( effectID == id )
-        {
-        effectReturned(phase);
-        mObject[phase].remove(id);
-        return;
-        }
-      }
-    for(int i=0; i<mNodeEffectNumber[phase]; i++)
-      {
-      long id = mNodeEffects[phase][i].getID();
-
-      if( effectID == id )
-        {
-        effectReturned(phase);
-        mObject[phase].getEffects().abortById(id);
-        return;
-        }
-      }
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  private void effectReturned(int phase)
-    {
-    mEffectReturned[phase]++;
-
-    if( mEffectReturned[phase] == mEffectFinished[phase] )
-      {
-      switch(phase)
-        {
-        case 0: mPhaseActive[1] = true;
-                mEffectFinished[1] = createEffectsPhase1(mDuration);
-                assignEffects(1);
-                mScreen.attach(mObject[1]);
-                break;
-        case 1: mController.effectFinished(FAKE_EFFECT_ID);
-                break;
-        }
-      }
-    if( mEffectReturned[phase] == mCubeEffectNumber[phase]+mNodeEffectNumber[phase] )
-      {
-      switch(phase)
-        {
-        case 0: mPhaseActive[0] = false;
-                mScreen.detach(mObject[0]);
-                break;
-        case 1: mPhaseActive[1] = false;
-                break;
-        }
-      }
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  private void assignEffects(int phase)
-    {
-    mCubeEffectNumber[phase] = ( mCubeEffects[phase]!=null ) ? mCubeEffects[phase].length : 0;
-    mNodeEffectNumber[phase] = ( mNodeEffects[phase]!=null ) ? mNodeEffects[phase].length : 0;
-
-    if( mCubeEffectNumber[phase]==0 && mNodeEffectNumber[phase]==0 )
-      {
-      throw new RuntimeException("Cube and Node Effects ("+phase+" phase) both not created!");
-      }
-
-    for(int i=0; i<mCubeEffectNumber[phase]; i++)
-      {
-      mObject[phase].apply(mCubeEffects[phase][i],mCubeEffectPosition[phase][i]);
-      mCubeEffects[phase][i].notifyWhenFinished(this);
-      }
-
-    DistortedEffects nodeEffects = mObject[phase].getEffects();
-
-    for(int i=0; i<mNodeEffectNumber[phase]; i++)
-      {
-      nodeEffects.apply(mNodeEffects[phase][i],mNodeEffectPosition[phase][i]);
-      mNodeEffects[phase][i].notifyWhenFinished(this);
-      }
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// PUBLIC API
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public void effectFinished(final long effectID)
-    {
-    if( mPhaseActive[0] ) effectFinishedPhase(effectID,0);
-    if( mPhaseActive[1] ) effectFinishedPhase(effectID,1);
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  @SuppressWarnings("unused")
-  public static String[] getNames()
-    {
-    String[] names = new String[NUM_EFFECTS];
-
-    for( int i=0; i<NUM_EFFECTS; i++)
-      {
-      names[i] = types[i].name();
-      }
-
-    return names;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  @SuppressWarnings("unused")
-  public static ObjectChangeEffect create(int ordinal) throws InstantiationException, IllegalAccessException
-    {
-    return types[ordinal].effect.newInstance();
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  @SuppressWarnings("unused")
-  public long start(int duration, DistortedScreen screen, EffectController cont)
-    {
-    mScreen    = screen;
-    mObject[0] = cont.getOldObject();
-    mObject[1] = cont.getObject();
-    mController= cont;
-    mDuration  = duration;
-
-    if( mObject[0]!=null )
-      {
-      mPhaseActive[0] = true;
-      mEffectFinished[0] = createEffectsPhase0(mDuration);
-      assignEffects(0);
-      }
-    else
-      {
-      mPhaseActive[1] = true;
-      mEffectFinished[1] = createEffectsPhase1(mDuration);
-      assignEffects(1);
-      mScreen.attach(mObject[1]);
-      }
-
-    return FAKE_EFFECT_ID;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  @SuppressWarnings("unused")
-  public static void enableEffects()
-    {
-    Method method;
-
-    for(Type type: Type.values())
-      {
-      try
-        {
-        method = type.effect.getDeclaredMethod("enable");  // enable not public, thus getDeclaredMethod
-        }
-      catch(NoSuchMethodException ex)
-        {
-        android.util.Log.e("SizeChangeEffect", type.effect.getSimpleName()+": exception getting method: "+ex.getMessage());
-        method = null;
-        }
-
-      try
-        {
-        if( method!=null ) method.invoke(null);
-        }
-      catch(Exception ex)
-        {
-        android.util.Log.e("SizeChangeEffect", type.effect.getSimpleName()+": exception invoking method: "+ex.getMessage());
-        }
-      }
-    }
-}
diff --git a/src/main/java/org/distorted/effects/objectchange/ObjectChangeEffectMove.java b/src/main/java/org/distorted/effects/objectchange/ObjectChangeEffectMove.java
deleted file mode 100644
index 9a9da892..00000000
--- a/src/main/java/org/distorted/effects/objectchange/ObjectChangeEffectMove.java
+++ /dev/null
@@ -1,77 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// 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.effects.objectchange;
-
-import org.distorted.library.effect.Effect;
-import org.distorted.library.effect.MatrixEffectMove;
-import org.distorted.library.type.Dynamic3D;
-import org.distorted.library.type.Static3D;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-class ObjectChangeEffectMove extends ObjectChangeEffect
-  {
-  public int createEffectsPhase0(int duration)
-    {
-    int w = mScreen.getWidth();
-    int h = mScreen.getHeight();
-    int xmove = w/2 + (w<h?w:h)/2;
-
-    mNodeEffectPosition[0] = new int[] {1};
-    mNodeEffects[0]        = new Effect[mNodeEffectPosition[0].length];
-
-    Dynamic3D d0 = new Dynamic3D(duration/2, 0.5f);
-    d0.add(new Static3D(    0,0,0));
-    d0.add(new Static3D(xmove,0,0));
-    mNodeEffects[0][0] = new MatrixEffectMove(d0);
-
-    return 1;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public int createEffectsPhase1(int duration)
-    {
-    int w = mScreen.getWidth();
-    int h = mScreen.getHeight();
-    int xmove = w/2 + (w<h?w:h)/2;
-
-    mNodeEffectPosition[1] = new int[] {1};
-    mNodeEffects[1]        = new Effect[mNodeEffectPosition[1].length];
-
-    Dynamic3D d0 = new Dynamic3D(duration/2, 0.5f);
-    d0.add(new Static3D(-xmove,0,0));
-    d0.add(new Static3D(     0,0,0));
-    mNodeEffects[1][0] = new MatrixEffectMove(d0);
-
-    return 1;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Enable all effects used in this Effect. Called by reflection from the parent class.
-// Matrix Effects do not have to be enabled.
-
-  @SuppressWarnings("unused")
-  static void enable()
-    {
-
-    }
-  }
-
diff --git a/src/main/java/org/distorted/effects/objectchange/ObjectChangeEffectNone.java b/src/main/java/org/distorted/effects/objectchange/ObjectChangeEffectNone.java
deleted file mode 100644
index 3502135d..00000000
--- a/src/main/java/org/distorted/effects/objectchange/ObjectChangeEffectNone.java
+++ /dev/null
@@ -1,65 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// 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.effects.objectchange;
-
-import org.distorted.library.effect.Effect;
-import org.distorted.library.effect.MatrixEffectMove;
-import org.distorted.library.type.Dynamic3D;
-import org.distorted.library.type.Static3D;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-class ObjectChangeEffectNone extends ObjectChangeEffect
-  {
-  public int createEffectsPhase0(int duration)
-    {
-    mCubeEffectPosition[0] = new int[] {-1};
-    mCubeEffects[0]        = new Effect[mCubeEffectPosition[0].length];
-
-    Dynamic3D d0 = new Dynamic3D(1,0.5f);
-    d0.add(new Static3D(0,0,0));
-    mCubeEffects[0][0] = new MatrixEffectMove(d0);
-
-    return 1;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public int createEffectsPhase1(int duration)
-    {
-    mCubeEffectPosition[1] = new int[] {-1};
-    mCubeEffects[1]        = new Effect[mCubeEffectPosition[1].length];
-
-    Dynamic3D d0 = new Dynamic3D(1,0.5f);
-    d0.add(new Static3D(0,0,0));
-    mCubeEffects[1][0] = new MatrixEffectMove(d0);
-
-    return 1;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// enable all effects used in this Effect (here: none).  Called by reflection from the parent class.
-
-  @SuppressWarnings("unused")
-  static void enable()
-    {
-
-    }
-  }
diff --git a/src/main/java/org/distorted/effects/objectchange/ObjectChangeEffectRound.java b/src/main/java/org/distorted/effects/objectchange/ObjectChangeEffectRound.java
deleted file mode 100644
index 2b1c8eef..00000000
--- a/src/main/java/org/distorted/effects/objectchange/ObjectChangeEffectRound.java
+++ /dev/null
@@ -1,89 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// 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.effects.objectchange;
-
-import org.distorted.library.effect.Effect;
-import org.distorted.library.effect.MatrixEffectMove;
-import org.distorted.library.effect.MatrixEffectScale;
-import org.distorted.library.type.Dynamic;
-import org.distorted.library.type.Dynamic3D;
-import org.distorted.library.type.Static3D;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-class ObjectChangeEffectRound extends ObjectChangeEffect
-  {
-  public int createEffectsPhase0(int duration)
-    {
-    float X = mObject[0].getNodeSize()/3.0f;
-
-    mCubeEffectPosition[0] = new int[] {2,3};
-    mCubeEffects[0]        = new Effect[mCubeEffectPosition[0].length];
-
-    Dynamic3D d0 = new Dynamic3D(duration/2, 0.5f);
-    d0.add(new Static3D( 1.00f, 1.00f, 1.00f));
-    d0.add(new Static3D( 0.01f, 0.01f, 0.01f));
-    mCubeEffects[0][0] = new MatrixEffectScale(d0);
-
-    Dynamic3D d1 = new Dynamic3D(duration/2, 0.5f);
-    d1.setMode(Dynamic.MODE_PATH);
-    d1.add(new Static3D( 0, 0, 0));
-    d1.add(new Static3D(+X, 0, 0));
-    d1.add(new Static3D( 0, 0, 0));
-    mCubeEffects[0][1] = new MatrixEffectMove(d1);
-
-    return 2;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public int createEffectsPhase1(int duration)
-    {
-    float X = mObject[0].getNodeSize()/3.0f;
-
-    mCubeEffectPosition[1] = new int[] {2,3};
-    mCubeEffects[1]        = new Effect[mCubeEffectPosition[1].length];
-
-    Dynamic3D d0 = new Dynamic3D(duration/2, 0.5f);
-    d0.add(new Static3D( 0.01f, 0.01f, 0.01f));
-    d0.add(new Static3D( 1.00f, 1.00f, 1.00f));
-    mCubeEffects[1][0] = new MatrixEffectScale(d0);
-
-    Dynamic3D d1 = new Dynamic3D(duration/2, 0.5f);
-    d1.setMode(Dynamic.MODE_PATH);
-    d1.add(new Static3D( 0, 0, 0));
-    d1.add(new Static3D(-X, 0, 0));
-    d1.add(new Static3D( 0, 0, 0));
-    mCubeEffects[1][1] = new MatrixEffectMove(d1);
-
-    return 2;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Enable all effects used in this Effect. Called by reflection from the parent class.
-// Matrix Effects do not have to be enabled.
-
-  @SuppressWarnings("unused")
-  static void enable()
-    {
-
-    }
-  }
-
diff --git a/src/main/java/org/distorted/effects/objectchange/ObjectChangeEffectScale.java b/src/main/java/org/distorted/effects/objectchange/ObjectChangeEffectScale.java
deleted file mode 100644
index e5b97a8b..00000000
--- a/src/main/java/org/distorted/effects/objectchange/ObjectChangeEffectScale.java
+++ /dev/null
@@ -1,69 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// 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.effects.objectchange;
-
-import org.distorted.library.effect.Effect;
-import org.distorted.library.effect.MatrixEffectScale;
-import org.distorted.library.type.Dynamic3D;
-import org.distorted.library.type.Static3D;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-class ObjectChangeEffectScale extends ObjectChangeEffect
-  {
-  public int createEffectsPhase0(int duration)
-    {
-    mCubeEffectPosition[0] = new int[] {2};
-    mCubeEffects[0]        = new Effect[mCubeEffectPosition[0].length];
-
-    Dynamic3D d0 = new Dynamic3D(duration/2, 0.5f);
-    d0.add(new Static3D(1.00f, 1.00f, 1.00f));
-    d0.add(new Static3D(0.01f, 0.01f, 0.01f));
-    mCubeEffects[0][0] = new MatrixEffectScale(d0);
-
-    return 1;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public int createEffectsPhase1(int duration)
-    {
-    mCubeEffectPosition[1] = new int[] {2};
-    mCubeEffects[1]        = new Effect[mCubeEffectPosition[1].length];
-
-    Dynamic3D d0 = new Dynamic3D(duration/2, 0.5f);
-    d0.add(new Static3D(0.01f, 0.01f, 0.01f));
-    d0.add(new Static3D(1.00f, 1.00f, 1.00f));
-    mCubeEffects[1][0] = new MatrixEffectScale(d0);
-
-    return 1;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Enable all effects used in this Effect. Called by reflection from the parent class.
-// Matrix Effects do not have to be enabled.
-
-  @SuppressWarnings("unused")
-  static void enable()
-    {
-
-    }
-  }
-
diff --git a/src/main/java/org/distorted/effects/objectchange/ObjectChangeEffectTransparency.java b/src/main/java/org/distorted/effects/objectchange/ObjectChangeEffectTransparency.java
deleted file mode 100644
index 12ad6639..00000000
--- a/src/main/java/org/distorted/effects/objectchange/ObjectChangeEffectTransparency.java
+++ /dev/null
@@ -1,100 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// 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.effects.objectchange;
-
-import org.distorted.library.effect.Effect;
-import org.distorted.library.effect.FragmentEffectAlpha;
-import org.distorted.library.effect.VertexEffectWave;
-import org.distorted.library.type.Dynamic1D;
-import org.distorted.library.type.Dynamic5D;
-import org.distorted.library.type.Static1D;
-import org.distorted.library.type.Static3D;
-import org.distorted.library.type.Static5D;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-class ObjectChangeEffectTransparency extends ObjectChangeEffect
-  {
-  public int createEffectsPhase0(int duration)
-    {
-    mNodeEffectPosition[0] = new int[] {-1,-1};
-    mNodeEffects[0]        = new Effect[mNodeEffectPosition[0].length];
-
-    float init_amplitude = 0.0f;
-    float end_amplitude  = 1/8.0f;
-    float length         = 1/8.0f;
-    float init_phase     = 360.0f;
-    float end_phase      = 0.0f;
-    float alpha          = 30.0f;
-    float beta           = 90.0f;
-
-    Dynamic5D d1 = new Dynamic5D(duration/2, 0.5f);
-    d1.add(new Static5D( init_amplitude, length, init_phase, alpha, beta) );
-    d1.add(new Static5D( end_amplitude , length, end_phase , alpha, beta) );
-    Static3D center = new Static3D(0,0,0);
-    mNodeEffects[0][0] = new VertexEffectWave(d1, center, null);
-
-    Dynamic1D d0 = new Dynamic1D(duration/2, 0.5f);
-    d0.add(new Static1D(1.0f));
-    d0.add(new Static1D(0.0f));
-    mNodeEffects[0][1] = new FragmentEffectAlpha(d0);
-
-    return 2;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public int createEffectsPhase1(int duration)
-    {
-    mNodeEffectPosition[1] = new int[] {-1,-1};
-    mNodeEffects[1]        = new Effect[mNodeEffectPosition[1].length];
-
-    float init_amplitude = 1/8.0f;
-    float end_amplitude  = 0.0f;
-    float length         = 1/8.0f;
-    float init_phase     = 0.0f;
-    float end_phase      = 360.0f;
-    float alpha          = 30.0f;
-    float beta           = 90.0f;
-
-    Dynamic5D d1 = new Dynamic5D(duration/2, 0.5f);
-    d1.add(new Static5D( init_amplitude, length, init_phase, alpha, beta) );
-    d1.add(new Static5D( end_amplitude , length, end_phase , alpha, beta) );
-    Static3D center = new Static3D(0,0,0);
-    mNodeEffects[1][0] = new VertexEffectWave(d1, center, null);
-
-    Dynamic1D d0 = new Dynamic1D(duration/2, 0.5f);
-    d0.add(new Static1D(0.0f));
-    d0.add(new Static1D(1.0f));
-    mNodeEffects[1][1] = new FragmentEffectAlpha(d0);
-
-    return 2;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Enable all effects used in this Effect. Called by reflection from the parent class.
-
-  @SuppressWarnings("unused")
-  static void enable()
-    {
-    FragmentEffectAlpha.enable();
-    VertexEffectWave.enable();
-    }
-  }
diff --git a/src/main/java/org/distorted/effects/scramble/ScrambleEffect.java b/src/main/java/org/distorted/effects/scramble/ScrambleEffect.java
deleted file mode 100644
index bcccb0b9..00000000
--- a/src/main/java/org/distorted/effects/scramble/ScrambleEffect.java
+++ /dev/null
@@ -1,323 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// 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.effects.scramble;
-
-import java.lang.reflect.Method;
-import java.util.Random;
-
-import org.distorted.library.effect.Effect;
-import org.distorted.library.main.DistortedEffects;
-import org.distorted.library.main.DistortedScreen;
-import org.distorted.library.message.EffectListener;
-
-import org.distorted.objectlib.main.ObjectType;
-import org.distorted.objectlib.main.TwistyObject;
-
-import org.distorted.effects.BaseEffect;
-import org.distorted.effects.EffectController;
-import org.distorted.objectlib.helpers.MovesFinished;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-public abstract class ScrambleEffect extends BaseEffect implements EffectListener, MovesFinished
-{
-  public enum Type
-    {
-    NONE         (ScrambleEffectNone.class        ),
-    ROTATIONS    (ScrambleEffectRotations.class   ),
-    ;
-
-    final Class<? extends ScrambleEffect> effect;
-
-    Type(Class<? extends ScrambleEffect> effect)
-      {
-      this.effect= effect;
-      }
-    }
-
-  private static final int NUM_EFFECTS = Type.values().length;
-  private static final int FAKE_EFFECT_ID  = -3;
-  private static final Type[] types;
-
-  static
-    {
-    int i=0;
-    types = new Type[NUM_EFFECTS];
-
-    for(Type type: Type.values())
-      {
-      types[i++] = type;
-      }
-    }
-
-  private EffectController mController;
-  private int mEffectReturned;
-  private int mNumScramblesLeft;
-  private long mDurationPerDegree;
-  private final Random mRnd;
-  private int[] mBasicAngle;
-  private boolean mRotReady, mPluginReady;
-
-  TwistyObject mObject;
-  Effect[] mNodeEffects;
-  int[] mNodeEffectPosition;
-  Effect[] mCubeEffects;
-  int[] mCubeEffectPosition;
-  int mCubeEffectNumber, mNodeEffectNumber;
-  int mNumScrambles;
-  int[][] mScrambles;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  ScrambleEffect()
-    {
-    mRnd = new Random( System.currentTimeMillis() );
-    mScrambles = new int[ObjectType.MAX_SCRAMBLE][3];
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  abstract void createEffects(int duration, int numScrambles);
-  abstract void effectFinishedPlugin(final long effectID);
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  private void createBaseEffects(int duration, int numScrambles)
-    {
-    mNumScramblesLeft = numScrambles;
-    int absAngle, angle, axis, basicDegrees, totalDegrees = 0;
-
-    for(int scramble=0; scramble<mNumScramblesLeft; scramble++)
-      {
-      mObject.randomizeNewScramble(mScrambles, mRnd, scramble, numScrambles);
-      axis  = mScrambles[scramble][0];
-      angle = mScrambles[scramble][2];
-      absAngle = (angle<0 ? -angle : angle);
-      basicDegrees = 360/mBasicAngle[axis];
-      totalDegrees += absAngle*basicDegrees;
-      }
-
-    mDurationPerDegree = duration/totalDegrees;
-    mNumScrambles = 0;
-
-    mRotReady    = false;
-    mPluginReady = false;
-
-    addNewScramble();
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  private void addNewScramble()
-    {
-    if( mNumScramblesLeft>0 )
-      {
-      int axis = mScrambles[mNumScrambles][0];
-      int row  = mScrambles[mNumScrambles][1];
-      int angle= mScrambles[mNumScrambles][2];
-
-      int rowBitmap= (1<<row);
-      int absAngle = (angle<0 ? -angle : angle);
-      int basicDegrees  = 360/mBasicAngle[axis];
-      long durationMillis = absAngle*basicDegrees*mDurationPerDegree;
-
-      mNumScramblesLeft--;
-      mController.addRotation(this, axis, rowBitmap, angle*basicDegrees, durationMillis);
-      mNumScrambles++;
-      }
-    else
-      {
-      mRotReady = true;
-      if( mPluginReady ) mController.effectFinished(FAKE_EFFECT_ID);
-      }
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  private void assignEffects()
-    {
-    for(int i=0; i<mCubeEffectNumber; i++)
-      {
-      mObject.apply(mCubeEffects[i],mCubeEffectPosition[i]);
-      mCubeEffects[i].notifyWhenFinished(this);
-      }
-
-    DistortedEffects nodeEffects = mObject.getEffects();
-
-    for(int i=0; i<mNodeEffectNumber; i++)
-      {
-      nodeEffects.apply(mNodeEffects[i],mNodeEffectPosition[i]);
-      mNodeEffects[i].notifyWhenFinished(this);
-      }
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  private void disassignEffects()
-    {
-    for(int i=0; i<mCubeEffectNumber; i++)
-      {
-      mObject.remove(mCubeEffects[i].getID());
-      }
-
-    DistortedEffects nodeEffects = mObject.getEffects();
-
-    for(int i=0; i<mNodeEffectNumber; i++)
-      {
-      nodeEffects.abortById(mNodeEffects[i].getID());
-      }
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// PUBLIC API
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  @SuppressWarnings("unused")
-  public static String[] getNames()
-    {
-    String[] names = new String[NUM_EFFECTS];
-
-    for( int i=0; i<NUM_EFFECTS; i++)
-      {
-      names[i] = types[i].name();
-      }
-
-    return names;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  @SuppressWarnings("unused")
-  public static ScrambleEffect create(int ordinal) throws InstantiationException, IllegalAccessException
-    {
-    return types[ordinal].effect.newInstance();
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public void onActionFinished(final long effectID)
-    {
-    addNewScramble();
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  private void effectFinishedAction(final long effectID, final long id)
-    {
-    mEffectReturned++;
-    effectFinishedPlugin(effectID);
-
-    if( mEffectReturned == mCubeEffectNumber+mNodeEffectNumber )
-      {
-      disassignEffects();
-
-      mPluginReady = true;
-      if( mRotReady ) mController.effectFinished(FAKE_EFFECT_ID);
-      }
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public void effectFinished(final long effectID)
-    {
-    for(int i=0; i<mCubeEffectNumber; i++)
-      {
-      long id = mCubeEffects[i].getID();
-
-      if( effectID == id )
-        {
-        effectFinishedAction(effectID,id);
-        return;
-        }
-      }
-
-    for(int i=0; i<mNodeEffectNumber; i++)
-      {
-      long id = mNodeEffects[i].getID();
-
-      if( effectID == id )
-        {
-        effectFinishedAction(effectID,id);
-        return;
-        }
-      }
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  @SuppressWarnings("unused")
-  public long start(int duration, DistortedScreen screen, EffectController cont)
-    {
-    mObject    = cont.getObject();
-    mController= cont;
-
-    // NOT mController.solve() !! This would be a very subtle bug. We need to do this immediately,
-    // because here we are already inside the mController.preRender() function (doing 'scrambleObjectNow')
-    // and doing a delayed 'solve()' here would mean we'd be sometimes first doing the first rotation,
-    // and only after it - the solve.
-    mObject.solve();
-
-    mBasicAngle = mObject.getBasicAngle();
-
-    int numScrambles = cont.getNumScrambles();
-    int dura = (int)(duration*Math.pow(numScrambles,0.66f));
-    createBaseEffects(dura,numScrambles);
-    createEffects    (dura,numScrambles);
-
-    if( mCubeEffectNumber==0 && mNodeEffectNumber==0 )
-      {
-      throw new RuntimeException("Cube and Node Plugin Effects not created!");
-      }
-
-    assignEffects();
-
-    return FAKE_EFFECT_ID;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  @SuppressWarnings("unused")
-  public static void enableEffects()
-    {
-    Method method;
-
-    for(Type type: Type.values())
-      {
-      try
-        {
-        method = type.effect.getDeclaredMethod("enable"); // enable not public, thus getDeclaredMethod
-        }
-      catch(NoSuchMethodException ex)
-        {
-        android.util.Log.e("ScrambleEffect", type.effect.getSimpleName()+": exception getting method: "+ex.getMessage());
-        method = null;
-        }
-
-      try
-        {
-        if( method!=null ) method.invoke(null);
-        }
-      catch(Exception ex)
-        {
-        android.util.Log.e("ScrambleEffect", type.effect.getSimpleName()+": exception invoking method: "+ex.getMessage());
-        }
-      }
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/org/distorted/effects/scramble/ScrambleEffectNone.java b/src/main/java/org/distorted/effects/scramble/ScrambleEffectNone.java
deleted file mode 100644
index 483bef15..00000000
--- a/src/main/java/org/distorted/effects/scramble/ScrambleEffectNone.java
+++ /dev/null
@@ -1,59 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// 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.effects.scramble;
-
-import org.distorted.library.effect.Effect;
-import org.distorted.library.effect.MatrixEffectMove;
-import org.distorted.library.type.Dynamic3D;
-import org.distorted.library.type.Static3D;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-public class ScrambleEffectNone extends ScrambleEffect
-  {
-  public void createEffects(int duration, int numScrambles)
-    {
-    Dynamic3D d0 = new Dynamic3D(1,0.5f);
-    d0.add(new Static3D(0,0,0));
-
-    mCubeEffectNumber   = 1;
-    mNodeEffectNumber   = 0;
-
-    mCubeEffectPosition = new int[] {-1};
-    mCubeEffects        = new Effect[mCubeEffectPosition.length];
-    mCubeEffects[0]     = new MatrixEffectMove(d0);
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public void effectFinishedPlugin(final long effectID)
-    {
-
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Enable all effects used in this Effect. Called by reflection from the parent class.
-
-  @SuppressWarnings("unused")
-  static void enable()
-    {
-
-    }
-  }
diff --git a/src/main/java/org/distorted/effects/scramble/ScrambleEffectRotations.java b/src/main/java/org/distorted/effects/scramble/ScrambleEffectRotations.java
deleted file mode 100644
index 9bfb2863..00000000
--- a/src/main/java/org/distorted/effects/scramble/ScrambleEffectRotations.java
+++ /dev/null
@@ -1,104 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// 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.effects.scramble;
-
-import java.util.Random;
-
-import org.distorted.library.effect.Effect;
-import org.distorted.library.effect.MatrixEffectMove;
-import org.distorted.library.effect.MatrixEffectQuaternion;
-import org.distorted.library.type.Dynamic;
-import org.distorted.library.type.Dynamic3D;
-import org.distorted.library.type.DynamicQuat;
-import org.distorted.library.type.Static3D;
-import org.distorted.library.type.Static4D;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-public class ScrambleEffectRotations extends ScrambleEffect
-  {
-  private final Random mRndGen = new Random(0);
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  private Static4D generateNewRandomPoint()
-    {
-    float x = mRndGen.nextFloat();
-    float y = mRndGen.nextFloat();
-    float z = mRndGen.nextFloat();
-    float w = mRndGen.nextFloat();
-
-    float len = (float)Math.sqrt(x*x + y*y + z*z + w*w);
-
-    return new Static4D( x/len, y/len, z/len, w/len);
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public void createEffects(int duration, int numScrambles)
-    {
-    mCubeEffectNumber   = 2;
-    mNodeEffectNumber   = 0;
-    mCubeEffectPosition = new int[] {2,3};
-    mCubeEffects        = new Effect[mCubeEffectPosition.length];
-
-    mRndGen.setSeed(System.currentTimeMillis());
-
-    int numRandomPoints = (int)(Math.pow(numScrambles,0.7f));
-
-    DynamicQuat dq = new DynamicQuat(duration, 0.5f);
-    dq.setMode(Dynamic.MODE_PATH);
-    dq.add(new Static4D(0,0,0,1));
-
-    for(int point=0; point<numRandomPoints; point++)
-      {
-      dq.add(generateNewRandomPoint());
-      }
-
-    dq.add(new Static4D(0,0,0,1));
-
-    mCubeEffects[0] = new MatrixEffectQuaternion(dq, new Static3D(0,0,0));
-
-    float Z = mObject.getNodeSize()/3.0f;
-
-    Dynamic3D d0 = new Dynamic3D(duration, 0.5f);
-    d0.setMode(Dynamic.MODE_PATH);
-    d0.add(new Static3D( 0, 0, 0));
-    d0.add(new Static3D( 0, 0,-Z));
-    d0.add(new Static3D( 0, 0, 0));
-    mCubeEffects[1] = new MatrixEffectMove(d0);
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public void effectFinishedPlugin(final long effectID)
-    {
-
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Enable all effects used in this Effect. Called by reflection from the parent class.
-
-  @SuppressWarnings("unused")
-  static void enable()
-    {
-
-    }
-  }
diff --git a/src/main/java/org/distorted/effects/solve/SolveEffect.java b/src/main/java/org/distorted/effects/solve/SolveEffect.java
deleted file mode 100644
index b7a9f7dd..00000000
--- a/src/main/java/org/distorted/effects/solve/SolveEffect.java
+++ /dev/null
@@ -1,244 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// 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.effects.solve;
-
-import java.lang.reflect.Method;
-
-import org.distorted.library.effect.Effect;
-import org.distorted.library.main.DistortedEffects;
-import org.distorted.library.main.DistortedScreen;
-import org.distorted.library.message.EffectListener;
-
-import org.distorted.objectlib.main.TwistyObject;
-
-import org.distorted.effects.BaseEffect;
-import org.distorted.effects.EffectController;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-public abstract class SolveEffect extends BaseEffect implements EffectListener
-{
-  public enum Type
-    {
-    NONE   (SolveEffectNone.class),
-    SPIN   (SolveEffectSpin.class),
-    ;
-
-    final Class<? extends SolveEffect> effect;
-
-    Type(Class<? extends SolveEffect> effect)
-      {
-      this.effect = effect;
-      }
-    }
-
-  private static final int NUM_EFFECTS = Type.values().length;
-  private static final int NUM_PHASES  = 2;
-  private static final int FAKE_EFFECT_ID = -2;
-  private static final Type[] types;
-
-  static
-    {
-    int i=0;
-    types = new Type[NUM_EFFECTS];
-
-    for(Type type: Type.values())
-      {
-      types[i++] = type;
-      }
-    }
-
-  private EffectController mController;
-  private int mDuration;
-  private int mEffectReturned;
-  private final int[] mCubeEffectNumber, mNodeEffectNumber;
-  private int mPhase;
-
-  TwistyObject mObject;
-  DistortedScreen mScreen;
-  Effect[][] mCubeEffects;
-  int[][] mCubeEffectPosition;
-  Effect[][] mNodeEffects;
-  int[][] mNodeEffectPosition;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  SolveEffect()
-    {
-    mPhase= 0;
-
-    mCubeEffectNumber   = new int[NUM_PHASES];
-    mNodeEffectNumber   = new int[NUM_PHASES];
-    mCubeEffectPosition = new int[NUM_PHASES][];
-    mNodeEffectPosition = new int[NUM_PHASES][];
-    mCubeEffects        = new Effect[NUM_PHASES][];
-    mNodeEffects        = new Effect[NUM_PHASES][];
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  abstract void createEffectsPhase0(int duration);
-  abstract void createEffectsPhase1(int duration);
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  private void assignEffects(int phase)
-    {
-    mCubeEffectNumber[phase] = ( mCubeEffects[phase]!=null ) ? mCubeEffects[phase].length : 0;
-    mNodeEffectNumber[phase] = ( mNodeEffects[phase]!=null ) ? mNodeEffects[phase].length : 0;
-
-    if( mCubeEffectNumber[phase]==0 && mNodeEffectNumber[phase]==0 )
-      {
-      throw new RuntimeException("Cube and Node Effects ("+phase+" phase) both not created!");
-      }
-
-    for(int i=0; i<mCubeEffectNumber[phase]; i++)
-      {
-      mObject.apply(mCubeEffects[phase][i],mCubeEffectPosition[phase][i]);
-      mCubeEffects[phase][i].notifyWhenFinished(this);
-      }
-
-    DistortedEffects nodeEffects = mObject.getEffects();
-
-    for(int i=0; i<mNodeEffectNumber[phase]; i++)
-      {
-      nodeEffects.apply(mNodeEffects[phase][i],mNodeEffectPosition[phase][i]);
-      mNodeEffects[phase][i].notifyWhenFinished(this);
-      }
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  private void effectAction(int phase)
-    {
-    switch(phase)
-      {
-      case 0: mEffectReturned = 0;
-              mPhase          = 1;
-              mController.solve();
-              createEffectsPhase1(mDuration);
-              assignEffects(mPhase);
-              break;
-      case 1: mController.effectFinished(FAKE_EFFECT_ID);
-              break;
-      }
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// PUBLIC API
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  @SuppressWarnings("unused")
-  public static String[] getNames()
-    {
-    String[] names = new String[NUM_EFFECTS];
-
-    for( int i=0; i<NUM_EFFECTS; i++)
-      {
-      names[i] = types[i].name();
-      }
-
-    return names;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  @SuppressWarnings("unused")
-  public static SolveEffect create(int ordinal) throws InstantiationException, IllegalAccessException
-    {
-    return types[ordinal].effect.newInstance();
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public void effectFinished(final long effectID)
-    {
-    int total = mCubeEffectNumber[mPhase]+mNodeEffectNumber[mPhase];
-
-    for(int i=0; i<mCubeEffectNumber[mPhase]; i++)
-      {
-      long id = mCubeEffects[mPhase][i].getID();
-
-      if( effectID == id )
-        {
-        if( ++mEffectReturned == total ) effectAction(mPhase);
-        mObject.remove(id);
-        return;
-        }
-      }
-    for(int i=0; i<mNodeEffectNumber[mPhase]; i++)
-      {
-      long id = mNodeEffects[mPhase][i].getID();
-
-      if( effectID == id )
-        {
-        if( ++mEffectReturned == total ) effectAction(mPhase);
-        mObject.getEffects().abortById(id);
-        return;
-        }
-      }
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  @SuppressWarnings("unused")
-  public long start(int duration, DistortedScreen screen, EffectController cont)
-    {
-    mScreen    = screen;
-    mObject    = cont.getObject();
-    mController= cont;
-    mDuration  = duration;
-
-    createEffectsPhase0(mDuration);
-    assignEffects(mPhase);
-
-    return FAKE_EFFECT_ID;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  @SuppressWarnings("unused")
-  public static void enableEffects()
-    {
-    Method method;
-
-    for(Type type: Type.values())
-      {
-      try
-        {
-        method = type.effect.getDeclaredMethod("enable"); // enable not public, thus getDeclaredMethod
-        }
-      catch(NoSuchMethodException ex)
-        {
-        android.util.Log.e("SolveEffect", type.effect.getSimpleName()+": exception getting method: "+ex.getMessage());
-        method = null;
-        }
-
-      try
-        {
-        if( method!=null ) method.invoke(null);
-        }
-      catch(Exception ex)
-        {
-        android.util.Log.e("SolveEffect", type.effect.getSimpleName()+": exception invoking method: "+ex.getMessage());
-        }
-      }
-    }
-}
diff --git a/src/main/java/org/distorted/effects/solve/SolveEffectNone.java b/src/main/java/org/distorted/effects/solve/SolveEffectNone.java
deleted file mode 100644
index 221568ad..00000000
--- a/src/main/java/org/distorted/effects/solve/SolveEffectNone.java
+++ /dev/null
@@ -1,61 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// 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.effects.solve;
-
-import org.distorted.library.effect.Effect;
-import org.distorted.library.effect.MatrixEffectMove;
-import org.distorted.library.type.Dynamic3D;
-import org.distorted.library.type.Static3D;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-public class SolveEffectNone extends SolveEffect
-  {
-  public void createEffectsPhase0(int duration)
-    {
-    Dynamic3D d0 = new Dynamic3D(1,0.5f);
-    d0.add(new Static3D(0,0,0));
-
-    mCubeEffectPosition[0] = new int[] {-1};
-    mCubeEffects[0]        = new Effect[mCubeEffectPosition[0].length];
-    mCubeEffects[0][0]     = new MatrixEffectMove(d0);
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public void createEffectsPhase1(int duration)
-    {
-    Dynamic3D d0 = new Dynamic3D(1,0.5f);
-    d0.add(new Static3D(0,0,0));
-
-    mCubeEffectPosition[1]  = new int[] {-1};
-    mCubeEffects[1]         = new Effect[mCubeEffectPosition[1].length];
-    mCubeEffects[1][0]      = new MatrixEffectMove(d0);
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Enable all effects used in this Effect. Called by reflection from the parent class.
-
-  @SuppressWarnings("unused")
-  static void enable()
-    {
-
-    }
-  }
diff --git a/src/main/java/org/distorted/effects/solve/SolveEffectSpin.java b/src/main/java/org/distorted/effects/solve/SolveEffectSpin.java
deleted file mode 100644
index f1a9f952..00000000
--- a/src/main/java/org/distorted/effects/solve/SolveEffectSpin.java
+++ /dev/null
@@ -1,121 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// 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.effects.solve;
-
-import org.distorted.library.effect.Effect;
-import org.distorted.library.effect.MatrixEffectRotate;
-import org.distorted.library.type.Dynamic;
-import org.distorted.library.type.Dynamic1D;
-import org.distorted.library.type.Static1D;
-import org.distorted.library.type.Static3D;
-import org.distorted.library.type.Static4D;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-public class SolveEffectSpin extends SolveEffect
-  {
-  private static Static4D quatMultiply( Static4D quat1, Static4D quat2 )
-    {
-    float qx = quat1.get0();
-    float qy = quat1.get1();
-    float qz = quat1.get2();
-    float qw = quat1.get3();
-
-    float rx = quat2.get0();
-    float ry = quat2.get1();
-    float rz = quat2.get2();
-    float rw = quat2.get3();
-
-    float tx = rw*qx - rz*qy + ry*qz + rx*qw;
-    float ty = rw*qy + rz*qx + ry*qw - rx*qz;
-    float tz = rw*qz + rz*qw - ry*qx + rx*qy;
-    float tw = rw*qw - rz*qz - ry*qy - rx*qx;
-
-    return new Static4D(tx,ty,tz,tw);
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// rotate 'vector' by quat^(-1)  ( i.e. return (quat^-1)*vector*quat )
-
-  private static Static4D rotateVectorByInvertedQuat(Static4D vector, Static4D quat)
-    {
-    float qx = quat.get0();
-    float qy = quat.get1();
-    float qz = quat.get2();
-    float qw = quat.get3();
-
-    Static4D quatInverted= new Static4D(-qx,-qy,-qz,qw);
-    Static4D tmp = quatMultiply(quatInverted,vector);
-
-    return quatMultiply(tmp,quat);
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  private void createEffects(int phase, int duration, int[] points)
-    {
-    mCubeEffectPosition[phase] = new int[] {0};
-    mCubeEffects[phase]        = new Effect[mCubeEffectPosition[0].length];
-
-    Static4D quaternion = mObject.getRotationQuat();                      // always rotate around
-    Static4D tmpAxis    = new Static4D(0,1,0,0);                          // vert axis no matter
-    Static4D rotated    = rotateVectorByInvertedQuat(tmpAxis,quaternion); // how cube is rotated
-
-    Static3D axis  = new Static3D(rotated.get0(), rotated.get1(), rotated.get2());
-    Static3D center= new Static3D(0,0,0);
-
-    Dynamic1D d = new Dynamic1D(duration/2, 1.0f);
-    d.setMode(Dynamic.MODE_JUMP);
-    d.setConvexity(0.0f);   // otherwise speed of the rotation would be strangely uneven
-
-    d.add( new Static1D(36*points[0]) );
-    d.add( new Static1D(36*points[1]) );
-    d.add( new Static1D(36*points[2]) );
-    d.add( new Static1D(36*points[3]) );
-    d.add( new Static1D(36*points[4]) );
-
-    mCubeEffects[phase][0] = new MatrixEffectRotate(d,axis,center);
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// PUBLIC API
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public void createEffectsPhase0(int duration)
-    {
-    createEffects(0,duration,new int[] {0,1,3,6,10});
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public void createEffectsPhase1(int duration)
-    {
-    createEffects(1,duration,new int[] {0,4,7,9,10});
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Enable all effects used in this Effect. Called by reflection from the parent class.
-
-  @SuppressWarnings("unused")
-  static void enable()
-    {
-
-    }
-  }
diff --git a/src/main/java/org/distorted/effects/win/WinEffect.java b/src/main/java/org/distorted/effects/win/WinEffect.java
deleted file mode 100644
index ce1f4905..00000000
--- a/src/main/java/org/distorted/effects/win/WinEffect.java
+++ /dev/null
@@ -1,210 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// 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.effects.win;
-
-import java.lang.reflect.Method;
-
-import org.distorted.library.effect.Effect;
-import org.distorted.library.main.DistortedEffects;
-import org.distorted.library.main.DistortedScreen;
-import org.distorted.library.message.EffectListener;
-
-import org.distorted.objectlib.main.TwistyObject;
-
-import org.distorted.effects.BaseEffect;
-import org.distorted.effects.EffectController;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-public abstract class WinEffect extends BaseEffect implements EffectListener
-{
-  public enum Type
-    {
-    NONE   (WinEffectNone.class),
-    GLOW   (WinEffectGlow.class),
-    ;
-
-    final Class<? extends WinEffect> effect;
-
-    Type(Class<? extends WinEffect> effect)
-      {
-      this.effect = effect;
-      }
-    }
-
-  private static final int NUM_EFFECTS = Type.values().length;
-  private static final int FAKE_EFFECT_ID = -4;
-  private static final Type[] types;
-
-  static
-    {
-    int i=0;
-    types = new Type[NUM_EFFECTS];
-
-    for(Type type: Type.values())
-      {
-      types[i++] = type;
-      }
-    }
-
-  private EffectController mController;
-  private int mDuration;
-  private int mEffectReturned;
-  private int mCubeEffectNumber, mNodeEffectNumber;
-
-  TwistyObject mObject;
-  DistortedScreen mScreen;
-  Effect[] mCubeEffects;
-  int[] mCubeEffectPosition;
-  Effect[] mNodeEffects;
-  int[] mNodeEffectPosition;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  abstract void createEffects(int duration);
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  private void assignEffects()
-    {
-    mCubeEffectNumber = ( mCubeEffects!=null ) ? mCubeEffects.length : 0;
-    mNodeEffectNumber = ( mNodeEffects!=null ) ? mNodeEffects.length : 0;
-
-    if( mCubeEffectNumber==0 && mNodeEffectNumber==0 )
-      {
-      throw new RuntimeException("Cube and Node Effects both not created!");
-      }
-
-    for(int i=0; i<mCubeEffectNumber; i++)
-      {
-      mObject.apply(mCubeEffects[i],mCubeEffectPosition[i]);
-      mCubeEffects[i].notifyWhenFinished(this);
-      }
-
-    DistortedEffects nodeEffects = mObject.getEffects();
-
-    for(int i=0; i<mNodeEffectNumber; i++)
-      {
-      nodeEffects.apply(mNodeEffects[i],mNodeEffectPosition[i]);
-      mNodeEffects[i].notifyWhenFinished(this);
-      }
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// PUBLIC API
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  @SuppressWarnings("unused")
-  public static String[] getNames()
-    {
-    String[] names = new String[NUM_EFFECTS];
-
-    for( int i=0; i<NUM_EFFECTS; i++)
-      {
-      names[i] = types[i].name();
-      }
-
-    return names;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  @SuppressWarnings("unused")
-  public static WinEffect create(int ordinal) throws InstantiationException, IllegalAccessException
-    {
-    return types[ordinal].effect.newInstance();
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public void effectFinished(final long effectID)
-    {
-    int total = mCubeEffectNumber+mNodeEffectNumber;
-
-    for(int i=0; i<mCubeEffectNumber; i++)
-      {
-      long id = mCubeEffects[i].getID();
-
-      if( effectID == id )
-        {
-        if( ++mEffectReturned == total ) mController.effectFinished(FAKE_EFFECT_ID);
-        mObject.remove(id);
-        return;
-        }
-      }
-    for(int i=0; i<mNodeEffectNumber; i++)
-      {
-      long id = mNodeEffects[i].getID();
-
-      if( effectID == id )
-        {
-        if( ++mEffectReturned == total ) mController.effectFinished(FAKE_EFFECT_ID);
-        mObject.getEffects().abortById(id);
-        return;
-        }
-      }
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  @SuppressWarnings("unused")
-  public long start(int duration, DistortedScreen screen, EffectController cont)
-    {
-    mScreen    = screen;
-    mObject    = cont.getObject();
-    mController= cont;
-    mDuration  = duration;
-
-    createEffects(mDuration);
-    assignEffects();
-
-    return FAKE_EFFECT_ID;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  @SuppressWarnings("unused")
-  public static void enableEffects()
-    {
-    Method method;
-
-    for(Type type: Type.values())
-      {
-      try
-        {
-        method = type.effect.getDeclaredMethod("enable"); // enable not public, thus getDeclaredMethod
-        }
-      catch(NoSuchMethodException ex)
-        {
-        android.util.Log.e("WinEffect", type.effect.getSimpleName()+": exception getting method: "+ex.getMessage());
-        method = null;
-        }
-
-      try
-        {
-        if( method!=null ) method.invoke(null);
-        }
-      catch(Exception ex)
-        {
-        android.util.Log.e("WinEffect", type.effect.getSimpleName()+": exception invoking method: "+ex.getMessage());
-        }
-      }
-    }
-}
diff --git a/src/main/java/org/distorted/effects/win/WinEffectGlow.java b/src/main/java/org/distorted/effects/win/WinEffectGlow.java
deleted file mode 100644
index 5e6ce1c4..00000000
--- a/src/main/java/org/distorted/effects/win/WinEffectGlow.java
+++ /dev/null
@@ -1,82 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// 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.effects.win;
-
-import org.distorted.library.effect.Effect;
-import org.distorted.library.effect.EffectQuality;
-import org.distorted.library.effect.PostprocessEffectGlow;
-import org.distorted.library.effect.VertexEffectSink;
-import org.distorted.library.type.Dynamic1D;
-import org.distorted.library.type.Dynamic2D;
-import org.distorted.library.type.Dynamic4D;
-import org.distorted.library.type.Static1D;
-import org.distorted.library.type.Static2D;
-import org.distorted.library.type.Static3D;
-import org.distorted.library.type.Static4D;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-public class WinEffectGlow extends WinEffect
-  {
-  private static final int[] colors = new int[] {0,0,1,  1,0,1,  1,0,0,  1,1,0,  0,1,0,  1,1,1}; // blue, pink, red, yellow, green, white
-  private static final int INDEX = 5;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public void createEffects(int duration)
-    {
-    mNodeEffectPosition = new int[] {-1, -1};
-    mNodeEffects        = new Effect[mNodeEffectPosition.length];
-
-    Dynamic2D haloRadiusDyn = new Dynamic2D(duration,1.0f);
-    haloRadiusDyn.add(new Static2D( 0, 0));
-    haloRadiusDyn.add(new Static2D(15,50));
-    haloRadiusDyn.add(new Static2D( 0, 0));
-
-    Dynamic4D color= new Dynamic4D(duration,1.0f);
-    Static4D P1    = new Static4D(colors[3*INDEX],colors[3*INDEX+1], colors[3*INDEX+2], 0.0f);
-    Static4D P2    = new Static4D(colors[3*INDEX],colors[3*INDEX+1], colors[3*INDEX+2], 0.5f);
-    color.add(P1);
-    color.add(P2);
-    color.add(P1);
-
-    PostprocessEffectGlow glow = new PostprocessEffectGlow(haloRadiusDyn,color);
-    glow.setQuality(EffectQuality.MEDIUM);
-
-    mNodeEffects[0] = glow;
-
-    Dynamic1D degreeDyn= new Dynamic1D(duration,1.0f);
-    degreeDyn.add(new Static1D(1.0f));
-    degreeDyn.add(new Static1D(1.5f));
-    degreeDyn.add(new Static1D(1.0f));
-
-    mNodeEffects[1] = new VertexEffectSink(degreeDyn,new Static3D(0,0,0), new Static4D(0,0,0,0.5f) );
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Enable all effects used in this Effect. Called by reflection from the parent class.
-
-  @SuppressWarnings("unused")
-  static void enable()
-    {
-    PostprocessEffectGlow.enable();
-    VertexEffectSink.enable();
-    }
-  }
diff --git a/src/main/java/org/distorted/effects/win/WinEffectNone.java b/src/main/java/org/distorted/effects/win/WinEffectNone.java
deleted file mode 100644
index a60e113e..00000000
--- a/src/main/java/org/distorted/effects/win/WinEffectNone.java
+++ /dev/null
@@ -1,49 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// 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.effects.win;
-
-import org.distorted.library.effect.Effect;
-import org.distorted.library.effect.MatrixEffectMove;
-import org.distorted.library.type.Dynamic3D;
-import org.distorted.library.type.Static3D;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-public class WinEffectNone extends WinEffect
-  {
-  public void createEffects(int duration)
-    {
-    Dynamic3D d0 = new Dynamic3D(1,0.5f);
-    d0.add(new Static3D(0,0,0));
-
-    mCubeEffectPosition = new int[] {-1};
-    mCubeEffects        = new Effect[mCubeEffectPosition.length];
-    mCubeEffects[0]     = new MatrixEffectMove(d0);
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Enable all effects used in this Effect. Called by reflection from the parent class.
-
-  @SuppressWarnings("unused")
-  static void enable()
-    {
-
-    }
-  }
diff --git a/src/main/java/org/distorted/main/RubikActivity.java b/src/main/java/org/distorted/main/RubikActivity.java
index b48a5e95..94678511 100644
--- a/src/main/java/org/distorted/main/RubikActivity.java
+++ b/src/main/java/org/distorted/main/RubikActivity.java
@@ -46,7 +46,7 @@ import org.distorted.objectlib.helpers.TwistyPreRender;
 
 import org.distorted.dialogs.RubikDialogError;
 import org.distorted.dialogs.RubikDialogPrivacy;
-import org.distorted.effects.BaseEffect;
+import org.distorted.objectlib.effects.BaseEffect;
 import org.distorted.objectlib.helpers.TwistyActivity;
 import org.distorted.network.RubikScores;
 import org.distorted.network.RubikNetwork;
diff --git a/src/main/java/org/distorted/main/RubikPreRender.java b/src/main/java/org/distorted/main/RubikPreRender.java
index d03d7c96..cc2246e1 100644
--- a/src/main/java/org/distorted/main/RubikPreRender.java
+++ b/src/main/java/org/distorted/main/RubikPreRender.java
@@ -39,9 +39,9 @@ import org.distorted.objectlib.main.ObjectType;
 
 import org.distorted.dialogs.RubikDialogNewRecord;
 import org.distorted.dialogs.RubikDialogSolved;
-import org.distorted.effects.BaseEffect;
-import org.distorted.effects.EffectController;
-import org.distorted.effects.scramble.ScrambleEffect;
+import org.distorted.objectlib.effects.BaseEffect;
+import org.distorted.objectlib.effects.EffectController;
+import org.distorted.objectlib.effects.scramble.ScrambleEffect;
 import org.distorted.objectlib.helpers.BlockController;
 import org.distorted.objectlib.helpers.MovesFinished;
 import org.distorted.objectlib.helpers.TwistyPreRender;
diff --git a/src/main/java/org/distorted/main/RubikRenderer.java b/src/main/java/org/distorted/main/RubikRenderer.java
index 0bad85d4..d2be6de7 100644
--- a/src/main/java/org/distorted/main/RubikRenderer.java
+++ b/src/main/java/org/distorted/main/RubikRenderer.java
@@ -23,7 +23,7 @@ import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 import org.distorted.control.RubikControl;
-import org.distorted.effects.BaseEffect;
+import org.distorted.objectlib.effects.BaseEffect;
 import org.distorted.library.effect.EffectType;
 import org.distorted.library.effect.VertexEffectQuaternion;
 import org.distorted.library.effect.VertexEffectRotate;
diff --git a/src/main/java/org/distorted/tutorials/TutorialPreRender.java b/src/main/java/org/distorted/tutorials/TutorialPreRender.java
index b06c84b8..146470ac 100644
--- a/src/main/java/org/distorted/tutorials/TutorialPreRender.java
+++ b/src/main/java/org/distorted/tutorials/TutorialPreRender.java
@@ -28,8 +28,8 @@ import org.distorted.objectlib.helpers.BlockController;
 import org.distorted.objectlib.helpers.MovesFinished;
 import org.distorted.objectlib.helpers.TwistyPreRender;
 
-import org.distorted.effects.BaseEffect;
-import org.distorted.effects.EffectController;
+import org.distorted.objectlib.effects.BaseEffect;
+import org.distorted.objectlib.effects.EffectController;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
diff --git a/src/main/java/org/distorted/tutorials/TutorialRenderer.java b/src/main/java/org/distorted/tutorials/TutorialRenderer.java
index 783345e8..b1a5c4be 100644
--- a/src/main/java/org/distorted/tutorials/TutorialRenderer.java
+++ b/src/main/java/org/distorted/tutorials/TutorialRenderer.java
@@ -30,7 +30,7 @@ import org.distorted.library.effect.VertexEffectRotate;
 import org.distorted.library.main.DistortedLibrary;
 import org.distorted.library.main.DistortedScreen;
 
-import org.distorted.effects.BaseEffect;
+import org.distorted.objectlib.effects.BaseEffect;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index d977a0d8..e607f165 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -19,10 +19,6 @@
     <string name="you">YOU</string>
     <string name="solution">Solution</string>
     <string name="ready">Ready?</string>
-    <string name="objectchange_effect">Object Change Effect</string>
-    <string name="solve_effect">Solve Effect</string>
-    <string name="scramble_effect">Scramble Effect</string>
-    <string name="win_effect">Win Effect</string>
     <string name="duration">Duration:</string>
     <string name="type">Type:</string>
     <string name="choose_name">Choose a Name</string>
