1
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
2
|
// Copyright 2024 Leszek Koltunski //
|
3
|
// //
|
4
|
// This file is part of Magic Cube. //
|
5
|
// //
|
6
|
// 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
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
9
|
|
10
|
package org.distorted.phasedsolver;
|
11
|
|
12
|
import static org.distorted.objectlib.main.TwistyObject.MODE_NORM;
|
13
|
|
14
|
import android.app.Activity;
|
15
|
import android.content.SharedPreferences;
|
16
|
import android.os.Bundle;
|
17
|
import android.view.View;
|
18
|
import android.widget.TextView;
|
19
|
import android.widget.Toast;
|
20
|
|
21
|
import androidx.preference.PreferenceManager;
|
22
|
|
23
|
import org.distorted.library.main.DistortedLibrary;
|
24
|
import org.distorted.library.type.Static3D;
|
25
|
import org.distorted.objectlib.algsolvers.PhaseMitm;
|
26
|
import org.distorted.objectlib.algsolvers.*;
|
27
|
import org.distorted.objectlib.main.InitAssets;
|
28
|
import org.distorted.objectlib.main.ObjectControl;
|
29
|
import org.distorted.objectlib.main.TwistyObject;
|
30
|
import org.distorted.objectlib.metadata.ListObjects;
|
31
|
import org.distorted.os.OSInterface;
|
32
|
|
33
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
34
|
|
35
|
public class SolverActivity extends Activity
|
36
|
{
|
37
|
private InitAssets mAsset;
|
38
|
private SharedPreferences mPreferences;
|
39
|
private SolverLowerPane mLowerPane;
|
40
|
private TextView mText;
|
41
|
private SolvedObject mObject;
|
42
|
private int[][] mMoveTable;
|
43
|
private String mMoves;
|
44
|
|
45
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
46
|
|
47
|
@Override
|
48
|
protected void onCreate(Bundle icicle)
|
49
|
{
|
50
|
super.onCreate(icicle);
|
51
|
mPreferences = PreferenceManager.getDefaultSharedPreferences(this);
|
52
|
DistortedLibrary.onCreate();
|
53
|
setContentView(R.layout.mainlayout);
|
54
|
SolverSurfaceView view = findViewById(R.id.solverView);
|
55
|
OSInterface os = view.getInterface();
|
56
|
mAsset = new InitAssets(null, null, os);
|
57
|
mLowerPane = new SolverLowerPane(this);
|
58
|
mText = findViewById(R.id.solverMoves);
|
59
|
mMoves = "";
|
60
|
}
|
61
|
|
62
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
63
|
|
64
|
@Override
|
65
|
protected void onPause()
|
66
|
{
|
67
|
super.onPause();
|
68
|
SolverSurfaceView view = findViewById(R.id.solverView);
|
69
|
view.onPause();
|
70
|
DistortedLibrary.onPause();
|
71
|
|
72
|
savePreferences();
|
73
|
}
|
74
|
|
75
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
76
|
|
77
|
@Override
|
78
|
protected void onResume()
|
79
|
{
|
80
|
super.onResume();
|
81
|
SolverSurfaceView view = findViewById(R.id.solverView);
|
82
|
view.onResume();
|
83
|
DistortedLibrary.onResume();
|
84
|
|
85
|
restorePreferences();
|
86
|
|
87
|
ObjectControl control = getControl();
|
88
|
control.changeObject(ListObjects.CUBE_3.ordinal(), MODE_NORM, mAsset);
|
89
|
}
|
90
|
|
91
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
92
|
|
93
|
@Override
|
94
|
protected void onDestroy()
|
95
|
{
|
96
|
DistortedLibrary.onDestroy();
|
97
|
super.onDestroy();
|
98
|
}
|
99
|
|
100
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
101
|
|
102
|
ObjectControl getControl()
|
103
|
{
|
104
|
SolverSurfaceView view = findViewById(R.id.solverView);
|
105
|
return view.getObjectControl();
|
106
|
}
|
107
|
|
108
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
109
|
|
110
|
private void savePreferences()
|
111
|
{
|
112
|
SharedPreferences.Editor editor = mPreferences.edit();
|
113
|
SolverSurfaceView view = findViewById(R.id.solverView);
|
114
|
OSInterface os = view.getInterface();
|
115
|
os.setEditor(editor);
|
116
|
view.getObjectControl().savePreferences();
|
117
|
|
118
|
editor.apply();
|
119
|
}
|
120
|
|
121
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
122
|
|
123
|
private void restorePreferences()
|
124
|
{
|
125
|
SolverSurfaceView view = findViewById(R.id.solverView);
|
126
|
OSInterface os = view.getInterface();
|
127
|
os.setPreferences(mPreferences);
|
128
|
view.getObjectControl().restorePreferences();
|
129
|
}
|
130
|
|
131
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
132
|
|
133
|
private void solve(SolverPhased ps, int[] quats)
|
134
|
{
|
135
|
int[][] sol = ps.solution(quats);
|
136
|
int numPhases = sol.length;
|
137
|
int totalLength = 0;
|
138
|
|
139
|
for(int p=0; p<numPhases; p++)
|
140
|
{
|
141
|
int numMoves = sol[p]==null ? -1 : sol[p][0];
|
142
|
|
143
|
if( numMoves<0 )
|
144
|
{
|
145
|
String message = "Phase "+p+": FAIL";
|
146
|
Toast.makeText(this,message,Toast.LENGTH_LONG).show();
|
147
|
return;
|
148
|
}
|
149
|
|
150
|
totalLength += numMoves;
|
151
|
}
|
152
|
|
153
|
int[][] moves = new int[totalLength][];
|
154
|
int index = 0;
|
155
|
|
156
|
for( int[] s : sol )
|
157
|
{
|
158
|
int numMoves = s[0];
|
159
|
|
160
|
for(int m=1; m<=numMoves; m++)
|
161
|
{
|
162
|
int mi = s[m];
|
163
|
moves[index++] = mMoveTable[mi];
|
164
|
android.util.Log.e("D","move "+m+" : "+mMoveTable[mi][0]+" "+mMoveTable[mi][1]+" "+mMoveTable[mi][2]);
|
165
|
}
|
166
|
}
|
167
|
|
168
|
mLowerPane.setMoves(this,moves);
|
169
|
}
|
170
|
|
171
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
172
|
|
173
|
private void createObject()
|
174
|
{
|
175
|
TwistyObject object = getControl().getObject();
|
176
|
|
177
|
int[] numL = object.getNumLayers();
|
178
|
float[][] pos = object.getCubitPositions(numL);
|
179
|
Static3D[] axis = object.getRotationAxis();
|
180
|
int[][] angles = object.getBasicAngles();
|
181
|
float[][] cuts = object.getCuts(numL);
|
182
|
|
183
|
boolean[] r = {true,false,true};
|
184
|
boolean[][] rot = {r,r,r};//object.getLayerRotatable(numL);
|
185
|
|
186
|
mObject = new SolvedObject(pos,axis,angles,cuts,rot);
|
187
|
mMoveTable = mObject.getMoveTable();
|
188
|
}
|
189
|
|
190
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
191
|
|
192
|
public void Solve(View v)
|
193
|
{
|
194
|
if( mObject==null ) createObject();
|
195
|
|
196
|
TwistyObject object = getControl().getObject();
|
197
|
int[] numL = object.getNumLayers();
|
198
|
float[][] pos = object.getCubitPositions(numL);
|
199
|
|
200
|
int numCubits = pos.length;
|
201
|
int[] qi = new int[numCubits];
|
202
|
for(int i=0; i<numCubits; i++) qi[i] = object.getCubitQuatIndex(i);
|
203
|
|
204
|
int[][] whiteCross = new int[][]{ {12,13,16,17} };
|
205
|
int[][] whiteCorners = new int[][]{ {0},{1},{2},{3} };
|
206
|
int[][] secondLayer = new int[][]{ {8},{9},{10},{11} };
|
207
|
|
208
|
int[][] yellowEdges = new int[][]{ {14,15,18,19} };
|
209
|
String lleoA = "(11,17,5,15,3,9)";
|
210
|
String lleoB = "(17,6,5,8,3,15)";
|
211
|
String lleoC = "(6,12,5,14,3,8)";
|
212
|
String lleoD = "(12,11,5,9,3,14)";
|
213
|
String llEdgesOrie = lleoA+"{0,1,2} "+lleoB+"{0,1,2} "+lleoC+"{0,1,2} "+lleoD+"{0,1,2}";
|
214
|
String llepA = "(6,5,8,5,6,4,8)";
|
215
|
String llepB = "(12,5,14,5,12,4,14)";
|
216
|
String llepC = "(11,5,9,5,11,4,9)";
|
217
|
String llEdgesPerm = "(3){0,1} ["+llepA+"{-1,0,1};"+llepB+"] "+llepC+"{-1,0,1}";
|
218
|
String llEdges = llEdgesOrie+" "+llEdgesPerm;
|
219
|
|
220
|
int[][] yellowCorners= new int[][]{ {4,5,6,7} };
|
221
|
String llcpA = "(5,6,3,9,5,8,3,11)";
|
222
|
String llcpB = "(5,12,3,15,5,14,3,17)";
|
223
|
String llcpC = "(5,11,3,8,5,9,3,6)";
|
224
|
String llCornersPerm = "["+llcpA+"{-1,0,1};"+llcpB+"] "+llcpC+"{-1,0,1}";
|
225
|
String llco = "(3,8,5,6){-2,0,2} (11)";
|
226
|
String llCornersOrie = llco+" "+llco+" "+llco+" "+llco;
|
227
|
String llCorners = llCornersPerm+" "+llCornersOrie;
|
228
|
|
229
|
int[][] algsOrie = { {11,17,5,15,3,9},{3} };
|
230
|
int[][] algsPerm = { {5,6,3,9,5,8,3,11},{3} };
|
231
|
|
232
|
int[][] moveTable = mObject.getMoveTable();
|
233
|
MoveProviderAll all = new MoveProviderAll(moveTable);
|
234
|
MoveProviderAlgs alO = new MoveProviderAlgs(algsOrie);
|
235
|
MoveProviderAlgs alP = new MoveProviderAlgs(algsPerm);
|
236
|
|
237
|
TargetProvider wcr = new TargetProviderAll(whiteCross);
|
238
|
TargetProvider wco = new TargetProviderAll(whiteCorners);
|
239
|
TargetProvider sla = new TargetProviderAll(secondLayer);
|
240
|
TargetProvider oll = new TargetProviderOrie(mObject,14,1);
|
241
|
TargetProvider pll = new TargetProviderPerm(mObject,14,1);
|
242
|
|
243
|
Phase[] phases =
|
244
|
{
|
245
|
new PhaseMitm( mObject, all, wcr),
|
246
|
new PhaseMitm( mObject, all, wco),
|
247
|
new PhaseMitm( mObject, all, sla),
|
248
|
new PhaseMitm( mObject, alO, oll),
|
249
|
new PhaseMitm( mObject, alP, pll),
|
250
|
};
|
251
|
|
252
|
SolverPhased ps = new SolverPhased(mObject,phases);
|
253
|
|
254
|
runOnUiThread(new Runnable()
|
255
|
{
|
256
|
@Override
|
257
|
public void run()
|
258
|
{
|
259
|
solve(ps,qi);
|
260
|
}
|
261
|
});
|
262
|
}
|
263
|
|
264
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
265
|
|
266
|
public void Reset(View v)
|
267
|
{
|
268
|
ObjectControl control = getControl();
|
269
|
control.solveObject();
|
270
|
mLowerPane.clearMoves(this);
|
271
|
|
272
|
mMoves = "";
|
273
|
mText.setText(mMoves);
|
274
|
}
|
275
|
|
276
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
277
|
|
278
|
int findMove(int ax, int row, int angle)
|
279
|
{
|
280
|
int num = mMoveTable.length;
|
281
|
|
282
|
for( int m=0; m<num; m++)
|
283
|
{
|
284
|
int[] move = mMoveTable[m];
|
285
|
if( ax==move[0] && row==move[1] && angle==move[2] ) return m;
|
286
|
}
|
287
|
|
288
|
return -1;
|
289
|
}
|
290
|
|
291
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
292
|
|
293
|
void addMove(int axis, int row, int angle)
|
294
|
{
|
295
|
if( mObject==null ) createObject();
|
296
|
int move = findMove(axis,row,angle);
|
297
|
mMoves += (" "+move);
|
298
|
mText.setText(mMoves);
|
299
|
}
|
300
|
|
301
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
302
|
|
303
|
public void Left(View v)
|
304
|
{
|
305
|
mLowerPane.backMove(this);
|
306
|
}
|
307
|
|
308
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
309
|
|
310
|
public void Right(View v)
|
311
|
{
|
312
|
mLowerPane.makeMove(this);
|
313
|
}
|
314
|
}
|