board.js
changeset 115 9e01c6c0c679
parent 114 1c3fdde0d481
child 116 61f7f1f03a8d
equal deleted inserted replaced
114:1c3fdde0d481 115:9e01c6c0c679
   995     if (f1 > 0 && (f1 === f2 || f2 === 0)) return true;
   995     if (f1 > 0 && (f1 === f2 || f2 === 0)) return true;
   996     if (f0 > 0 && (f0 === f1 || f1 === 0)) return true;
   996     if (f0 > 0 && (f0 === f1 || f1 === 0)) return true;
   997     return false;
   997     return false;
   998 }
   998 }
   999 
   999 
       
  1000 BoardObj.prototype.right = function(brd) {
       
  1001     var updated = false;
       
  1002     var from = this.brd, to = brd.brd;
       
  1003     var moved = true;
       
  1004     var f0 = from.aa, f1 = from.ab, f2 = from.ac, f3 = from.ad;
       
  1005     if (f3 === 0) {
       
  1006         if (f2 === 0) {
       
  1007             if (f1 === 0) {  // a 0 0 0
       
  1008                 if (f0 === 0)
       
  1009                     moved = false;
       
  1010                 f3 = f0;
       
  1011                 f2 = 0;
       
  1012             } else {         // a b 0 0
       
  1013                 f3 = f1;
       
  1014                 f2 = f0;
       
  1015             }
       
  1016             f1 = 0;
       
  1017         } else {             // f2 !== 0 && f3 === 0
       
  1018             if (f1 === 0) {  // a 0 b 0
       
  1019                 f3 = f2;
       
  1020                 f2 = f0;
       
  1021             } else {         // a b c 0
       
  1022                 f3 = f2;
       
  1023                 f2 = f1;
       
  1024                 f1 = f0;
       
  1025             }
       
  1026         }
       
  1027         f0 = 0;
       
  1028     } else {                 // f3 !== 0
       
  1029         if (f2 === 0) {
       
  1030             if (f1 === 0) {  // a 0 0 b
       
  1031                 if (f0 === 0)
       
  1032                     moved = false;
       
  1033                 f2 = f0;
       
  1034             } else {         // a b 0 c
       
  1035                 f2 = f1;
       
  1036                 f1 = f0;
       
  1037             }
       
  1038             f0 = 0;
       
  1039         } else {             // f2 !== 0 && f3 !== 0
       
  1040             if (f1 === 0) {  // a 0 b c
       
  1041                 if (f0 === 0)
       
  1042                     moved = false;
       
  1043                 f1 = f0;
       
  1044                 f0 = 0;
       
  1045             } else {         // else: a b c d
       
  1046                 moved = false;
       
  1047             }
       
  1048         }
       
  1049     }
       
  1050     updated = updated || moved;
       
  1051     if (f2 === 0) {
       
  1052         to.aa = 0;
       
  1053         to.ab = 0;
       
  1054         to.ac = 0;
       
  1055         to.ad = f3;
       
  1056         continue;
       
  1057     }
       
  1058     if (f1 === 0) {
       
  1059         to.aa = 0;
       
  1060         to.ab = 0;
       
  1061         if (f2 === f3) {
       
  1062             updated = true;
       
  1063             to.ac = 0;
       
  1064             to.ad = f3 + 1;
       
  1065         } else {
       
  1066             to.ac = f2;
       
  1067             to.ad = f3;
       
  1068         }
       
  1069         continue;
       
  1070     }
       
  1071     if (f2 === f3) {
       
  1072         updated = true;
       
  1073         to.aa = 0;
       
  1074         to.ad = f3 + 1;
       
  1075         if (f0 === f1) {
       
  1076             to.ab = 0;
       
  1077             to.ac = f1 + 1;
       
  1078         } else {
       
  1079             to.ab = f0;
       
  1080             to.ac = f1;
       
  1081         }
       
  1082     } else {
       
  1083         to.ad = f3;
       
  1084         if (f1 === f2) {
       
  1085             updated = true;
       
  1086             to.aa = 0;
       
  1087             to.ab = f0;
       
  1088             to.ac = f2 + 1;
       
  1089         } else {
       
  1090             if (f0 === f1) {
       
  1091                 updated = true;
       
  1092                 to.aa = 0;
       
  1093                 to.ab = f1+1;
       
  1094                 to.ac = f2;
       
  1095             } else {
       
  1096                 to.aa = f0;
       
  1097                 to.ab = f1;
       
  1098                 to.ac = f2;
       
  1099             }
       
  1100         }
       
  1101     }
       
  1102     var moved = true;
       
  1103     var f0 = from.ba, f1 = from.bb, f2 = from.bc, f3 = from.bd;
       
  1104     if (f3 === 0) {
       
  1105         if (f2 === 0) {
       
  1106             if (f1 === 0) {  // a 0 0 0
       
  1107                 if (f0 === 0)
       
  1108                     moved = false;
       
  1109                 f3 = f0;
       
  1110                 f2 = 0;
       
  1111             } else {         // a b 0 0
       
  1112                 f3 = f1;
       
  1113                 f2 = f0;
       
  1114             }
       
  1115             f1 = 0;
       
  1116         } else {             // f2 !== 0 && f3 === 0
       
  1117             if (f1 === 0) {  // a 0 b 0
       
  1118                 f3 = f2;
       
  1119                 f2 = f0;
       
  1120             } else {         // a b c 0
       
  1121                 f3 = f2;
       
  1122                 f2 = f1;
       
  1123                 f1 = f0;
       
  1124             }
       
  1125         }
       
  1126         f0 = 0;
       
  1127     } else {                 // f3 !== 0
       
  1128         if (f2 === 0) {
       
  1129             if (f1 === 0) {  // a 0 0 b
       
  1130                 if (f0 === 0)
       
  1131                     moved = false;
       
  1132                 f2 = f0;
       
  1133             } else {         // a b 0 c
       
  1134                 f2 = f1;
       
  1135                 f1 = f0;
       
  1136             }
       
  1137             f0 = 0;
       
  1138         } else {             // f2 !== 0 && f3 !== 0
       
  1139             if (f1 === 0) {  // a 0 b c
       
  1140                 if (f0 === 0)
       
  1141                     moved = false;
       
  1142                 f1 = f0;
       
  1143                 f0 = 0;
       
  1144             } else {         // else: a b c d
       
  1145                 moved = false;
       
  1146             }
       
  1147         }
       
  1148     }
       
  1149     updated = updated || moved;
       
  1150     if (f2 === 0) {
       
  1151         to.ba = 0;
       
  1152         to.bb = 0;
       
  1153         to.bc = 0;
       
  1154         to.bd = f3;
       
  1155         continue;
       
  1156     }
       
  1157     if (f1 === 0) {
       
  1158         to.ba = 0;
       
  1159         to.bb = 0;
       
  1160         if (f2 === f3) {
       
  1161             updated = true;
       
  1162             to.bc = 0;
       
  1163             to.bd = f3 + 1;
       
  1164         } else {
       
  1165             to.bc = f2;
       
  1166             to.bd = f3;
       
  1167         }
       
  1168         continue;
       
  1169     }
       
  1170     if (f2 === f3) {
       
  1171         updated = true;
       
  1172         to.ba = 0;
       
  1173         to.bd = f3 + 1;
       
  1174         if (f0 === f1) {
       
  1175             to.bb = 0;
       
  1176             to.bc = f1 + 1;
       
  1177         } else {
       
  1178             to.bb = f0;
       
  1179             to.bc = f1;
       
  1180         }
       
  1181     } else {
       
  1182         to.bd = f3;
       
  1183         if (f1 === f2) {
       
  1184             updated = true;
       
  1185             to.ba = 0;
       
  1186             to.bb = f0;
       
  1187             to.bc = f2 + 1;
       
  1188         } else {
       
  1189             if (f0 === f1) {
       
  1190                 updated = true;
       
  1191                 to.ba = 0;
       
  1192                 to.bb = f1+1;
       
  1193                 to.bc = f2;
       
  1194             } else {
       
  1195                 to.ba = f0;
       
  1196                 to.bb = f1;
       
  1197                 to.bc = f2;
       
  1198             }
       
  1199         }
       
  1200     }
       
  1201     var moved = true;
       
  1202     var f0 = from.ca, f1 = from.cb, f2 = from.cc, f3 = from.cd;
       
  1203     if (f3 === 0) {
       
  1204         if (f2 === 0) {
       
  1205             if (f1 === 0) {  // a 0 0 0
       
  1206                 if (f0 === 0)
       
  1207                     moved = false;
       
  1208                 f3 = f0;
       
  1209                 f2 = 0;
       
  1210             } else {         // a b 0 0
       
  1211                 f3 = f1;
       
  1212                 f2 = f0;
       
  1213             }
       
  1214             f1 = 0;
       
  1215         } else {             // f2 !== 0 && f3 === 0
       
  1216             if (f1 === 0) {  // a 0 b 0
       
  1217                 f3 = f2;
       
  1218                 f2 = f0;
       
  1219             } else {         // a b c 0
       
  1220                 f3 = f2;
       
  1221                 f2 = f1;
       
  1222                 f1 = f0;
       
  1223             }
       
  1224         }
       
  1225         f0 = 0;
       
  1226     } else {                 // f3 !== 0
       
  1227         if (f2 === 0) {
       
  1228             if (f1 === 0) {  // a 0 0 b
       
  1229                 if (f0 === 0)
       
  1230                     moved = false;
       
  1231                 f2 = f0;
       
  1232             } else {         // a b 0 c
       
  1233                 f2 = f1;
       
  1234                 f1 = f0;
       
  1235             }
       
  1236             f0 = 0;
       
  1237         } else {             // f2 !== 0 && f3 !== 0
       
  1238             if (f1 === 0) {  // a 0 b c
       
  1239                 if (f0 === 0)
       
  1240                     moved = false;
       
  1241                 f1 = f0;
       
  1242                 f0 = 0;
       
  1243             } else {         // else: a b c d
       
  1244                 moved = false;
       
  1245             }
       
  1246         }
       
  1247     }
       
  1248     updated = updated || moved;
       
  1249     if (f2 === 0) {
       
  1250         to.ca = 0;
       
  1251         to.cb = 0;
       
  1252         to.cc = 0;
       
  1253         to.cd = f3;
       
  1254         continue;
       
  1255     }
       
  1256     if (f1 === 0) {
       
  1257         to.ca = 0;
       
  1258         to.cb = 0;
       
  1259         if (f2 === f3) {
       
  1260             updated = true;
       
  1261             to.cc = 0;
       
  1262             to.cd = f3 + 1;
       
  1263         } else {
       
  1264             to.cc = f2;
       
  1265             to.cd = f3;
       
  1266         }
       
  1267         continue;
       
  1268     }
       
  1269     if (f2 === f3) {
       
  1270         updated = true;
       
  1271         to.ca = 0;
       
  1272         to.cd = f3 + 1;
       
  1273         if (f0 === f1) {
       
  1274             to.cb = 0;
       
  1275             to.cc = f1 + 1;
       
  1276         } else {
       
  1277             to.cb = f0;
       
  1278             to.cc = f1;
       
  1279         }
       
  1280     } else {
       
  1281         to.cd = f3;
       
  1282         if (f1 === f2) {
       
  1283             updated = true;
       
  1284             to.ca = 0;
       
  1285             to.cb = f0;
       
  1286             to.cc = f2 + 1;
       
  1287         } else {
       
  1288             if (f0 === f1) {
       
  1289                 updated = true;
       
  1290                 to.ca = 0;
       
  1291                 to.cb = f1+1;
       
  1292                 to.cc = f2;
       
  1293             } else {
       
  1294                 to.ca = f0;
       
  1295                 to.cb = f1;
       
  1296                 to.cc = f2;
       
  1297             }
       
  1298         }
       
  1299     }
       
  1300     var moved = true;
       
  1301     var f0 = from.da, f1 = from.db, f2 = from.dc, f3 = from.dd;
       
  1302     if (f3 === 0) {
       
  1303         if (f2 === 0) {
       
  1304             if (f1 === 0) {  // a 0 0 0
       
  1305                 if (f0 === 0)
       
  1306                     moved = false;
       
  1307                 f3 = f0;
       
  1308                 f2 = 0;
       
  1309             } else {         // a b 0 0
       
  1310                 f3 = f1;
       
  1311                 f2 = f0;
       
  1312             }
       
  1313             f1 = 0;
       
  1314         } else {             // f2 !== 0 && f3 === 0
       
  1315             if (f1 === 0) {  // a 0 b 0
       
  1316                 f3 = f2;
       
  1317                 f2 = f0;
       
  1318             } else {         // a b c 0
       
  1319                 f3 = f2;
       
  1320                 f2 = f1;
       
  1321                 f1 = f0;
       
  1322             }
       
  1323         }
       
  1324         f0 = 0;
       
  1325     } else {                 // f3 !== 0
       
  1326         if (f2 === 0) {
       
  1327             if (f1 === 0) {  // a 0 0 b
       
  1328                 if (f0 === 0)
       
  1329                     moved = false;
       
  1330                 f2 = f0;
       
  1331             } else {         // a b 0 c
       
  1332                 f2 = f1;
       
  1333                 f1 = f0;
       
  1334             }
       
  1335             f0 = 0;
       
  1336         } else {             // f2 !== 0 && f3 !== 0
       
  1337             if (f1 === 0) {  // a 0 b c
       
  1338                 if (f0 === 0)
       
  1339                     moved = false;
       
  1340                 f1 = f0;
       
  1341                 f0 = 0;
       
  1342             } else {         // else: a b c d
       
  1343                 moved = false;
       
  1344             }
       
  1345         }
       
  1346     }
       
  1347     updated = updated || moved;
       
  1348     if (f2 === 0) {
       
  1349         to.da = 0;
       
  1350         to.db = 0;
       
  1351         to.dc = 0;
       
  1352         to.dd = f3;
       
  1353         continue;
       
  1354     }
       
  1355     if (f1 === 0) {
       
  1356         to.da = 0;
       
  1357         to.db = 0;
       
  1358         if (f2 === f3) {
       
  1359             updated = true;
       
  1360             to.dc = 0;
       
  1361             to.dd = f3 + 1;
       
  1362         } else {
       
  1363             to.dc = f2;
       
  1364             to.dd = f3;
       
  1365         }
       
  1366         continue;
       
  1367     }
       
  1368     if (f2 === f3) {
       
  1369         updated = true;
       
  1370         to.da = 0;
       
  1371         to.dd = f3 + 1;
       
  1372         if (f0 === f1) {
       
  1373             to.db = 0;
       
  1374             to.dc = f1 + 1;
       
  1375         } else {
       
  1376             to.db = f0;
       
  1377             to.dc = f1;
       
  1378         }
       
  1379     } else {
       
  1380         to.dd = f3;
       
  1381         if (f1 === f2) {
       
  1382             updated = true;
       
  1383             to.da = 0;
       
  1384             to.db = f0;
       
  1385             to.dc = f2 + 1;
       
  1386         } else {
       
  1387             if (f0 === f1) {
       
  1388                 updated = true;
       
  1389                 to.da = 0;
       
  1390                 to.db = f1+1;
       
  1391                 to.dc = f2;
       
  1392             } else {
       
  1393                 to.da = f0;
       
  1394                 to.db = f1;
       
  1395                 to.dc = f2;
       
  1396             }
       
  1397         }
       
  1398     }
       
  1399     return updated;
       
  1400 }
       
  1401 
       
  1402 BoardObj.prototype.down = function(brd) {
       
  1403     var updated = false;
       
  1404     var from = this.brd, to = brd.brd;
       
  1405     var moved = true;
       
  1406     var f0 = from.aa, f1 = from.ba, f2 = from.ca, f3 = from.da;
       
  1407     if (f3 === 0) {
       
  1408         if (f2 === 0) {
       
  1409             if (f1 === 0) {  // a 0 0 0
       
  1410                 if (f0 === 0)
       
  1411                     moved = false;
       
  1412                 f3 = f0;
       
  1413                 f2 = 0;
       
  1414             } else {         // a b 0 0
       
  1415                 f3 = f1;
       
  1416                 f2 = f0;
       
  1417             }
       
  1418             f1 = 0;
       
  1419         } else {             // f2 !== 0 && f3 === 0
       
  1420             if (f1 === 0) {  // a 0 b 0
       
  1421                 f3 = f2;
       
  1422                 f2 = f0;
       
  1423             } else {         // a b c 0
       
  1424                 f3 = f2;
       
  1425                 f2 = f1;
       
  1426                 f1 = f0;
       
  1427             }
       
  1428         }
       
  1429         f0 = 0;
       
  1430     } else {                 // f3 !== 0
       
  1431         if (f2 === 0) {
       
  1432             if (f1 === 0) {  // a 0 0 b
       
  1433                 if (f0 === 0)
       
  1434                     moved = false;
       
  1435                 f2 = f0;
       
  1436             } else {         // a b 0 c
       
  1437                 f2 = f1;
       
  1438                 f1 = f0;
       
  1439             }
       
  1440             f0 = 0;
       
  1441         } else {             // f2 !== 0 && f3 !== 0
       
  1442             if (f1 === 0) {  // a 0 b c
       
  1443                 if (f0 === 0)
       
  1444                     moved = false;
       
  1445                 f1 = f0;
       
  1446                 f0 = 0;
       
  1447             } else {         // else: a b c d
       
  1448                 moved = false;
       
  1449             }
       
  1450         }
       
  1451     }
       
  1452     updated = updated || moved;
       
  1453     if (f2 === 0) {
       
  1454         to.aa = 0;
       
  1455         to.ba = 0;
       
  1456         to.ca = 0;
       
  1457         to.da = f3;
       
  1458         continue;
       
  1459     }
       
  1460     if (f1 === 0) {
       
  1461         to.aa = 0;
       
  1462         to.ba = 0;
       
  1463         if (f2 === f3) {
       
  1464             to.ca = 0;
       
  1465             to.da = f3 + 1;
       
  1466             updated = true;
       
  1467         } else {
       
  1468             to.ca = f2;
       
  1469             to.da = f3;
       
  1470         }
       
  1471         continue;
       
  1472     }
       
  1473     if (f2 === f3) {
       
  1474         updated = true;
       
  1475         to.aa = 0;
       
  1476         to.da = f3 + 1;
       
  1477         if (f0 === f1) {
       
  1478             to.ba = 0;
       
  1479             to.ca = f1 + 1;
       
  1480         } else {
       
  1481             to.ba = f0;
       
  1482             to.ca = f1;
       
  1483         }
       
  1484     } else {
       
  1485         to.da = f3;
       
  1486         if (f1 === f2) {
       
  1487             updated = true;
       
  1488             to.aa = 0;
       
  1489             to.ba = f0;
       
  1490             to.ca = f2 + 1;
       
  1491         } else {
       
  1492             if (f0 === f1) {
       
  1493                 updated = true;
       
  1494                 to.aa = 0;
       
  1495                 to.ba = f1+1;
       
  1496                 to.ca = f2;
       
  1497             } else {
       
  1498                 to.aa = f0;
       
  1499                 to.ba = f1;
       
  1500                 to.ca = f2;
       
  1501             }
       
  1502         }
       
  1503     }
       
  1504     var moved = true;
       
  1505     var f0 = from.ab, f1 = from.bb, f2 = from.cb, f3 = from.db;
       
  1506     if (f3 === 0) {
       
  1507         if (f2 === 0) {
       
  1508             if (f1 === 0) {  // a 0 0 0
       
  1509                 if (f0 === 0)
       
  1510                     moved = false;
       
  1511                 f3 = f0;
       
  1512                 f2 = 0;
       
  1513             } else {         // a b 0 0
       
  1514                 f3 = f1;
       
  1515                 f2 = f0;
       
  1516             }
       
  1517             f1 = 0;
       
  1518         } else {             // f2 !== 0 && f3 === 0
       
  1519             if (f1 === 0) {  // a 0 b 0
       
  1520                 f3 = f2;
       
  1521                 f2 = f0;
       
  1522             } else {         // a b c 0
       
  1523                 f3 = f2;
       
  1524                 f2 = f1;
       
  1525                 f1 = f0;
       
  1526             }
       
  1527         }
       
  1528         f0 = 0;
       
  1529     } else {                 // f3 !== 0
       
  1530         if (f2 === 0) {
       
  1531             if (f1 === 0) {  // a 0 0 b
       
  1532                 if (f0 === 0)
       
  1533                     moved = false;
       
  1534                 f2 = f0;
       
  1535             } else {         // a b 0 c
       
  1536                 f2 = f1;
       
  1537                 f1 = f0;
       
  1538             }
       
  1539             f0 = 0;
       
  1540         } else {             // f2 !== 0 && f3 !== 0
       
  1541             if (f1 === 0) {  // a 0 b c
       
  1542                 if (f0 === 0)
       
  1543                     moved = false;
       
  1544                 f1 = f0;
       
  1545                 f0 = 0;
       
  1546             } else {         // else: a b c d
       
  1547                 moved = false;
       
  1548             }
       
  1549         }
       
  1550     }
       
  1551     updated = updated || moved;
       
  1552     if (f2 === 0) {
       
  1553         to.ab = 0;
       
  1554         to.bb = 0;
       
  1555         to.cb = 0;
       
  1556         to.db = f3;
       
  1557         continue;
       
  1558     }
       
  1559     if (f1 === 0) {
       
  1560         to.ab = 0;
       
  1561         to.bb = 0;
       
  1562         if (f2 === f3) {
       
  1563             to.cb = 0;
       
  1564             to.db = f3 + 1;
       
  1565             updated = true;
       
  1566         } else {
       
  1567             to.cb = f2;
       
  1568             to.db = f3;
       
  1569         }
       
  1570         continue;
       
  1571     }
       
  1572     if (f2 === f3) {
       
  1573         updated = true;
       
  1574         to.ab = 0;
       
  1575         to.db = f3 + 1;
       
  1576         if (f0 === f1) {
       
  1577             to.bb = 0;
       
  1578             to.cb = f1 + 1;
       
  1579         } else {
       
  1580             to.bb = f0;
       
  1581             to.cb = f1;
       
  1582         }
       
  1583     } else {
       
  1584         to.db = f3;
       
  1585         if (f1 === f2) {
       
  1586             updated = true;
       
  1587             to.ab = 0;
       
  1588             to.bb = f0;
       
  1589             to.cb = f2 + 1;
       
  1590         } else {
       
  1591             if (f0 === f1) {
       
  1592                 updated = true;
       
  1593                 to.ab = 0;
       
  1594                 to.bb = f1+1;
       
  1595                 to.cb = f2;
       
  1596             } else {
       
  1597                 to.ab = f0;
       
  1598                 to.bb = f1;
       
  1599                 to.cb = f2;
       
  1600             }
       
  1601         }
       
  1602     }
       
  1603     var moved = true;
       
  1604     var f0 = from.ac, f1 = from.bc, f2 = from.cc, f3 = from.dc;
       
  1605     if (f3 === 0) {
       
  1606         if (f2 === 0) {
       
  1607             if (f1 === 0) {  // a 0 0 0
       
  1608                 if (f0 === 0)
       
  1609                     moved = false;
       
  1610                 f3 = f0;
       
  1611                 f2 = 0;
       
  1612             } else {         // a b 0 0
       
  1613                 f3 = f1;
       
  1614                 f2 = f0;
       
  1615             }
       
  1616             f1 = 0;
       
  1617         } else {             // f2 !== 0 && f3 === 0
       
  1618             if (f1 === 0) {  // a 0 b 0
       
  1619                 f3 = f2;
       
  1620                 f2 = f0;
       
  1621             } else {         // a b c 0
       
  1622                 f3 = f2;
       
  1623                 f2 = f1;
       
  1624                 f1 = f0;
       
  1625             }
       
  1626         }
       
  1627         f0 = 0;
       
  1628     } else {                 // f3 !== 0
       
  1629         if (f2 === 0) {
       
  1630             if (f1 === 0) {  // a 0 0 b
       
  1631                 if (f0 === 0)
       
  1632                     moved = false;
       
  1633                 f2 = f0;
       
  1634             } else {         // a b 0 c
       
  1635                 f2 = f1;
       
  1636                 f1 = f0;
       
  1637             }
       
  1638             f0 = 0;
       
  1639         } else {             // f2 !== 0 && f3 !== 0
       
  1640             if (f1 === 0) {  // a 0 b c
       
  1641                 if (f0 === 0)
       
  1642                     moved = false;
       
  1643                 f1 = f0;
       
  1644                 f0 = 0;
       
  1645             } else {         // else: a b c d
       
  1646                 moved = false;
       
  1647             }
       
  1648         }
       
  1649     }
       
  1650     updated = updated || moved;
       
  1651     if (f2 === 0) {
       
  1652         to.ac = 0;
       
  1653         to.bc = 0;
       
  1654         to.cc = 0;
       
  1655         to.dc = f3;
       
  1656         continue;
       
  1657     }
       
  1658     if (f1 === 0) {
       
  1659         to.ac = 0;
       
  1660         to.bc = 0;
       
  1661         if (f2 === f3) {
       
  1662             to.cc = 0;
       
  1663             to.dc = f3 + 1;
       
  1664             updated = true;
       
  1665         } else {
       
  1666             to.cc = f2;
       
  1667             to.dc = f3;
       
  1668         }
       
  1669         continue;
       
  1670     }
       
  1671     if (f2 === f3) {
       
  1672         updated = true;
       
  1673         to.ac = 0;
       
  1674         to.dc = f3 + 1;
       
  1675         if (f0 === f1) {
       
  1676             to.bc = 0;
       
  1677             to.cc = f1 + 1;
       
  1678         } else {
       
  1679             to.bc = f0;
       
  1680             to.cc = f1;
       
  1681         }
       
  1682     } else {
       
  1683         to.dc = f3;
       
  1684         if (f1 === f2) {
       
  1685             updated = true;
       
  1686             to.ac = 0;
       
  1687             to.bc = f0;
       
  1688             to.cc = f2 + 1;
       
  1689         } else {
       
  1690             if (f0 === f1) {
       
  1691                 updated = true;
       
  1692                 to.ac = 0;
       
  1693                 to.bc = f1+1;
       
  1694                 to.cc = f2;
       
  1695             } else {
       
  1696                 to.ac = f0;
       
  1697                 to.bc = f1;
       
  1698                 to.cc = f2;
       
  1699             }
       
  1700         }
       
  1701     }
       
  1702     var moved = true;
       
  1703     var f0 = from.ad, f1 = from.bd, f2 = from.cd, f3 = from.dd;
       
  1704     if (f3 === 0) {
       
  1705         if (f2 === 0) {
       
  1706             if (f1 === 0) {  // a 0 0 0
       
  1707                 if (f0 === 0)
       
  1708                     moved = false;
       
  1709                 f3 = f0;
       
  1710                 f2 = 0;
       
  1711             } else {         // a b 0 0
       
  1712                 f3 = f1;
       
  1713                 f2 = f0;
       
  1714             }
       
  1715             f1 = 0;
       
  1716         } else {             // f2 !== 0 && f3 === 0
       
  1717             if (f1 === 0) {  // a 0 b 0
       
  1718                 f3 = f2;
       
  1719                 f2 = f0;
       
  1720             } else {         // a b c 0
       
  1721                 f3 = f2;
       
  1722                 f2 = f1;
       
  1723                 f1 = f0;
       
  1724             }
       
  1725         }
       
  1726         f0 = 0;
       
  1727     } else {                 // f3 !== 0
       
  1728         if (f2 === 0) {
       
  1729             if (f1 === 0) {  // a 0 0 b
       
  1730                 if (f0 === 0)
       
  1731                     moved = false;
       
  1732                 f2 = f0;
       
  1733             } else {         // a b 0 c
       
  1734                 f2 = f1;
       
  1735                 f1 = f0;
       
  1736             }
       
  1737             f0 = 0;
       
  1738         } else {             // f2 !== 0 && f3 !== 0
       
  1739             if (f1 === 0) {  // a 0 b c
       
  1740                 if (f0 === 0)
       
  1741                     moved = false;
       
  1742                 f1 = f0;
       
  1743                 f0 = 0;
       
  1744             } else {         // else: a b c d
       
  1745                 moved = false;
       
  1746             }
       
  1747         }
       
  1748     }
       
  1749     updated = updated || moved;
       
  1750     if (f2 === 0) {
       
  1751         to.ad = 0;
       
  1752         to.bd = 0;
       
  1753         to.cd = 0;
       
  1754         to.dd = f3;
       
  1755         continue;
       
  1756     }
       
  1757     if (f1 === 0) {
       
  1758         to.ad = 0;
       
  1759         to.bd = 0;
       
  1760         if (f2 === f3) {
       
  1761             to.cd = 0;
       
  1762             to.dd = f3 + 1;
       
  1763             updated = true;
       
  1764         } else {
       
  1765             to.cd = f2;
       
  1766             to.dd = f3;
       
  1767         }
       
  1768         continue;
       
  1769     }
       
  1770     if (f2 === f3) {
       
  1771         updated = true;
       
  1772         to.ad = 0;
       
  1773         to.dd = f3 + 1;
       
  1774         if (f0 === f1) {
       
  1775             to.bd = 0;
       
  1776             to.cd = f1 + 1;
       
  1777         } else {
       
  1778             to.bd = f0;
       
  1779             to.cd = f1;
       
  1780         }
       
  1781     } else {
       
  1782         to.dd = f3;
       
  1783         if (f1 === f2) {
       
  1784             updated = true;
       
  1785             to.ad = 0;
       
  1786             to.bd = f0;
       
  1787             to.cd = f2 + 1;
       
  1788         } else {
       
  1789             if (f0 === f1) {
       
  1790                 updated = true;
       
  1791                 to.ad = 0;
       
  1792                 to.bd = f1+1;
       
  1793                 to.cd = f2;
       
  1794             } else {
       
  1795                 to.ad = f0;
       
  1796                 to.bd = f1;
       
  1797                 to.cd = f2;
       
  1798             }
       
  1799         }
       
  1800     }
       
  1801     return updated;
       
  1802 }
       
  1803 
       
  1804 BoardObj.prototype.left = function(brd) {
       
  1805     var updated = false;
       
  1806     var from = this.brd, to = brd.brd;
       
  1807     var moved = true;
       
  1808     var f0 = from.aa, f1 = from.ab, f2 = from.ac, f3 = from.ad;
       
  1809     if (f0 === 0) {
       
  1810         if (f1 === 0) {
       
  1811             if (f2 === 0) {  // 0 0 0 a
       
  1812                 if (f3 === 0)
       
  1813                     moved = false;
       
  1814                 f0 = f3;
       
  1815                 f1 = 0;
       
  1816             } else {         // 0 0 a b
       
  1817                 f0 = f2;
       
  1818                 f1 = f3;
       
  1819             }
       
  1820             f2 = 0;
       
  1821         } else {             // f1 !== 0 && f0 === 0
       
  1822             if (f2 === 0) {  // 0 a 0 b
       
  1823                 f0 = f1;
       
  1824                 f1 = f3;
       
  1825             } else {         // 0 a b c
       
  1826                 f0 = f1;
       
  1827                 f1 = f2;
       
  1828                 f2 = f3;
       
  1829             }
       
  1830         }
       
  1831         f3 = 0;
       
  1832     } else {                 // f0 !== 0
       
  1833         if (f1 === 0) {
       
  1834             if (f2 === 0) {  // a 0 0 b
       
  1835                 if (f3 === 0)
       
  1836                     moved = false;
       
  1837                 f1 = f3;
       
  1838             } else {         // a 0 b c
       
  1839                 f1 = f2;
       
  1840                 f2 = f3;
       
  1841             }
       
  1842             f3 = 0;
       
  1843         } else {             // f1 !== 0 && f0 !== 0
       
  1844             if (f2 === 0) {  // a b 0 c
       
  1845                 if (f3 === 0)
       
  1846                     moved = false;
       
  1847                 f2 = f3;
       
  1848                 f3 = 0;
       
  1849             } else {         // else: a b c d
       
  1850                 moved = false;
       
  1851             }
       
  1852         }
       
  1853     }
       
  1854     updated = updated || moved;
       
  1855     if (f1 === 0) {          // a 0 0 0
       
  1856         to.ad = 0;
       
  1857         to.ac = 0;
       
  1858         to.ab = 0;
       
  1859         to.aa = f0;
       
  1860         continue;
       
  1861     }
       
  1862     if (f2 === 0) {
       
  1863         to.ad = 0;
       
  1864         to.ac = 0;
       
  1865         if (f1 === f0) {     // a a 0 0
       
  1866             updated = true;
       
  1867             to.ab = 0;
       
  1868             to.aa = f0 + 1;
       
  1869         } else {             // a b 0 0
       
  1870             to.ab = f1;
       
  1871             to.aa = f0;
       
  1872         }
       
  1873         continue;
       
  1874     }
       
  1875     if (f1 === f0) {
       
  1876         updated = true;
       
  1877         to.ad = 0;
       
  1878         to.aa = f0 + 1;
       
  1879         if (f3 === f2) {     // a a b b
       
  1880             to.ac = 0;
       
  1881             to.ab = f2 + 1;
       
  1882         } else {             // a a b c
       
  1883             to.ac = f3;
       
  1884             to.ab = f2;
       
  1885         }
       
  1886     } else {
       
  1887         to.aa = f0;
       
  1888         if (f2 === f1) {     // a b b c
       
  1889             updated = true;
       
  1890             to.ad = 0;
       
  1891             to.ac = f3;
       
  1892             to.ab = f1 + 1;
       
  1893         } else {
       
  1894             to.ab = f1;
       
  1895             if (f2 === f3) { // a b c c
       
  1896                 updated = true;
       
  1897                 to.ad = 0;
       
  1898                 to.ac = f2+1;
       
  1899             } else {         // a b c d
       
  1900                 to.ad = f3;
       
  1901                 to.ac = f2;
       
  1902             }
       
  1903         }
       
  1904     }
       
  1905     var moved = true;
       
  1906     var f0 = from.ba, f1 = from.bb, f2 = from.bc, f3 = from.bd;
       
  1907     if (f0 === 0) {
       
  1908         if (f1 === 0) {
       
  1909             if (f2 === 0) {  // 0 0 0 a
       
  1910                 if (f3 === 0)
       
  1911                     moved = false;
       
  1912                 f0 = f3;
       
  1913                 f1 = 0;
       
  1914             } else {         // 0 0 a b
       
  1915                 f0 = f2;
       
  1916                 f1 = f3;
       
  1917             }
       
  1918             f2 = 0;
       
  1919         } else {             // f1 !== 0 && f0 === 0
       
  1920             if (f2 === 0) {  // 0 a 0 b
       
  1921                 f0 = f1;
       
  1922                 f1 = f3;
       
  1923             } else {         // 0 a b c
       
  1924                 f0 = f1;
       
  1925                 f1 = f2;
       
  1926                 f2 = f3;
       
  1927             }
       
  1928         }
       
  1929         f3 = 0;
       
  1930     } else {                 // f0 !== 0
       
  1931         if (f1 === 0) {
       
  1932             if (f2 === 0) {  // a 0 0 b
       
  1933                 if (f3 === 0)
       
  1934                     moved = false;
       
  1935                 f1 = f3;
       
  1936             } else {         // a 0 b c
       
  1937                 f1 = f2;
       
  1938                 f2 = f3;
       
  1939             }
       
  1940             f3 = 0;
       
  1941         } else {             // f1 !== 0 && f0 !== 0
       
  1942             if (f2 === 0) {  // a b 0 c
       
  1943                 if (f3 === 0)
       
  1944                     moved = false;
       
  1945                 f2 = f3;
       
  1946                 f3 = 0;
       
  1947             } else {         // else: a b c d
       
  1948                 moved = false;
       
  1949             }
       
  1950         }
       
  1951     }
       
  1952     updated = updated || moved;
       
  1953     if (f1 === 0) {          // a 0 0 0
       
  1954         to.bd = 0;
       
  1955         to.bc = 0;
       
  1956         to.bb = 0;
       
  1957         to.ba = f0;
       
  1958         continue;
       
  1959     }
       
  1960     if (f2 === 0) {
       
  1961         to.bd = 0;
       
  1962         to.bc = 0;
       
  1963         if (f1 === f0) {     // a a 0 0
       
  1964             updated = true;
       
  1965             to.bb = 0;
       
  1966             to.ba = f0 + 1;
       
  1967         } else {             // a b 0 0
       
  1968             to.bb = f1;
       
  1969             to.ba = f0;
       
  1970         }
       
  1971         continue;
       
  1972     }
       
  1973     if (f1 === f0) {
       
  1974         updated = true;
       
  1975         to.bd = 0;
       
  1976         to.ba = f0 + 1;
       
  1977         if (f3 === f2) {     // a a b b
       
  1978             to.bc = 0;
       
  1979             to.bb = f2 + 1;
       
  1980         } else {             // a a b c
       
  1981             to.bc = f3;
       
  1982             to.bb = f2;
       
  1983         }
       
  1984     } else {
       
  1985         to.ba = f0;
       
  1986         if (f2 === f1) {     // a b b c
       
  1987             updated = true;
       
  1988             to.bd = 0;
       
  1989             to.bc = f3;
       
  1990             to.bb = f1 + 1;
       
  1991         } else {
       
  1992             to.bb = f1;
       
  1993             if (f2 === f3) { // a b c c
       
  1994                 updated = true;
       
  1995                 to.bd = 0;
       
  1996                 to.bc = f2+1;
       
  1997             } else {         // a b c d
       
  1998                 to.bd = f3;
       
  1999                 to.bc = f2;
       
  2000             }
       
  2001         }
       
  2002     }
       
  2003     var moved = true;
       
  2004     var f0 = from.ca, f1 = from.cb, f2 = from.cc, f3 = from.cd;
       
  2005     if (f0 === 0) {
       
  2006         if (f1 === 0) {
       
  2007             if (f2 === 0) {  // 0 0 0 a
       
  2008                 if (f3 === 0)
       
  2009                     moved = false;
       
  2010                 f0 = f3;
       
  2011                 f1 = 0;
       
  2012             } else {         // 0 0 a b
       
  2013                 f0 = f2;
       
  2014                 f1 = f3;
       
  2015             }
       
  2016             f2 = 0;
       
  2017         } else {             // f1 !== 0 && f0 === 0
       
  2018             if (f2 === 0) {  // 0 a 0 b
       
  2019                 f0 = f1;
       
  2020                 f1 = f3;
       
  2021             } else {         // 0 a b c
       
  2022                 f0 = f1;
       
  2023                 f1 = f2;
       
  2024                 f2 = f3;
       
  2025             }
       
  2026         }
       
  2027         f3 = 0;
       
  2028     } else {                 // f0 !== 0
       
  2029         if (f1 === 0) {
       
  2030             if (f2 === 0) {  // a 0 0 b
       
  2031                 if (f3 === 0)
       
  2032                     moved = false;
       
  2033                 f1 = f3;
       
  2034             } else {         // a 0 b c
       
  2035                 f1 = f2;
       
  2036                 f2 = f3;
       
  2037             }
       
  2038             f3 = 0;
       
  2039         } else {             // f1 !== 0 && f0 !== 0
       
  2040             if (f2 === 0) {  // a b 0 c
       
  2041                 if (f3 === 0)
       
  2042                     moved = false;
       
  2043                 f2 = f3;
       
  2044                 f3 = 0;
       
  2045             } else {         // else: a b c d
       
  2046                 moved = false;
       
  2047             }
       
  2048         }
       
  2049     }
       
  2050     updated = updated || moved;
       
  2051     if (f1 === 0) {          // a 0 0 0
       
  2052         to.cd = 0;
       
  2053         to.cc = 0;
       
  2054         to.cb = 0;
       
  2055         to.ca = f0;
       
  2056         continue;
       
  2057     }
       
  2058     if (f2 === 0) {
       
  2059         to.cd = 0;
       
  2060         to.cc = 0;
       
  2061         if (f1 === f0) {     // a a 0 0
       
  2062             updated = true;
       
  2063             to.cb = 0;
       
  2064             to.ca = f0 + 1;
       
  2065         } else {             // a b 0 0
       
  2066             to.cb = f1;
       
  2067             to.ca = f0;
       
  2068         }
       
  2069         continue;
       
  2070     }
       
  2071     if (f1 === f0) {
       
  2072         updated = true;
       
  2073         to.cd = 0;
       
  2074         to.ca = f0 + 1;
       
  2075         if (f3 === f2) {     // a a b b
       
  2076             to.cc = 0;
       
  2077             to.cb = f2 + 1;
       
  2078         } else {             // a a b c
       
  2079             to.cc = f3;
       
  2080             to.cb = f2;
       
  2081         }
       
  2082     } else {
       
  2083         to.ca = f0;
       
  2084         if (f2 === f1) {     // a b b c
       
  2085             updated = true;
       
  2086             to.cd = 0;
       
  2087             to.cc = f3;
       
  2088             to.cb = f1 + 1;
       
  2089         } else {
       
  2090             to.cb = f1;
       
  2091             if (f2 === f3) { // a b c c
       
  2092                 updated = true;
       
  2093                 to.cd = 0;
       
  2094                 to.cc = f2+1;
       
  2095             } else {         // a b c d
       
  2096                 to.cd = f3;
       
  2097                 to.cc = f2;
       
  2098             }
       
  2099         }
       
  2100     }
       
  2101     var moved = true;
       
  2102     var f0 = from.da, f1 = from.db, f2 = from.dc, f3 = from.dd;
       
  2103     if (f0 === 0) {
       
  2104         if (f1 === 0) {
       
  2105             if (f2 === 0) {  // 0 0 0 a
       
  2106                 if (f3 === 0)
       
  2107                     moved = false;
       
  2108                 f0 = f3;
       
  2109                 f1 = 0;
       
  2110             } else {         // 0 0 a b
       
  2111                 f0 = f2;
       
  2112                 f1 = f3;
       
  2113             }
       
  2114             f2 = 0;
       
  2115         } else {             // f1 !== 0 && f0 === 0
       
  2116             if (f2 === 0) {  // 0 a 0 b
       
  2117                 f0 = f1;
       
  2118                 f1 = f3;
       
  2119             } else {         // 0 a b c
       
  2120                 f0 = f1;
       
  2121                 f1 = f2;
       
  2122                 f2 = f3;
       
  2123             }
       
  2124         }
       
  2125         f3 = 0;
       
  2126     } else {                 // f0 !== 0
       
  2127         if (f1 === 0) {
       
  2128             if (f2 === 0) {  // a 0 0 b
       
  2129                 if (f3 === 0)
       
  2130                     moved = false;
       
  2131                 f1 = f3;
       
  2132             } else {         // a 0 b c
       
  2133                 f1 = f2;
       
  2134                 f2 = f3;
       
  2135             }
       
  2136             f3 = 0;
       
  2137         } else {             // f1 !== 0 && f0 !== 0
       
  2138             if (f2 === 0) {  // a b 0 c
       
  2139                 if (f3 === 0)
       
  2140                     moved = false;
       
  2141                 f2 = f3;
       
  2142                 f3 = 0;
       
  2143             } else {         // else: a b c d
       
  2144                 moved = false;
       
  2145             }
       
  2146         }
       
  2147     }
       
  2148     updated = updated || moved;
       
  2149     if (f1 === 0) {          // a 0 0 0
       
  2150         to.dd = 0;
       
  2151         to.dc = 0;
       
  2152         to.db = 0;
       
  2153         to.da = f0;
       
  2154         continue;
       
  2155     }
       
  2156     if (f2 === 0) {
       
  2157         to.dd = 0;
       
  2158         to.dc = 0;
       
  2159         if (f1 === f0) {     // a a 0 0
       
  2160             updated = true;
       
  2161             to.db = 0;
       
  2162             to.da = f0 + 1;
       
  2163         } else {             // a b 0 0
       
  2164             to.db = f1;
       
  2165             to.da = f0;
       
  2166         }
       
  2167         continue;
       
  2168     }
       
  2169     if (f1 === f0) {
       
  2170         updated = true;
       
  2171         to.dd = 0;
       
  2172         to.da = f0 + 1;
       
  2173         if (f3 === f2) {     // a a b b
       
  2174             to.dc = 0;
       
  2175             to.db = f2 + 1;
       
  2176         } else {             // a a b c
       
  2177             to.dc = f3;
       
  2178             to.db = f2;
       
  2179         }
       
  2180     } else {
       
  2181         to.da = f0;
       
  2182         if (f2 === f1) {     // a b b c
       
  2183             updated = true;
       
  2184             to.dd = 0;
       
  2185             to.dc = f3;
       
  2186             to.db = f1 + 1;
       
  2187         } else {
       
  2188             to.db = f1;
       
  2189             if (f2 === f3) { // a b c c
       
  2190                 updated = true;
       
  2191                 to.dd = 0;
       
  2192                 to.dc = f2+1;
       
  2193             } else {         // a b c d
       
  2194                 to.dd = f3;
       
  2195                 to.dc = f2;
       
  2196             }
       
  2197         }
       
  2198     }
       
  2199     return updated;
       
  2200 }
       
  2201 
       
  2202 BoardObj.prototype.up = function(brd) {
       
  2203     var updated = false;
       
  2204     var from = this.brd, to = brd.brd;
       
  2205     var moved = true;
       
  2206     var f0 = from.aa, f1 = from.ba, f2 = from.ca, f3 = from.da;
       
  2207     if (f0 === 0) {
       
  2208         if (f1 === 0) {
       
  2209             if (f2 === 0) {  // 0 0 0 a
       
  2210                 if (f3 === 0)
       
  2211                     moved = false;
       
  2212                 f0 = f3;
       
  2213                 f1 = 0;
       
  2214             } else {         // 0 0 a b
       
  2215                 f0 = f2;
       
  2216                 f1 = f3;
       
  2217             }
       
  2218             f2 = 0;
       
  2219         } else {             // f1 !== 0 && f0 === 0
       
  2220             if (f2 === 0) {  // 0 a 0 b
       
  2221                 f0 = f1;
       
  2222                 f1 = f3;
       
  2223             } else {         // 0 a b c
       
  2224                 f0 = f1;
       
  2225                 f1 = f2;
       
  2226                 f2 = f3;
       
  2227             }
       
  2228         }
       
  2229         f3 = 0;
       
  2230     } else {                 // f0 !== 0
       
  2231         if (f1 === 0) {
       
  2232             if (f2 === 0) {  // a 0 0 b
       
  2233                 if (f3 === 0)
       
  2234                     moved = false;
       
  2235                 f1 = f3;
       
  2236             } else {         // a 0 b c
       
  2237                 f1 = f2;
       
  2238                 f2 = f3;
       
  2239             }
       
  2240             f3 = 0;
       
  2241         } else {             // f1 !== 0 && f0 !== 0
       
  2242             if (f2 === 0) {  // a b 0 c
       
  2243                 if (f3 === 0)
       
  2244                     moved = false;
       
  2245                 f2 = f3;
       
  2246                 f3 = 0;
       
  2247             } else {         // else: a b c d
       
  2248                 moved = false;
       
  2249             }
       
  2250         }
       
  2251     }
       
  2252     updated = updated || moved;
       
  2253     if (f1 === 0) {          // a 0 0 0
       
  2254         to.da = 0;
       
  2255         to.ca = 0;
       
  2256         to.ba = 0;
       
  2257         to.aa = f0;
       
  2258         continue;
       
  2259     }
       
  2260     if (f2 === 0) {
       
  2261         to.da = 0;
       
  2262         to.ca = 0;
       
  2263         if (f1 === f0) {     // a a 0 0
       
  2264             updated = true;
       
  2265             to.ba = 0;
       
  2266             to.aa = f0 + 1;
       
  2267         } else {             // a b 0 0
       
  2268             to.ba = f1;
       
  2269             to.aa = f0;
       
  2270         }
       
  2271         continue;
       
  2272     }
       
  2273     if (f1 === f0) {
       
  2274         to.da = 0;
       
  2275         to.aa = f0 + 1;
       
  2276         if (f3 === f2) {     // a a b b
       
  2277             updated = true;
       
  2278             to.ca = 0;
       
  2279             to.ba = f2 + 1;
       
  2280         } else {             // a a b c
       
  2281             to.ca = f3;
       
  2282             to.ba = f2;
       
  2283         }
       
  2284     } else {
       
  2285         to.aa = f0;
       
  2286         if (f2 === f1) {     // a b b c
       
  2287             updated = true;
       
  2288             to.da = 0;
       
  2289             to.ca = f3;
       
  2290             to.ba = f1 + 1;
       
  2291         } else {
       
  2292             to.ba = f1;
       
  2293             if (f2 === f3) { // a b c c
       
  2294                 updated = true;
       
  2295                 to.da = 0;
       
  2296                 to.ca = f2+1;
       
  2297             } else {         // a b c d
       
  2298                 to.da = f3;
       
  2299                 to.ca = f2;
       
  2300             }
       
  2301         }
       
  2302     }
       
  2303     var moved = true;
       
  2304     var f0 = from.ab, f1 = from.bb, f2 = from.cb, f3 = from.db;
       
  2305     if (f0 === 0) {
       
  2306         if (f1 === 0) {
       
  2307             if (f2 === 0) {  // 0 0 0 a
       
  2308                 if (f3 === 0)
       
  2309                     moved = false;
       
  2310                 f0 = f3;
       
  2311                 f1 = 0;
       
  2312             } else {         // 0 0 a b
       
  2313                 f0 = f2;
       
  2314                 f1 = f3;
       
  2315             }
       
  2316             f2 = 0;
       
  2317         } else {             // f1 !== 0 && f0 === 0
       
  2318             if (f2 === 0) {  // 0 a 0 b
       
  2319                 f0 = f1;
       
  2320                 f1 = f3;
       
  2321             } else {         // 0 a b c
       
  2322                 f0 = f1;
       
  2323                 f1 = f2;
       
  2324                 f2 = f3;
       
  2325             }
       
  2326         }
       
  2327         f3 = 0;
       
  2328     } else {                 // f0 !== 0
       
  2329         if (f1 === 0) {
       
  2330             if (f2 === 0) {  // a 0 0 b
       
  2331                 if (f3 === 0)
       
  2332                     moved = false;
       
  2333                 f1 = f3;
       
  2334             } else {         // a 0 b c
       
  2335                 f1 = f2;
       
  2336                 f2 = f3;
       
  2337             }
       
  2338             f3 = 0;
       
  2339         } else {             // f1 !== 0 && f0 !== 0
       
  2340             if (f2 === 0) {  // a b 0 c
       
  2341                 if (f3 === 0)
       
  2342                     moved = false;
       
  2343                 f2 = f3;
       
  2344                 f3 = 0;
       
  2345             } else {         // else: a b c d
       
  2346                 moved = false;
       
  2347             }
       
  2348         }
       
  2349     }
       
  2350     updated = updated || moved;
       
  2351     if (f1 === 0) {          // a 0 0 0
       
  2352         to.db = 0;
       
  2353         to.cb = 0;
       
  2354         to.bb = 0;
       
  2355         to.ab = f0;
       
  2356         continue;
       
  2357     }
       
  2358     if (f2 === 0) {
       
  2359         to.db = 0;
       
  2360         to.cb = 0;
       
  2361         if (f1 === f0) {     // a a 0 0
       
  2362             updated = true;
       
  2363             to.bb = 0;
       
  2364             to.ab = f0 + 1;
       
  2365         } else {             // a b 0 0
       
  2366             to.bb = f1;
       
  2367             to.ab = f0;
       
  2368         }
       
  2369         continue;
       
  2370     }
       
  2371     if (f1 === f0) {
       
  2372         to.db = 0;
       
  2373         to.ab = f0 + 1;
       
  2374         if (f3 === f2) {     // a a b b
       
  2375             updated = true;
       
  2376             to.cb = 0;
       
  2377             to.bb = f2 + 1;
       
  2378         } else {             // a a b c
       
  2379             to.cb = f3;
       
  2380             to.bb = f2;
       
  2381         }
       
  2382     } else {
       
  2383         to.ab = f0;
       
  2384         if (f2 === f1) {     // a b b c
       
  2385             updated = true;
       
  2386             to.db = 0;
       
  2387             to.cb = f3;
       
  2388             to.bb = f1 + 1;
       
  2389         } else {
       
  2390             to.bb = f1;
       
  2391             if (f2 === f3) { // a b c c
       
  2392                 updated = true;
       
  2393                 to.db = 0;
       
  2394                 to.cb = f2+1;
       
  2395             } else {         // a b c d
       
  2396                 to.db = f3;
       
  2397                 to.cb = f2;
       
  2398             }
       
  2399         }
       
  2400     }
       
  2401     var moved = true;
       
  2402     var f0 = from.ac, f1 = from.bc, f2 = from.cc, f3 = from.dc;
       
  2403     if (f0 === 0) {
       
  2404         if (f1 === 0) {
       
  2405             if (f2 === 0) {  // 0 0 0 a
       
  2406                 if (f3 === 0)
       
  2407                     moved = false;
       
  2408                 f0 = f3;
       
  2409                 f1 = 0;
       
  2410             } else {         // 0 0 a b
       
  2411                 f0 = f2;
       
  2412                 f1 = f3;
       
  2413             }
       
  2414             f2 = 0;
       
  2415         } else {             // f1 !== 0 && f0 === 0
       
  2416             if (f2 === 0) {  // 0 a 0 b
       
  2417                 f0 = f1;
       
  2418                 f1 = f3;
       
  2419             } else {         // 0 a b c
       
  2420                 f0 = f1;
       
  2421                 f1 = f2;
       
  2422                 f2 = f3;
       
  2423             }
       
  2424         }
       
  2425         f3 = 0;
       
  2426     } else {                 // f0 !== 0
       
  2427         if (f1 === 0) {
       
  2428             if (f2 === 0) {  // a 0 0 b
       
  2429                 if (f3 === 0)
       
  2430                     moved = false;
       
  2431                 f1 = f3;
       
  2432             } else {         // a 0 b c
       
  2433                 f1 = f2;
       
  2434                 f2 = f3;
       
  2435             }
       
  2436             f3 = 0;
       
  2437         } else {             // f1 !== 0 && f0 !== 0
       
  2438             if (f2 === 0) {  // a b 0 c
       
  2439                 if (f3 === 0)
       
  2440                     moved = false;
       
  2441                 f2 = f3;
       
  2442                 f3 = 0;
       
  2443             } else {         // else: a b c d
       
  2444                 moved = false;
       
  2445             }
       
  2446         }
       
  2447     }
       
  2448     updated = updated || moved;
       
  2449     if (f1 === 0) {          // a 0 0 0
       
  2450         to.dc = 0;
       
  2451         to.cc = 0;
       
  2452         to.bc = 0;
       
  2453         to.ac = f0;
       
  2454         continue;
       
  2455     }
       
  2456     if (f2 === 0) {
       
  2457         to.dc = 0;
       
  2458         to.cc = 0;
       
  2459         if (f1 === f0) {     // a a 0 0
       
  2460             updated = true;
       
  2461             to.bc = 0;
       
  2462             to.ac = f0 + 1;
       
  2463         } else {             // a b 0 0
       
  2464             to.bc = f1;
       
  2465             to.ac = f0;
       
  2466         }
       
  2467         continue;
       
  2468     }
       
  2469     if (f1 === f0) {
       
  2470         to.dc = 0;
       
  2471         to.ac = f0 + 1;
       
  2472         if (f3 === f2) {     // a a b b
       
  2473             updated = true;
       
  2474             to.cc = 0;
       
  2475             to.bc = f2 + 1;
       
  2476         } else {             // a a b c
       
  2477             to.cc = f3;
       
  2478             to.bc = f2;
       
  2479         }
       
  2480     } else {
       
  2481         to.ac = f0;
       
  2482         if (f2 === f1) {     // a b b c
       
  2483             updated = true;
       
  2484             to.dc = 0;
       
  2485             to.cc = f3;
       
  2486             to.bc = f1 + 1;
       
  2487         } else {
       
  2488             to.bc = f1;
       
  2489             if (f2 === f3) { // a b c c
       
  2490                 updated = true;
       
  2491                 to.dc = 0;
       
  2492                 to.cc = f2+1;
       
  2493             } else {         // a b c d
       
  2494                 to.dc = f3;
       
  2495                 to.cc = f2;
       
  2496             }
       
  2497         }
       
  2498     }
       
  2499     var moved = true;
       
  2500     var f0 = from.ad, f1 = from.bd, f2 = from.cd, f3 = from.dd;
       
  2501     if (f0 === 0) {
       
  2502         if (f1 === 0) {
       
  2503             if (f2 === 0) {  // 0 0 0 a
       
  2504                 if (f3 === 0)
       
  2505                     moved = false;
       
  2506                 f0 = f3;
       
  2507                 f1 = 0;
       
  2508             } else {         // 0 0 a b
       
  2509                 f0 = f2;
       
  2510                 f1 = f3;
       
  2511             }
       
  2512             f2 = 0;
       
  2513         } else {             // f1 !== 0 && f0 === 0
       
  2514             if (f2 === 0) {  // 0 a 0 b
       
  2515                 f0 = f1;
       
  2516                 f1 = f3;
       
  2517             } else {         // 0 a b c
       
  2518                 f0 = f1;
       
  2519                 f1 = f2;
       
  2520                 f2 = f3;
       
  2521             }
       
  2522         }
       
  2523         f3 = 0;
       
  2524     } else {                 // f0 !== 0
       
  2525         if (f1 === 0) {
       
  2526             if (f2 === 0) {  // a 0 0 b
       
  2527                 if (f3 === 0)
       
  2528                     moved = false;
       
  2529                 f1 = f3;
       
  2530             } else {         // a 0 b c
       
  2531                 f1 = f2;
       
  2532                 f2 = f3;
       
  2533             }
       
  2534             f3 = 0;
       
  2535         } else {             // f1 !== 0 && f0 !== 0
       
  2536             if (f2 === 0) {  // a b 0 c
       
  2537                 if (f3 === 0)
       
  2538                     moved = false;
       
  2539                 f2 = f3;
       
  2540                 f3 = 0;
       
  2541             } else {         // else: a b c d
       
  2542                 moved = false;
       
  2543             }
       
  2544         }
       
  2545     }
       
  2546     updated = updated || moved;
       
  2547     if (f1 === 0) {          // a 0 0 0
       
  2548         to.dd = 0;
       
  2549         to.cd = 0;
       
  2550         to.bd = 0;
       
  2551         to.ad = f0;
       
  2552         continue;
       
  2553     }
       
  2554     if (f2 === 0) {
       
  2555         to.dd = 0;
       
  2556         to.cd = 0;
       
  2557         if (f1 === f0) {     // a a 0 0
       
  2558             updated = true;
       
  2559             to.bd = 0;
       
  2560             to.ad = f0 + 1;
       
  2561         } else {             // a b 0 0
       
  2562             to.bd = f1;
       
  2563             to.ad = f0;
       
  2564         }
       
  2565         continue;
       
  2566     }
       
  2567     if (f1 === f0) {
       
  2568         to.dd = 0;
       
  2569         to.ad = f0 + 1;
       
  2570         if (f3 === f2) {     // a a b b
       
  2571             updated = true;
       
  2572             to.cd = 0;
       
  2573             to.bd = f2 + 1;
       
  2574         } else {             // a a b c
       
  2575             to.cd = f3;
       
  2576             to.bd = f2;
       
  2577         }
       
  2578     } else {
       
  2579         to.ad = f0;
       
  2580         if (f2 === f1) {     // a b b c
       
  2581             updated = true;
       
  2582             to.dd = 0;
       
  2583             to.cd = f3;
       
  2584             to.bd = f1 + 1;
       
  2585         } else {
       
  2586             to.bd = f1;
       
  2587             if (f2 === f3) { // a b c c
       
  2588                 updated = true;
       
  2589                 to.dd = 0;
       
  2590                 to.cd = f2+1;
       
  2591             } else {         // a b c d
       
  2592                 to.dd = f3;
       
  2593                 to.cd = f2;
       
  2594             }
       
  2595         }
       
  2596     }
       
  2597     return updated;
       
  2598 }