Project

General

Profile

Download (7.78 KB) Statistics
| Branch: | Tag: | Revision:

magiccube / src / main / java / org / distorted / effect / solve / SolveEffect.java @ 64975793

1 a7012218 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2019 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Distorted.                                                               //
5
//                                                                                               //
6
// Distorted is free software: you can redistribute it and/or modify                             //
7
// it under the terms of the GNU General Public License as published by                          //
8
// the Free Software Foundation, either version 2 of the License, or                             //
9
// (at your option) any later version.                                                           //
10
//                                                                                               //
11
// Distorted is distributed in the hope that it will be useful,                                  //
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
14
// GNU General Public License for more details.                                                  //
15
//                                                                                               //
16
// You should have received a copy of the GNU General Public License                             //
17
// along with Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
18
///////////////////////////////////////////////////////////////////////////////////////////////////
19
20 64975793 Leszek Koltunski
package org.distorted.effect.solve;
21 a7012218 Leszek Koltunski
22 64975793 Leszek Koltunski
import org.distorted.effect.BaseEffect;
23 584f7954 Leszek Koltunski
import org.distorted.library.effect.Effect;
24
import org.distorted.library.main.DistortedEffects;
25
import org.distorted.library.main.DistortedScreen;
26
import org.distorted.library.message.EffectListener;
27
import org.distorted.magic.RubikCube;
28 64975793 Leszek Koltunski
import org.distorted.magic.RubikRenderer;
29 584f7954 Leszek Koltunski
30
import java.lang.reflect.Method;
31
32 64975793 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
33
34
public abstract class SolveEffect extends BaseEffect implements EffectListener
35 a7012218 Leszek Koltunski
{
36
  public enum Type
37
    {
38 2ecf0c21 Leszek Koltunski
    NONE   (SolveEffectNone.class),
39
    SPIN   (SolveEffectSpin.class),
40 a7012218 Leszek Koltunski
    ;
41
42 2ecf0c21 Leszek Koltunski
    final Class<? extends SolveEffect> effect;
43 a7012218 Leszek Koltunski
44 2ecf0c21 Leszek Koltunski
    Type(Class<? extends SolveEffect> effect)
45 a7012218 Leszek Koltunski
      {
46 584f7954 Leszek Koltunski
      this.effect = effect;
47 a7012218 Leszek Koltunski
      }
48
    }
49
50 086a24d0 Leszek Koltunski
  private static final int NUM_EFFECTS = Type.values().length;
51
  private static final int NUM_PHASES  = 2;
52
  private static final int FAKE_EFFECT_ID = -2;
53 a7012218 Leszek Koltunski
  private static final Type[] types;
54
55
  static
56
    {
57
    int i=0;
58
    types = new Type[NUM_EFFECTS];
59
60
    for(Type type: Type.values())
61
      {
62 584f7954 Leszek Koltunski
      types[i++] = type;
63 a7012218 Leszek Koltunski
      }
64
    }
65
66 584f7954 Leszek Koltunski
  private EffectListener mListener;
67 086a24d0 Leszek Koltunski
  private int mDuration;
68
  private int mEffectReturned;
69
  private int[] mCubeEffectNumber, mNodeEffectNumber;
70
  private int mPhase;
71 584f7954 Leszek Koltunski
72
  RubikCube mCube;
73
  DistortedScreen mScreen;
74 086a24d0 Leszek Koltunski
  Effect[][] mCubeEffects;
75
  int[][] mCubeEffectPosition;
76
  Effect[][] mNodeEffects;
77
  int[][] mNodeEffectPosition;
78 584f7954 Leszek Koltunski
79
///////////////////////////////////////////////////////////////////////////////////////////////////
80
81 2ecf0c21 Leszek Koltunski
  SolveEffect()
82 584f7954 Leszek Koltunski
    {
83 086a24d0 Leszek Koltunski
    mPhase        =  0;
84
85
    mCubeEffectNumber   = new int[NUM_PHASES];
86
    mNodeEffectNumber   = new int[NUM_PHASES];
87
    mCubeEffectPosition = new int[NUM_PHASES][];
88
    mNodeEffectPosition = new int[NUM_PHASES][];
89
    mCubeEffects        = new Effect[NUM_PHASES][];
90
    mNodeEffects        = new Effect[NUM_PHASES][];
91 584f7954 Leszek Koltunski
    }
92
93
///////////////////////////////////////////////////////////////////////////////////////////////////
94
95
  public static String[] getNames()
96
    {
97
    String[] names = new String[NUM_EFFECTS];
98
99
    for( int i=0; i<NUM_EFFECTS; i++)
100
      {
101
      names[i] = types[i].name();
102
      }
103
104
    return names;
105
    }
106
107 a7012218 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
108
109 42772cff Leszek Koltunski
  public static SolveEffect create(int ordinal) throws InstantiationException, IllegalAccessException
110 a7012218 Leszek Koltunski
    {
111 42772cff Leszek Koltunski
    return types[ordinal].effect.newInstance();
112 a7012218 Leszek Koltunski
    }
113
114 584f7954 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
115
116 086a24d0 Leszek Koltunski
  abstract void createEffectsPhase0(int duration);
117
  abstract void createEffectsPhase1(int duration);
118 584f7954 Leszek Koltunski
119
///////////////////////////////////////////////////////////////////////////////////////////////////
120
121
  public void effectFinished(final long effectID)
122
    {
123 086a24d0 Leszek Koltunski
    int total = mCubeEffectNumber[mPhase]+mNodeEffectNumber[mPhase];
124 584f7954 Leszek Koltunski
125 086a24d0 Leszek Koltunski
    for(int i=0; i<mCubeEffectNumber[mPhase]; i++)
126 584f7954 Leszek Koltunski
      {
127 086a24d0 Leszek Koltunski
      long id = mCubeEffects[mPhase][i].getID();
128 584f7954 Leszek Koltunski
129
      if( effectID == id )
130
        {
131 086a24d0 Leszek Koltunski
        if( ++mEffectReturned == total ) effectAction(mPhase);
132 584f7954 Leszek Koltunski
        mCube.remove(id);
133 086a24d0 Leszek Koltunski
        return;
134 584f7954 Leszek Koltunski
        }
135
      }
136 086a24d0 Leszek Koltunski
    for(int i=0; i<mNodeEffectNumber[mPhase]; i++)
137 584f7954 Leszek Koltunski
      {
138 086a24d0 Leszek Koltunski
      long id = mNodeEffects[mPhase][i].getID();
139 584f7954 Leszek Koltunski
140
      if( effectID == id )
141
        {
142 086a24d0 Leszek Koltunski
        if( ++mEffectReturned == total ) effectAction(mPhase);
143 584f7954 Leszek Koltunski
        mCube.getEffects().abortById(id);
144 086a24d0 Leszek Koltunski
        return;
145 584f7954 Leszek Koltunski
        }
146
      }
147
    }
148
149
///////////////////////////////////////////////////////////////////////////////////////////////////
150
151 086a24d0 Leszek Koltunski
  private void effectAction(int phase)
152 584f7954 Leszek Koltunski
    {
153 086a24d0 Leszek Koltunski
    switch(phase)
154 584f7954 Leszek Koltunski
      {
155 086a24d0 Leszek Koltunski
      case 0: mEffectReturned = 0;
156
              mPhase          = 1;
157 2ecf0c21 Leszek Koltunski
              mCube.solve();
158 086a24d0 Leszek Koltunski
              createEffectsPhase1(mDuration);
159
              assignEffects(mPhase);
160
              break;
161
      case 1: mListener.effectFinished(FAKE_EFFECT_ID);
162
              break;
163 584f7954 Leszek Koltunski
      }
164
    }
165
166
///////////////////////////////////////////////////////////////////////////////////////////////////
167
168 64975793 Leszek Koltunski
  public long start(int duration, RubikRenderer renderer)
169 584f7954 Leszek Koltunski
    {
170 64975793 Leszek Koltunski
    mScreen   = renderer.getScreen();
171
    mCube     = renderer.getCube();
172
    mListener = renderer;
173 086a24d0 Leszek Koltunski
    mDuration = duration;
174 584f7954 Leszek Koltunski
175 086a24d0 Leszek Koltunski
    createEffectsPhase0(mDuration);
176
    assignEffects(mPhase);
177 584f7954 Leszek Koltunski
178 086a24d0 Leszek Koltunski
    return FAKE_EFFECT_ID;
179 584f7954 Leszek Koltunski
    }
180
181
///////////////////////////////////////////////////////////////////////////////////////////////////
182
183 086a24d0 Leszek Koltunski
  private void assignEffects(int phase)
184 584f7954 Leszek Koltunski
    {
185 086a24d0 Leszek Koltunski
    mCubeEffectNumber[phase] = ( mCubeEffects[phase]!=null ) ? mCubeEffects[phase].length : 0;
186
    mNodeEffectNumber[phase] = ( mNodeEffects[phase]!=null ) ? mNodeEffects[phase].length : 0;
187 584f7954 Leszek Koltunski
188 086a24d0 Leszek Koltunski
    if( mCubeEffectNumber[phase]==0 && mNodeEffectNumber[phase]==0 )
189 584f7954 Leszek Koltunski
      {
190 086a24d0 Leszek Koltunski
      throw new RuntimeException("Cube and Node Effects ("+phase+" phase) both not created!");
191 584f7954 Leszek Koltunski
      }
192
193 086a24d0 Leszek Koltunski
    for(int i=0; i<mCubeEffectNumber[phase]; i++)
194 584f7954 Leszek Koltunski
      {
195 086a24d0 Leszek Koltunski
      mCube.apply(mCubeEffects[phase][i],mCubeEffectPosition[phase][i]);
196
      mCubeEffects[phase][i].notifyWhenFinished(this);
197 584f7954 Leszek Koltunski
      }
198
199
    DistortedEffects nodeEffects = mCube.getEffects();
200
201 086a24d0 Leszek Koltunski
    for(int i=0; i<mNodeEffectNumber[phase]; i++)
202 584f7954 Leszek Koltunski
      {
203 086a24d0 Leszek Koltunski
      nodeEffects.apply(mNodeEffects[phase][i],mNodeEffectPosition[phase][i]);
204
      mNodeEffects[phase][i].notifyWhenFinished(this);
205 584f7954 Leszek Koltunski
      }
206
    }
207
208
///////////////////////////////////////////////////////////////////////////////////////////////////
209
210 086a24d0 Leszek Koltunski
  @SuppressWarnings("unused")
211 a7012218 Leszek Koltunski
  public static void enableEffects()
212
    {
213 a8cbefce Leszek Koltunski
    Method method;
214 a7012218 Leszek Koltunski
215
    for(Type type: Type.values())
216
      {
217
      try
218
        {
219 a8cbefce Leszek Koltunski
        method = type.effect.getDeclaredMethod("enable"); // enable not public, thus getDeclaredMethod
220 a7012218 Leszek Koltunski
        }
221
      catch(NoSuchMethodException ex)
222
        {
223 2ecf0c21 Leszek Koltunski
        android.util.Log.e("SolveEffect", type.effect.getSimpleName()+": exception getting method: "+ex.getMessage());
224 a8cbefce Leszek Koltunski
        method = null;
225 a7012218 Leszek Koltunski
        }
226
227
      try
228
        {
229 a8cbefce Leszek Koltunski
        if( method!=null ) method.invoke(null);
230 a7012218 Leszek Koltunski
        }
231
      catch(Exception ex)
232
        {
233 2ecf0c21 Leszek Koltunski
        android.util.Log.e("SolveEffect", type.effect.getSimpleName()+": exception invoking method: "+ex.getMessage());
234 a7012218 Leszek Koltunski
        }
235
      }
236
    }
237
}