scramble.inc
scramble.inc
CPP1/****h* PawnLibs/scramble2 * Summary3 * A helper library that facilitates level initialization.4 * Description5 * This library contains several useful utilities which simulate cube6 * twists. An application can initialize its inner state data with wining7 * condition and do some virtual twists to prepare initial arrangement for8 * player like deck shuffling or Rubik'c cube scramble.9 *10 * To use this library several functions have to be defined:11 * * RememberDataBeforeTwist()12 * * SetDataAfterTwist(moduleTo, screenTo, moduleFrom, screenFrom)13 * * VirtualTwist(twist[TOPOLOGY_TWIST_INFO])14 *15 * TBD - add detailed descriptions of required functions16 * Example17 * TBD - add example description18 * new mapping[MODULES_MAX][SCREENS_MAX];19 * new mappingTemp[MODULES_MAX][SCREENS_MAX];20 *21 * RememberDataBeforeTwist() {22 * // Back up current mapping23 * mappingTemp = mapping;24 * }25 *26 * SetDataAfterTwist(moduleTo, screenTo, moduleFrom, screenFrom) {27 * // Fill mapping according to the new topology after twise28 * mapping[moduleTo][screenTo] = mappingTemp[moduleFrom][screenFrom];29 * }30 *31 * VirtualTwist(twist[TOPOLOGY_TWIST_INFO]) {32 * // Additional handling of virtual twist if necessary33 * myTwist = twist;34 * }35 * History36 * * v6.0 - added37 ******/3839new scrambleTwist[TOPOLOGY_TWIST_INFO]; // .screen, .count, TOPOLOGY_twist: .direction40new previosTwist[TOPOLOGY_TWIST_INFO] = [SCREENS_MAX, 0, TWIST_MAX];4142new ScrambleTopFaceletsStarting[SCREENS_MAX][MODULES_MAX / 2][TOPOLOGY_FACELET];43new ScrambleTopFaceletsEnding[SCREENS_MAX][MODULES_MAX / 2][TOPOLOGY_FACELET];4445/****f* PawnLibs/scramble/Scramble46 * Summary47 * Scramble the cube randomly the specified number of times.48 * Synopsis49 */50Scramble(twistsCount)51/*52 * Inputs53 * * twistsCount - how many times to twist the cube for scramble54 * Source55 */56{5758 if (twistsCount < 1) return;5960 scrambleTwist.count = 1;6162 for (new twistI = 0; twistI < twistsCount; ++twistI) {6364 RememberCurrentTopology();6566 scrambleTwist.screen = random(0, SCREENS_MAX - 1);67 scrambleTwist.direction = random(TWIST_LEFT, TWIST_RIGHT);6869 if (scrambleTwist.screen == previosTwist.screen) {70 scrambleTwist.screen = ++scrambleTwist.screen % SCREENS_MAX;71 }7273 ScrambleRotate(scrambleTwist.screen, scrambleTwist.direction);7475 ScrambleTopFaceletsStarting = ScrambleTopFaceletsEnding;76 previosTwist = scrambleTwist;77 }78}79/******/8081/****f* PawnLibs/scramble/ScrambleRotate82 * Summary83 * Twist the cube around some screen in a specified direction.84 * Synopsis85 */86ScrambleRotate(scr, dir)87/*88 * Inputs89 * * scr - a screen to twist around90 * * dir - a direction of the twist91 * Source92 */93{9495 RememberDataBeforeTwist();9697 switch (dir) {98 case TWIST_LEFT: {99 for (new i = 0; i < MODULES_MAX / 2 - 1; ++i) {100 ScrambleSwapFacelets(ScrambleTopFaceletsEnding[scr][i], ScrambleTopFaceletsEnding[scr][i + 1]);101 }102 }103 case TWIST_RIGHT: {104 for (new i = MODULES_MAX / 2 - 1; i >= 1; --i) {105 ScrambleSwapFacelets(ScrambleTopFaceletsEnding[scr][i], ScrambleTopFaceletsEnding[scr][i - 1]);106 }107 }108 }109110 for (new i = 0; i < MODULES_MAX / 2; ++i) {111 for (new screen = 0; screen < SCREENS_MAX; ++screen) {112 SetDataAfterTwist(113 ScrambleTopFaceletsEnding[scr][i].module,114 (ScrambleTopFaceletsEnding[scr][i].screen + screen) % SCREENS_MAX,115 ScrambleTopFaceletsStarting[scr][i].module,116 (ScrambleTopFaceletsStarting[scr][i].screen + screen) % SCREENS_MAX117 );118119 }120 }121122 VirtualTwist(scrambleTwist);123}124/******/125126ScrambleSwapFacelets(facelet1[TOPOLOGY_FACELET], facelet2[TOPOLOGY_FACELET]) {127 new facelet[TOPOLOGY_FACELET];128 facelet = facelet1;129 facelet1 = facelet2;130 facelet2 = facelet;131}132133RememberCurrentTopology() {134 new facelet[TOPOLOGY_FACELET];135 new neighbor[TOPOLOGY_FACELET_INFO];136137 for (new screen = 0; screen < SCREENS_MAX; ++screen) {138139 facelet.module = 0;140 facelet.screen = screen;141 neighbor = TOPOLOGY_getAdjacentFacelet(facelet, NEIGHBOR_TOP);142143 for (new i = 0; i < MODULES_MAX / 2; ++i) {144145 facelet.module = neighbor.module;146 facelet.screen = neighbor.screen;147148 ScrambleTopFaceletsStarting[screen][i] = facelet;149150 neighbor = TOPOLOGY_getAdjacentFacelet(facelet, NEIGHBOR_TOP);151 facelet.module = neighbor.module;152 facelet.screen = neighbor.screen;153154 neighbor = TOPOLOGY_getAdjacentFacelet(facelet, NEIGHBOR_RIGHT);155 facelet.module = neighbor.module;156 facelet.screen = neighbor.screen;157 }158 }159 ScrambleTopFaceletsEnding = ScrambleTopFaceletsStarting;160}161
Wrapped for easier reading. Turn wrap off to inspect exact line lengths.