Project

General

Profile

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

magiccube / src / main / java / org / distorted / patterns / RubikPattern.java @ 6f2a942e

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 6f2a942e Leszek Koltunski
    private String nameStr, moveStr;
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 6f2a942e Leszek Koltunski
    private boolean mInitialized;
163 8becce57 Leszek Koltunski
164 3a9d19ed Leszek Koltunski
  /////////////////////////////////////////////////////////////
165
166 4f470e00 Leszek Koltunski
    Pattern(String n, String m)
167 d18993ac Leszek Koltunski
      {
168 6f2a942e Leszek Koltunski
      nameStr = n;
169
      moveStr = m;
170
      mCanRotate   = true;
171
      mInitialized = false;
172 d18993ac Leszek Koltunski
      }
173 3a9d19ed Leszek Koltunski
174 a31d25de Leszek Koltunski
  /////////////////////////////////////////////////////////////
175
176
    private int[][] movesParser(String moves)
177
      {
178
      numMove = moves.length()/4;
179 6f2a942e Leszek Koltunski
      curMove=numMove;
180 a31d25de Leszek Koltunski
181
      int digit0, digit1, digit2;
182
      int[][] result = new int[numMove][3];
183
184
      for(int i=0; i<numMove; i++)
185
        {
186
        digit0 = moves.charAt(4*i+1)-'0';
187
        digit1 = moves.charAt(4*i+2)-'0';
188
        digit2 = moves.charAt(4*i+3)-'0';
189
190
        result[i][0] = (10*digit0+digit1)/32;
191
        result[i][1] = (10*digit0+digit1)%32;
192
        result[i][2] = 2-digit2;
193
        }
194
195
      return result;
196
      }
197
198 3a9d19ed Leszek Koltunski
  /////////////////////////////////////////////////////////////
199
200
    String getName()
201 d18993ac Leszek Koltunski
      {
202 6f2a942e Leszek Koltunski
      return nameStr;
203 d18993ac Leszek Koltunski
      }
204 3a9d19ed Leszek Koltunski
205
  /////////////////////////////////////////////////////////////
206
207 4f470e00 Leszek Koltunski
    int getNumMove()
208 8becce57 Leszek Koltunski
      {
209 6f2a942e Leszek Koltunski
      if( !mInitialized )
210
        {
211
        mInitialized = true;
212
        moves = movesParser(moveStr);
213
        moveStr = null;
214
        }
215
216 8becce57 Leszek Koltunski
      return numMove;
217
      }
218 3a9d19ed Leszek Koltunski
219
  /////////////////////////////////////////////////////////////
220
221 4f470e00 Leszek Koltunski
    int getCurMove()
222 8becce57 Leszek Koltunski
      {
223 6f2a942e Leszek Koltunski
      if( !mInitialized )
224
        {
225
        mInitialized = true;
226
        moves = movesParser(moveStr);
227
        moveStr = null;
228
        }
229
230 8becce57 Leszek Koltunski
      return curMove;
231
      }
232 3a9d19ed Leszek Koltunski
233
  /////////////////////////////////////////////////////////////
234
235 8becce57 Leszek Koltunski
    void makeMove(RubikPostRender post)
236 d18993ac Leszek Koltunski
      {
237 6f2a942e Leszek Koltunski
      if( !mInitialized )
238
        {
239
        mInitialized = true;
240
        moves = movesParser(moveStr);
241
        moveStr = null;
242
        }
243
244 39566863 Leszek Koltunski
      curMove++;
245 8becce57 Leszek Koltunski
      RubikObject object = post.getObject();
246 3a9d19ed Leszek Koltunski
247 d12bb11b Leszek Koltunski
      if( mCanRotate )
248 d18993ac Leszek Koltunski
        {
249 d12bb11b Leszek Koltunski
        if( curMove>numMove )
250
          {
251
          curMove= 0;
252
          post.initializeObject(null);
253
          }
254
        else
255 aa171dee Leszek Koltunski
          {
256 8becce57 Leszek Koltunski
          mCanRotate = false;
257
258 a31d25de Leszek Koltunski
          int axis     =moves[curMove-1][0];
259
		      int rowBitmap=moves[curMove-1][1];
260
		      int bareAngle=moves[curMove-1][2];
261
          int angle    = bareAngle*(360/object.getBasicAngle());
262
          int numRot   = Math.abs(bareAngle);
263 8becce57 Leszek Koltunski
264
          post.addRotation(this, axis, rowBitmap, angle, numRot*DURATION_MILLIS);
265
          }
266 d12bb11b Leszek Koltunski
        }
267
      else
268
        {
269
        android.util.Log.e("pattern", "failed to make Move!");
270
        curMove--;
271 d18993ac Leszek Koltunski
        }
272
      }
273 3a9d19ed Leszek Koltunski
274
  /////////////////////////////////////////////////////////////
275
276 8becce57 Leszek Koltunski
    void backMove(RubikPostRender post)
277 d18993ac Leszek Koltunski
      {
278 6f2a942e Leszek Koltunski
      if( !mInitialized )
279
        {
280
        mInitialized = true;
281
        moves = movesParser(moveStr);
282
        moveStr = null;
283
        }
284
285 39566863 Leszek Koltunski
      curMove--;
286 8becce57 Leszek Koltunski
      RubikObject object = post.getObject();
287 3a9d19ed Leszek Koltunski
288 d12bb11b Leszek Koltunski
      if( mCanRotate )
289 d18993ac Leszek Koltunski
        {
290 d12bb11b Leszek Koltunski
        if( curMove<0 )
291
          {
292
          curMove=numMove;
293
          post.initializeObject(moves);
294
          }
295
        else
296 aa171dee Leszek Koltunski
          {
297 8becce57 Leszek Koltunski
          mCanRotate = false;
298
299 a31d25de Leszek Koltunski
          int axis     =moves[curMove][0];
300
		      int rowBitmap=moves[curMove][1];
301
		      int bareAngle=moves[curMove][2];
302
          int angle    = bareAngle*(360/object.getBasicAngle());
303
          int numRot   = Math.abs(bareAngle);
304 8becce57 Leszek Koltunski
305
          post.addRotation(this, axis, rowBitmap, -angle, numRot*DURATION_MILLIS);
306
          }
307 d12bb11b Leszek Koltunski
        }
308
      else
309
        {
310
        android.util.Log.e("pattern", "failed to back Move!");
311
        curMove++;
312 d18993ac Leszek Koltunski
        }
313
      }
314 3a9d19ed Leszek Koltunski
315
  /////////////////////////////////////////////////////////////
316
317 a31d25de Leszek Koltunski
    int[][] getMoves()
318 d18993ac Leszek Koltunski
      {
319 6f2a942e Leszek Koltunski
      if( !mInitialized )
320
        {
321
        mInitialized = true;
322
        moves = movesParser(moveStr);
323
        moveStr = null;
324
        }
325
326
      curMove = numMove;
327 a31d25de Leszek Koltunski
      return moves;
328 d18993ac Leszek Koltunski
      }
329 8becce57 Leszek Koltunski
330
  /////////////////////////////////////////////////////////////
331
332
    public void onActionFinished(final long effectID)
333
      {
334
      mCanRotate = true;
335
      }
336 d18993ac Leszek Koltunski
    }
337
338
///////////////////////////////////////////////////////////////////////////////////////////////////
339
340 4f470e00 Leszek Koltunski
  private RubikPattern()
341 d18993ac Leszek Koltunski
    {
342
    mCategories = new Vector[NUM_CUBES];
343 4f470e00 Leszek Koltunski
344 d18993ac Leszek Koltunski
    initializeCategories(0, RubikPatternData2.patterns);
345
    initializeCategories(1, RubikPatternData3.patterns);
346
    initializeCategories(2, RubikPatternData4.patterns);
347
    initializeCategories(3, RubikPatternData5.patterns);
348
    }
349
350
///////////////////////////////////////////////////////////////////////////////////////////////////
351
352
  private void initializeCategories(int num, String[] pat)
353
    {
354
    int colon;
355
    mCategories[num] = new Vector<>();
356
    Category cat=null;
357
    String name, pattern;
358
    Pattern patt;
359
360
    numCategories[num]=0;
361
362
    for(String p: pat)
363
      {
364
      colon = p.indexOf(':');
365
366
      if( colon==-1 )
367
        {
368
        cat = new Category(p);
369
        mCategories[num].addElement(cat);
370
        numCategories[num]++;
371
        }
372
      else
373
        {
374
        pattern = p.substring(colon+1);
375
        name    = p.substring(0,colon);
376
        patt = new Pattern(name,pattern);
377
        cat.addPattern(patt);
378
        }
379
      }
380
    }
381
382 4f470e00 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
383
// PUBLIC API
384
///////////////////////////////////////////////////////////////////////////////////////////////////
385
386
  public static RubikPattern getInstance()
387
    {
388
    if( mThis==null )
389
      {
390
      mThis = new RubikPattern();
391
      }
392
393
    return mThis;
394
    }
395
396 3a9d19ed Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
397
398
  public int getNumCategories(int size)
399
    {
400
    return size>=0 && size<NUM_CUBES ? numCategories[size] : 0;
401
    }
402
403 d18993ac Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
404
405
  public String getCategoryName(int size,int num)
406
    {
407 4f470e00 Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && num>=0 && num< numCategories[size] )
408 d18993ac Leszek Koltunski
      {
409 4f470e00 Leszek Koltunski
      Category c = mCategories[size].elementAt(num);
410 d18993ac Leszek Koltunski
      return c!=null ? c.getName() : null;
411
      }
412
413
    return null;
414
    }
415
416 044529c1 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
417
418
  public void rememberCategory(int size,int num)
419
    {
420
    if( size>=0 && size<NUM_CUBES )
421
      {
422
      currentCategory[size] = num;
423
      }
424
    }
425
426
///////////////////////////////////////////////////////////////////////////////////////////////////
427
428
  public int recallCategory(int size)
429
    {
430
    return size>=0 && size<NUM_CUBES ? currentCategory[size] : 0;
431
    }
432
433 d18993ac Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
434
435 3a9d19ed Leszek Koltunski
  public String getPatternName(int size, int cat, int pat)
436 d18993ac Leszek Koltunski
    {
437 3a9d19ed Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && cat>=0 && cat< numCategories[size] )
438 d18993ac Leszek Koltunski
      {
439 3a9d19ed Leszek Koltunski
      Category c = mCategories[size].elementAt(cat);
440
      return c!=null ? c.getPatternName(pat) : null;
441 d18993ac Leszek Koltunski
      }
442
443
    return null;
444
    }
445
446
///////////////////////////////////////////////////////////////////////////////////////////////////
447
448
  public int getNumPatterns(int size, int num )
449
    {
450 4f470e00 Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && num>=0 && num< numCategories[size] )
451 d18993ac Leszek Koltunski
      {
452 4f470e00 Leszek Koltunski
      Category c = mCategories[size].elementAt(num);
453 d18993ac Leszek Koltunski
      return c!=null ? c.getNumPatterns() : 0;
454
      }
455
456
    return 0;
457
    }
458
459
///////////////////////////////////////////////////////////////////////////////////////////////////
460
461 3a9d19ed Leszek Koltunski
  public int getCurMove(int size, int cat, int pat)
462 d18993ac Leszek Koltunski
    {
463 3a9d19ed Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && cat>=0 && cat< numCategories[size] )
464 d18993ac Leszek Koltunski
      {
465 3a9d19ed Leszek Koltunski
      Category c = mCategories[size].elementAt(cat);
466
      return c!=null ? c.getPatternCurMove(pat):0;
467 d18993ac Leszek Koltunski
      }
468
469
    return 0;
470
    }
471
472
///////////////////////////////////////////////////////////////////////////////////////////////////
473
474 3a9d19ed Leszek Koltunski
  public int getNumMoves(int size, int cat, int pat)
475 d18993ac Leszek Koltunski
    {
476 3a9d19ed Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && cat>=0 && cat< numCategories[size] )
477 d18993ac Leszek Koltunski
      {
478 3a9d19ed Leszek Koltunski
      Category c = mCategories[size].elementAt(cat);
479
      return c!=null ? c.getPatternNumMove(pat):0;
480 d18993ac Leszek Koltunski
      }
481
482
    return 0;
483
    }
484
485
///////////////////////////////////////////////////////////////////////////////////////////////////
486
487 8becce57 Leszek Koltunski
  public void makeMove(RubikPostRender post, int size, int cat, int pat)
488 d18993ac Leszek Koltunski
    {
489 3a9d19ed Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && cat>=0 && cat< numCategories[size] )
490 d18993ac Leszek Koltunski
      {
491 3a9d19ed Leszek Koltunski
      Category c = mCategories[size].elementAt(cat);
492 8becce57 Leszek Koltunski
      if( c!=null ) c.makeMove(post,pat);
493 d18993ac Leszek Koltunski
      }
494
    }
495
496
///////////////////////////////////////////////////////////////////////////////////////////////////
497
498 8becce57 Leszek Koltunski
  public void backMove(RubikPostRender post, int size, int cat, int pat)
499 d18993ac Leszek Koltunski
    {
500 3a9d19ed Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && cat>=0 && cat< numCategories[size] )
501 d18993ac Leszek Koltunski
      {
502 3a9d19ed Leszek Koltunski
      Category c = mCategories[size].elementAt(cat);
503 8becce57 Leszek Koltunski
      if( c!=null ) c.backMove(post,pat);
504 d18993ac Leszek Koltunski
      }
505
    }
506
507
///////////////////////////////////////////////////////////////////////////////////////////////////
508
509 a31d25de Leszek Koltunski
  public int[][] getMoves(int size, int cat, int pat)
510 d18993ac Leszek Koltunski
    {
511 3a9d19ed Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && cat>=0 && cat< numCategories[size] )
512 d18993ac Leszek Koltunski
      {
513 3a9d19ed Leszek Koltunski
      Category c = mCategories[size].elementAt(cat);
514 aa171dee Leszek Koltunski
      if( c!=null ) return c.getMoves(pat);
515 d18993ac Leszek Koltunski
      }
516 4f470e00 Leszek Koltunski
517 a31d25de Leszek Koltunski
    return null;
518 4f470e00 Leszek Koltunski
    }
519 d18993ac Leszek Koltunski
}