Project

General

Profile

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

magiccube / src / main / java / org / distorted / patterns / RubikPattern.java @ 7f84a768

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