Revision 286d73ae
Added by Leszek Koltunski over 5 years ago
| src/main/java/org/distorted/dialog/RubikDialogScoresView.java | ||
|---|---|---|
| 81 | 81 |
RubikScores scores = RubikScores.getInstance(); |
| 82 | 82 |
|
| 83 | 83 |
boolean inserted = false; |
| 84 |
long myRecordInSeconds = scores.getRecord(object, size, scramble); |
|
| 84 |
long myRecordInMillis = scores.getRecord(object, size, scramble); |
|
| 85 |
float myRecordInSeconds = (myRecordInMillis/100)/10.0f; |
|
| 86 |
boolean mySubmitted = scores.isSubmitted(object, size, scramble); |
|
| 85 | 87 |
String myName = scores.getName(); |
| 86 | 88 |
int myCountryID = scores.getCountryID(); |
| 87 |
String myRecord = ( myRecordInSeconds<RubikScores.NO_RECORD ) ? Float.toString((myRecordInSeconds/100)/10.0f) : "??";
|
|
| 89 |
String myRecord = ( myRecordInMillis<RubikScores.NO_RECORD ) ? Float.toString(myRecordInSeconds) : "??";
|
|
| 88 | 90 |
String theirTime; |
| 89 | 91 |
int theirCountryID; |
| 90 | 92 |
|
| ... | ... | |
| 95 | 97 |
{
|
| 96 | 98 |
if( name[j] != null ) |
| 97 | 99 |
{
|
| 98 |
if( myRecordInSeconds<time[j] && !inserted ) |
|
| 100 |
if( !mySubmitted && myRecordInSeconds<time[j] && !inserted )
|
|
| 99 | 101 |
{
|
| 100 | 102 |
inserted = true; |
| 101 | 103 |
View row = createRow(act, myCountryID, myName, myRecord, red); |
| ... | ... | |
| 128 | 130 |
TextView textName = row.findViewById(R.id.scoresScrambleRowName); |
| 129 | 131 |
TextView textTime = row.findViewById(R.id.scoresScrambleRowTime); |
| 130 | 132 |
|
| 131 |
imgCoun.setImageResource(countryID!=0 ? countryID : R.drawable.unk);
|
|
| 133 |
imgCoun.setImageResource(countryID!=0 ? countryID : R.drawable.un); |
|
| 132 | 134 |
textName.setText(name); |
| 133 | 135 |
textTime.setText(time); |
| 134 | 136 |
|
| src/main/java/org/distorted/object/RubikObjectList.java | ||
|---|---|---|
| 113 | 113 |
return -1; |
| 114 | 114 |
} |
| 115 | 115 |
|
| 116 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 117 |
|
|
| 118 |
public static int unpackObjectFromString(String obj) |
|
| 119 |
{
|
|
| 120 |
int u = obj.indexOf('_');
|
|
| 121 |
int l = obj.length(); |
|
| 122 |
|
|
| 123 |
if( u>0 ) |
|
| 124 |
{
|
|
| 125 |
String name = obj.substring(0,u); |
|
| 126 |
int size = Integer.parseInt( obj.substring(u+1,l) ); |
|
| 127 |
|
|
| 128 |
for(int i=0; i<NUM_OBJECTS; i++) |
|
| 129 |
{
|
|
| 130 |
if( objects[i].name().equals(name) ) |
|
| 131 |
{
|
|
| 132 |
int s = getSize(i,size); |
|
| 133 |
return pack(i,s); |
|
| 134 |
} |
|
| 135 |
} |
|
| 136 |
} |
|
| 137 |
|
|
| 138 |
return -1; |
|
| 139 |
} |
|
| 140 |
|
|
| 141 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 142 |
|
|
| 143 |
public static String getObjectList() |
|
| 144 |
{
|
|
| 145 |
String name; |
|
| 146 |
StringBuilder list = new StringBuilder(); |
|
| 147 |
int len; |
|
| 148 |
int[] sizes; |
|
| 149 |
|
|
| 150 |
for(int i=0; i<NUM_OBJECTS; i++) |
|
| 151 |
{
|
|
| 152 |
sizes = objects[i].mObjectSizes; |
|
| 153 |
len = sizes.length; |
|
| 154 |
name = objects[i].name(); |
|
| 155 |
|
|
| 156 |
for(int j=0; j<len; j++) |
|
| 157 |
{
|
|
| 158 |
if( i>0 || j>0 ) list.append(',');
|
|
| 159 |
list.append(name); |
|
| 160 |
list.append('_');
|
|
| 161 |
list.append(sizes[j]); |
|
| 162 |
} |
|
| 163 |
} |
|
| 164 |
|
|
| 165 |
return list.toString(); |
|
| 166 |
} |
|
| 167 |
|
|
| 116 | 168 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 117 | 169 |
|
| 118 | 170 |
public static int getTotal() |
| src/main/java/org/distorted/scores/RubikScores.java | ||
|---|---|---|
| 37 | 37 |
private static RubikScores mThis; |
| 38 | 38 |
|
| 39 | 39 |
private long[][][] mRecords; |
| 40 |
private int [][][] mSubmitted; |
|
| 41 |
|
|
| 40 | 42 |
private String mName; |
| 41 | 43 |
private boolean mNameIsVerified; |
| 42 | 44 |
private int mNumRuns; |
| ... | ... | |
| 47 | 49 |
|
| 48 | 50 |
private RubikScores() |
| 49 | 51 |
{
|
| 50 |
mRecords = new long[NUM_OBJECTS][MAX_SIZE][MAX_SCRAMBLE]; |
|
| 52 |
mRecords = new long[NUM_OBJECTS][MAX_SIZE][MAX_SCRAMBLE]; |
|
| 53 |
mSubmitted = new int [NUM_OBJECTS][MAX_SIZE][MAX_SCRAMBLE]; |
|
| 51 | 54 |
|
| 52 | 55 |
for(int i=0; i<NUM_OBJECTS; i++) |
| 53 | 56 |
for(int j=0; j<MAX_SIZE; j++) |
| 54 | 57 |
for(int k=0; k<MAX_SCRAMBLE; k++) |
| 55 | 58 |
{
|
| 56 |
mRecords[i][j][k] = NO_RECORD; |
|
| 59 |
mRecords[i][j][k] = NO_RECORD; |
|
| 60 |
mSubmitted[i][j][k] = 0; |
|
| 57 | 61 |
} |
| 58 | 62 |
|
| 59 | 63 |
mName = "YOU"; |
| 60 | 64 |
mNameIsVerified = false; |
| 61 | 65 |
mNumPlays= -1; |
| 62 | 66 |
mNumRuns = -1; |
| 63 |
mCountryID = R.drawable.unk;
|
|
| 67 |
mCountryID = R.drawable.un; |
|
| 64 | 68 |
} |
| 65 | 69 |
|
| 66 | 70 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 101 | 105 |
builder.append(sizes[size]); |
| 102 | 106 |
builder.append("=");
|
| 103 | 107 |
builder.append(mRecords[object][size][scramble]); |
| 108 |
builder.append(",");
|
|
| 109 |
builder.append(mSubmitted[object][size][scramble]); |
|
| 104 | 110 |
builder.append(" ");
|
| 105 | 111 |
} |
| 106 | 112 |
} |
| ... | ... | |
| 118 | 124 |
|
| 119 | 125 |
public void restorePreferences(SharedPreferences preferences) |
| 120 | 126 |
{
|
| 121 |
String recordStr, subStr, nameStr, sizeStr, timeStr; |
|
| 122 |
int start, end, equals, underscore; |
|
| 123 |
int object, size; |
|
| 127 |
String recordStr, subStr, nameStr, sizeStr, timeStr, submStr;
|
|
| 128 |
int start, end, equals, underscore, comma;
|
|
| 129 |
int object, size, subm;
|
|
| 124 | 130 |
long time; |
| 125 | 131 |
|
| 126 | 132 |
for(int scramble=0; scramble<MAX_SCRAMBLE; scramble++) |
| ... | ... | |
| 139 | 145 |
|
| 140 | 146 |
underscore = subStr.indexOf("_");
|
| 141 | 147 |
equals = subStr.indexOf("=");
|
| 148 |
comma = subStr.indexOf(",");
|
|
| 142 | 149 |
|
| 143 |
if( underscore>=0 && equals>=0 ) |
|
| 150 |
if( underscore>=0 && equals>=0 && comma>=0 )
|
|
| 144 | 151 |
{
|
| 145 | 152 |
nameStr = subStr.substring(0,underscore); |
| 146 | 153 |
sizeStr = subStr.substring(underscore+1, equals); |
| 147 |
timeStr = subStr.substring(equals+1); |
|
| 154 |
timeStr = subStr.substring(equals+1,comma); |
|
| 155 |
submStr = subStr.substring(comma+1); |
|
| 148 | 156 |
|
| 149 | 157 |
object = RubikObjectList.getOrdinal(nameStr); |
| 150 | 158 |
size = RubikObjectList.getSize(object,Integer.parseInt(sizeStr)); |
| 151 | 159 |
time = Long.parseLong(timeStr); |
| 160 |
subm = Integer.parseInt(submStr); |
|
| 152 | 161 |
|
| 153 |
if( object>=0 && object< NUM_OBJECTS && size>=0 && size<MAX_SIZE ) |
|
| 162 |
if( object>=0 && object< NUM_OBJECTS && size>=0 && size<MAX_SIZE && subm>=0 && subm<=1 )
|
|
| 154 | 163 |
{
|
| 155 |
mRecords[object][size][scramble] = time; |
|
| 164 |
mRecords [object][size][scramble] = time; |
|
| 165 |
mSubmitted[object][size][scramble] = subm; |
|
| 156 | 166 |
|
| 157 | 167 |
if( time<NO_RECORD ) |
| 158 | 168 |
{
|
| 159 |
android.util.Log.e("solv", "Set record for: object="+object+" size="+size+" scramble="+scramble+" time: "+time);
|
|
| 169 |
android.util.Log.e("solv", "Set record for: object="+object+" size="+size+" scramble="+scramble+" time: "+time+" submitted: "+subm);
|
|
| 160 | 170 |
} |
| 161 | 171 |
} |
| 162 | 172 |
else |
| ... | ... | |
| 227 | 237 |
mCountryID = country; |
| 228 | 238 |
} |
| 229 | 239 |
|
| 240 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 241 |
// TODO |
|
| 242 |
|
|
| 243 |
public void setSubmitted(int object, int size, int scramble) |
|
| 244 |
{
|
|
| 245 |
int maxsize = RubikObjectList.getObject(object).getSizes().length; |
|
| 246 |
|
|
| 247 |
if( object>=0 && object<NUM_OBJECTS && size>=0 && size<maxsize && scramble>=1 && scramble<=MAX_SCRAMBLE ) |
|
| 248 |
{
|
|
| 249 |
mSubmitted[object][size][scramble] = 1; |
|
| 250 |
} |
|
| 251 |
} |
|
| 252 |
|
|
| 230 | 253 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 231 | 254 |
|
| 232 | 255 |
public long getRecord(int object, int size, int scramble) |
| ... | ... | |
| 241 | 264 |
return -1; |
| 242 | 265 |
} |
| 243 | 266 |
|
| 267 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 268 |
|
|
| 269 |
public boolean isSubmitted(int object, int size, int scramble) |
|
| 270 |
{
|
|
| 271 |
int maxsize = RubikObjectList.getObject(object).getSizes().length; |
|
| 272 |
|
|
| 273 |
if( object>=0 && object<NUM_OBJECTS && size>=0 && size<maxsize && scramble>=0 && scramble<MAX_SCRAMBLE ) |
|
| 274 |
{
|
|
| 275 |
return mSubmitted[object][size][scramble]==1; |
|
| 276 |
} |
|
| 277 |
|
|
| 278 |
return false; |
|
| 279 |
} |
|
| 280 |
|
|
| 244 | 281 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 245 | 282 |
// TODO |
| 246 | 283 |
|
| src/main/java/org/distorted/scores/RubikScoresDownloader.java | ||
|---|---|---|
| 38 | 38 |
void exception(String exception); |
| 39 | 39 |
} |
| 40 | 40 |
|
| 41 |
public static final int MAX_PLACES = 12;
|
|
| 41 |
public static final int MAX_PLACES = 10;
|
|
| 42 | 42 |
|
| 43 | 43 |
private static final int DOWNLOAD = 0; |
| 44 | 44 |
private static final int SUBMIT = 1; |
| 45 | 45 |
private static final int IDLE = 2; |
| 46 | 46 |
|
| 47 |
private static final String URL ="http://koltunski.pl/rubik/cgi-bin"; |
|
| 48 |
|
|
| 49 | 47 |
private final String[] hex = {
|
| 50 | 48 |
"%00", "%01", "%02", "%03", "%04", "%05", "%06", "%07", |
| 51 | 49 |
"%08", "%09", "%0a", "%0b", "%0c", "%0d", "%0e", "%0f", |
| ... | ... | |
| 111 | 109 |
{
|
| 112 | 110 |
end = mScores.indexOf('\n', begin+1);
|
| 113 | 111 |
if( end<0 ) end = len; |
| 114 |
fillRow(mScores.substring(begin+1,end)); |
|
| 112 |
|
|
| 113 |
try |
|
| 114 |
{
|
|
| 115 |
fillRow(mScores.substring(begin+1,end)); |
|
| 116 |
} |
|
| 117 |
catch(Exception ex) |
|
| 118 |
{
|
|
| 119 |
// faulty row - ignore |
|
| 120 |
} |
|
| 121 |
|
|
| 115 | 122 |
begin = end; |
| 116 | 123 |
} |
| 117 | 124 |
} |
| ... | ... | |
| 124 | 131 |
int s2 = row.indexOf(' ',s1+1);
|
| 125 | 132 |
int s3 = row.indexOf(' ',s2+1);
|
| 126 | 133 |
int s4 = row.indexOf(' ',s3+1);
|
| 127 |
int s5 = row.indexOf(' ',s4+1);
|
|
| 128 |
int s6 = row.length(); |
|
| 134 |
int s5 = row.length(); |
|
| 129 | 135 |
|
| 130 | 136 |
if( s5>s4 && s4>s3 && s3>s2 && s2>s1 && s1>0 ) |
| 131 | 137 |
{
|
| 132 |
int size = Integer.parseInt( row.substring(0,s1) );
|
|
| 138 |
int object = RubikObjectList.unpackObjectFromString( row.substring(0,s1) );
|
|
| 133 | 139 |
|
| 134 |
if( size>=0 && size<mTotal )
|
|
| 140 |
if( object>=0 && object<mTotal )
|
|
| 135 | 141 |
{
|
| 136 | 142 |
int level = Integer.parseInt( row.substring(s1+1,s2) ); |
| 137 |
int place = Integer.parseInt( row.substring(s2+1,s3) ); |
|
| 138 |
String name = row.substring(s3+1, s4); |
|
| 139 |
int time = Integer.parseInt( row.substring(s4+1,s5) ); |
|
| 140 |
String country = row.substring(s5+1, s6); |
|
| 143 |
String name = row.substring(s2+1, s3); |
|
| 144 |
int time = Integer.parseInt( row.substring(s3+1,s4) ); |
|
| 145 |
String country = row.substring(s4+1, s5); |
|
| 141 | 146 |
|
| 142 |
if(level>=0 && level<MAX_SCRAMBLE && place>=0 && place<MAX_PLACES)
|
|
| 147 |
if(level>0 && level<=MAX_SCRAMBLE)
|
|
| 143 | 148 |
{
|
| 144 |
int p = mPlaces[size][level];
|
|
| 145 |
mPlaces[size][level]++;
|
|
| 149 |
int p = mPlaces[object][level];
|
|
| 150 |
mPlaces[object][level]++;
|
|
| 146 | 151 |
|
| 147 |
if( p!=place ) android.util.Log.e("downloader", "size="+size+" level="+level+" p="+p+" place="+place);
|
|
| 148 |
|
|
| 149 |
mCountry[size][level][place] = country; |
|
| 150 |
mName [size][level][place] = name; |
|
| 151 |
mTime [size][level][place] = ((float)time)/10.0f; |
|
| 152 |
mCountry[object][level-1][p] = country; |
|
| 153 |
mName [object][level-1][p] = name; |
|
| 154 |
mTime [object][level-1][p] = ((float)(time/100))/10.0f; |
|
| 152 | 155 |
} |
| 153 | 156 |
} |
| 154 | 157 |
} |
| ... | ... | |
| 195 | 198 |
|
| 196 | 199 |
private boolean doDownload() |
| 197 | 200 |
{
|
| 198 |
String message=URL+"/download.cgi?n="+URLencode(mUserName)+"&r="+mNumRuns+"&e="+mVersion+"d"; |
|
| 201 |
String message="https://distorted.org/magic/cgi-bin/download.cgi"; |
|
| 202 |
message += "?n="+URLencode(mUserName)+"&r="+mNumRuns+"&e="+mVersion+"d"; |
|
| 203 |
message += "&o="+RubikObjectList.getObjectList()+"&min=0&max="+MAX_SCRAMBLE+"&l="+MAX_PLACES; |
|
| 199 | 204 |
|
| 200 | 205 |
try |
| 201 | 206 |
{
|
| ... | ... | |
| 270 | 275 |
{
|
| 271 | 276 |
mRunning = true; |
| 272 | 277 |
success = doDownload(); |
| 273 |
fillValues(); |
|
| 274 | 278 |
} |
| 275 | 279 |
} |
| 276 | 280 |
catch( Exception e ) |
| ... | ... | |
| 278 | 282 |
mReceiver.exception("Exception downloading records: "+e.getMessage() );
|
| 279 | 283 |
} |
| 280 | 284 |
|
| 285 |
fillValues(); |
|
| 286 |
|
|
| 281 | 287 |
mRunning = false; |
| 282 | 288 |
|
| 283 | 289 |
if( success ) |
Also available in: Unified diff
Port the downloading into the new 'magic' server.