Project

General

Profile

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

magiccube / src / main / java / org / distorted / effect / SolveEffect.java @ 42772cff

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
package org.distorted.effect;
21
22
///////////////////////////////////////////////////////////////////////////////////////////////////
23
24 584f7954 Leszek Koltunski
import org.distorted.library.effect.Effect;
25
import org.distorted.library.main.DistortedEffects;
26
import org.distorted.library.main.DistortedScreen;
27
import org.distorted.library.message.EffectListener;
28
import org.distorted.magic.RubikCube;
29
30
import java.lang.reflect.Method;
31
32 2ecf0c21 Leszek Koltunski
public abstract class SolveEffect implements EffectListener
33 a7012218 Leszek Koltunski
{
34
  public enum Type
35
    {
36 2ecf0c21 Leszek Koltunski
    NONE   (SolveEffectNone.class),
37
    SPIN   (SolveEffectSpin.class),
38 a7012218 Leszek Koltunski
    ;
39
40 2ecf0c21 Leszek Koltunski
    final Class<? extends SolveEffect> effect;
41 a7012218 Leszek Koltunski
42 2ecf0c21 Leszek Koltunski
    Type(Class<? extends SolveEffect> effect)
43 a7012218 Leszek Koltunski
      {
44 584f7954 Leszek Koltunski
      this.effect = effect;
45 a7012218 Leszek Koltunski
      }
46
    }
47
48 086a24d0 Leszek Koltunski
  private static final int NUM_EFFECTS = Type.values().length;
49
  private static final int NUM_PHASES  = 2;
50
  private static final int FAKE_EFFECT_ID = -2;
51 a7012218 Leszek Koltunski
  private static final Type[] types;
52
53
  static
54
    {
55
    int i=0;
56
    types = new Type[NUM_EFFECTS];
57
58
    for(Type type: Type.values())
59
      {
60 584f7954 Leszek Koltunski
      types[i++] = type;
61 a7012218 Leszek Koltunski
      }
62
    }
63
64 584f7954 Leszek Koltunski
  private EffectListener mListener;
65 086a24d0 Leszek Koltunski
  private int mDuration;
66
  private int mEffectReturned;
67
  private int[] mCubeEffectNumber, mNodeEffectNumber;
68
  private int mPhase;
69 584f7954 Leszek Koltunski
70
  RubikCube mCube;
71
  DistortedScreen mScreen;
72 086a24d0 Leszek Koltunski
  Effect[][] mCubeEffects;
73
  int[][] mCubeEffectPosition;
74
  Effect[][] mNodeEffects;
75
  int[][] mNodeEffectPosition;
76 584f7954 Leszek Koltunski
77
///////////////////////////////////////////////////////////////////////////////////////////////////
78
79 2ecf0c21 Leszek Koltunski
  SolveEffect()
80 584f7954 Leszek Koltunski
    {
81 086a24d0 Leszek Koltunski
    mPhase        =  0;
82
83
    mCubeEffectNumber   = new int[NUM_PHASES];
84
    mNodeEffectNumber   = new int[NUM_PHASES];
85
    mCubeEffectPosition = new int[NUM_PHASES][];
86
    mNodeEffectPosition = new int[NUM_PHASES][];
87
    mCubeEffects        = new Effect[NUM_PHASES][];
88
    mNodeEffects        = new Effect[NUM_PHASES][];
89 584f7954 Leszek Koltunski
    }
90
91
///////////////////////////////////////////////////////////////////////////////////////////////////
92
93
  public static String[] getNames()
94
    {
95
    String[] names = new String[NUM_EFFECTS];
96
97
    for( int i=0; i<NUM_EFFECTS; i++)
98
      {
99
      names[i] = types[i].name();
100
      }
101
102
    return names;
103
    }
104
105 a7012218 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
106
107 42772cff Leszek Koltunski
  public static SolveEffect create(int ordinal) throws InstantiationException, IllegalAccessException
108 a7012218 Leszek Koltunski
    {
109 42772cff Leszek Koltunski
    return types[ordinal].effect.newInstance();
110 a7012218 Leszek Koltunski
    }
111
112 584f7954 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
113
114 086a24d0 Leszek Koltunski
  abstract void createEffectsPhase0(int duration);
115
  abstract void createEffectsPhase1(int duration);
116 584f7954 Leszek Koltunski
117
///////////////////////////////////////////////////////////////////////////////////////////////////
118
119
  public void effectFinished(final long effectID)
120
    {
121 086a24d0 Leszek Koltunski
    int total = mCubeEffectNumber[mPhase]+mNodeEffectNumber[mPhase];
122 584f7954 Leszek Koltunski
123 086a24d0 Leszek Koltunski
    for(int i=0; i<mCubeEffectNumber[mPhase]; i++)
124 584f7954 Leszek Koltunski
      {
125 086a24d0 Leszek Koltunski
      long id = mCubeEffects[mPhase][i].getID();
126 584f7954 Leszek Koltunski
127
      if( effectID == id )
128
        {
129 086a24d0 Leszek Koltunski
        if( ++mEffectReturned == total ) effectAction(mPhase);
130 584f7954 Leszek Koltunski
        mCube.remove(id);
131 086a24d0 Leszek Koltunski
        return;
132 584f7954 Leszek Koltunski
        }
133
      }
134 086a24d0 Leszek Koltunski
    for(int i=0; i<mNodeEffectNumber[mPhase]; i++)
135 584f7954 Leszek Koltunski
      {
136 086a24d0 Leszek Koltunski
      long id = mNodeEffects[mPhase][i].getID();
137 584f7954 Leszek Koltunski
138
      if( effectID == id )
139
        {
140 086a24d0 Leszek Koltunski
        if( ++mEffectReturned == total ) effectAction(mPhase);
141 584f7954 Leszek Koltunski
        mCube.getEffects().abortById(id);
142 086a24d0 Leszek Koltunski
        return;
143 584f7954 Leszek Koltunski
        }
144
      }
145
    }
146
147
///////////////////////////////////////////////////////////////////////////////////////////////////
148
149 086a24d0 Leszek Koltunski
  private void effectAction(int phase)
150 584f7954 Leszek Koltunski
    {
151 086a24d0 Leszek Koltunski
    switch(phase)
152 584f7954 Leszek Koltunski
      {
153 086a24d0 Leszek Koltunski
      case 0: mEffectReturned = 0;
154
              mPhase          = 1;
155 2ecf0c21 Leszek Koltunski
              mCube.solve();
156 086a24d0 Leszek Koltunski
              createEffectsPhase1(mDuration);
157
              assignEffects(mPhase);
158
              break;
159
      case 1: mListener.effectFinished(FAKE_EFFECT_ID);
160
              break;
161 584f7954 Leszek Koltunski
      }
162
    }
163
164
///////////////////////////////////////////////////////////////////////////////////////////////////
165
166
  public long start(int duration, DistortedScreen screen, RubikCube cube, EffectListener listener)
167
    {
168
    mScreen   = screen;
169
    mCube     = cube;
170
    mListener = listener;
171 086a24d0 Leszek Koltunski
    mDuration = duration;
172 584f7954 Leszek Koltunski
173 086a24d0 Leszek Koltunski
    createEffectsPhase0(mDuration);
174
    assignEffects(mPhase);
175 584f7954 Leszek Koltunski
176 086a24d0 Leszek Koltunski
    return FAKE_EFFECT_ID;
177 584f7954 Leszek Koltunski
    }
178
179
///////////////////////////////////////////////////////////////////////////////////////////////////
180
181 086a24d0 Leszek Koltunski
  private void assignEffects(int phase)
182 584f7954 Leszek Koltunski
    {
183 086a24d0 Leszek Koltunski
    mCubeEffectNumber[phase] = ( mCubeEffects[phase]!=null ) ? mCubeEffects[phase].length : 0;
184
    mNodeEffectNumber[phase] = ( mNodeEffects[phase]!=null ) ? mNodeEffects[phase].length : 0;
185 584f7954 Leszek Koltunski
186 086a24d0 Leszek Koltunski
    if( mCubeEffectNumber[phase]==0 && mNodeEffectNumber[phase]==0 )
187 584f7954 Leszek Koltunski
      {
188 086a24d0 Leszek Koltunski
      throw new RuntimeException("Cube and Node Effects ("+phase+" phase) both not created!");
189 584f7954 Leszek Koltunski
      }
190
191 086a24d0 Leszek Koltunski
    for(int i=0; i<mCubeEffectNumber[phase]; i++)
192 584f7954 Leszek Koltunski
      {
193 086a24d0 Leszek Koltunski
      mCube.apply(mCubeEffects[phase][i],mCubeEffectPosition[phase][i]);
194
      mCubeEffects[phase][i].notifyWhenFinished(this);
195 584f7954 Leszek Koltunski
      }
196
197
    DistortedEffects nodeEffects = mCube.getEffects();
198
199 086a24d0 Leszek Koltunski
    for(int i=0; i<mNodeEffectNumber[phase]; i++)
200 584f7954 Leszek Koltunski
      {
201 086a24d0 Leszek Koltunski
      nodeEffects.apply(mNodeEffects[phase][i],mNodeEffectPosition[phase][i]);
202
      mNodeEffects[phase][i].notifyWhenFinished(this);
203 584f7954 Leszek Koltunski
      }
204
    }
205
206
///////////////////////////////////////////////////////////////////////////////////////////////////
207
208 086a24d0 Leszek Koltunski
  @SuppressWarnings("unused")
209 a7012218 Leszek Koltunski
  public static void enableEffects()
210
    {
211 a8cbefce Leszek Koltunski
    Method method;
212 a7012218 Leszek Koltunski
213
    for(Type type: Type.values())
214
      {
215
      try
216
        {
217 a8cbefce Leszek Koltunski
        method = type.effect.getDeclaredMethod("enable"); // enable not public, thus getDeclaredMethod
218 a7012218 Leszek Koltunski
        }
219
      catch(NoSuchMethodException ex)
220
        {
221 2ecf0c21 Leszek Koltunski
        android.util.Log.e("SolveEffect", type.effect.getSimpleName()+": exception getting method: "+ex.getMessage());
222 a8cbefce Leszek Koltunski
        method = null;
223 a7012218 Leszek Koltunski
        }
224
225
      try
226
        {
227 a8cbefce Leszek Koltunski
        if( method!=null ) method.invoke(null);
228 a7012218 Leszek Koltunski
        }
229
      catch(Exception ex)
230
        {
231 2ecf0c21 Leszek Koltunski
        android.util.Log.e("SolveEffect", type.effect.getSimpleName()+": exception invoking method: "+ex.getMessage());
232 a7012218 Leszek Koltunski
        }
233
      }
234
    }
235
}