Project

General

Profile

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

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

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 8becce57 Leszek Koltunski
          mCanRotate = false;
259
260 a31d25de Leszek Koltunski
          int axis     =moves[curMove-1][0];
261
		      int rowBitmap=moves[curMove-1][1];
262
		      int bareAngle=moves[curMove-1][2];
263
          int angle    = bareAngle*(360/object.getBasicAngle());
264
          int numRot   = Math.abs(bareAngle);
265 8becce57 Leszek Koltunski
266
          post.addRotation(this, axis, rowBitmap, angle, numRot*DURATION_MILLIS);
267
          }
268 d12bb11b Leszek Koltunski
        }
269
      else
270
        {
271
        android.util.Log.e("pattern", "failed to make Move!");
272
        curMove--;
273 d18993ac Leszek Koltunski
        }
274
      }
275 3a9d19ed Leszek Koltunski
276
  /////////////////////////////////////////////////////////////
277
278 8becce57 Leszek Koltunski
    void backMove(RubikPostRender post)
279 d18993ac Leszek Koltunski
      {
280 6f2a942e Leszek Koltunski
      if( !mInitialized )
281
        {
282
        mInitialized = true;
283
        moves = movesParser(moveStr);
284
        moveStr = null;
285
        }
286
287 39566863 Leszek Koltunski
      curMove--;
288 8becce57 Leszek Koltunski
      RubikObject object = post.getObject();
289 3a9d19ed Leszek Koltunski
290 d12bb11b Leszek Koltunski
      if( mCanRotate )
291 d18993ac Leszek Koltunski
        {
292 d12bb11b Leszek Koltunski
        if( curMove<0 )
293
          {
294
          curMove=numMove;
295
          post.initializeObject(moves);
296
          }
297
        else
298 aa171dee Leszek Koltunski
          {
299 8becce57 Leszek Koltunski
          mCanRotate = false;
300
301 a31d25de Leszek Koltunski
          int axis     =moves[curMove][0];
302
		      int rowBitmap=moves[curMove][1];
303
		      int bareAngle=moves[curMove][2];
304
          int angle    = bareAngle*(360/object.getBasicAngle());
305
          int numRot   = Math.abs(bareAngle);
306 8becce57 Leszek Koltunski
307
          post.addRotation(this, axis, rowBitmap, -angle, numRot*DURATION_MILLIS);
308
          }
309 d12bb11b Leszek Koltunski
        }
310
      else
311
        {
312
        android.util.Log.e("pattern", "failed to back Move!");
313
        curMove++;
314 d18993ac Leszek Koltunski
        }
315
      }
316 3a9d19ed Leszek Koltunski
317
  /////////////////////////////////////////////////////////////
318
319 c715128d Leszek Koltunski
    int[][] reInitialize()
320 d18993ac Leszek Koltunski
      {
321 6f2a942e Leszek Koltunski
      if( !mInitialized )
322
        {
323
        mInitialized = true;
324
        moves = movesParser(moveStr);
325
        moveStr = null;
326
        }
327
328 c715128d Leszek Koltunski
      mCanRotate = true;
329 6f2a942e Leszek Koltunski
      curMove = numMove;
330 a31d25de Leszek Koltunski
      return moves;
331 d18993ac Leszek Koltunski
      }
332 8becce57 Leszek Koltunski
333
  /////////////////////////////////////////////////////////////
334
335
    public void onActionFinished(final long effectID)
336
      {
337
      mCanRotate = true;
338
      }
339 d18993ac Leszek Koltunski
    }
340
341
///////////////////////////////////////////////////////////////////////////////////////////////////
342
343 4f470e00 Leszek Koltunski
  private RubikPattern()
344 d18993ac Leszek Koltunski
    {
345
    mCategories = new Vector[NUM_CUBES];
346 4f470e00 Leszek Koltunski
347 d18993ac Leszek Koltunski
    initializeCategories(0, RubikPatternData2.patterns);
348
    initializeCategories(1, RubikPatternData3.patterns);
349
    initializeCategories(2, RubikPatternData4.patterns);
350
    initializeCategories(3, RubikPatternData5.patterns);
351
    }
352
353
///////////////////////////////////////////////////////////////////////////////////////////////////
354
355
  private void initializeCategories(int num, String[] pat)
356
    {
357
    int colon;
358
    mCategories[num] = new Vector<>();
359
    Category cat=null;
360
    String name, pattern;
361
    Pattern patt;
362
363
    numCategories[num]=0;
364
365
    for(String p: pat)
366
      {
367
      colon = p.indexOf(':');
368
369
      if( colon==-1 )
370
        {
371
        cat = new Category(p);
372
        mCategories[num].addElement(cat);
373
        numCategories[num]++;
374
        }
375
      else
376
        {
377
        pattern = p.substring(colon+1);
378
        name    = p.substring(0,colon);
379
        patt = new Pattern(name,pattern);
380
        cat.addPattern(patt);
381
        }
382
      }
383
    }
384
385 4f470e00 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
386
// PUBLIC API
387
///////////////////////////////////////////////////////////////////////////////////////////////////
388
389
  public static RubikPattern getInstance()
390
    {
391
    if( mThis==null )
392
      {
393
      mThis = new RubikPattern();
394
      }
395
396
    return mThis;
397
    }
398
399 3a9d19ed Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
400
401
  public int getNumCategories(int size)
402
    {
403
    return size>=0 && size<NUM_CUBES ? numCategories[size] : 0;
404
    }
405
406 d18993ac Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
407
408
  public String getCategoryName(int size,int num)
409
    {
410 4f470e00 Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && num>=0 && num< numCategories[size] )
411 d18993ac Leszek Koltunski
      {
412 4f470e00 Leszek Koltunski
      Category c = mCategories[size].elementAt(num);
413 d18993ac Leszek Koltunski
      return c!=null ? c.getName() : null;
414
      }
415
416
    return null;
417
    }
418
419 044529c1 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
420
421 c715128d Leszek Koltunski
  public void rememberState(int size,int num, int scrollPos)
422 044529c1 Leszek Koltunski
    {
423
    if( size>=0 && size<NUM_CUBES )
424
      {
425
      currentCategory[size] = num;
426 c715128d Leszek Koltunski
      currentScrollPos[size]= scrollPos;
427 044529c1 Leszek Koltunski
      }
428
    }
429
430
///////////////////////////////////////////////////////////////////////////////////////////////////
431
432
  public int recallCategory(int size)
433
    {
434
    return size>=0 && size<NUM_CUBES ? currentCategory[size] : 0;
435
    }
436
437 c715128d Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
438
439
  public int recallScrollPos(int size)
440
    {
441
    return size>=0 && size<NUM_CUBES ? currentScrollPos[size] : 0;
442
    }
443
444 d18993ac Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
445
446 3a9d19ed Leszek Koltunski
  public String getPatternName(int size, int cat, int pat)
447 d18993ac Leszek Koltunski
    {
448 3a9d19ed Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && cat>=0 && cat< numCategories[size] )
449 d18993ac Leszek Koltunski
      {
450 3a9d19ed Leszek Koltunski
      Category c = mCategories[size].elementAt(cat);
451
      return c!=null ? c.getPatternName(pat) : null;
452 d18993ac Leszek Koltunski
      }
453
454
    return null;
455
    }
456
457
///////////////////////////////////////////////////////////////////////////////////////////////////
458
459
  public int getNumPatterns(int size, int num )
460
    {
461 4f470e00 Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && num>=0 && num< numCategories[size] )
462 d18993ac Leszek Koltunski
      {
463 4f470e00 Leszek Koltunski
      Category c = mCategories[size].elementAt(num);
464 d18993ac Leszek Koltunski
      return c!=null ? c.getNumPatterns() : 0;
465
      }
466
467
    return 0;
468
    }
469
470
///////////////////////////////////////////////////////////////////////////////////////////////////
471
472 3a9d19ed Leszek Koltunski
  public int getCurMove(int size, int cat, int pat)
473 d18993ac Leszek Koltunski
    {
474 3a9d19ed Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && cat>=0 && cat< numCategories[size] )
475 d18993ac Leszek Koltunski
      {
476 3a9d19ed Leszek Koltunski
      Category c = mCategories[size].elementAt(cat);
477
      return c!=null ? c.getPatternCurMove(pat):0;
478 d18993ac Leszek Koltunski
      }
479
480
    return 0;
481
    }
482
483
///////////////////////////////////////////////////////////////////////////////////////////////////
484
485 3a9d19ed Leszek Koltunski
  public int getNumMoves(int size, int cat, int pat)
486 d18993ac Leszek Koltunski
    {
487 3a9d19ed Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && cat>=0 && cat< numCategories[size] )
488 d18993ac Leszek Koltunski
      {
489 3a9d19ed Leszek Koltunski
      Category c = mCategories[size].elementAt(cat);
490
      return c!=null ? c.getPatternNumMove(pat):0;
491 d18993ac Leszek Koltunski
      }
492
493
    return 0;
494
    }
495
496
///////////////////////////////////////////////////////////////////////////////////////////////////
497
498 8becce57 Leszek Koltunski
  public void makeMove(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.makeMove(post,pat);
504 d18993ac Leszek Koltunski
      }
505
    }
506
507
///////////////////////////////////////////////////////////////////////////////////////////////////
508
509 8becce57 Leszek Koltunski
  public void backMove(RubikPostRender post, 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 8becce57 Leszek Koltunski
      if( c!=null ) c.backMove(post,pat);
515 d18993ac Leszek Koltunski
      }
516
    }
517
518
///////////////////////////////////////////////////////////////////////////////////////////////////
519
520 c715128d Leszek Koltunski
  public int[][] reInitialize(int size, int cat, int pat)
521 d18993ac Leszek Koltunski
    {
522 3a9d19ed Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && cat>=0 && cat< numCategories[size] )
523 d18993ac Leszek Koltunski
      {
524 3a9d19ed Leszek Koltunski
      Category c = mCategories[size].elementAt(cat);
525 c715128d Leszek Koltunski
      if( c!=null ) return c.reInitialize(pat);
526 d18993ac Leszek Koltunski
      }
527 4f470e00 Leszek Koltunski
528 a31d25de Leszek Koltunski
    return null;
529 4f470e00 Leszek Koltunski
    }
530 d18993ac Leszek Koltunski
}