Project

General

Profile

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

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

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