Revision 7ac0ee88
Added by Leszek Koltunski about 4 years ago
| src/main/java/org/distorted/dialogs/RubikDialogNewRecord.java | ||
|---|---|---|
| 82 | 82 |
{
|
| 83 | 83 |
RubikScreenPlay play = (RubikScreenPlay) ScreenList.PLAY.getScreenClass(); |
| 84 | 84 |
int object = play.getObject(); |
| 85 |
int size = play.getSize(); |
|
| 86 |
int sizeIndex = ObjectList.getSizeIndex(object,size); |
|
| 87 | 85 |
|
| 88 |
bundle.putInt("tab", ObjectList.pack(object,sizeIndex) );
|
|
| 86 |
bundle.putInt("tab", object );
|
|
| 89 | 87 |
bundle.putBoolean("submitting", true);
|
| 90 | 88 |
|
| 91 | 89 |
RubikDialogScores scoresDiag = new RubikDialogScores(); |
| src/main/java/org/distorted/dialogs/RubikDialogPattern.java | ||
|---|---|---|
| 105 | 105 |
for(int i=0; i< RubikPatternList.NUM_OBJECTS; i++) |
| 106 | 106 |
{
|
| 107 | 107 |
ObjectList list = RubikPatternList.getObject(i); |
| 108 |
int size = RubikPatternList.getSize(i); |
|
| 109 |
int sizeIndex = ObjectList.getSizeIndex(list.ordinal(),size); |
|
| 110 | 108 |
int iconSize = RubikActivity.getDrawableSize(); |
| 111 |
int iconID = list.getIconIDs(iconSize)[sizeIndex];
|
|
| 109 |
int iconID = list.getIconID(iconSize);
|
|
| 112 | 110 |
|
| 113 | 111 |
ImageView imageView = new ImageView(act); |
| 114 | 112 |
imageView.setImageResource(iconID); |
| src/main/java/org/distorted/dialogs/RubikDialogPatternView.java | ||
|---|---|---|
| 95 | 95 |
RubikPattern pattern = RubikPattern.getInstance(); |
| 96 | 96 |
int[][] moves = pattern.reInitialize(mTab, groupPosition, childPosition); |
| 97 | 97 |
ObjectList list = RubikPatternList.getObject(mTab); |
| 98 |
int size = RubikPatternList.getSize(mTab); |
|
| 99 | 98 |
|
| 100 |
ract.setupObject(list, size, moves);
|
|
| 99 |
ract.setupObject(list, moves); |
|
| 101 | 100 |
|
| 102 | 101 |
ScreenList.switchScreen(ract, ScreenList.PATT); |
| 103 | 102 |
RubikScreenPattern state = (RubikScreenPattern) ScreenList.PATT.getScreenClass(); |
| src/main/java/org/distorted/dialogs/RubikDialogScores.java | ||
|---|---|---|
| 105 | 105 |
|
| 106 | 106 |
viewPager.setCurrentItem(curTab); |
| 107 | 107 |
ObjectList list; |
| 108 |
int iconSize = RubikActivity.getDrawableSize(); |
|
| 108 | 109 |
|
| 109 | 110 |
for (int object = 0; object< ObjectList.NUM_OBJECTS; object++) |
| 110 | 111 |
{
|
| 111 | 112 |
list = ObjectList.getObject(object); |
| 112 |
int iconSize = RubikActivity.getDrawableSize(); |
|
| 113 |
int[] iconID = list.getIconIDs(iconSize); |
|
| 114 |
int len = list.getSizes().length; |
|
| 115 |
|
|
| 116 |
for(int size=0; size<len; size++) |
|
| 117 |
{
|
|
| 118 |
int t = ObjectList.pack(object,size); |
|
| 119 |
ImageView imageView = new ImageView(act); |
|
| 120 |
imageView.setImageResource(iconID[size]); |
|
| 121 |
TabLayout.Tab tab = tabLayout.getTabAt(t); |
|
| 122 |
if(tab!=null) tab.setCustomView(imageView); |
|
| 123 |
} |
|
| 113 |
int iconID = list.getIconID(iconSize); |
|
| 114 |
ImageView imageView = new ImageView(act); |
|
| 115 |
imageView.setImageResource(iconID); |
|
| 116 |
TabLayout.Tab tab = tabLayout.getTabAt(object); |
|
| 117 |
if(tab!=null) tab.setCustomView(imageView); |
|
| 124 | 118 |
} |
| 125 | 119 |
|
| 126 | 120 |
Dialog dialog = builder.create(); |
| src/main/java/org/distorted/dialogs/RubikDialogScoresPagerAdapter.java | ||
|---|---|---|
| 117 | 117 |
|
| 118 | 118 |
for(int i=0; i<mNumTabs; i++) |
| 119 | 119 |
{
|
| 120 |
int object = ObjectList.unpackObject(i); |
|
| 121 |
int sizeIndex= ObjectList.unpackSizeIndex(i); |
|
| 122 |
lastTab[i] = ObjectList.getDBLevel(object, sizeIndex); |
|
| 123 |
maxTab[i] = Math.min(lastTab[i],MAX); |
|
| 124 |
toDoTab[i] = 0; |
|
| 120 |
lastTab[i]= ObjectList.getDBLevel(i); |
|
| 121 |
maxTab[i] = Math.min(lastTab[i],MAX); |
|
| 122 |
toDoTab[i]= 0; |
|
| 125 | 123 |
|
| 126 | 124 |
toDo += maxTab[i]; |
| 127 | 125 |
} |
| ... | ... | |
| 210 | 208 |
{
|
| 211 | 209 |
mAct = act; |
| 212 | 210 |
mDialog = diag; |
| 213 |
mNumTabs = ObjectList.getTotal();
|
|
| 211 |
mNumTabs = ObjectList.NUM_OBJECTS;
|
|
| 214 | 212 |
mViews = new RubikDialogScoresView[mNumTabs]; |
| 215 | 213 |
mViewPager = viewPager; |
| 216 | 214 |
mIsSubmitting = isSubmitting; |
| src/main/java/org/distorted/dialogs/RubikDialogScoresView.java | ||
|---|---|---|
| 88 | 88 |
|
| 89 | 89 |
Resources res = act.getResources(); |
| 90 | 90 |
String packageName = act.getPackageName(); |
| 91 |
|
|
| 92 |
int object = ObjectList.unpackObject(tab); |
|
| 93 |
int sizeIndex= ObjectList.unpackSizeIndex(tab); |
|
| 94 | 91 |
RubikScores scores = RubikScores.getInstance(); |
| 95 | 92 |
|
| 96 | 93 |
boolean inserted = false; |
| 97 |
long myRecordInMillis = scores.getRecord(object, sizeIndex, level);
|
|
| 94 |
long myRecordInMillis = scores.getRecord(tab, level);
|
|
| 98 | 95 |
float myRecordInSeconds = (myRecordInMillis/10)/100.0f; |
| 99 | 96 |
String myName = scores.getName(); |
| 100 | 97 |
if( myName.length()==0 ) myName = act.getString(R.string.you); |
| src/main/java/org/distorted/dialogs/RubikDialogSetName.java | ||
|---|---|---|
| 149 | 149 |
RubikScores.getInstance().setName(name); |
| 150 | 150 |
RubikScreenPlay play = (RubikScreenPlay) ScreenList.PLAY.getScreenClass(); |
| 151 | 151 |
|
| 152 |
int object = play.getObject(); |
|
| 153 |
int size = play.getSize(); |
|
| 154 |
int sizeIndex = ObjectList.getSizeIndex(object,size); |
|
| 155 |
|
|
| 156 | 152 |
Bundle bundle = new Bundle(); |
| 157 |
bundle.putInt("tab", ObjectList.pack(object,sizeIndex) );
|
|
| 153 |
bundle.putInt("tab", play.getObject() );
|
|
| 158 | 154 |
bundle.putBoolean("submitting", true);
|
| 159 | 155 |
|
| 160 | 156 |
RubikDialogScores scores = new RubikDialogScores(); |
| src/main/java/org/distorted/dialogs/RubikDialogTutorialView.java | ||
|---|---|---|
| 77 | 77 |
|
| 78 | 78 |
TutorialList list = TutorialList.getObject(position); |
| 79 | 79 |
ObjectList objList = list.getObjectList(); |
| 80 |
int size = list.getSize(); |
|
| 81 | 80 |
|
| 82 | 81 |
View tab = inflate( act, R.layout.dialog_tutorial_tab, null); |
| 83 | 82 |
LinearLayout layout = tab.findViewById(R.id.tabLayout); |
| ... | ... | |
| 93 | 92 |
|
| 94 | 93 |
int countryID = res.getIdentifier( coun, "drawable", packageName); |
| 95 | 94 |
|
| 96 |
View row = createRow(ract,countryID,desc,url,auth,widthT,objList,size);
|
|
| 95 |
View row = createRow(ract,countryID,desc,url,auth,widthT,objList); |
|
| 97 | 96 |
layout.addView(row); |
| 98 | 97 |
} |
| 99 | 98 |
|
| ... | ... | |
| 110 | 109 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 111 | 110 |
|
| 112 | 111 |
private View createRow(final RubikActivity act, int countryID, final String desc, final String url, |
| 113 |
final String auth, int width, final ObjectList obj, final int size)
|
|
| 112 |
final String auth, int width, final ObjectList obj) |
|
| 114 | 113 |
{
|
| 115 | 114 |
View row = inflate( act, R.layout.dialog_tutorial_row, null); |
| 116 | 115 |
Button butt = row.findViewById(R.id.tutorialButton); |
| ... | ... | |
| 126 | 125 |
{
|
| 127 | 126 |
if( mCanClick ) |
| 128 | 127 |
{
|
| 129 |
act.switchTutorial(url,obj,size);
|
|
| 130 |
analyticsReport(act,desc,auth,obj,size);
|
|
| 128 |
act.switchTutorial(url,obj); |
|
| 129 |
analyticsReport(act,desc,auth,obj); |
|
| 131 | 130 |
clickPossible(false); |
| 132 | 131 |
} |
| 133 | 132 |
} |
| ... | ... | |
| 150 | 149 |
|
| 151 | 150 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 152 | 151 |
|
| 153 |
private void analyticsReport(RubikActivity act, String desc, String author, ObjectList obj, int size)
|
|
| 152 |
private void analyticsReport(RubikActivity act, String desc, String author, ObjectList obj) |
|
| 154 | 153 |
{
|
| 155 | 154 |
String message = desc+" ("+author+")";
|
| 156 | 155 |
|
| ... | ... | |
| 161 | 160 |
else |
| 162 | 161 |
{
|
| 163 | 162 |
FirebaseAnalytics analytics = act.getAnalytics(); |
| 164 |
String name = obj.name()+"_"+size; |
|
| 165 | 163 |
|
| 166 | 164 |
if( analytics!=null ) |
| 167 | 165 |
{
|
| 168 | 166 |
Bundle bundle = new Bundle(); |
| 169 | 167 |
bundle.putString(FirebaseAnalytics.Param.CONTENT_TYPE, message); |
| 170 |
bundle.putString(FirebaseAnalytics.Param.ITEM_NAME, name);
|
|
| 168 |
bundle.putString(FirebaseAnalytics.Param.ITEM_NAME, obj.name());
|
|
| 171 | 169 |
analytics.logEvent(FirebaseAnalytics.Event.TUTORIAL_BEGIN, bundle); |
| 172 | 170 |
} |
| 173 | 171 |
} |
| src/main/java/org/distorted/main/RubikActivity.java | ||
|---|---|---|
| 276 | 276 |
boolean success = false; |
| 277 | 277 |
RubikScreenPlay play = (RubikScreenPlay) ScreenList.PLAY.getScreenClass(); |
| 278 | 278 |
int object = play.getObject(); |
| 279 |
int size = play.getSize(); |
|
| 280 | 279 |
|
| 281 | 280 |
if( object>=0 && object< ObjectList.NUM_OBJECTS ) |
| 282 | 281 |
{
|
| 283 |
ObjectList obj = ObjectList.getObject(object); |
|
| 284 |
int[] sizes = obj.getSizes(); |
|
| 285 |
int sizeIndex = ObjectList.getSizeIndex(object,size); |
|
| 286 |
|
|
| 287 |
if( sizeIndex>=0 && sizeIndex<sizes.length ) |
|
| 288 |
{
|
|
| 289 |
success = true; |
|
| 290 |
view.getPreRender().changeObject(obj,size); |
|
| 291 |
} |
|
| 282 |
success = true; |
|
| 283 |
ObjectList nextObj = ObjectList.values()[object]; |
|
| 284 |
view.getPreRender().changeObject(nextObj); |
|
| 292 | 285 |
} |
| 293 | 286 |
|
| 294 | 287 |
if( !success ) |
| 295 | 288 |
{
|
| 296 | 289 |
ObjectList obj = ObjectList.getObject(RubikScreenPlay.DEF_OBJECT); |
| 297 |
int s = RubikScreenPlay.DEF_SIZE; |
|
| 298 |
|
|
| 299 |
play.setObjectAndSize(this,obj,s); |
|
| 300 |
view.getPreRender().changeObject(obj,s); |
|
| 290 |
play.setObject(this,obj); |
|
| 291 |
view.getPreRender().changeObject(obj); |
|
| 301 | 292 |
} |
| 302 | 293 |
|
| 303 | 294 |
if( mIsChinese && !mPolicyAccepted ) PrivacyPolicy(); |
| ... | ... | |
| 466 | 457 |
|
| 467 | 458 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 468 | 459 |
|
| 469 |
public void changeObject(ObjectList newObject, int newSize, boolean reportChange)
|
|
| 460 |
public void changeObject(ObjectList newObject, boolean reportChange) |
|
| 470 | 461 |
{
|
| 471 | 462 |
RubikSurfaceView view = findViewById(R.id.rubikSurfaceView); |
| 472 | 463 |
RubikPreRender pre = view.getPreRender(); |
| ... | ... | |
| 478 | 469 |
if( oldObject!=null ) |
| 479 | 470 |
{
|
| 480 | 471 |
ObjectList oldList = oldObject.getObjectList(); |
| 481 |
int oldNum = oldObject.getNumLayers(); |
|
| 482 | 472 |
float fps = view.getRenderer().getFPS(); |
| 483 | 473 |
fps = (int)(fps+0.5f); |
| 484 | 474 |
StringBuilder name = new StringBuilder(); |
| 485 | 475 |
name.append(oldList.name()); |
| 486 |
name.append('_');
|
|
| 487 |
name.append(oldNum); |
|
| 488 | 476 |
name.append(' ');
|
| 489 | 477 |
name.append(fps); |
| 490 | 478 |
name.append(" --> ");
|
| 491 | 479 |
name.append(newObject.name()); |
| 492 |
name.append('_');
|
|
| 493 |
name.append(newSize); |
|
| 494 | 480 |
|
| 495 | 481 |
if( BuildConfig.DEBUG ) |
| 496 | 482 |
{
|
| ... | ... | |
| 510 | 496 |
} |
| 511 | 497 |
} |
| 512 | 498 |
|
| 513 |
pre.changeObject(newObject,newSize);
|
|
| 499 |
pre.changeObject(newObject); |
|
| 514 | 500 |
} |
| 515 | 501 |
|
| 516 | 502 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 517 | 503 |
|
| 518 |
public void setupObject(ObjectList object, int size, int[][] moves)
|
|
| 504 |
public void setupObject(ObjectList object, int[][] moves) |
|
| 519 | 505 |
{
|
| 520 | 506 |
RubikSurfaceView view = findViewById(R.id.rubikSurfaceView); |
| 521 | 507 |
RubikPreRender pre = view.getPreRender(); |
| 522 |
pre.setupObject(object,size,moves);
|
|
| 508 |
pre.setupObject(object,moves); |
|
| 523 | 509 |
} |
| 524 | 510 |
|
| 525 | 511 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 642 | 628 |
|
| 643 | 629 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 644 | 630 |
|
| 645 |
public void switchTutorial(String url, ObjectList object, int size)
|
|
| 631 |
public void switchTutorial(String url, ObjectList object) |
|
| 646 | 632 |
{
|
| 647 | 633 |
Intent myIntent = new Intent(this, TutorialActivity.class); |
| 648 | 634 |
myIntent.putExtra("url", url);
|
| 649 | 635 |
myIntent.putExtra("obj", object.ordinal());
|
| 650 |
myIntent.putExtra("siz", size);
|
|
| 651 | 636 |
startActivity(myIntent); |
| 652 | 637 |
} |
| 653 | 638 |
} |
| src/main/java/org/distorted/main/RubikPreRender.java | ||
|---|---|---|
| 61 | 61 |
private boolean mUIBlocked, mTouchBlocked; |
| 62 | 62 |
private boolean mIsSolved; |
| 63 | 63 |
private ObjectList mNextObject; |
| 64 |
private int mNextSize; |
|
| 65 | 64 |
private long mRotationFinishedID; |
| 66 | 65 |
private final long[] mEffectID; |
| 67 | 66 |
private boolean mIsNewRecord; |
| ... | ... | |
| 115 | 114 |
|
| 116 | 115 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 117 | 116 |
|
| 118 |
private void createObjectNow(ObjectList object, int size, int[][] moves)
|
|
| 117 |
private void createObjectNow(ObjectList object, int[][] moves) |
|
| 119 | 118 |
{
|
| 120 | 119 |
boolean firstTime = (mNewObject==null); |
| 121 | 120 |
|
| ... | ... | |
| 125 | 124 |
Context con = mView.getContext(); |
| 126 | 125 |
Resources res = con.getResources(); |
| 127 | 126 |
|
| 128 |
mNewObject = object.create(size, mView.getQuat(), moves, res, mScreenWidth);
|
|
| 127 |
mNewObject = object.create(mView.getQuat(), moves, res, mScreenWidth); |
|
| 129 | 128 |
|
| 130 | 129 |
if( mNewObject!=null ) |
| 131 | 130 |
{
|
| ... | ... | |
| 248 | 247 |
{
|
| 249 | 248 |
mChangeObject = false; |
| 250 | 249 |
|
| 251 |
if ( mNewObject==null || mNewObject.getObjectList()!=mNextObject || mNewObject.getNumLayers()!=mNextSize)
|
|
| 250 |
if ( mNewObject==null || mNewObject.getObjectList()!=mNextObject ) |
|
| 252 | 251 |
{
|
| 253 | 252 |
blockEverything(BlockController.RUBIK_PLACE_1); |
| 254 |
createObjectNow(mNextObject, mNextSize, null);
|
|
| 253 |
createObjectNow(mNextObject, null); |
|
| 255 | 254 |
doEffectNow( BaseEffect.Type.SIZECHANGE ); |
| 256 | 255 |
} |
| 257 | 256 |
} |
| ... | ... | |
| 262 | 261 |
{
|
| 263 | 262 |
mSetupObject = false; |
| 264 | 263 |
|
| 265 |
if ( mNewObject==null || mNewObject.getObjectList()!=mNextObject || mNewObject.getNumLayers()!=mNextSize)
|
|
| 264 |
if ( mNewObject==null || mNewObject.getObjectList()!=mNextObject) |
|
| 266 | 265 |
{
|
| 267 | 266 |
blockEverything(BlockController.RUBIK_PLACE_2); |
| 268 |
createObjectNow(mNextObject, mNextSize, mNextMoves);
|
|
| 267 |
createObjectNow(mNextObject, mNextMoves); |
|
| 269 | 268 |
doEffectNow( BaseEffect.Type.SIZECHANGE ); |
| 270 | 269 |
} |
| 271 | 270 |
else |
| ... | ... | |
| 344 | 343 |
RubikScores scores = RubikScores.getInstance(); |
| 345 | 344 |
|
| 346 | 345 |
int object = play.getObject(); |
| 347 |
int size = play.getSize(); |
|
| 348 | 346 |
int level = play.getLevel(); |
| 349 | 347 |
ObjectList list = ObjectList.getObject(object); |
| 350 | 348 |
String name = scores.getName(); |
| 351 | 349 |
|
| 352 |
String record = list.name()+"_"+size+" level "+level+" time "+mNewRecord+" isNew: "+mIsNewRecord+" scrambleNum: "+mScrambleObjectNum;
|
|
| 350 |
String record = list.name()+" level "+level+" time "+mNewRecord+" isNew: "+mIsNewRecord+" scrambleNum: "+mScrambleObjectNum; |
|
| 353 | 351 |
|
| 354 | 352 |
if( BuildConfig.DEBUG ) |
| 355 | 353 |
{
|
| ... | ... | |
| 499 | 497 |
|
| 500 | 498 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 501 | 499 |
|
| 502 |
void changeObject(ObjectList object, int size)
|
|
| 500 |
void changeObject(ObjectList object) |
|
| 503 | 501 |
{
|
| 504 |
if( size>0 ) |
|
| 505 |
{
|
|
| 506 |
mChangeObject = true; |
|
| 507 |
mNextObject = object; |
|
| 508 |
mNextSize = size; |
|
| 509 |
} |
|
| 502 |
mChangeObject = true; |
|
| 503 |
mNextObject = object; |
|
| 510 | 504 |
} |
| 511 | 505 |
|
| 512 | 506 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 513 | 507 |
|
| 514 |
void setupObject(ObjectList object, int size, int[][] moves)
|
|
| 508 |
void setupObject(ObjectList object, int[][] moves) |
|
| 515 | 509 |
{
|
| 516 |
if( size>0 ) |
|
| 517 |
{
|
|
| 518 |
mSetupObject= true; |
|
| 519 |
mNextObject = object; |
|
| 520 |
mNextSize = size; |
|
| 521 |
mNextMoves = moves; |
|
| 522 |
} |
|
| 510 |
mSetupObject= true; |
|
| 511 |
mNextObject = object; |
|
| 512 |
mNextMoves = moves; |
|
| 523 | 513 |
} |
| 524 | 514 |
|
| 525 | 515 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| src/main/java/org/distorted/main/RubikSurfaceView.java | ||
|---|---|---|
| 257 | 257 |
int color = solver.getCurrentColor(); |
| 258 | 258 |
mLastCubit = object.getCubit(point); |
| 259 | 259 |
mPreRender.setTextureMap( mLastCubit, mLastCubitFace, color ); |
| 260 |
mLastCubitColor = SolverMain.cubitIsLocked(object.getObjectList(), object.getNumLayers(), mLastCubit);
|
|
| 260 |
mLastCubitColor = SolverMain.cubitIsLocked(object.getObjectList(), mLastCubit); |
|
| 261 | 261 |
} |
| 262 | 262 |
} |
| 263 | 263 |
} |
| src/main/java/org/distorted/network/RubikNetwork.java | ||
|---|---|---|
| 37 | 37 |
import org.distorted.objectlib.main.ObjectList; |
| 38 | 38 |
|
| 39 | 39 |
import static org.distorted.objectlib.main.ObjectList.MAX_LEVEL; |
| 40 |
import static org.distorted.objectlib.main.ObjectList.NUM_OBJECTS; |
|
| 40 | 41 |
|
| 41 | 42 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 42 | 43 |
|
| ... | ... | |
| 96 | 97 |
"%f8", "%f9", "%fa", "%fb", "%fc", "%fd", "%fe", "%ff" |
| 97 | 98 |
}; |
| 98 | 99 |
|
| 99 |
private static int mTotal = 0; |
|
| 100 | 100 |
private static String[][][] mCountry; |
| 101 | 101 |
private static String[][][] mName; |
| 102 | 102 |
private static float[][][] mTime; |
| ... | ... | |
| 113 | 113 |
|
| 114 | 114 |
private static void initializeStatics() |
| 115 | 115 |
{
|
| 116 |
if( mTotal==0 ) mTotal = ObjectList.getTotal(); |
|
| 117 |
if( mCountry==null ) mCountry = new String[mTotal][MAX_LEVEL][MAX_PLACES]; |
|
| 118 |
if( mName==null ) mName = new String[mTotal][MAX_LEVEL][MAX_PLACES]; |
|
| 119 |
if( mTime==null ) mTime = new float[mTotal][MAX_LEVEL][MAX_PLACES]; |
|
| 120 |
if( mPlaces==null ) mPlaces = new int[mTotal][MAX_LEVEL]; |
|
| 116 |
if( mCountry==null ) mCountry = new String[NUM_OBJECTS][MAX_LEVEL][MAX_PLACES]; |
|
| 117 |
if( mName==null ) mName = new String[NUM_OBJECTS][MAX_LEVEL][MAX_PLACES]; |
|
| 118 |
if( mTime==null ) mTime = new float[NUM_OBJECTS][MAX_LEVEL][MAX_PLACES]; |
|
| 119 |
if( mPlaces==null ) mPlaces = new int[NUM_OBJECTS][MAX_LEVEL]; |
|
| 121 | 120 |
} |
| 122 | 121 |
|
| 123 | 122 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 166 | 165 |
return false; |
| 167 | 166 |
} |
| 168 | 167 |
|
| 169 |
for(int i=0; i<mTotal; i++)
|
|
| 168 |
for(int i=0; i<NUM_OBJECTS; i++)
|
|
| 170 | 169 |
for(int j=0; j<MAX_LEVEL; j++) |
| 171 | 170 |
{
|
| 172 | 171 |
mPlaces[i][j] = 0; |
| ... | ... | |
| 205 | 204 |
|
| 206 | 205 |
if( s5>s4 && s4>s3 && s3>s2 && s2>s1 && s1>0 ) |
| 207 | 206 |
{
|
| 208 |
int object = ObjectList.unpackObjectFromString( row.substring(0,s1) );
|
|
| 207 |
int object = ObjectList.getOrdinal( row.substring(0,s1) );
|
|
| 209 | 208 |
|
| 210 |
if( object>=0 && object<mTotal )
|
|
| 209 |
if( object>=0 && object<NUM_OBJECTS )
|
|
| 211 | 210 |
{
|
| 212 | 211 |
int level = Integer.parseInt( row.substring(s1+1,s2) ); |
| 213 | 212 |
String name = row.substring(s2+1, s3); |
| src/main/java/org/distorted/network/RubikScores.java | ||
|---|---|---|
| 27 | 27 |
|
| 28 | 28 |
import com.google.firebase.crashlytics.FirebaseCrashlytics; |
| 29 | 29 |
|
| 30 |
import static org.distorted.objectlib.main.ObjectList.MAX_NUM_OBJECTS; |
|
| 31 | 30 |
import static org.distorted.objectlib.main.ObjectList.NUM_OBJECTS; |
| 32 | 31 |
import static org.distorted.objectlib.main.ObjectList.MAX_LEVEL; |
| 33 | 32 |
|
| ... | ... | |
| 43 | 42 |
public static final long NO_RECORD = Long.MAX_VALUE; |
| 44 | 43 |
private static RubikScores mThis; |
| 45 | 44 |
|
| 46 |
private final long[][][] mRecords;
|
|
| 47 |
private final int [][][] mSubmitted;
|
|
| 45 |
private final long[][] mRecords; |
|
| 46 |
private final int [][] mSubmitted; |
|
| 48 | 47 |
|
| 49 | 48 |
private String mName, mCountry; |
| 50 | 49 |
private boolean mNameIsVerified; |
| ... | ... | |
| 57 | 56 |
|
| 58 | 57 |
private RubikScores() |
| 59 | 58 |
{
|
| 60 |
mRecords = new long[NUM_OBJECTS][MAX_NUM_OBJECTS][MAX_LEVEL];
|
|
| 61 |
mSubmitted = new int [NUM_OBJECTS][MAX_NUM_OBJECTS][MAX_LEVEL];
|
|
| 59 |
mRecords = new long[NUM_OBJECTS][MAX_LEVEL]; |
|
| 60 |
mSubmitted = new int [NUM_OBJECTS][MAX_LEVEL]; |
|
| 62 | 61 |
|
| 63 | 62 |
for(int i=0; i<NUM_OBJECTS; i++) |
| 64 |
for(int j=0; j<MAX_NUM_OBJECTS; j++) |
|
| 65 |
for(int k=0; k<MAX_LEVEL; k++) |
|
| 66 |
{
|
|
| 67 |
mRecords[i][j][k] = NO_RECORD; |
|
| 68 |
mSubmitted[i][j][k] = 0; |
|
| 69 |
} |
|
| 63 |
for(int j=0; j<MAX_LEVEL; j++) |
|
| 64 |
{
|
|
| 65 |
mRecords[i][j] = NO_RECORD; |
|
| 66 |
mSubmitted[i][j] = 0; |
|
| 67 |
} |
|
| 70 | 68 |
|
| 71 | 69 |
mName = ""; |
| 72 | 70 |
mCountry = "un"; |
| ... | ... | |
| 106 | 104 |
mNameIsVerified = true; |
| 107 | 105 |
|
| 108 | 106 |
for(int i=0; i<NUM_OBJECTS; i++) |
| 109 |
for(int j=0; j<MAX_NUM_OBJECTS; j++) |
|
| 110 |
for(int k=0; k<MAX_LEVEL; k++) |
|
| 111 |
{
|
|
| 112 |
mSubmitted[i][j][k]=1; |
|
| 113 |
} |
|
| 107 |
for(int j=0; j<MAX_LEVEL; j++) |
|
| 108 |
{
|
|
| 109 |
mSubmitted[i][j]=1; |
|
| 110 |
} |
|
| 114 | 111 |
} |
| 115 | 112 |
|
| 116 | 113 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 124 | 121 |
|
| 125 | 122 |
synchronized boolean thereAreUnsubmittedRecords() |
| 126 | 123 |
{
|
| 127 |
ObjectList list; |
|
| 128 |
int length; |
|
| 129 |
|
|
| 130 | 124 |
for(int object=0; object<NUM_OBJECTS; object++) |
| 131 | 125 |
{
|
| 132 |
list = ObjectList.getObject(object); |
|
| 133 |
length = list.getSizes().length; |
|
| 134 |
|
|
| 135 |
for(int size=0; size<length; size++) |
|
| 136 |
for(int level=0; level<MAX_LEVEL; level++) |
|
| 137 |
{
|
|
| 138 |
if( mSubmitted[object][size][level]==0 && mRecords[object][size][level]<NO_RECORD ) |
|
| 139 |
{
|
|
| 140 |
return true; |
|
| 141 |
} |
|
| 142 |
} |
|
| 126 |
for(int level=0; level<MAX_LEVEL; level++) |
|
| 127 |
{
|
|
| 128 |
if( mSubmitted[object][level]==0 && mRecords[object][level]<NO_RECORD ) return true; |
|
| 129 |
} |
|
| 143 | 130 |
} |
| 144 | 131 |
|
| 145 | 132 |
return false; |
| ... | ... | |
| 149 | 136 |
|
| 150 | 137 |
synchronized String getRecordList(String strObj, String strLvl, String strTim) |
| 151 | 138 |
{
|
| 152 |
ObjectList list; |
|
| 153 | 139 |
StringBuilder builderObj = new StringBuilder(); |
| 154 | 140 |
StringBuilder builderLvl = new StringBuilder(); |
| 155 | 141 |
StringBuilder builderTim = new StringBuilder(); |
| 156 | 142 |
boolean first = true; |
| 157 |
int[] sizes; |
|
| 158 |
int length; |
|
| 159 | 143 |
|
| 160 | 144 |
for(int object=0; object<NUM_OBJECTS; object++) |
| 161 | 145 |
{
|
| 162 |
list = ObjectList.getObject(object); |
|
| 163 |
sizes = list.getSizes(); |
|
| 164 |
length = sizes.length; |
|
| 146 |
String name = ObjectList.getObject(object).name(); |
|
| 165 | 147 |
|
| 166 |
for(int size=0; size<length; size++)
|
|
| 148 |
for(int level=0; level<MAX_LEVEL; level++)
|
|
| 167 | 149 |
{
|
| 168 |
for(int level=0; level<MAX_LEVEL; level++)
|
|
| 150 |
if( mSubmitted[object][level]==0 && mRecords[object][level]<NO_RECORD )
|
|
| 169 | 151 |
{
|
| 170 |
if( mSubmitted[object][size][level]==0 && mRecords[object][size][level]<NO_RECORD )
|
|
| 152 |
if( !first )
|
|
| 171 | 153 |
{
|
| 172 |
if( !first ) |
|
| 173 |
{
|
|
| 174 |
builderObj.append(',');
|
|
| 175 |
builderLvl.append(',');
|
|
| 176 |
builderTim.append(',');
|
|
| 177 |
} |
|
| 178 |
else |
|
| 179 |
{
|
|
| 180 |
first=false; |
|
| 181 |
} |
|
| 182 |
|
|
| 183 |
builderObj.append(list.name()); |
|
| 184 |
builderObj.append("_");
|
|
| 185 |
builderObj.append(sizes[size]); |
|
| 186 |
builderLvl.append(level); |
|
| 187 |
builderTim.append(mRecords[object][size][level]); |
|
| 154 |
builderObj.append(',');
|
|
| 155 |
builderLvl.append(',');
|
|
| 156 |
builderTim.append(',');
|
|
| 157 |
} |
|
| 158 |
else |
|
| 159 |
{
|
|
| 160 |
first=false; |
|
| 188 | 161 |
} |
| 162 |
|
|
| 163 |
builderObj.append(name); |
|
| 164 |
builderLvl.append(level); |
|
| 165 |
builderTim.append(mRecords[object][level]); |
|
| 189 | 166 |
} |
| 190 | 167 |
} |
| 191 | 168 |
} |
| ... | ... | |
| 197 | 174 |
// Public API |
| 198 | 175 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 199 | 176 |
|
| 200 |
public synchronized long getRecord(int object, int size, int level)
|
|
| 177 |
public synchronized long getRecord(int obj, int level) |
|
| 201 | 178 |
{
|
| 202 |
int maxsize = ObjectList.getObject(object).getSizes().length; |
|
| 203 |
|
|
| 204 |
if( object>=0 && object<NUM_OBJECTS && size>=0 && size<maxsize && level>=0 && level<MAX_LEVEL ) |
|
| 205 |
{
|
|
| 206 |
return mRecords[object][size][level]; |
|
| 207 |
} |
|
| 208 |
|
|
| 209 |
return -1; |
|
| 179 |
return (obj>=0 && obj<NUM_OBJECTS && level>=0 && level<MAX_LEVEL) ? mRecords[obj][level] : -1; |
|
| 210 | 180 |
} |
| 211 | 181 |
|
| 212 | 182 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 213 | 183 |
|
| 214 |
public synchronized boolean isSubmitted(int object, int size, int level)
|
|
| 184 |
public synchronized boolean isSubmitted(int obj, int level) |
|
| 215 | 185 |
{
|
| 216 |
int maxsize = ObjectList.getObject(object).getSizes().length; |
|
| 217 |
|
|
| 218 |
if( object>=0 && object<NUM_OBJECTS && size>=0 && size<maxsize && level>=0 && level<MAX_LEVEL ) |
|
| 219 |
{
|
|
| 220 |
return mSubmitted[object][size][level]==1; |
|
| 221 |
} |
|
| 222 |
|
|
| 223 |
return false; |
|
| 186 |
return obj>=0 && obj<NUM_OBJECTS && level>=0 && level<MAX_LEVEL && mSubmitted[obj][level]==1; |
|
| 224 | 187 |
} |
| 225 | 188 |
|
| 226 | 189 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 289 | 252 |
|
| 290 | 253 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 291 | 254 |
|
| 292 |
public synchronized boolean isSolved(int object, int size, int level)
|
|
| 255 |
public synchronized boolean isSolved(int obj, int level) |
|
| 293 | 256 |
{
|
| 294 |
int maxsize = ObjectList.getObject(object).getSizes().length; |
|
| 295 |
|
|
| 296 |
if( object>=0 && object<NUM_OBJECTS && size>=0 && size<maxsize && level>=0 && level<MAX_LEVEL ) |
|
| 297 |
{
|
|
| 298 |
return mRecords[object][size][level]<NO_RECORD; |
|
| 299 |
} |
|
| 300 |
|
|
| 301 |
return false; |
|
| 257 |
return obj>=0 && obj<NUM_OBJECTS && level>=0 && level<MAX_LEVEL && mRecords[obj][level]<NO_RECORD; |
|
| 302 | 258 |
} |
| 303 | 259 |
|
| 304 | 260 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 350 | 306 |
public synchronized void savePreferences(SharedPreferences.Editor editor) |
| 351 | 307 |
{
|
| 352 | 308 |
StringBuilder builder = new StringBuilder(); |
| 353 |
ObjectList list; |
|
| 354 |
int[] sizes; |
|
| 355 |
int length; |
|
| 309 |
String name; |
|
| 356 | 310 |
|
| 357 | 311 |
for(int level=0; level<MAX_LEVEL; level++) |
| 358 | 312 |
{
|
| ... | ... | |
| 360 | 314 |
|
| 361 | 315 |
for(int object=0; object<NUM_OBJECTS; object++) |
| 362 | 316 |
{
|
| 363 |
list = ObjectList.getObject(object); |
|
| 364 |
sizes = list.getSizes(); |
|
| 365 |
length = sizes.length; |
|
| 366 |
|
|
| 367 |
for(int size=0; size<length; size++) |
|
| 368 |
{
|
|
| 369 |
builder.append(list.name()); |
|
| 370 |
builder.append("_");
|
|
| 371 |
builder.append(sizes[size]); |
|
| 372 |
builder.append("=");
|
|
| 373 |
builder.append(mRecords[object][size][level]); |
|
| 374 |
builder.append(",");
|
|
| 375 |
builder.append(mSubmitted[object][size][level]); |
|
| 376 |
builder.append(" ");
|
|
| 377 |
} |
|
| 317 |
name = ObjectList.getObject(object).name(); |
|
| 318 |
builder.append(name); |
|
| 319 |
builder.append("=");
|
|
| 320 |
builder.append(mRecords[object][level]); |
|
| 321 |
builder.append(",");
|
|
| 322 |
builder.append(mSubmitted[object][level]); |
|
| 323 |
builder.append(" ");
|
|
| 378 | 324 |
} |
| 379 | 325 |
|
| 380 | 326 |
editor.putString("scores_record"+level, builder.toString());
|
| ... | ... | |
| 393 | 339 |
public synchronized void restorePreferences(SharedPreferences preferences) |
| 394 | 340 |
{
|
| 395 | 341 |
String recordStr, subStr, nameStr, sizeStr, timeStr, submStr, errorStr=""; |
| 396 |
int start, end, equals, underscore, comma; |
|
| 397 |
int object, sizeIndex, subm; |
|
| 342 |
int start, end, equals, underscore, comma, object, subm; |
|
| 398 | 343 |
long time; |
| 399 | 344 |
boolean thereWasError = false; |
| 400 | 345 |
|
| ... | ... | |
| 427 | 372 |
|
| 428 | 373 |
if( object>=0 && object< NUM_OBJECTS ) |
| 429 | 374 |
{
|
| 430 |
sizeIndex = ObjectList.getSizeIndex(object,Integer.parseInt(sizeStr)); |
|
| 431 | 375 |
time = Long.parseLong(timeStr); |
| 432 | 376 |
subm = Integer.parseInt(submStr); |
| 433 | 377 |
|
| 434 |
if( sizeIndex>=0 && sizeIndex<MAX_NUM_OBJECTS && subm>=0 && subm<=1 )
|
|
| 378 |
if( subm>=0 && subm<=1 ) |
|
| 435 | 379 |
{
|
| 436 |
mRecords [object][sizeIndex][level] = time;
|
|
| 437 |
mSubmitted[object][sizeIndex][level] = subm;
|
|
| 380 |
mRecords [object][level] = time; |
|
| 381 |
mSubmitted[object][level] = subm; |
|
| 438 | 382 |
} |
| 439 | 383 |
else |
| 440 | 384 |
{
|
| 441 |
errorStr += ("error1: size="+sizeIndex+" subm="+subm+" obj: "+nameStr+" size: "+sizeStr+"\n");
|
|
| 385 |
errorStr += ("error1: subm="+subm+" obj: "+nameStr+" size: "+sizeStr+"\n");
|
|
| 442 | 386 |
thereWasError= true; |
| 443 | 387 |
} |
| 444 | 388 |
} |
| ... | ... | |
| 482 | 426 |
|
| 483 | 427 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 484 | 428 |
|
| 485 |
public synchronized boolean setRecord(int object, int size, int level, long timeTaken)
|
|
| 429 |
public synchronized boolean setRecord(int object, int level, long timeTaken) |
|
| 486 | 430 |
{
|
| 487 |
int maxsize = ObjectList.getObject(object).getSizes().length; |
|
| 488 |
|
|
| 489 |
if( object>=0 && object<NUM_OBJECTS && size>=0 && size<maxsize && level>=1 && level<=MAX_LEVEL ) |
|
| 431 |
if( object>=0 && object<NUM_OBJECTS && level>=1 && level<=MAX_LEVEL && mRecords[object][level-1]>timeTaken ) |
|
| 490 | 432 |
{
|
| 491 |
if( mRecords[object][size][level-1]> timeTaken ) |
|
| 492 |
{
|
|
| 493 |
mRecords [object][size][level-1] = timeTaken; |
|
| 494 |
mSubmitted[object][size][level-1] = 0; |
|
| 495 |
return true; |
|
| 496 |
} |
|
| 433 |
mRecords [object][level-1] = timeTaken; |
|
| 434 |
mSubmitted[object][level-1] = 0; |
|
| 435 |
return true; |
|
| 497 | 436 |
} |
| 498 | 437 |
|
| 499 | 438 |
return false; |
| src/main/java/org/distorted/patterns/RubikPatternList.java | ||
|---|---|---|
| 25 | 25 |
|
| 26 | 26 |
public enum RubikPatternList |
| 27 | 27 |
{
|
| 28 |
CUBE2 (ObjectList.CUBE, 2, PatternCube2.patterns),
|
|
| 29 |
CUBE3 (ObjectList.CUBE, 3, PatternCube3.patterns),
|
|
| 30 |
CUBE4 (ObjectList.CUBE, 4, PatternCube4.patterns),
|
|
| 31 |
CUBE5 (ObjectList.CUBE, 5, PatternCube5.patterns),
|
|
| 32 |
PYRA3 (ObjectList.PYRA, 3, PatternPyraminx3.patterns),
|
|
| 33 |
PYRA4 (ObjectList.PYRA, 4, PatternPyraminx4.patterns),
|
|
| 34 |
PYRA5 (ObjectList.PYRA, 5, PatternPyraminx5.patterns),
|
|
| 35 |
MEGA3 (ObjectList.MEGA, 3, PatternMegaminx.patterns),
|
|
| 36 |
MEGA5 (ObjectList.MEGA, 5, PatternGigaminx.patterns),
|
|
| 28 |
CUBE2 (ObjectList.CUBE_2, PatternCube2.patterns),
|
|
| 29 |
CUBE3 (ObjectList.CUBE_3, PatternCube3.patterns),
|
|
| 30 |
CUBE4 (ObjectList.CUBE_4, PatternCube4.patterns),
|
|
| 31 |
CUBE5 (ObjectList.CUBE_5, PatternCube5.patterns),
|
|
| 32 |
PYRA3 (ObjectList.PYRA_3, PatternPyraminx3.patterns),
|
|
| 33 |
PYRA4 (ObjectList.PYRA_4, PatternPyraminx4.patterns),
|
|
| 34 |
PYRA5 (ObjectList.PYRA_5, PatternPyraminx5.patterns),
|
|
| 35 |
MEGA3 (ObjectList.MEGA_3, PatternMegaminx.patterns),
|
|
| 36 |
MEGA5 (ObjectList.MEGA_5, PatternGigaminx.patterns),
|
|
| 37 | 37 |
; |
| 38 | 38 |
|
| 39 | 39 |
public static final int NUM_OBJECTS = values().length; |
| 40 | 40 |
private final ObjectList mObject; |
| 41 |
private final int mSize; |
|
| 42 | 41 |
private final String[][] mPatterns; |
| 43 | 42 |
|
| 44 | 43 |
private static final RubikPatternList[] objects; |
| ... | ... | |
| 63 | 62 |
|
| 64 | 63 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 65 | 64 |
|
| 66 |
RubikPatternList(ObjectList object, int size, String[][] patterns)
|
|
| 65 |
RubikPatternList(ObjectList object, String[][] patterns) |
|
| 67 | 66 |
{
|
| 68 | 67 |
mObject = object; |
| 69 |
mSize = size; |
|
| 70 | 68 |
mPatterns = patterns; |
| 71 | 69 |
} |
| 72 | 70 |
|
| ... | ... | |
| 74 | 72 |
// PUBLIC API |
| 75 | 73 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 76 | 74 |
|
| 77 |
public static int getOrdinal(int objectOrdinal, int size)
|
|
| 75 |
public static int getOrdinal(int object) |
|
| 78 | 76 |
{
|
| 79 | 77 |
for(int i=0; i<NUM_OBJECTS; i++) |
| 80 | 78 |
{
|
| 81 |
if( objects[i].mObject.ordinal() == objectOrdinal && objects[i].mSize == size )
|
|
| 79 |
if( objects[i].mObject.ordinal() == object ) |
|
| 82 | 80 |
{
|
| 83 | 81 |
return i; |
| 84 | 82 |
} |
| ... | ... | |
| 93 | 91 |
{
|
| 94 | 92 |
return objects[ordinal].mObject; |
| 95 | 93 |
} |
| 96 |
|
|
| 97 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 98 |
|
|
| 99 |
public static int getSize(int ordinal) |
|
| 100 |
{
|
|
| 101 |
return objects[ordinal].mSize; |
|
| 102 |
} |
|
| 103 | 94 |
} |
| src/main/java/org/distorted/screens/RubikScreenAbstract.java | ||
|---|---|---|
| 35 | 35 |
{
|
| 36 | 36 |
RubikScreenPlay play = (RubikScreenPlay) ScreenList.PLAY.getScreenClass(); |
| 37 | 37 |
int obj = play.getObject(); |
| 38 |
int size = play.getSize(); |
|
| 39 |
int ret = RubikPatternList.getOrdinal(obj,size); |
|
| 38 |
int ret = RubikPatternList.getOrdinal(obj); |
|
| 40 | 39 |
|
| 41 | 40 |
if( ret<0 ) |
| 42 | 41 |
{
|
| 43 |
ret = ObjectList.getSizeIndex(RubikScreenPlay.DEF_OBJECT, RubikScreenPlay.DEF_SIZE);
|
|
| 42 |
ret = RubikPatternList.getOrdinal(RubikScreenPlay.DEF_OBJECT);
|
|
| 44 | 43 |
} |
| 45 | 44 |
|
| 46 | 45 |
return ret; |
| ... | ... | |
| 52 | 51 |
{
|
| 53 | 52 |
RubikScreenPlay play = (RubikScreenPlay) ScreenList.PLAY.getScreenClass(); |
| 54 | 53 |
int obj = play.getObject(); |
| 55 |
int size = play.getSize(); |
|
| 56 | 54 |
|
| 57 |
int ret = TutorialList.getOrdinal(obj,size);
|
|
| 55 |
int ret = TutorialList.getOrdinal(obj); |
|
| 58 | 56 |
|
| 59 | 57 |
if( ret<0 ) |
| 60 | 58 |
{
|
| 61 |
ret = ObjectList.getSizeIndex(RubikScreenPlay.DEF_OBJECT, RubikScreenPlay.DEF_SIZE);
|
|
| 59 |
ret = TutorialList.getOrdinal(RubikScreenPlay.DEF_OBJECT);
|
|
| 62 | 60 |
} |
| 63 | 61 |
|
| 64 | 62 |
return ret; |
| src/main/java/org/distorted/screens/RubikScreenPattern.java | ||
|---|---|---|
| 63 | 63 |
void leaveScreen(RubikActivity act) |
| 64 | 64 |
{
|
| 65 | 65 |
RubikScreenPlay play = (RubikScreenPlay) ScreenList.PLAY.getScreenClass(); |
| 66 |
|
|
| 67 | 66 |
ObjectList object = RubikPatternList.getObject(mPatternOrdinal); |
| 68 |
int size = RubikPatternList.getSize(mPatternOrdinal); |
|
| 69 | 67 |
|
| 70 |
if( !play.setObjectAndSize(act,object,size) )
|
|
| 68 |
if( !play.setObject(act,object) )
|
|
| 71 | 69 |
{
|
| 72 | 70 |
int objectPlay= play.getObject(); |
| 73 |
int sizePlay = play.getSize(); |
|
| 74 | 71 |
|
| 75 |
act.changeObject(ObjectList.getObject(objectPlay),sizePlay, false);
|
|
| 72 |
act.changeObject(ObjectList.getObject(objectPlay),false); |
|
| 76 | 73 |
} |
| 77 | 74 |
} |
| 78 | 75 |
|
| src/main/java/org/distorted/screens/RubikScreenPlay.java | ||
|---|---|---|
| 53 | 53 |
public class RubikScreenPlay extends RubikScreenBase |
| 54 | 54 |
{
|
| 55 | 55 |
public static final int LEVELS_SHOWN = 10; |
| 56 |
public static final int DEF_OBJECT= ObjectList.CUBE.ordinal(); |
|
| 57 |
public static final int DEF_SIZE = 3; |
|
| 56 |
public static final int DEF_OBJECT= ObjectList.CUBE_3.ordinal(); |
|
| 58 | 57 |
|
| 59 | 58 |
private static final int[] BUTTON_LABELS = { R.string.scores,
|
| 60 | 59 |
R.string.patterns, |
| ... | ... | |
| 71 | 70 |
private Button mPlayButton; |
| 72 | 71 |
private PopupWindow mObjectPopup, mMenuPopup, mPlayPopup; |
| 73 | 72 |
private int mObject = DEF_OBJECT; |
| 74 |
private int mSize = DEF_SIZE; |
|
| 75 | 73 |
private int mObjectSize, mMenuLayoutWidth, mMenuLayoutHeight, mPlayLayoutWidth; |
| 76 | 74 |
private int mLevelValue; |
| 77 | 75 |
private float mButtonSize, mMenuItemSize, mMenuTextSize; |
| ... | ... | |
| 79 | 77 |
private LinearLayout mPlayLayout; |
| 80 | 78 |
private int mUpperBarHeight; |
| 81 | 79 |
|
| 82 |
private boolean mIsFullScreen; |
|
| 83 |
|
|
| 84 | 80 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 85 | 81 |
|
| 86 | 82 |
void leaveScreen(RubikActivity act) |
| ... | ... | |
| 166 | 162 |
{
|
| 167 | 163 |
View popupView = mPlayPopup.getContentView(); |
| 168 | 164 |
popupView.setSystemUiVisibility(RubikActivity.FLAGS); |
| 169 |
final int sizeIndex = ObjectList.getSizeIndex(mObject,mSize); |
|
| 170 |
final int dbLevel = ObjectList.getDBLevel(mObject, sizeIndex); |
|
| 165 |
final int dbLevel = ObjectList.getDBLevel(mObject); |
|
| 171 | 166 |
final int levelsShown = Math.min(dbLevel,LEVELS_SHOWN); |
| 172 | 167 |
final int popupHeight = (int)(levelsShown*(mMenuItemSize+margin)+3*margin+mMenuItemSize*(LAST_BUTTON-1.0f)); |
| 173 | 168 |
final int realHeight = Math.min(popupHeight,maxHeight); |
| ... | ... | |
| 205 | 200 |
|
| 206 | 201 |
private void setupObjectWindow(final RubikActivity act, final float width, final float height) |
| 207 | 202 |
{
|
| 208 |
int icon = RubikActivity.getDrawable(R.drawable.ui_small_cube2,R.drawable.ui_medium_cube2, R.drawable.ui_big_cube2, R.drawable.ui_huge_cube2);
|
|
| 203 |
int icon = RubikActivity.getDrawable(R.drawable.small_cube2,R.drawable.medium_cube2, R.drawable.big_cube2, R.drawable.huge_cube2);
|
|
| 209 | 204 |
|
| 210 | 205 |
BitmapDrawable bd = (BitmapDrawable) act.getResources().getDrawable(icon); |
| 211 | 206 |
int cubeWidth = bd.getIntrinsicWidth(); |
| ... | ... | |
| 250 | 245 |
for(int object=0; object< ObjectList.NUM_OBJECTS; object++) |
| 251 | 246 |
{
|
| 252 | 247 |
final ObjectList list = ObjectList.getObject(object); |
| 253 |
final int[] sizes = list.getSizes(); |
|
| 254 | 248 |
int iconSize = RubikActivity.getDrawableSize(); |
| 255 |
int[] icons = list.getIconIDs(iconSize); |
|
| 256 |
int len = sizes.length; |
|
| 249 |
int icons = list.getIconID(iconSize); |
|
| 257 | 250 |
final int obj = object; |
| 258 | 251 |
int row = indices[object]; |
| 259 | 252 |
|
| 260 |
for(int i=0; i<len; i++) |
|
| 253 |
ImageButton button = new ImageButton(act); |
|
| 254 |
button.setBackgroundResource(icons); |
|
| 255 |
button.setOnClickListener( new View.OnClickListener() |
|
| 261 | 256 |
{
|
| 262 |
final int index = i; |
|
| 263 |
|
|
| 264 |
ImageButton button = new ImageButton(act); |
|
| 265 |
button.setBackgroundResource(icons[i]); |
|
| 266 |
button.setOnClickListener( new View.OnClickListener() |
|
| 257 |
@Override |
|
| 258 |
public void onClick(View v) |
|
| 267 | 259 |
{
|
| 268 |
@Override |
|
| 269 |
public void onClick(View v) |
|
| 260 |
if( act.getPreRender().isUINotBlocked() && ScreenList.getCurrentScreen()== ScreenList.PLAY ) |
|
| 270 | 261 |
{
|
| 271 |
if( act.getPreRender().isUINotBlocked() && ScreenList.getCurrentScreen()== ScreenList.PLAY ) |
|
| 272 |
{
|
|
| 273 |
mObject = obj; |
|
| 274 |
mSize = sizes[index]; |
|
| 275 |
act.changeObject(list,sizes[index], true); |
|
| 276 |
adjustLevels(act); |
|
| 277 |
mController.clearMoves(act); |
|
| 278 |
} |
|
| 279 |
|
|
| 280 |
mObjectPopup.dismiss(); |
|
| 262 |
mObject = obj; |
|
| 263 |
act.changeObject(list, true); |
|
| 264 |
adjustLevels(act); |
|
| 265 |
mController.clearMoves(act); |
|
| 281 | 266 |
} |
| 282 |
}); |
|
| 283 | 267 |
|
| 284 |
GridLayout.LayoutParams params = new GridLayout.LayoutParams(rowSpecs[row],colSpecs[nextInRow[row]]); |
|
| 285 |
params.bottomMargin = margin; |
|
| 286 |
params.topMargin = margin; |
|
| 287 |
params.leftMargin = margin; |
|
| 288 |
params.rightMargin = margin; |
|
| 268 |
mObjectPopup.dismiss(); |
|
| 269 |
} |
|
| 270 |
}); |
|
| 289 | 271 |
|
| 290 |
nextInRow[row]++; |
|
| 272 |
GridLayout.LayoutParams params = new GridLayout.LayoutParams(rowSpecs[row],colSpecs[nextInRow[row]]); |
|
| 273 |
params.bottomMargin = margin; |
|
| 274 |
params.topMargin = margin; |
|
| 275 |
params.leftMargin = margin; |
|
| 276 |
params.rightMargin = margin; |
|
| 291 | 277 |
|
| 292 |
objectGrid.addView(button, params); |
|
| 293 |
} |
|
| 278 |
nextInRow[row]++; |
|
| 279 |
|
|
| 280 |
objectGrid.addView(button, params); |
|
| 294 | 281 |
} |
| 295 | 282 |
} |
| 296 | 283 |
|
| ... | ... | |
| 360 | 347 |
{
|
| 361 | 348 |
case 0: RubikScreenPlay play = (RubikScreenPlay) ScreenList.PLAY.getScreenClass(); |
| 362 | 349 |
int object = play.getObject(); |
| 363 |
int size = play.getSize(); |
|
| 364 |
int sizeIndex = ObjectList.getSizeIndex(object,size); |
|
| 365 | 350 |
Bundle sBundle = new Bundle(); |
| 366 |
sBundle.putInt("tab", ObjectList.pack(object,sizeIndex) );
|
|
| 351 |
sBundle.putInt("tab", object );
|
|
| 367 | 352 |
sBundle.putBoolean("submitting", false);
|
| 368 | 353 |
RubikDialogScores scores = new RubikDialogScores(); |
| 369 | 354 |
scores.setArguments(sBundle); |
| ... | ... | |
| 420 | 405 |
public void savePreferences(SharedPreferences.Editor editor) |
| 421 | 406 |
{
|
| 422 | 407 |
editor.putInt("statePlay_object", mObject);
|
| 423 |
editor.putInt("statePlay_size" , mSize);
|
|
| 424 | 408 |
|
| 425 | 409 |
if( mObjectPopup!=null ) |
| 426 | 410 |
{
|
| ... | ... | |
| 446 | 430 |
public void restorePreferences(SharedPreferences preferences) |
| 447 | 431 |
{
|
| 448 | 432 |
mObject= preferences.getInt("statePlay_object", DEF_OBJECT);
|
| 449 |
mSize = preferences.getInt("statePlay_size" , DEF_SIZE );
|
|
| 450 |
|
|
| 451 |
int sizeIndex = ObjectList.getSizeIndex(mObject,mSize); |
|
| 452 |
int dbLevel = ObjectList.getDBLevel(mObject, sizeIndex); |
|
| 433 |
int dbLevel = ObjectList.getDBLevel(mObject); |
|
| 453 | 434 |
|
| 454 | 435 |
// This means the app has been upgraded to a new version which swapped the |
| 455 | 436 |
// Object for a new one with larger sizeIndex and now getMaxLevel() returns |
| 456 | 437 |
// 0. Reset the object to default, otherwise we'll get a crash later on. |
| 457 | 438 |
|
| 458 |
if( dbLevel==0 ) |
|
| 459 |
{
|
|
| 460 |
mObject = DEF_OBJECT; |
|
| 461 |
mSize = DEF_SIZE; |
|
| 462 |
} |
|
| 439 |
if( dbLevel==0 ) mObject = DEF_OBJECT; |
|
| 463 | 440 |
} |
| 464 | 441 |
|
| 465 | 442 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 466 | 443 |
|
| 467 |
public boolean setObjectAndSize(RubikActivity act, ObjectList obj, int size)
|
|
| 444 |
public boolean setObject(RubikActivity act, ObjectList obj)
|
|
| 468 | 445 |
{
|
| 469 |
if( mObject!=obj.ordinal() || mSize != size )
|
|
| 446 |
if( mObject!=obj.ordinal() ) |
|
| 470 | 447 |
{
|
| 471 |
boolean success = false; |
|
| 472 |
|
|
| 473 |
for( int s: obj.getSizes() ) |
|
| 474 |
if( s==size ) |
|
| 475 |
{
|
|
| 476 |
success = true; |
|
| 477 |
break; |
|
| 478 |
} |
|
| 479 |
|
|
| 480 |
if( success ) |
|
| 481 |
{
|
|
| 482 |
mObject = obj.ordinal(); |
|
| 483 |
mSize = size; |
|
| 484 |
|
|
| 485 |
if( mPlayLayout!=null ) adjustLevels(act); |
|
| 486 |
} |
|
| 487 |
|
|
| 488 |
return success; |
|
| 448 |
mObject = obj.ordinal(); |
|
| 449 |
if( mPlayLayout!=null ) adjustLevels(act); |
|
| 450 |
return true; |
|
| 489 | 451 |
} |
| 490 | 452 |
|
| 491 |
return true;
|
|
| 453 |
return false;
|
|
| 492 | 454 |
} |
| 493 | 455 |
|
| 494 | 456 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 497 | 459 |
private void displayPopup(RubikActivity act, View view, PopupWindow window, int w, int h, int xoff, int yoff) |
| 498 | 460 |
{
|
| 499 | 461 |
View topLayout = act.findViewById(R.id.relativeLayout); |
| 462 |
boolean isFullScreen; |
|
| 500 | 463 |
|
| 501 | 464 |
if( topLayout!=null ) |
| 502 | 465 |
{
|
| 503 | 466 |
topLayout.getLocationOnScreen(mLocation); |
| 504 |
mIsFullScreen = (mLocation[1]==0);
|
|
| 467 |
isFullScreen = (mLocation[1]==0);
|
|
| 505 | 468 |
} |
| 506 | 469 |
else |
| 507 | 470 |
{
|
| 508 |
mIsFullScreen = true;
|
|
| 471 |
isFullScreen = true;
|
|
| 509 | 472 |
} |
| 510 | 473 |
|
| 511 | 474 |
// if on Android 11 or we are fullscreen |
| 512 |
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R || mIsFullScreen )
|
|
| 475 |
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R || isFullScreen )
|
|
| 513 | 476 |
{
|
| 514 | 477 |
window.showAsDropDown(view, xoff, yoff, Gravity.CENTER); |
| 515 | 478 |
window.update(view, w, h); |
| ... | ... | |
| 531 | 494 |
|
| 532 | 495 |
private void adjustLevels(final RubikActivity act) |
| 533 | 496 |
{
|
| 534 |
int sizeIndex = ObjectList.getSizeIndex(mObject,mSize); |
|
| 535 |
int dbLevel = ObjectList.getDBLevel(mObject, sizeIndex); |
|
| 536 |
int numScrambles = ObjectList.getNumScramble(mObject, sizeIndex); |
|
| 497 |
int dbLevel = ObjectList.getDBLevel(mObject); |
|
| 498 |
int numScrambles = ObjectList.getNumScramble(mObject); |
|
| 537 | 499 |
int numLevel = Math.min(dbLevel, LEVELS_SHOWN); |
| 538 | 500 |
String[] levels = new String[numLevel]; |
| 539 | 501 |
|
| ... | ... | |
| 580 | 542 |
button.setText(levels[i]); |
| 581 | 543 |
button.setTextSize(TypedValue.COMPLEX_UNIT_PX, mMenuTextSize); |
| 582 | 544 |
|
| 583 |
int icon = scores.isSolved(mObject, sizeIndex, level-1) ? R.drawable.ui_solved : R.drawable.ui_notsolved;
|
|
| 545 |
int icon = scores.isSolved(mObject, level-1) ? R.drawable.ui_solved : R.drawable.ui_notsolved; |
|
| 584 | 546 |
button.setCompoundDrawablesWithIntrinsicBounds(icon,0,0,0); |
| 585 | 547 |
|
| 586 | 548 |
button.setOnClickListener( new View.OnClickListener() |
| ... | ... | |
| 616 | 578 |
{
|
| 617 | 579 |
return mObject; |
| 618 | 580 |
} |
| 619 |
|
|
| 620 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 621 |
|
|
| 622 |
public int getSize() |
|
| 623 |
{
|
|
| 624 |
return mSize; |
|
| 625 |
} |
|
| 626 | 581 |
} |
| src/main/java/org/distorted/screens/RubikScreenSolver.java | ||
|---|---|---|
| 80 | 80 |
mSolving = false; |
| 81 | 81 |
|
| 82 | 82 |
ObjectList currentObject= ImplementedSolversList.getObject(0); |
| 83 |
int currentObjectSize = ImplementedSolversList.getObjectSize(0); |
|
| 84 | 83 |
|
| 85 |
act.setupObject(currentObject, currentObjectSize, null);
|
|
| 84 |
act.setupObject(currentObject,null); |
|
| 86 | 85 |
RubikScreenPlay play = (RubikScreenPlay) ScreenList.PLAY.getScreenClass(); |
| 87 |
play.setObjectAndSize(act, currentObject, currentObjectSize);
|
|
| 86 |
play.setObject(act, currentObject);
|
|
| 88 | 87 |
|
| 89 | 88 |
generateFaceColors(); |
| 90 | 89 |
|
| src/main/java/org/distorted/screens/RubikScreenSolving.java | ||
|---|---|---|
| 188 | 188 |
|
| 189 | 189 |
RubikScreenPlay play = (RubikScreenPlay) ScreenList.PLAY.getScreenClass(); |
| 190 | 190 |
int object = play.getObject(); |
| 191 |
int size = play.getSize(); |
|
| 192 | 191 |
int level = play.getLevel(); |
| 193 |
int realSize= ObjectList.getSizeIndex(object,size); |
|
| 194 |
|
|
| 195 |
boolean isNew = mScores.setRecord(object, realSize, level, mElapsed); |
|
| 192 |
boolean isNew = mScores.setRecord(object, level, mElapsed); |
|
| 196 | 193 |
|
| 197 | 194 |
return isNew ? mElapsed : -mElapsed; |
| 198 | 195 |
} |
| src/main/java/org/distorted/solvers/ImplementedSolversList.java | ||
|---|---|---|
| 25 | 25 |
|
| 26 | 26 |
public enum ImplementedSolversList |
| 27 | 27 |
{
|
| 28 |
CUBE3 ( ObjectList.CUBE, 3),
|
|
| 28 |
CUBE3 ( ObjectList.CUBE_3),
|
|
| 29 | 29 |
; |
| 30 | 30 |
|
| 31 | 31 |
public static final int NUM_OBJECTS = values().length; |
| 32 | 32 |
|
| 33 | 33 |
private final ObjectList mObject; |
| 34 |
private final int mObjectSize; |
|
| 35 | 34 |
|
| 36 | 35 |
private static final ImplementedSolversList[] objects; |
| 37 | 36 |
|
| ... | ... | |
| 55 | 54 |
|
| 56 | 55 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 57 | 56 |
|
| 58 |
public static int getObjectSize(int ordinal)
|
|
| 57 |
ImplementedSolversList(ObjectList object)
|
|
| 59 | 58 |
{
|
| 60 |
return objects[ordinal].mObjectSize; |
|
| 61 |
} |
|
| 62 |
|
|
| 63 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 64 |
|
|
| 65 |
ImplementedSolversList(ObjectList object, int size) |
|
| 66 |
{
|
|
| 67 |
mObject = object; |
|
| 68 |
mObjectSize = size; |
|
| 59 |
mObject= object; |
|
| 69 | 60 |
} |
| 70 | 61 |
} |
| src/main/java/org/distorted/solvers/SolverMain.java | ||
|---|---|---|
| 49 | 49 |
// If a certain cubit is locked, return the color (index into it's FACE_COLORS array) it |
| 50 | 50 |
// must have. Otherwise return -1. |
| 51 | 51 |
|
| 52 |
public static int cubitIsLocked(ObjectList object, int size, int cubit)
|
|
| 52 |
public static int cubitIsLocked(ObjectList object, int cubit) |
|
| 53 | 53 |
{
|
| 54 |
if( object == ObjectList.CUBE && size == 3)
|
|
| 54 |
if( object == ObjectList.CUBE_3 )
|
|
| 55 | 55 |
{
|
| 56 | 56 |
if( cubit==21 ) return 0; // center of the right face |
| 57 | 57 |
if( cubit== 4 ) return 1; // center of the left face |
| ... | ... | |
| 248 | 248 |
{
|
| 249 | 249 |
RubikScreenSolver solver = (RubikScreenSolver) ScreenList.SVER.getScreenClass(); |
| 250 | 250 |
|
| 251 |
if( mObject.getObjectList()==ObjectList.CUBE && mObject.getNumLayers()==3 )
|
|
| 251 |
if( mObject.getObjectList()==ObjectList.CUBE_3 )
|
|
| 252 | 252 |
{
|
| 253 | 253 |
solveCube3(solver); |
| 254 | 254 |
} |
| src/main/java/org/distorted/tutorials/TutorialActivity.java | ||
|---|---|---|
| 63 | 63 |
private int mCurrentApiVersion; |
| 64 | 64 |
private TutorialState mState; |
| 65 | 65 |
private String mURL; |
| 66 |
private int mObjectOrdinal, mObjectSize;
|
|
| 66 |
private int mObjectOrdinal; |
|
| 67 | 67 |
private TutorialWebView mWebView; |
| 68 | 68 |
|
| 69 | 69 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 82 | 82 |
{
|
| 83 | 83 |
mURL = b.getString("url");
|
| 84 | 84 |
mObjectOrdinal = b.getInt("obj");
|
| 85 |
mObjectSize = b.getInt("siz");
|
|
| 86 | 85 |
} |
| 87 | 86 |
|
| 88 | 87 |
unlock(); |
| ... | ... | |
| 211 | 210 |
if( mObjectOrdinal>=0 && mObjectOrdinal< ObjectList.NUM_OBJECTS ) |
| 212 | 211 |
{
|
| 213 | 212 |
ObjectList obj = ObjectList.getObject(mObjectOrdinal); |
| 214 |
int[] sizes = obj.getSizes(); |
|
| 215 |
int sizeIndex = ObjectList.getSizeIndex(mObjectOrdinal,mObjectSize); |
|
| 216 |
|
|
| 217 |
if( sizeIndex>=0 && sizeIndex<sizes.length ) |
|
| 218 |
{
|
|
| 219 |
view.getPreRender().changeObject(obj,mObjectSize); |
|
| 220 |
} |
|
| 213 |
view.getPreRender().changeObject(obj); |
|
| 221 | 214 |
} |
| 222 | 215 |
} |
| 223 | 216 |
|
| src/main/java/org/distorted/tutorials/TutorialList.java | ||
|---|---|---|
| 26 | 26 |
|
| 27 | 27 |
public enum TutorialList |
| 28 | 28 |
{
|
| 29 |
CUBE2 ( ObjectList.CUBE, 2,
|
|
| 29 |
CUBE2 ( ObjectList.CUBE_2,
|
|
| 30 | 30 |
new String[][] {
|
| 31 | 31 |
{"gb","rJlh5p2wAKA","How to Solve a 2x2 Rubik's Cube","Z3"},
|
| 32 | 32 |
{"es","f85wqJTIDlw","Resolver cubo de Rubik 2X2","Cuby"},
|
| ... | ... | |
| 39 | 39 |
} |
| 40 | 40 |
), |
| 41 | 41 |
|
| 42 |
CUBE3 ( ObjectList.CUBE, 3,
|
|
| 42 |
CUBE3 ( ObjectList.CUBE_3,
|
|
| 43 | 43 |
new String[][] {
|
| 44 | 44 |
{"gb","-8ohoCKN0Zw","How to Solve a Rubik's Cube","Z3"},
|
| 45 | 45 |
{"es","GyY0OxDk5lI","Resolver cubo de Rubik 3x3","Cuby"},
|
| ... | ... | |
| 54 | 54 |
} |
| 55 | 55 |
), |
| 56 | 56 |
|
| 57 |
CUBE4 ( ObjectList.CUBE, 4,
|
|
| 57 |
CUBE4 ( ObjectList.CUBE_4,
|
|
| 58 | 58 |
new String[][] {
|
| 59 | 59 |
{"gb","RR77Md71Ymc","How to Solve the 4x4 Rubik's Cube","Z3"},
|
| 60 | 60 |
{"es","d_4xk1r9hxU","Resolver cubo de Rubik 4x4","Cuby"},
|
| ... | ... | |
| 71 | 71 |
} |
| 72 | 72 |
), |
| 73 | 73 |
|
| 74 |
CUBE5 ( ObjectList.CUBE, 5,
|
|
| 74 |
CUBE5 ( ObjectList.CUBE_5,
|
|
| 75 | 75 |
new String[][] {
|
| 76 | 76 |
{"gb","zMkNkXHzQts","How to Solve the 5x5 Rubik's Cube","Z3"},
|
| 77 | 77 |
{"es","6uaq-xfFs98","Resolver cubo de Rubik 5x5","Cuby"},
|
| ... | ... | |
| 83 | 83 |
} |
| 84 | 84 |
), |
| 85 | 85 |
|
| 86 |
JING ( ObjectList.JING, 2,
|
|
| 86 |
JING ( ObjectList.JING_2,
|
|
| 87 | 87 |
new String[][] {
|
| 88 | 88 |
{"gb","0T8Iw6aI2gA","Jing's Pyraminx Tutorial","SuperAntoniovivaldi"},
|
| 89 | 89 |
{"es","Na27_GUIzqY","Resolver Jing Pyraminx","Cuby"},
|
| ... | ... | |
| 94 | 94 |
} |
| 95 | 95 |
), |
| 96 | 96 |
|
| 97 |
PYRA3 ( ObjectList.PYRA, 3,
|
|
| 97 |
PYRA3 ( ObjectList.PYRA_3,
|
|
| 98 | 98 |
new String[][] {
|
| 99 | 99 |
{"gb","xIQtn2qazvg","Pyraminx Layer By Layer","Z3"},
|
| 100 | 100 |
{"es","4cJJe9RAzAU","Resolver Pyraminx","Cuby"},
|
| ... | ... | |
| 107 | 107 |
} |
| 108 | 108 |
), |
| 109 | 109 |
|
| 110 |
PYRA4 ( ObjectList.PYRA, 4,
|
|
| 110 |
PYRA4 ( ObjectList.PYRA_4,
|
|
| 111 | 111 |
new String[][] {
|
| 112 | 112 |
{"gb","tGQDqDcSa6U","How to Solve the Master Pyraminx","Z3"},
|
| 113 | 113 |
{"es","74PIPm9-uPg","Resolver Master Pyraminx 4x4","Cuby"},
|
| ... | ... | |
| 119 | 119 |
} |
| 120 | 120 |
), |
| 121 | 121 |
|
| 122 |
PYRA5 ( ObjectList.PYRA, 5,
|
|
| 122 |
PYRA5 ( ObjectList.PYRA_5,
|
|
| 123 | 123 |
new String[][] {
|
| 124 | 124 |
{"gb","2nsPEECDdN0","Professor Pyraminx Solve","RedKB"},
|
| 125 | 125 |
{"es","cSDj8OQK3TU","Tutorial del Professor Pyraminx","QBAndo"},
|
| ... | ... | |
| 129 | 129 |
} |
| 130 | 130 |
), |
| 131 | 131 |
|
| 132 |
KILO3( ObjectList.KILO, 3,
|
|
| 132 |
KILO3( ObjectList.KILO_3,
|
|
| 133 | 133 |
new String[][] {
|
| 134 | 134 |
{"gb","grgGgUSxiQg","How to Solve the Kilominx","Z3"},
|
| 135 | 135 |
{"es","g6WMYjkCLok","Resolver Kilominx","Cuby"},
|
| ... | ... | |
| 141 | 141 |
} |
| 142 | 142 |
), |
| 143 | 143 |
|
| 144 |
KILO5( ObjectList.KILO, 5,
|
|
| 144 |
KILO5( ObjectList.KILO_5,
|
|
| 145 | 145 |
new String[][] {
|
| 146 | 146 |
{"gb","VAnzC2SYVc4","How To Solve A Master Kilominx","Grizz Media"},
|
| 147 | 147 |
{"es","ozINTg-61Fs","Tutorial Master Kilominx","RubikArt"},
|
| ... | ... | |
| 156 | 156 |
} |
| 157 | 157 |
), |
| 158 | 158 |
|
| 159 |
MEGA3( ObjectList.MEGA, 3,
|
|
| 159 |
MEGA3( ObjectList.MEGA_3,
|
|
| 160 | 160 |
new String[][] {
|
| 161 | 161 |
{"gb","j4x61L5Onzk","How to Solve the Megaminx","Z3"},
|
| 162 | 162 |
{"es","xuKbT6Il0Ko","Resolver Megaminx","Cuby"},
|
| ... | ... | |
| 168 | 168 |
} |
| 169 | 169 |
), |
| 170 | 170 |
|
| 171 |
MEGA5( ObjectList.MEGA, 5,
|
|
| 171 |
MEGA5( ObjectList.MEGA_5,
|
|
| 172 | 172 |
new String[][] {
|
| 173 | 173 |
{"gb","MNBMm8BnHtQ","Solve the Gigaminx Part 1","BeardedCubing"},
|
| 174 | 174 |
{"gb","QrrP4GwqVMw","Solve the Gigaminx Part 2","BeardedCubing"},
|
| ... | ... | |
| 186 | 186 |
} |
| 187 | 187 |
), |
| 188 | 188 |
|
| 189 |
ULTI ( ObjectList.ULTI, 2,
|
|
| 189 |
ULTI ( ObjectList.ULTI_2,
|
|
| 190 | 190 |
new String[][] {
|
| 191 | 191 |
{"gb","n1ikPKZxGEo","Ultimate Skewb Tutorial","BeardedCubing"},
|
| 192 | 192 |
{"es","wNL1WJ_sCfs","Resolver Skewb ULTIMATE","Cuby"},
|
| ... | ... | |
| 198 | 198 |
} |
| 199 | 199 |
), |
| 200 | 200 |
|
| 201 |
DIAM2 ( ObjectList.DIAM, 2,
|
|
| 201 |
DIAM2 ( ObjectList.DIAM_2,
|
|
| 202 | 202 |
new String[][] {
|
| 203 | 203 |
{"gb","R2wrbJJ3izM","How to Solve a Skewb Diamond","Dr. Penguin^3"},
|
| 204 | 204 |
{"es","2RCusYQdYYE","Como resolver Skewb Diamond","Tutoriales Rubik"},
|
| ... | ... | |
| 210 | 210 |
} |
| 211 | 211 |
), |
| 212 | 212 |
|
| 213 |
DIAM3 ( ObjectList.DIAM, 3,
|
|
| 213 |
DIAM3 ( ObjectList.DIAM_3,
|
|
| 214 | 214 |
new String[][] {
|
| 215 | 215 |
{"gb","n_mBSUDLUZw","Face Turning Octahedron Tutorial","SuperAntoniovivaldi"},
|
| 216 | 216 |
{"es","ogf0t6fGxZI","FTO - Tutorial en espaƱol","Gadi Rubik"},
|
| ... | ... | |
| 220 | 220 |
} |
| 221 | 221 |
), |
| 222 | 222 |
|
| 223 |
DIAM4 ( ObjectList.DIAM, 4,
|
|
| 223 |
DIAM4 ( ObjectList.DIAM_4,
|
|
| 224 | 224 |
new String[][] {
|
| 225 | 225 |
{"gb","3GJkySk5zeQ","Master Face Turning Octahedron","SuperAntoniovivaldi"},
|
| 226 | 226 |
{"gb","zW_1htxy52k","Master FTO Tutorial","Michele Regano"},
|
| ... | ... | |
| 229 | 229 |
} |
| 230 | 230 |
), |
| 231 | 231 |
|
| 232 |
DINO3 ( ObjectList.DINO, 3,
|
|
| 232 |
DINO3 ( ObjectList.DINO_3,
|
|
| 233 | 233 |
new String[][] {
|
| 234 | 234 |
{"gb","puTJZqFBQwo","Dino Skewb Cube Tutorial","Bearded Cubing"},
|
| 235 | 235 |
{"es","6o1Yo5iCxvI","Resolver Cubo Dino","Cuby"},
|
| ... | ... | |
| 241 | 241 |
} |
| 242 | 242 |
), |
| 243 | 243 |
|
| 244 |
REDI3 ( ObjectList.REDI, 3,
|
|
| 244 |
REDI3 ( ObjectList.REDI_3,
|
|
| 245 | 245 |
new String[][] {
|
| 246 | 246 |
{"gb","Qn7TJED6O-4","How to Solve the MoYu Redi Cube","Z3"},
|
| 247 | 247 |
{"es","g0M38Aotgac","Resolver Redi Cube","Cuby"},
|
| ... | ... | |
| 253 | 253 |
} |
| 254 | 254 |
), |
| 255 | 255 |
|
| 256 |
HELI3 ( ObjectList.HELI, 3,
|
|
| 256 |
HELI3 ( ObjectList.HELI_3,
|
|
| 257 | 257 |
new String[][] {
|
| 258 | 258 |
{"gb","-suwJpd_PO8","Helicopter Cube Tutorial","Bearded Cubing"},
|
| 259 | 259 |
{"es","DWG9n_YyGPA","Resolver Helicopter Cube","Cuby"},
|
| ... | ... | |
| 265 | 265 |
} |
| 266 | 266 |
), |
| 267 | 267 |
|
| 268 |
SKEW2 ( ObjectList.SKEW, 2,
|
|
| 268 |
SKEW2 ( ObjectList.SKEW_2,
|
|
| 269 | 269 |
new String[][] {
|
| 270 | 270 |
{"gb","I6132yshkeU","How to Solve the Skewb","Z3"},
|
| 271 | 271 |
{"es","wxQX3HhPgds","Resolver Skewb (Principiantes)","Cuby"},
|
| ... | ... | |
| 278 | 278 |
} |
| 279 | 279 |
), |
| 280 | 280 |
|
| 281 |
SKEW3 ( ObjectList.SKEW, 3, |
|
| 281 |
SKEW3 ( ObjectList.SKEW_3, |
|
Also available in: Unified diff
Simplify ObjectList: now there's just one object per size.