Project

General

Profile

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

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

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