206 |
206 |
return mAlgorithms;
|
207 |
207 |
}
|
208 |
208 |
|
|
209 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
210 |
|
|
211 |
private int computeBranchingFactor(Static3D[] axis, boolean[][] rotatable, int[][] basicAngles)
|
|
212 |
{
|
|
213 |
int factor = 0;
|
|
214 |
int numAxis = axis.length;
|
|
215 |
|
|
216 |
for(int a=0; a<numAxis; a++)
|
|
217 |
{
|
|
218 |
int numL = rotatable[a].length;
|
|
219 |
|
|
220 |
for(int l=0; l<numL; l++)
|
|
221 |
if( rotatable[a][l] )
|
|
222 |
{
|
|
223 |
int basicAngle = basicAngles[a][l];
|
|
224 |
factor += (basicAngle-1);
|
|
225 |
}
|
|
226 |
}
|
|
227 |
|
|
228 |
return factor;
|
|
229 |
}
|
|
230 |
|
|
231 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
232 |
|
|
233 |
private ObjectMove[] computeMoveTable(Static3D[] axis, boolean[][] rotatable, int[][] basicAngles)
|
|
234 |
{
|
|
235 |
int branchingFactor = computeBranchingFactor(axis,rotatable,basicAngles);
|
|
236 |
ObjectMove[] ret = new ObjectMove[branchingFactor];
|
|
237 |
int numAxis = axis.length;
|
|
238 |
int index = 0;
|
|
239 |
|
|
240 |
for(int a=0; a<numAxis; a++)
|
|
241 |
{
|
|
242 |
int numL = rotatable[a].length;
|
|
243 |
|
|
244 |
for(int l=0; l<numL; l++)
|
|
245 |
if( rotatable[a][l] )
|
|
246 |
{
|
|
247 |
int basicAngle = basicAngles[a][l];
|
|
248 |
for(int b=1; b<basicAngle; b++)
|
|
249 |
{
|
|
250 |
int angle = b<=basicAngle/2 ? b : b-basicAngle;
|
|
251 |
int degre = angle*360/basicAngle;
|
|
252 |
ret[index++] = new ObjectMove( a,1<<l,degre );
|
|
253 |
}
|
|
254 |
}
|
|
255 |
}
|
|
256 |
|
|
257 |
return ret;
|
|
258 |
}
|
|
259 |
|
209 |
260 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
210 |
261 |
|
211 |
262 |
private ObjectMove[][] createInitAlgs()
|
212 |
263 |
{
|
|
264 |
Static3D[] axis = getRotationAxis();
|
|
265 |
boolean[][] rotatable = getLayerRotatable();
|
|
266 |
int[][] basic = getBasicAngles();
|
|
267 |
ObjectMove[] m = computeMoveTable(axis,rotatable,basic);
|
|
268 |
|
213 |
269 |
switch( getMetadata().getParam() )
|
214 |
270 |
{
|
215 |
271 |
case I_CUBE : break;
|
216 |
|
case L_CUBE : ObjectMove l41 = new ObjectMove(2,8,-90);
|
217 |
|
ObjectMove l38 = new ObjectMove(2,4,-90);
|
218 |
|
ObjectMove l35 = new ObjectMove(2,2,-90);
|
219 |
|
ObjectMove l39 = new ObjectMove(2,8, 90);
|
220 |
|
ObjectMove l36 = new ObjectMove(2,4, 90);
|
221 |
|
ObjectMove l33 = new ObjectMove(2,2, 90);
|
222 |
|
ObjectMove l12 = new ObjectMove(0,16,-90);
|
223 |
|
ObjectMove l13 = new ObjectMove(0,16, 90);
|
224 |
|
ObjectMove l14 = new ObjectMove(0,16,180);
|
225 |
|
ObjectMove l27 = new ObjectMove(1,16,-90);
|
226 |
|
ObjectMove l28 = new ObjectMove(1,16, 90);
|
227 |
|
ObjectMove l29 = new ObjectMove(1,16,180);
|
228 |
|
|
229 |
|
return new ObjectMove[][]
|
230 |
|
{
|
231 |
|
{ l41,l12,l39,l27 },
|
232 |
|
{ l41,l12,l39,l28 },
|
233 |
|
{ l41,l12,l39,l29 },
|
234 |
|
{ l41,l13,l39,l27 },
|
235 |
|
{ l41,l13,l39,l28 },
|
236 |
|
{ l41,l13,l39,l29 },
|
237 |
|
{ l41,l14,l39,l27 },
|
238 |
|
{ l41,l14,l39,l28 },
|
239 |
|
{ l41,l14,l39,l29 },
|
240 |
|
{ l38,l12,l36,l27 },
|
241 |
|
{ l38,l12,l36,l28 },
|
242 |
|
{ l38,l12,l36,l29 },
|
243 |
|
{ l38,l13,l36,l27 },
|
244 |
|
{ l38,l13,l36,l28 },
|
245 |
|
{ l38,l13,l36,l29 },
|
246 |
|
{ l38,l14,l36,l27 },
|
247 |
|
{ l38,l14,l36,l28 },
|
248 |
|
{ l38,l14,l36,l29 },
|
249 |
|
{ l35,l12,l33,l27 },
|
250 |
|
{ l35,l12,l33,l28 },
|
251 |
|
{ l35,l12,l33,l29 },
|
252 |
|
{ l35,l13,l33,l27 },
|
253 |
|
{ l35,l13,l33,l28 },
|
254 |
|
{ l35,l13,l33,l29 },
|
255 |
|
{ l35,l14,l33,l27 },
|
256 |
|
{ l35,l14,l33,l28 },
|
257 |
|
{ l35,l14,l33,l29 },
|
258 |
|
};
|
259 |
|
case T_CUBE : break;
|
260 |
|
case X_CUBE : break;
|
|
272 |
case L_CUBE : ObjectMove[][] retL = new ObjectMove[27][];
|
|
273 |
int indexL =0;
|
|
274 |
|
|
275 |
for(int m1=12; m1<15; m1++)
|
|
276 |
for(int m2=27; m2<30; m2++)
|
|
277 |
{
|
|
278 |
retL[indexL++] = new ObjectMove[] { m[41],m[m1],m[39],m[m2] };
|
|
279 |
retL[indexL++] = new ObjectMove[] { m[38],m[m1],m[36],m[m2] };
|
|
280 |
retL[indexL++] = new ObjectMove[] { m[35],m[m1],m[33],m[m2] };
|
|
281 |
}
|
|
282 |
return retL;
|
|
283 |
case T_CUBE : ObjectMove[][] retT = new ObjectMove[81][];
|
|
284 |
int indexT =0;
|
|
285 |
|
|
286 |
for(int m1=27; m1<30; m1++)
|
|
287 |
for(int m2=12; m2<15; m2++)
|
|
288 |
for(int m3= 0; m3< 3; m3++)
|
|
289 |
{
|
|
290 |
retT[indexT++] = new ObjectMove[] { m[m1],m[41],m[m2],m[40],m[m3],m[41] };
|
|
291 |
retT[indexT++] = new ObjectMove[] { m[m1],m[38],m[m2],m[37],m[m3],m[38] };
|
|
292 |
retT[indexT++] = new ObjectMove[] { m[m1],m[35],m[m2],m[34],m[m3],m[35] };
|
|
293 |
}
|
|
294 |
return retT;
|
|
295 |
case X_CUBE : ObjectMove[][] retX = new ObjectMove[21][];
|
|
296 |
int indexX =0;
|
|
297 |
for(int m1=33; m1<42; m1++) retX[indexX++] = new ObjectMove[] { m[m1] };
|
|
298 |
for(int m1= 0; m1< 3; m1++) retX[indexX++] = new ObjectMove[] { m[m1] };
|
|
299 |
for(int m1=12; m1<15; m1++) retX[indexX++] = new ObjectMove[] { m[m1] };
|
|
300 |
for(int m1=27; m1<30; m1++) retX[indexX++] = new ObjectMove[] { m[m1] };
|
|
301 |
for(int m1=15; m1<18; m1++) retX[indexX++] = new ObjectMove[] { m[m1] };
|
|
302 |
return retX;
|
261 |
303 |
case TRI_CUBE: break;
|
262 |
304 |
case TEM_CUBE: break;
|
263 |
305 |
}
|
bugfix in ObjectScrambler's SCRAMBLING_TWOPHASE.