Project

General

Profile

Download (3.16 KB) Statistics
| Branch: | Revision:

distorted-objectlib / src / main / java / org / distorted / objectlib / scrambling / ScrambleState.java @ a0ef8a1d

1 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2021 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6 babb7b08 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 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
9
10 10b7e306 Leszek Koltunski
package org.distorted.objectlib.scrambling;
11 29b82486 Leszek Koltunski
12
import java.util.Random;
13
14
///////////////////////////////////////////////////////////////////////////////////////////////////
15
16
public class ScrambleState
17
{
18 9ba7f3f6 Leszek Koltunski
  private final boolean mMoreThanOneAxis;
19
  private final int mTotal;
20
  private final int[] mEdges;
21 29b82486 Leszek Koltunski
22
///////////////////////////////////////////////////////////////////////////////////////////////////
23
24 9ba7f3f6 Leszek Koltunski
  public ScrambleState(int[] edges, int[][] algorithms)
25 29b82486 Leszek Koltunski
    {
26 9ba7f3f6 Leszek Koltunski
    mEdges = edges;
27
    mTotal = edges.length/2;
28 f9a81f52 Leszek Koltunski
29 9ba7f3f6 Leszek Koltunski
    int firstAxis= algorithms[edges[0]][0];
30
    boolean moreThanOne = false;
31 29b82486 Leszek Koltunski
32 9ba7f3f6 Leszek Koltunski
    for(int i=1; i<mTotal; i++)
33
      if( algorithms[edges[2*i]][0]!=firstAxis )
34 29b82486 Leszek Koltunski
        {
35 9ba7f3f6 Leszek Koltunski
        moreThanOne = true;
36
        break;
37 29b82486 Leszek Koltunski
        }
38
39 9ba7f3f6 Leszek Koltunski
    mMoreThanOneAxis = moreThanOne;
40 29b82486 Leszek Koltunski
    }
41
42 ca4a3a68 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
43
44
  private int getScrambleValue(int[] alg, int[][] scrambleTable)
45
    {
46 e17d01c2 Leszek Koltunski
    int layerBmp = alg[1];
47
    int[] table = scrambleTable[alg[0]];
48 ca4a3a68 Leszek Koltunski
49 e17d01c2 Leszek Koltunski
    for(int i : table)
50 ca4a3a68 Leszek Koltunski
      {
51 e17d01c2 Leszek Koltunski
      if( (layerBmp&0x1) != 0) return i;
52 ca4a3a68 Leszek Koltunski
      layerBmp /= 2;
53
      }
54
55 e17d01c2 Leszek Koltunski
    return 0;
56 ca4a3a68 Leszek Koltunski
    }
57
58 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
59
60 e9ec2e9d Leszek Koltunski
  public void getRandom(Random rnd, int[][] algorithms, int axisExcluded, int[][] scrambleTable, int[] numOccurences, int[] result)
61 29b82486 Leszek Koltunski
    {
62 9ba7f3f6 Leszek Koltunski
    int total=0, max=0;
63 29b82486 Leszek Koltunski
64 9ba7f3f6 Leszek Koltunski
    if( !mMoreThanOneAxis ) axisExcluded=-1;
65 4a5157a1 Leszek Koltunski
66 29b82486 Leszek Koltunski
    for(int i=0; i<mTotal; i++)
67
      {
68 9ba7f3f6 Leszek Koltunski
      int[] alg = algorithms[mEdges[2*i]];
69 29b82486 Leszek Koltunski
70 9ba7f3f6 Leszek Koltunski
      if( alg[0]!=axisExcluded )
71 29b82486 Leszek Koltunski
        {
72 ca4a3a68 Leszek Koltunski
        int value = getScrambleValue(alg,scrambleTable);
73 29b82486 Leszek Koltunski
        if( value>max ) max=value;
74
        }
75
      }
76
77
    for(int i=0; i<mTotal; i++)
78
      {
79 9ba7f3f6 Leszek Koltunski
      int[] alg = algorithms[mEdges[2*i]];
80 e9ec2e9d Leszek Koltunski
      int previous = (total==0 ? 0 : numOccurences[total-1]);
81 ca4a3a68 Leszek Koltunski
      if( alg[0]!=axisExcluded ) numOccurences[total] = 1+max+previous-getScrambleValue(alg,scrambleTable);
82 e9ec2e9d Leszek Koltunski
      else                       numOccurences[total] = previous;
83
      total++;
84 29b82486 Leszek Koltunski
      }
85
86
    float random= rnd.nextFloat()*numOccurences[total-1];
87
88
    for(int i=0; i<total; i++)
89 e9ec2e9d Leszek Koltunski
      if( random <= numOccurences[i] )
90
        {
91
        result[0] = mEdges[2*i];
92
        result[1] = mEdges[2*i+1];
93
        break;
94
        }
95 f9a81f52 Leszek Koltunski
    }
96
97 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
98
99 9ba7f3f6 Leszek Koltunski
  public int getTotal()
100 29b82486 Leszek Koltunski
    {
101 9ba7f3f6 Leszek Koltunski
    return mTotal;
102 29b82486 Leszek Koltunski
    }
103
}