Project

General

Profile

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

magiccube / src / main / java / org / distorted / patterns / RubikPattern.java @ 88a3e972

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 48145a5b Leszek Koltunski
import java.util.ArrayList;
23
import java.util.List;
24 d18993ac Leszek Koltunski
25 88a3e972 Leszek Koltunski
import org.distorted.objectlib.helpers.MovesFinished;
26 3f7a4363 Leszek Koltunski
import org.distorted.main.RubikPreRender;
27
28 b498f3f6 Leszek Koltunski
import static org.distorted.patterns.RubikPatternList.NUM_OBJECTS;
29
30 d18993ac Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
31
32
public class RubikPattern
33
{
34 0594c61f Leszek Koltunski
  private static final int MILLIS_PER_DEGREE = 6;
35 8becce57 Leszek Koltunski
36 0594c61f Leszek Koltunski
  private final int[] numCategories    = new int[NUM_OBJECTS];
37
  private final int[] currentCategory  = new int[NUM_OBJECTS];
38
  private final int[] currentVisiblePos= new int[NUM_OBJECTS];
39
  private final int[] currentExpanded  = new int[NUM_OBJECTS];
40 c715128d Leszek Koltunski
41 0594c61f Leszek Koltunski
  private final List<List<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 0594c61f Leszek Koltunski
    private final String[] mLines;
49 3a9d19ed Leszek Koltunski
    private int numPatterns;
50 48145a5b Leszek Koltunski
    private ArrayList<Pattern> mPatterns;
51
    private boolean mInitialized;
52 3a9d19ed Leszek Koltunski
53
  /////////////////////////////////////////////////////////////
54 d18993ac Leszek Koltunski
55 48145a5b Leszek Koltunski
    Category(String[] lines)
56 d18993ac Leszek Koltunski
      {
57 b498f3f6 Leszek Koltunski
      mLines       = lines;
58
      numPatterns  = lines.length-1;
59 48145a5b Leszek Koltunski
      mInitialized = false;
60 d18993ac Leszek Koltunski
      }
61 3a9d19ed Leszek Koltunski
62
  /////////////////////////////////////////////////////////////
63
64 48145a5b Leszek Koltunski
    void initialize()
65 d18993ac Leszek Koltunski
      {
66 48145a5b Leszek Koltunski
      int colon;
67
      String moves, name;
68
      Pattern pattern;
69
70 b498f3f6 Leszek Koltunski
      mPatterns = new ArrayList<>();
71
72 48145a5b Leszek Koltunski
      for(int i=0; i<numPatterns; i++)
73
        {
74
        colon = mLines[i+1].indexOf(":");
75
76
        if( colon!=-1 )
77
          {
78
          moves   = mLines[i+1].substring(colon+1);
79
          name    = mLines[i+1].substring(0,colon);
80
          pattern = new Pattern(name,moves);
81
82
          mPatterns.add(pattern);
83
          }
84
        else
85
          {
86
          numPatterns--;
87
          }
88
        }
89
90
      mInitialized = true;
91 d18993ac Leszek Koltunski
      }
92 3a9d19ed Leszek Koltunski
93
  /////////////////////////////////////////////////////////////
94
95 4f470e00 Leszek Koltunski
    int getNumPatterns()
96 48145a5b Leszek Koltunski
      {
97
      return numPatterns;
98
      }
99 3a9d19ed Leszek Koltunski
100
  /////////////////////////////////////////////////////////////
101
102 4f470e00 Leszek Koltunski
    String getName()
103 48145a5b Leszek Koltunski
      {
104
      return mLines[0];
105
      }
106 3a9d19ed Leszek Koltunski
107
  /////////////////////////////////////////////////////////////
108
109
    String getPatternName(int pattern)
110 d18993ac Leszek Koltunski
      {
111 48145a5b Leszek Koltunski
      if( !mInitialized ) initialize();
112
113 3a9d19ed Leszek Koltunski
      if( pattern>=0 && pattern<numPatterns )
114
        {
115 48145a5b Leszek Koltunski
        Pattern p = mPatterns.get(pattern);
116 3a9d19ed Leszek Koltunski
        return  p!=null ? p.getName():"";
117
        }
118 48145a5b Leszek Koltunski
119 3a9d19ed Leszek Koltunski
      return "";
120 d18993ac Leszek Koltunski
      }
121 3a9d19ed Leszek Koltunski
122
  /////////////////////////////////////////////////////////////
123
124
    int getPatternCurMove(int pattern)
125 d18993ac Leszek Koltunski
      {
126 48145a5b Leszek Koltunski
      if( !mInitialized ) initialize();
127
128 3a9d19ed Leszek Koltunski
      if( pattern>=0 && pattern<numPatterns )
129
        {
130 48145a5b Leszek Koltunski
        Pattern p = mPatterns.get(pattern);
131 3a9d19ed Leszek Koltunski
        return  p!=null ? p.getCurMove():-1;
132
        }
133 48145a5b Leszek Koltunski
134 3a9d19ed Leszek Koltunski
      return -1;
135 d18993ac Leszek Koltunski
      }
136 3a9d19ed Leszek Koltunski
137
  /////////////////////////////////////////////////////////////
138
139
    int getPatternNumMove(int pattern)
140 d18993ac Leszek Koltunski
      {
141 48145a5b Leszek Koltunski
      if( !mInitialized ) initialize();
142
143 3a9d19ed Leszek Koltunski
      if( pattern>=0 && pattern<numPatterns )
144
        {
145 48145a5b Leszek Koltunski
        Pattern p = mPatterns.get(pattern);
146 3a9d19ed Leszek Koltunski
        return  p!=null ? p.getNumMove():-1;
147
        }
148 48145a5b Leszek Koltunski
149 3a9d19ed Leszek Koltunski
      return -1;
150 d18993ac Leszek Koltunski
      }
151 3a9d19ed Leszek Koltunski
152
  /////////////////////////////////////////////////////////////
153
154 5a4d4fba Leszek Koltunski
    void makeMove(RubikPreRender pre, int pattern)
155 d18993ac Leszek Koltunski
      {
156 48145a5b Leszek Koltunski
      if( !mInitialized ) initialize();
157
158 3a9d19ed Leszek Koltunski
      if( pattern>=0 && pattern<numPatterns )
159
        {
160 48145a5b Leszek Koltunski
        Pattern p = mPatterns.get(pattern);
161 5a4d4fba Leszek Koltunski
        if( p!=null ) p.makeMove(pre);
162 3a9d19ed Leszek Koltunski
        }
163 d18993ac Leszek Koltunski
      }
164 3a9d19ed Leszek Koltunski
165
  /////////////////////////////////////////////////////////////
166
167 5a4d4fba Leszek Koltunski
    void backMove(RubikPreRender pre, int pattern)
168 d18993ac Leszek Koltunski
      {
169 48145a5b Leszek Koltunski
      if( !mInitialized ) initialize();
170
171 3a9d19ed Leszek Koltunski
      if( pattern>=0 && pattern<numPatterns )
172
        {
173 48145a5b Leszek Koltunski
        Pattern p = mPatterns.get(pattern);
174 5a4d4fba Leszek Koltunski
        if( p!=null ) p.backMove(pre);
175 3a9d19ed Leszek Koltunski
        }
176 d18993ac Leszek Koltunski
      }
177 3a9d19ed Leszek Koltunski
178
  /////////////////////////////////////////////////////////////
179
180 c715128d Leszek Koltunski
    int[][] reInitialize(int pattern)
181 d18993ac Leszek Koltunski
      {
182 48145a5b Leszek Koltunski
      if( !mInitialized ) initialize();
183
184 3a9d19ed Leszek Koltunski
      if( pattern>=0 && pattern<numPatterns )
185
        {
186 48145a5b Leszek Koltunski
        Pattern p = mPatterns.get(pattern);
187 c715128d Leszek Koltunski
        if( p!=null ) return p.reInitialize();
188 3a9d19ed Leszek Koltunski
        }
189
190 a31d25de Leszek Koltunski
      return null;
191 d18993ac Leszek Koltunski
      }
192
    }
193
194
///////////////////////////////////////////////////////////////////////////////////////////////////
195
196 55e6be1d Leszek Koltunski
  private static class Pattern implements MovesFinished
197 d18993ac Leszek Koltunski
    {
198 3c4495ac Leszek Koltunski
    private final String nameStr;
199
    private String moveStr;
200 a31d25de Leszek Koltunski
    private int[][] moves;
201 39566863 Leszek Koltunski
    private int curMove;
202
    private int numMove;
203 8becce57 Leszek Koltunski
    private boolean mCanRotate;
204 6f2a942e Leszek Koltunski
    private boolean mInitialized;
205 8becce57 Leszek Koltunski
206 3a9d19ed Leszek Koltunski
  /////////////////////////////////////////////////////////////
207
208 b498f3f6 Leszek Koltunski
    Pattern(String name, String moves)
209 d18993ac Leszek Koltunski
      {
210 b498f3f6 Leszek Koltunski
      nameStr      = name;
211 f185faf8 Leszek Koltunski
      moveStr      = expand(moves);
212 6f2a942e Leszek Koltunski
      mCanRotate   = true;
213
      mInitialized = false;
214 d18993ac Leszek Koltunski
      }
215 3a9d19ed Leszek Koltunski
216 f185faf8 Leszek Koltunski
  /////////////////////////////////////////////////////////////
217
218
    private String expandOne(String moves)
219
      {
220
      int right, left=-1;
221
      int len=moves.length();
222
223
      for(int ch=0; ch<len; ch++)
224
        {
225
        char c = moves.charAt(ch);
226
227
        if( c == '(' ) left=ch;
228
        if( c == ')' && left>=0 )
229
          {
230
          right = ch;
231
          String lStr = moves.substring(0, moves.charAt(left-1)==' ' ? left-1 : left);
232
          String mStr = moves.substring(left+1,right);
233
          String rStr = moves.substring(right+1);
234
          int number, space = rStr.indexOf(' ');
235
          if( mStr.charAt(0) != ' ') mStr = ' '+mStr;
236
237
          if( space>0 )
238
            {
239
            number = Integer.parseInt(rStr.substring(0,space));
240
            rStr = rStr.substring(space);
241
            }
242
          else if( space==0 )
243
            {
244
            number = 1;
245
            }
246
          else
247
            {
248
            number = Integer.parseInt(rStr);
249
            rStr = "";
250
            }
251
252
          StringBuilder builder = new StringBuilder();
253
          builder.append(lStr);
254
          for(int i=0; i<number; i++) builder.append(mStr);
255
          builder.append(rStr);
256
          return builder.toString();
257
          }
258
        }
259
260
      return moves;
261
      }
262
263
  /////////////////////////////////////////////////////////////
264
265
    private String expand(String moves)
266
      {
267
      String next,curr = moves;
268
      boolean expanded;
269
270
      do
271
        {
272
        next = expandOne(curr);
273
        expanded = (next.length() > curr.length());
274
        curr = next;
275
        }
276
      while(expanded);
277
278
      return curr;
279
      }
280
281 a31d25de Leszek Koltunski
  /////////////////////////////////////////////////////////////
282
283 48145a5b Leszek Koltunski
    private void initialize()
284 a31d25de Leszek Koltunski
      {
285 48145a5b Leszek Koltunski
      numMove = moveStr.length()/4;
286
      moves   = new int[numMove][3];
287
      curMove = numMove;
288 7f84a768 Leszek Koltunski
      parseMoves(moves,numMove,moveStr);
289 48145a5b Leszek Koltunski
      moveStr = null;
290
      mInitialized = true;
291 a31d25de Leszek Koltunski
      }
292
293 3a9d19ed Leszek Koltunski
  /////////////////////////////////////////////////////////////
294
295
    String getName()
296 d18993ac Leszek Koltunski
      {
297 6f2a942e Leszek Koltunski
      return nameStr;
298 d18993ac Leszek Koltunski
      }
299 3a9d19ed Leszek Koltunski
300
  /////////////////////////////////////////////////////////////
301
302 4f470e00 Leszek Koltunski
    int getNumMove()
303 8becce57 Leszek Koltunski
      {
304 48145a5b Leszek Koltunski
      if( !mInitialized ) initialize();
305 6f2a942e Leszek Koltunski
306 8becce57 Leszek Koltunski
      return numMove;
307
      }
308 3a9d19ed Leszek Koltunski
309
  /////////////////////////////////////////////////////////////
310
311 4f470e00 Leszek Koltunski
    int getCurMove()
312 8becce57 Leszek Koltunski
      {
313 48145a5b Leszek Koltunski
      if( !mInitialized ) initialize();
314 6f2a942e Leszek Koltunski
315 8becce57 Leszek Koltunski
      return curMove;
316
      }
317 3a9d19ed Leszek Koltunski
318
  /////////////////////////////////////////////////////////////
319
320 5a4d4fba Leszek Koltunski
    void makeMove(RubikPreRender pre)
321 d18993ac Leszek Koltunski
      {
322 48145a5b Leszek Koltunski
      if( !mInitialized ) initialize();
323 6f2a942e Leszek Koltunski
324 d12bb11b Leszek Koltunski
      if( mCanRotate )
325 d18993ac Leszek Koltunski
        {
326 7f84a768 Leszek Koltunski
        curMove++;
327
328 d12bb11b Leszek Koltunski
        if( curMove>numMove )
329
          {
330
          curMove= 0;
331 5a4d4fba Leszek Koltunski
          pre.initializeObject(null);
332 d12bb11b Leszek Koltunski
          }
333
        else
334 aa171dee Leszek Koltunski
          {
335 925ed78f Leszek Koltunski
          int axis      = moves[curMove-1][0];
336
		      int rowBitmap = moves[curMove-1][1];
337
		      int bareAngle = moves[curMove-1][2];
338
		      int basicAngle= pre.getObject().getBasicAngle()[axis];
339
          int angle     = bareAngle*(360/basicAngle);
340 0594c61f Leszek Koltunski
          int duration  = Math.abs(angle)*MILLIS_PER_DEGREE;
341 8becce57 Leszek Koltunski
342 c0495b7d Leszek Koltunski
          if( angle!=0 )
343
            {
344
            mCanRotate = false;
345 0594c61f Leszek Koltunski
            pre.addRotation(this, axis, rowBitmap, angle, duration);
346 c0495b7d Leszek Koltunski
            }
347
          else
348
            {
349
            android.util.Log.e("pattern", "error: pattern "+nameStr+" move "+(curMove-1)+" angle 0");
350
            }
351 8becce57 Leszek Koltunski
          }
352 d12bb11b Leszek Koltunski
        }
353
      else
354
        {
355
        android.util.Log.e("pattern", "failed to make Move!");
356 d18993ac Leszek Koltunski
        }
357
      }
358 3a9d19ed Leszek Koltunski
359
  /////////////////////////////////////////////////////////////
360
361 5a4d4fba Leszek Koltunski
    void backMove(RubikPreRender pre)
362 d18993ac Leszek Koltunski
      {
363 48145a5b Leszek Koltunski
      if( !mInitialized ) initialize();
364 6f2a942e Leszek Koltunski
365 d12bb11b Leszek Koltunski
      if( mCanRotate )
366 d18993ac Leszek Koltunski
        {
367 7f84a768 Leszek Koltunski
        curMove--;
368
369 d12bb11b Leszek Koltunski
        if( curMove<0 )
370
          {
371
          curMove=numMove;
372 5a4d4fba Leszek Koltunski
          pre.initializeObject(moves);
373 d12bb11b Leszek Koltunski
          }
374
        else
375 aa171dee Leszek Koltunski
          {
376 925ed78f Leszek Koltunski
          int axis      = moves[curMove][0];
377
		      int rowBitmap = moves[curMove][1];
378
		      int bareAngle = moves[curMove][2];
379
		      int basicAngle= pre.getObject().getBasicAngle()[axis];
380
          int angle     = bareAngle*(360/basicAngle);
381 0594c61f Leszek Koltunski
          int duration  = Math.abs(angle)*MILLIS_PER_DEGREE;
382 8becce57 Leszek Koltunski
383 c0495b7d Leszek Koltunski
          if( angle!=0 )
384
            {
385
            mCanRotate = false;
386 0594c61f Leszek Koltunski
            pre.addRotation(this, axis, rowBitmap, -angle, duration);
387 c0495b7d Leszek Koltunski
            }
388
          else
389
            {
390
            android.util.Log.e("pattern", "error: pattern "+nameStr+" move "+curMove+" angle 0");
391
            }
392 8becce57 Leszek Koltunski
          }
393 d12bb11b Leszek Koltunski
        }
394
      else
395
        {
396
        android.util.Log.e("pattern", "failed to back Move!");
397 d18993ac Leszek Koltunski
        }
398
      }
399 3a9d19ed Leszek Koltunski
400
  /////////////////////////////////////////////////////////////
401
402 c715128d Leszek Koltunski
    int[][] reInitialize()
403 d18993ac Leszek Koltunski
      {
404 48145a5b Leszek Koltunski
      if( !mInitialized ) initialize();
405 6f2a942e Leszek Koltunski
406 c715128d Leszek Koltunski
      mCanRotate = true;
407 6f2a942e Leszek Koltunski
      curMove = numMove;
408 a31d25de Leszek Koltunski
      return moves;
409 d18993ac Leszek Koltunski
      }
410 8becce57 Leszek Koltunski
411
  /////////////////////////////////////////////////////////////
412
413
    public void onActionFinished(final long effectID)
414
      {
415
      mCanRotate = true;
416
      }
417 d18993ac Leszek Koltunski
    }
418
419
///////////////////////////////////////////////////////////////////////////////////////////////////
420
421 4f470e00 Leszek Koltunski
  private RubikPattern()
422 d18993ac Leszek Koltunski
    {
423 48145a5b Leszek Koltunski
    mCategories = new ArrayList<>();
424 4f470e00 Leszek Koltunski
425 b498f3f6 Leszek Koltunski
    for(int i=0; i<NUM_OBJECTS; i++)
426
      {
427
      List<Category> list = new ArrayList<>();
428
      String[][] patStrings = RubikPatternList.getPatterns(i);
429
430
      for(String[] lines: patStrings) list.add(new Category(lines));
431
432
      mCategories.add(list);
433
      numCategories[i]=patStrings.length;
434 054fbee1 Leszek Koltunski
435
      currentExpanded[i] = -1;
436 b498f3f6 Leszek Koltunski
      }
437 d18993ac Leszek Koltunski
    }
438
439
///////////////////////////////////////////////////////////////////////////////////////////////////
440
441 b498f3f6 Leszek Koltunski
  private Category getCategory(int tab, int cat)
442 d18993ac Leszek Koltunski
    {
443 b498f3f6 Leszek Koltunski
    if( tab>=0 && tab<NUM_OBJECTS && cat>=0 && cat<numCategories[tab] )
444 d18993ac Leszek Koltunski
      {
445 b498f3f6 Leszek Koltunski
      return mCategories.get(tab).get(cat);
446 d18993ac Leszek Koltunski
      }
447 48145a5b Leszek Koltunski
448 b498f3f6 Leszek Koltunski
    return null;
449 d18993ac Leszek Koltunski
    }
450
451 4f470e00 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
452
// PUBLIC API
453
///////////////////////////////////////////////////////////////////////////////////////////////////
454
455
  public static RubikPattern getInstance()
456
    {
457
    if( mThis==null )
458
      {
459
      mThis = new RubikPattern();
460
      }
461
462
    return mThis;
463
    }
464
465 7f84a768 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
466
467
  public static void parseMoves(int[][] result, int numMoves, String moves)
468
    {
469 906cc928 Leszek Koltunski
    int digit0, digit1, digit2, number;
470 7f84a768 Leszek Koltunski
471
    for(int i=0; i<numMoves; i++)
472
      {
473
      digit0 = moves.charAt(4*i+1)-'0';
474
      digit1 = moves.charAt(4*i+2)-'0';
475
      digit2 = moves.charAt(4*i+3)-'0';
476 906cc928 Leszek Koltunski
      number = 100*digit0+10*digit1+digit2;
477 7f84a768 Leszek Koltunski
478 3c4495ac Leszek Koltunski
      int axis   = (number/32)%8;
479
      int bitmap = (number%32)  ;
480
      int angle  = (number/32)/8;
481
482
      switch(angle)
483
        {
484
        case 0: angle = 2; break;
485
        case 1: angle = 1; break;
486
        case 2: angle =-1; break;
487
        case 3: angle =-2; break;
488
        default: android.util.Log.e("D", "ERROR!! parsing move "+moves+" number="+number);
489
        }
490
491
      result[i][0] = axis;
492
      result[i][1] = bitmap;
493
      result[i][2] = angle;
494 7f84a768 Leszek Koltunski
      }
495
    }
496
497 3a9d19ed Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
498
499 48145a5b Leszek Koltunski
  public int getNumCategories(int tab)
500 3a9d19ed Leszek Koltunski
    {
501 b498f3f6 Leszek Koltunski
    return tab>=0 && tab<NUM_OBJECTS ? numCategories[tab] : 0;
502 d18993ac Leszek Koltunski
    }
503
504 044529c1 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
505
506 054fbee1 Leszek Koltunski
  public void rememberState(int tab, int cat, int scrollPos, int expanded)
507 044529c1 Leszek Koltunski
    {
508 b498f3f6 Leszek Koltunski
    if( tab>=0 && tab<NUM_OBJECTS )
509 044529c1 Leszek Koltunski
      {
510 054fbee1 Leszek Koltunski
      currentCategory[tab]  = cat;
511
      currentVisiblePos[tab]= scrollPos;
512
      currentExpanded[tab]  = expanded;
513 044529c1 Leszek Koltunski
      }
514
    }
515
516
///////////////////////////////////////////////////////////////////////////////////////////////////
517
518 48145a5b Leszek Koltunski
  public int recallCategory(int tab)
519 044529c1 Leszek Koltunski
    {
520 b498f3f6 Leszek Koltunski
    return tab>=0 && tab<NUM_OBJECTS ? currentCategory[tab] : 0;
521 044529c1 Leszek Koltunski
    }
522
523 c715128d Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
524
525 054fbee1 Leszek Koltunski
  public int recallVisiblePos(int tab)
526
    {
527
    return tab>=0 && tab<NUM_OBJECTS ? currentVisiblePos[tab] : 0;
528
    }
529
530
///////////////////////////////////////////////////////////////////////////////////////////////////
531
532
  public int recallExpanded(int tab)
533 c715128d Leszek Koltunski
    {
534 054fbee1 Leszek Koltunski
    return tab>=0 && tab<NUM_OBJECTS ? currentExpanded[tab] : -1;
535 c715128d Leszek Koltunski
    }
536
537 d18993ac Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
538
539 b498f3f6 Leszek Koltunski
  public String getCategoryName(int tab, int cat)
540 d18993ac Leszek Koltunski
    {
541 b498f3f6 Leszek Koltunski
    Category c = getCategory(tab,cat);
542
    return c!=null ? c.getName() : null;
543
    }
544 d18993ac Leszek Koltunski
545 b498f3f6 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
546
547
  public String getPatternName(int tab, int cat, int pat)
548
    {
549
    Category c = getCategory(tab,cat);
550
    return c!=null ? c.getPatternName(pat) : null;
551 d18993ac Leszek Koltunski
    }
552
553
///////////////////////////////////////////////////////////////////////////////////////////////////
554
555 48145a5b Leszek Koltunski
  public int getNumPatterns(int tab, int cat)
556 d18993ac Leszek Koltunski
    {
557 b498f3f6 Leszek Koltunski
    Category c = getCategory(tab,cat);
558
    return c!=null ? c.getNumPatterns() : 0;
559 d18993ac Leszek Koltunski
    }
560
561
///////////////////////////////////////////////////////////////////////////////////////////////////
562
563 48145a5b Leszek Koltunski
  public int getCurMove(int tab, int cat, int pat)
564 d18993ac Leszek Koltunski
    {
565 b498f3f6 Leszek Koltunski
    Category c = getCategory(tab,cat);
566
    return c!=null ? c.getPatternCurMove(pat) : 0;
567 d18993ac Leszek Koltunski
    }
568
569
///////////////////////////////////////////////////////////////////////////////////////////////////
570
571 48145a5b Leszek Koltunski
  public int getNumMoves(int tab, int cat, int pat)
572 d18993ac Leszek Koltunski
    {
573 b498f3f6 Leszek Koltunski
    Category c = getCategory(tab,cat);
574
    return c!=null ? c.getPatternNumMove(pat) : 0;
575 d18993ac Leszek Koltunski
    }
576
577
///////////////////////////////////////////////////////////////////////////////////////////////////
578
579 5a4d4fba Leszek Koltunski
  public void makeMove(RubikPreRender pre, int tab, int cat, int pat)
580 d18993ac Leszek Koltunski
    {
581 b498f3f6 Leszek Koltunski
    Category c = getCategory(tab,cat);
582 5a4d4fba Leszek Koltunski
    if( c!=null ) c.makeMove(pre,pat);
583 d18993ac Leszek Koltunski
    }
584
585
///////////////////////////////////////////////////////////////////////////////////////////////////
586
587 5a4d4fba Leszek Koltunski
  public void backMove(RubikPreRender pre, int tab, int cat, int pat)
588 d18993ac Leszek Koltunski
    {
589 b498f3f6 Leszek Koltunski
    Category c = getCategory(tab,cat);
590 5a4d4fba Leszek Koltunski
    if( c!=null ) c.backMove(pre,pat);
591 d18993ac Leszek Koltunski
    }
592
593
///////////////////////////////////////////////////////////////////////////////////////////////////
594
595 48145a5b Leszek Koltunski
  public int[][] reInitialize(int tab, int cat, int pat)
596 d18993ac Leszek Koltunski
    {
597 b498f3f6 Leszek Koltunski
    Category c = getCategory(tab,cat);
598
    return c!=null ? c.reInitialize(pat) : null;
599 4f470e00 Leszek Koltunski
    }
600 d18993ac Leszek Koltunski
}