Project

General

Profile

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

magiccube / src / main / java / org / distorted / patterns / RubikPattern.java @ d12bb11b

1 d18993ac Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2020 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// Magic Cube 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
// Magic Cube 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 Magic Cube.  If not, see <http://www.gnu.org/licenses/>.                           //
18
///////////////////////////////////////////////////////////////////////////////////////////////////
19
20
package org.distorted.patterns;
21
22 8becce57 Leszek Koltunski
import org.distorted.magic.RubikPostRender;
23 aa171dee Leszek Koltunski
import org.distorted.object.RubikObject;
24
25 d18993ac Leszek Koltunski
import java.util.Vector;
26
27
///////////////////////////////////////////////////////////////////////////////////////////////////
28
29
public class RubikPattern
30
{
31 8becce57 Leszek Koltunski
  private static final int DURATION_MILLIS = 1000;
32
33 53f23b64 Leszek Koltunski
  public static final int MIN_CUBE  = 2;
34
  public static final int MAX_CUBE  = 5;
35
  public static final int NUM_CUBES = MAX_CUBE-MIN_CUBE+1;
36 d18993ac Leszek Koltunski
37 044529c1 Leszek Koltunski
  private int[] numCategories   = new int[NUM_CUBES];
38
  private int[] currentCategory = new int[NUM_CUBES];
39 d18993ac Leszek Koltunski
  private Vector<Category>[] mCategories;
40 4f470e00 Leszek Koltunski
  private static RubikPattern mThis;
41
42 d18993ac Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
43
44 3a9d19ed Leszek Koltunski
  private static class Category
45 d18993ac Leszek Koltunski
    {
46
    private String name;
47 3a9d19ed Leszek Koltunski
    private int numPatterns;
48 d18993ac Leszek Koltunski
    private Vector<Pattern> patterns;
49 3a9d19ed Leszek Koltunski
50
  /////////////////////////////////////////////////////////////
51 d18993ac Leszek Koltunski
52 4f470e00 Leszek Koltunski
    Category(String n)
53 d18993ac Leszek Koltunski
      {
54
      name=n;
55 3a9d19ed Leszek Koltunski
      numPatterns=0;
56 d18993ac Leszek Koltunski
      patterns = new Vector<>();
57
      }
58 3a9d19ed Leszek Koltunski
59
  /////////////////////////////////////////////////////////////
60
61 4f470e00 Leszek Koltunski
    void addPattern(Pattern p)
62 d18993ac Leszek Koltunski
      {
63
      patterns.addElement(p);
64 3a9d19ed Leszek Koltunski
      numPatterns++;
65 d18993ac Leszek Koltunski
      }
66 3a9d19ed Leszek Koltunski
67
  /////////////////////////////////////////////////////////////
68
69 4f470e00 Leszek Koltunski
    int getNumPatterns()
70 d18993ac Leszek Koltunski
    {
71 3a9d19ed Leszek Koltunski
    return numPatterns;
72 4f470e00 Leszek Koltunski
    }
73 3a9d19ed Leszek Koltunski
74
  /////////////////////////////////////////////////////////////
75
76 4f470e00 Leszek Koltunski
    String getName()
77 d18993ac Leszek Koltunski
    {
78
    return name;
79
    }
80 3a9d19ed Leszek Koltunski
81
  /////////////////////////////////////////////////////////////
82
83
    String getPatternName(int pattern)
84 d18993ac Leszek Koltunski
      {
85 3a9d19ed Leszek Koltunski
      if( pattern>=0 && pattern<numPatterns )
86
        {
87
        Pattern p = patterns.elementAt(pattern);
88
        return  p!=null ? p.getName():"";
89
        }
90
      return "";
91 d18993ac Leszek Koltunski
      }
92 3a9d19ed Leszek Koltunski
93
  /////////////////////////////////////////////////////////////
94
95
    int getPatternCurMove(int pattern)
96 d18993ac Leszek Koltunski
      {
97 3a9d19ed Leszek Koltunski
      if( pattern>=0 && pattern<numPatterns )
98
        {
99
        Pattern p = patterns.elementAt(pattern);
100
        return  p!=null ? p.getCurMove():-1;
101
        }
102
      return -1;
103 d18993ac Leszek Koltunski
      }
104 3a9d19ed Leszek Koltunski
105
  /////////////////////////////////////////////////////////////
106
107
    int getPatternNumMove(int pattern)
108 d18993ac Leszek Koltunski
      {
109 3a9d19ed Leszek Koltunski
      if( pattern>=0 && pattern<numPatterns )
110
        {
111
        Pattern p = patterns.elementAt(pattern);
112
        return  p!=null ? p.getNumMove():-1;
113
        }
114
      return -1;
115 d18993ac Leszek Koltunski
      }
116 3a9d19ed Leszek Koltunski
117
  /////////////////////////////////////////////////////////////
118
119 8becce57 Leszek Koltunski
    void makeMove(RubikPostRender post, int pattern)
120 d18993ac Leszek Koltunski
      {
121 3a9d19ed Leszek Koltunski
      if( pattern>=0 && pattern<numPatterns )
122
        {
123
        Pattern p = patterns.elementAt(pattern);
124 8becce57 Leszek Koltunski
        if( p!=null ) p.makeMove(post);
125 3a9d19ed Leszek Koltunski
        }
126 d18993ac Leszek Koltunski
      }
127 3a9d19ed Leszek Koltunski
128
  /////////////////////////////////////////////////////////////
129
130 8becce57 Leszek Koltunski
    void backMove(RubikPostRender post, int pattern)
131 d18993ac Leszek Koltunski
      {
132 3a9d19ed Leszek Koltunski
      if( pattern>=0 && pattern<numPatterns )
133
        {
134
        Pattern p = patterns.elementAt(pattern);
135 8becce57 Leszek Koltunski
        if( p!=null ) p.backMove(post);
136 3a9d19ed Leszek Koltunski
        }
137 d18993ac Leszek Koltunski
      }
138 3a9d19ed Leszek Koltunski
139
  /////////////////////////////////////////////////////////////
140
141 a31d25de Leszek Koltunski
    int[][] getMoves(int pattern)
142 d18993ac Leszek Koltunski
      {
143 3a9d19ed Leszek Koltunski
      if( pattern>=0 && pattern<numPatterns )
144
        {
145
        Pattern p = patterns.elementAt(pattern);
146 aa171dee Leszek Koltunski
        if( p!=null ) return p.getMoves();
147 3a9d19ed Leszek Koltunski
        }
148
149 a31d25de Leszek Koltunski
      return null;
150 d18993ac Leszek Koltunski
      }
151
    }
152
153
///////////////////////////////////////////////////////////////////////////////////////////////////
154
155 8becce57 Leszek Koltunski
  private static class Pattern implements RubikPostRender.ActionFinishedListener
156 d18993ac Leszek Koltunski
    {
157
    private String name;
158 a31d25de Leszek Koltunski
    private int[][] moves;
159 39566863 Leszek Koltunski
    private int curMove;
160
    private int numMove;
161 8becce57 Leszek Koltunski
    private boolean mCanRotate;
162
163 3a9d19ed Leszek Koltunski
  /////////////////////////////////////////////////////////////
164
165 4f470e00 Leszek Koltunski
    Pattern(String n, String m)
166 d18993ac Leszek Koltunski
      {
167
      name=n;
168 a31d25de Leszek Koltunski
      moves= movesParser(m);
169 39566863 Leszek Koltunski
      curMove=numMove;
170 8becce57 Leszek Koltunski
      mCanRotate = true;
171 d18993ac Leszek Koltunski
      }
172 3a9d19ed Leszek Koltunski
173 a31d25de Leszek Koltunski
  /////////////////////////////////////////////////////////////
174
175
    private int[][] movesParser(String moves)
176
      {
177
      numMove = moves.length()/4;
178
179
      int digit0, digit1, digit2;
180
      int[][] result = new int[numMove][3];
181
182
      for(int i=0; i<numMove; i++)
183
        {
184
        digit0 = moves.charAt(4*i+1)-'0';
185
        digit1 = moves.charAt(4*i+2)-'0';
186
        digit2 = moves.charAt(4*i+3)-'0';
187
188
        result[i][0] = (10*digit0+digit1)/32;
189
        result[i][1] = (10*digit0+digit1)%32;
190
        result[i][2] = 2-digit2;
191
        }
192
193
      return result;
194
      }
195
196 3a9d19ed Leszek Koltunski
  /////////////////////////////////////////////////////////////
197
198
    String getName()
199 d18993ac Leszek Koltunski
      {
200 39566863 Leszek Koltunski
      return name;
201 d18993ac Leszek Koltunski
      }
202 3a9d19ed Leszek Koltunski
203
  /////////////////////////////////////////////////////////////
204
205 4f470e00 Leszek Koltunski
    int getNumMove()
206 8becce57 Leszek Koltunski
      {
207
      return numMove;
208
      }
209 3a9d19ed Leszek Koltunski
210
  /////////////////////////////////////////////////////////////
211
212 4f470e00 Leszek Koltunski
    int getCurMove()
213 8becce57 Leszek Koltunski
      {
214
      return curMove;
215
      }
216 3a9d19ed Leszek Koltunski
217
  /////////////////////////////////////////////////////////////
218
219 8becce57 Leszek Koltunski
    void makeMove(RubikPostRender post)
220 d18993ac Leszek Koltunski
      {
221 39566863 Leszek Koltunski
      curMove++;
222 8becce57 Leszek Koltunski
      RubikObject object = post.getObject();
223 3a9d19ed Leszek Koltunski
224 d12bb11b Leszek Koltunski
      if( mCanRotate )
225 d18993ac Leszek Koltunski
        {
226 d12bb11b Leszek Koltunski
        if( curMove>numMove )
227
          {
228
          curMove= 0;
229
          post.initializeObject(null);
230
          }
231
        else
232 aa171dee Leszek Koltunski
          {
233 8becce57 Leszek Koltunski
          mCanRotate = false;
234
235 a31d25de Leszek Koltunski
          int axis     =moves[curMove-1][0];
236
		      int rowBitmap=moves[curMove-1][1];
237
		      int bareAngle=moves[curMove-1][2];
238
          int angle    = bareAngle*(360/object.getBasicAngle());
239
          int numRot   = Math.abs(bareAngle);
240 8becce57 Leszek Koltunski
241
          post.addRotation(this, axis, rowBitmap, angle, numRot*DURATION_MILLIS);
242
          }
243 d12bb11b Leszek Koltunski
        }
244
      else
245
        {
246
        android.util.Log.e("pattern", "failed to make Move!");
247
        curMove--;
248 d18993ac Leszek Koltunski
        }
249
      }
250 3a9d19ed Leszek Koltunski
251
  /////////////////////////////////////////////////////////////
252
253 8becce57 Leszek Koltunski
    void backMove(RubikPostRender post)
254 d18993ac Leszek Koltunski
      {
255 39566863 Leszek Koltunski
      curMove--;
256 8becce57 Leszek Koltunski
      RubikObject object = post.getObject();
257 3a9d19ed Leszek Koltunski
258 d12bb11b Leszek Koltunski
      if( mCanRotate )
259 d18993ac Leszek Koltunski
        {
260 d12bb11b Leszek Koltunski
        if( curMove<0 )
261
          {
262
          curMove=numMove;
263
          post.initializeObject(moves);
264
          }
265
        else
266 aa171dee Leszek Koltunski
          {
267 8becce57 Leszek Koltunski
          mCanRotate = false;
268
269 a31d25de Leszek Koltunski
          int axis     =moves[curMove][0];
270
		      int rowBitmap=moves[curMove][1];
271
		      int bareAngle=moves[curMove][2];
272
          int angle    = bareAngle*(360/object.getBasicAngle());
273
          int numRot   = Math.abs(bareAngle);
274 8becce57 Leszek Koltunski
275
          post.addRotation(this, axis, rowBitmap, -angle, numRot*DURATION_MILLIS);
276
          }
277 d12bb11b Leszek Koltunski
        }
278
      else
279
        {
280
        android.util.Log.e("pattern", "failed to back Move!");
281
        curMove++;
282 d18993ac Leszek Koltunski
        }
283
      }
284 3a9d19ed Leszek Koltunski
285
  /////////////////////////////////////////////////////////////
286
287 a31d25de Leszek Koltunski
    int[][] getMoves()
288 d18993ac Leszek Koltunski
      {
289 a31d25de Leszek Koltunski
      return moves;
290 d18993ac Leszek Koltunski
      }
291 8becce57 Leszek Koltunski
292
  /////////////////////////////////////////////////////////////
293
294
    public void onActionFinished(final long effectID)
295
      {
296
      mCanRotate = true;
297
      }
298 d18993ac Leszek Koltunski
    }
299
300
///////////////////////////////////////////////////////////////////////////////////////////////////
301
302 4f470e00 Leszek Koltunski
  private RubikPattern()
303 d18993ac Leszek Koltunski
    {
304
    mCategories = new Vector[NUM_CUBES];
305 4f470e00 Leszek Koltunski
306 d18993ac Leszek Koltunski
    initializeCategories(0, RubikPatternData2.patterns);
307
    initializeCategories(1, RubikPatternData3.patterns);
308
    initializeCategories(2, RubikPatternData4.patterns);
309
    initializeCategories(3, RubikPatternData5.patterns);
310
    }
311
312
///////////////////////////////////////////////////////////////////////////////////////////////////
313
314
  private void initializeCategories(int num, String[] pat)
315
    {
316
    int colon;
317
    mCategories[num] = new Vector<>();
318
    Category cat=null;
319
    String name, pattern;
320
    Pattern patt;
321
322
    numCategories[num]=0;
323
324
    for(String p: pat)
325
      {
326
      colon = p.indexOf(':');
327
328
      if( colon==-1 )
329
        {
330
        cat = new Category(p);
331
        mCategories[num].addElement(cat);
332
        numCategories[num]++;
333
        }
334
      else
335
        {
336
        pattern = p.substring(colon+1);
337
        name    = p.substring(0,colon);
338
        patt = new Pattern(name,pattern);
339
        cat.addPattern(patt);
340
        }
341
      }
342
    }
343
344 4f470e00 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
345
// PUBLIC API
346
///////////////////////////////////////////////////////////////////////////////////////////////////
347
348
  public static RubikPattern getInstance()
349
    {
350
    if( mThis==null )
351
      {
352
      mThis = new RubikPattern();
353
      }
354
355
    return mThis;
356
    }
357
358 3a9d19ed Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
359
360
  public int getNumCategories(int size)
361
    {
362
    return size>=0 && size<NUM_CUBES ? numCategories[size] : 0;
363
    }
364
365 d18993ac Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
366
367
  public String getCategoryName(int size,int num)
368
    {
369 4f470e00 Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && num>=0 && num< numCategories[size] )
370 d18993ac Leszek Koltunski
      {
371 4f470e00 Leszek Koltunski
      Category c = mCategories[size].elementAt(num);
372 d18993ac Leszek Koltunski
      return c!=null ? c.getName() : null;
373
      }
374
375
    return null;
376
    }
377
378 044529c1 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
379
380
  public void rememberCategory(int size,int num)
381
    {
382
    if( size>=0 && size<NUM_CUBES )
383
      {
384
      currentCategory[size] = num;
385
      }
386
    }
387
388
///////////////////////////////////////////////////////////////////////////////////////////////////
389
390
  public int recallCategory(int size)
391
    {
392
    return size>=0 && size<NUM_CUBES ? currentCategory[size] : 0;
393
    }
394
395 d18993ac Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
396
397 3a9d19ed Leszek Koltunski
  public String getPatternName(int size, int cat, int pat)
398 d18993ac Leszek Koltunski
    {
399 3a9d19ed Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && cat>=0 && cat< numCategories[size] )
400 d18993ac Leszek Koltunski
      {
401 3a9d19ed Leszek Koltunski
      Category c = mCategories[size].elementAt(cat);
402
      return c!=null ? c.getPatternName(pat) : null;
403 d18993ac Leszek Koltunski
      }
404
405
    return null;
406
    }
407
408
///////////////////////////////////////////////////////////////////////////////////////////////////
409
410
  public int getNumPatterns(int size, int num )
411
    {
412 4f470e00 Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && num>=0 && num< numCategories[size] )
413 d18993ac Leszek Koltunski
      {
414 4f470e00 Leszek Koltunski
      Category c = mCategories[size].elementAt(num);
415 d18993ac Leszek Koltunski
      return c!=null ? c.getNumPatterns() : 0;
416
      }
417
418
    return 0;
419
    }
420
421
///////////////////////////////////////////////////////////////////////////////////////////////////
422
423 3a9d19ed Leszek Koltunski
  public int getCurMove(int size, int cat, int pat)
424 d18993ac Leszek Koltunski
    {
425 3a9d19ed Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && cat>=0 && cat< numCategories[size] )
426 d18993ac Leszek Koltunski
      {
427 3a9d19ed Leszek Koltunski
      Category c = mCategories[size].elementAt(cat);
428
      return c!=null ? c.getPatternCurMove(pat):0;
429 d18993ac Leszek Koltunski
      }
430
431
    return 0;
432
    }
433
434
///////////////////////////////////////////////////////////////////////////////////////////////////
435
436 3a9d19ed Leszek Koltunski
  public int getNumMoves(int size, int cat, int pat)
437 d18993ac Leszek Koltunski
    {
438 3a9d19ed Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && cat>=0 && cat< numCategories[size] )
439 d18993ac Leszek Koltunski
      {
440 3a9d19ed Leszek Koltunski
      Category c = mCategories[size].elementAt(cat);
441
      return c!=null ? c.getPatternNumMove(pat):0;
442 d18993ac Leszek Koltunski
      }
443
444
    return 0;
445
    }
446
447
///////////////////////////////////////////////////////////////////////////////////////////////////
448
449 8becce57 Leszek Koltunski
  public void makeMove(RubikPostRender post, int size, int cat, int pat)
450 d18993ac Leszek Koltunski
    {
451 3a9d19ed Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && cat>=0 && cat< numCategories[size] )
452 d18993ac Leszek Koltunski
      {
453 3a9d19ed Leszek Koltunski
      Category c = mCategories[size].elementAt(cat);
454 8becce57 Leszek Koltunski
      if( c!=null ) c.makeMove(post,pat);
455 d18993ac Leszek Koltunski
      }
456
    }
457
458
///////////////////////////////////////////////////////////////////////////////////////////////////
459
460 8becce57 Leszek Koltunski
  public void backMove(RubikPostRender post, int size, int cat, int pat)
461 d18993ac Leszek Koltunski
    {
462 3a9d19ed Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && cat>=0 && cat< numCategories[size] )
463 d18993ac Leszek Koltunski
      {
464 3a9d19ed Leszek Koltunski
      Category c = mCategories[size].elementAt(cat);
465 8becce57 Leszek Koltunski
      if( c!=null ) c.backMove(post,pat);
466 d18993ac Leszek Koltunski
      }
467
    }
468
469
///////////////////////////////////////////////////////////////////////////////////////////////////
470
471 a31d25de Leszek Koltunski
  public int[][] getMoves(int size, int cat, int pat)
472 d18993ac Leszek Koltunski
    {
473 3a9d19ed Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && cat>=0 && cat< numCategories[size] )
474 d18993ac Leszek Koltunski
      {
475 3a9d19ed Leszek Koltunski
      Category c = mCategories[size].elementAt(cat);
476 aa171dee Leszek Koltunski
      if( c!=null ) return c.getMoves(pat);
477 d18993ac Leszek Koltunski
      }
478 4f470e00 Leszek Koltunski
479 a31d25de Leszek Koltunski
    return null;
480 4f470e00 Leszek Koltunski
    }
481 d18993ac Leszek Koltunski
}