Project

General

Profile

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

magiccube / src / main / java / org / distorted / effects / win / WinEffect.java @ 1f9772f3

1 ebb64a1d Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2019 Leszek Koltunski                                                               //
3
//                                                                                               //
4 fdec60a3 Leszek Koltunski
// This file is part of Magic Cube.                                                              //
5 ebb64a1d Leszek Koltunski
//                                                                                               //
6 fdec60a3 Leszek Koltunski
// Magic Cube is free software: you can redistribute it and/or modify                            //
7 ebb64a1d Leszek Koltunski
// 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 fdec60a3 Leszek Koltunski
// Magic Cube is distributed in the hope that it will be useful,                                 //
12 ebb64a1d Leszek Koltunski
// 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 fdec60a3 Leszek Koltunski
// along with Magic Cube.  If not, see <http://www.gnu.org/licenses/>.                           //
18 ebb64a1d Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
19
20 1f9772f3 Leszek Koltunski
package org.distorted.effects.win;
21 ebb64a1d Leszek Koltunski
22 1f9772f3 Leszek Koltunski
import org.distorted.effects.BaseEffect;
23 ebb64a1d 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 1f9772f3 Leszek Koltunski
import org.distorted.main.RubikPostRender;
28
import org.distorted.objects.RubikObject;
29 ebb64a1d Leszek Koltunski
30
import java.lang.reflect.Method;
31
32
///////////////////////////////////////////////////////////////////////////////////////////////////
33
34
public abstract class WinEffect extends BaseEffect implements EffectListener
35
{
36
  public enum Type
37
    {
38
    NONE   (WinEffectNone.class),
39 bee1d997 Leszek Koltunski
    GLOW   (WinEffectGlow.class),
40 ebb64a1d Leszek Koltunski
    ;
41
42
    final Class<? extends WinEffect> effect;
43
44
    Type(Class<? extends WinEffect> effect)
45
      {
46
      this.effect = effect;
47
      }
48
    }
49
50
  private static final int NUM_EFFECTS = Type.values().length;
51 769d7b9f Leszek Koltunski
  private static final int FAKE_EFFECT_ID = -4;
52 ebb64a1d Leszek Koltunski
  private static final Type[] types;
53
54
  static
55
    {
56
    int i=0;
57
    types = new Type[NUM_EFFECTS];
58
59
    for(Type type: Type.values())
60
      {
61
      types[i++] = type;
62
      }
63
    }
64
65
  private EffectListener mListener;
66
  private int mDuration;
67
  private int mEffectReturned;
68 bee1d997 Leszek Koltunski
  private int mCubeEffectNumber, mNodeEffectNumber;
69 ebb64a1d Leszek Koltunski
70 27a70eae Leszek Koltunski
  RubikObject mObject;
71 ebb64a1d Leszek Koltunski
  DistortedScreen mScreen;
72 bee1d997 Leszek Koltunski
  Effect[] mCubeEffects;
73
  int[] mCubeEffectPosition;
74
  Effect[] mNodeEffects;
75
  int[] mNodeEffectPosition;
76 ebb64a1d Leszek Koltunski
77
///////////////////////////////////////////////////////////////////////////////////////////////////
78
79 47ba5ddc Leszek Koltunski
  abstract void createEffects(int duration);
80
81
///////////////////////////////////////////////////////////////////////////////////////////////////
82
83
  private void assignEffects()
84
    {
85
    mCubeEffectNumber = ( mCubeEffects!=null ) ? mCubeEffects.length : 0;
86
    mNodeEffectNumber = ( mNodeEffects!=null ) ? mNodeEffects.length : 0;
87
88
    if( mCubeEffectNumber==0 && mNodeEffectNumber==0 )
89
      {
90
      throw new RuntimeException("Cube and Node Effects both not created!");
91
      }
92
93
    for(int i=0; i<mCubeEffectNumber; i++)
94
      {
95 27a70eae Leszek Koltunski
      mObject.apply(mCubeEffects[i],mCubeEffectPosition[i]);
96 47ba5ddc Leszek Koltunski
      mCubeEffects[i].notifyWhenFinished(this);
97
      }
98
99 27a70eae Leszek Koltunski
    DistortedEffects nodeEffects = mObject.getEffects();
100 47ba5ddc Leszek Koltunski
101
    for(int i=0; i<mNodeEffectNumber; i++)
102
      {
103
      nodeEffects.apply(mNodeEffects[i],mNodeEffectPosition[i]);
104
      mNodeEffects[i].notifyWhenFinished(this);
105
      }
106
    }
107
108
///////////////////////////////////////////////////////////////////////////////////////////////////
109
// PUBLIC API
110
///////////////////////////////////////////////////////////////////////////////////////////////////
111
112
  @SuppressWarnings("unused")
113 ebb64a1d Leszek Koltunski
  public static String[] getNames()
114
    {
115
    String[] names = new String[NUM_EFFECTS];
116
117
    for( int i=0; i<NUM_EFFECTS; i++)
118
      {
119
      names[i] = types[i].name();
120
      }
121
122
    return names;
123
    }
124
125
///////////////////////////////////////////////////////////////////////////////////////////////////
126
127 47ba5ddc Leszek Koltunski
  @SuppressWarnings("unused")
128 ebb64a1d Leszek Koltunski
  public static WinEffect create(int ordinal) throws InstantiationException, IllegalAccessException
129
    {
130
    return types[ordinal].effect.newInstance();
131
    }
132
133
///////////////////////////////////////////////////////////////////////////////////////////////////
134
135
  public void effectFinished(final long effectID)
136
    {
137 bee1d997 Leszek Koltunski
    int total = mCubeEffectNumber+mNodeEffectNumber;
138 ebb64a1d Leszek Koltunski
139 bee1d997 Leszek Koltunski
    for(int i=0; i<mCubeEffectNumber; i++)
140 ebb64a1d Leszek Koltunski
      {
141 bee1d997 Leszek Koltunski
      long id = mCubeEffects[i].getID();
142 ebb64a1d Leszek Koltunski
143
      if( effectID == id )
144
        {
145 bee1d997 Leszek Koltunski
        if( ++mEffectReturned == total ) mListener.effectFinished(FAKE_EFFECT_ID);
146 27a70eae Leszek Koltunski
        mObject.remove(id);
147 ebb64a1d Leszek Koltunski
        return;
148
        }
149
      }
150 bee1d997 Leszek Koltunski
    for(int i=0; i<mNodeEffectNumber; i++)
151 ebb64a1d Leszek Koltunski
      {
152 bee1d997 Leszek Koltunski
      long id = mNodeEffects[i].getID();
153 ebb64a1d Leszek Koltunski
154
      if( effectID == id )
155
        {
156 bee1d997 Leszek Koltunski
        if( ++mEffectReturned == total ) mListener.effectFinished(FAKE_EFFECT_ID);
157 27a70eae Leszek Koltunski
        mObject.getEffects().abortById(id);
158 ebb64a1d Leszek Koltunski
        return;
159
        }
160
      }
161
    }
162
163
///////////////////////////////////////////////////////////////////////////////////////////////////
164
165 47ba5ddc Leszek Koltunski
  @SuppressWarnings("unused")
166 8becce57 Leszek Koltunski
  public long start(int duration, DistortedScreen screen, RubikPostRender post)
167 ebb64a1d Leszek Koltunski
    {
168 8becce57 Leszek Koltunski
    mScreen   = screen;
169
    mObject   = post.getObject();
170
    mListener = post;
171 ebb64a1d Leszek Koltunski
    mDuration = duration;
172
173 bee1d997 Leszek Koltunski
    createEffects(mDuration);
174
    assignEffects();
175 ebb64a1d Leszek Koltunski
176
    return FAKE_EFFECT_ID;
177
    }
178
179
///////////////////////////////////////////////////////////////////////////////////////////////////
180
181
  @SuppressWarnings("unused")
182
  public static void enableEffects()
183
    {
184
    Method method;
185
186
    for(Type type: Type.values())
187
      {
188
      try
189
        {
190
        method = type.effect.getDeclaredMethod("enable"); // enable not public, thus getDeclaredMethod
191
        }
192
      catch(NoSuchMethodException ex)
193
        {
194 bee1d997 Leszek Koltunski
        android.util.Log.e("WinEffect", type.effect.getSimpleName()+": exception getting method: "+ex.getMessage());
195 ebb64a1d Leszek Koltunski
        method = null;
196
        }
197
198
      try
199
        {
200
        if( method!=null ) method.invoke(null);
201
        }
202
      catch(Exception ex)
203
        {
204 bee1d997 Leszek Koltunski
        android.util.Log.e("WinEffect", type.effect.getSimpleName()+": exception invoking method: "+ex.getMessage());
205 ebb64a1d Leszek Koltunski
        }
206
      }
207
    }
208
}