Project

General

Profile

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

magiccube / src / main / java / org / distorted / patterns / RubikPattern.java @ 5b115c9b

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