BvS Synchro Helper

BvS WorldKai Synchro Helper 1.3

目前为 2017-05-19 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name BvS Synchro Helper
  3. // @namespace rvBvS
  4. // @description BvS WorldKai Synchro Helper 1.3
  5. // @include http*://*animecubed.com/billy/bvs/worldkaiju-group.html
  6. // @version 1.4
  7. // @history 1.4 Now https compatible (Updated by Channel28)
  8. // @history 1.3 Made more compliant
  9. // ==/UserScript==
  10.  
  11. const GMSTORAGE_PATH = "BvS_Synchro_";
  12.  
  13.  
  14. var match;
  15. var possibilities = [];
  16. var guesses = [];
  17. var responses = [];
  18. var previousGuesses = []; //guess1, guess2, guess3, guess4, correct, wrong position
  19.  
  20. var elementDisplay = ["Fire", "Lightning", "Water", "Earth", "Wind", "RNG", "Awesome", "Code", "XXXX"];
  21. var reverseElements = {"Fire" : 0, "Lightning" : 1, "Water" : 2, "Earth" : 3, "Wind" : 4, "RNG" : 5, "Awesome" : 6, "Code" : 7, "XXXX" : 8};
  22. var standardFirstGuess = null;
  23. var legacyHelp;
  24. var guess = null;
  25.  
  26. var element1;
  27. var element2;
  28. var element3;
  29. var element4;
  30.  
  31. var numberofcolors;
  32. var possibilitiesleft = null;
  33. var allowpossibilitiesdisplay = false;
  34. var possibilitydisplaypage = 0;
  35.  
  36. function load(ev) {
  37. try {
  38. var temp = document.getElementsByName("c1");
  39. if ((temp != null) && (temp.length > 0)) {
  40. element1 = temp[0];
  41. element2 = document.getElementsByName("c2")[0];
  42. element3 = document.getElementsByName("c3")[0];
  43. element4 = document.getElementsByName("c4")[0];
  44.  
  45. numberofcolors = element1.options.length;
  46.  
  47. legacyHelp = getLegacyHelp();
  48. getPreviousGuesses();
  49.  
  50. if (previousGuesses.length <= 1) {
  51. if (legacyHelp == null) {
  52. switch (numberofcolors) {
  53. case 1: standardFirstGuess = [0, 0, 0, 0]; break;
  54. case 2: standardFirstGuess = [0, 0, 1, 1]; break;
  55. case 3: standardFirstGuess = [0, 0, 0, 1]; break;
  56. case 4: standardFirstGuess = [0, 0, 1, 2]; break;
  57. case 5: standardFirstGuess = [0, 0, 1, 1]; break;
  58. case 6: standardFirstGuess = [0, 0, 1, 1]; break;
  59. case 7: standardFirstGuess = [0, 1, 2, 3]; break;
  60. case 8: standardFirstGuess = [0, 1, 2, 3]; break;
  61. }
  62. } else {
  63. switch (numberofcolors) {
  64. case 2: standardFirstGuess = [0, 0, 0, 1]; break;
  65. case 3: standardFirstGuess = [1, 0, 0, 2]; break;
  66. case 4: standardFirstGuess = [1, 0, 1, 2]; break;
  67. case 5: standardFirstGuess = [1, 2, 3, 4]; break;
  68. case 6: standardFirstGuess = [1, 1, 2, 2]; break;
  69. case 7: standardFirstGuess = [1, 0, 2, 3]; break;
  70. case 8: standardFirstGuess = [1, 2, 3, 4]; break;
  71. }
  72. if (standardFirstGuess != null) {
  73. standardFirstGuess[0] += legacyHelp;
  74. standardFirstGuess[1] += legacyHelp;
  75. standardFirstGuess[2] += legacyHelp;
  76. standardFirstGuess[3] += legacyHelp;
  77. standardFirstGuess[0] %= numberofcolors;
  78. standardFirstGuess[1] %= numberofcolors;
  79. standardFirstGuess[2] %= numberofcolors;
  80. standardFirstGuess[3] %= numberofcolors;
  81. }
  82. }
  83. }
  84. if ((previousGuesses.length == 0) && (standardFirstGuess != null)) {
  85. guess = standardFirstGuess;
  86. if (legacyHelp == null)
  87. possibilitiesleft = numberofcolors * numberofcolors * numberofcolors * numberofcolors;
  88. else
  89. possibilitiesleft = (numberofcolors - 1) * numberofcolors * numberofcolors * numberofcolors;
  90. } else if ((previousGuesses.length == 1) && (numberofcolors >= 4) && (numberofcolors <= 8) && (compareArray(previousGuesses[0], standardFirstGuess, 4))) {
  91. var index = Math.floor((previousGuesses[0][4] * 11 - previousGuesses[0][4] * previousGuesses[0][4]) / 2) + previousGuesses[0][5];
  92.  
  93. if (legacyHelp == null) {
  94. switch (numberofcolors) {
  95. case 4:
  96. switch (index) {
  97. case 0: guess = [3, 3, 3, 3]; possibilitiesleft = 1; break;
  98. case 1: guess = [3, 3, 1, 3]; possibilitiesleft = 16; break;
  99. case 2: guess = [3, 3, 0, 1]; possibilitiesleft = 42; break;
  100. case 3: guess = [1, 3, 2, 0]; possibilitiesleft = 20; break;
  101. case 4: guess = [1, 2, 0, 0]; possibilitiesleft = 2; break;
  102. case 5: guess = [0, 3, 2, 3]; possibilitiesleft = 18; break;
  103. case 6: guess = [0, 3, 0, 3]; possibilitiesleft = 46; break;
  104. case 7: guess = [0, 1, 2, 1]; possibilitiesleft = 40; break;
  105. case 8: guess = [0, 1, 2, 0]; possibilitiesleft = 4; break;
  106. case 9: guess = [0, 3, 0, 3]; possibilitiesleft = 29; break;
  107. case 10:guess = [0, 1, 1, 0]; possibilitiesleft = 20; break;
  108. case 11:guess = [0, 1, 0, 2]; possibilitiesleft = 5; break;
  109. case 12:guess = [0, 1, 1, 3]; possibilitiesleft = 12; break;
  110. }
  111. break;
  112. case 5:
  113. switch (index) {
  114. case 0: guess = [2, 2, 2, 3]; possibilitiesleft = 81; break;
  115. case 1: guess = [1, 2, 0, 2]; possibilitiesleft = 108; break;
  116. case 2: guess = [1, 2, 0, 3]; possibilitiesleft = 54; break;
  117. case 3: guess = [0, 1, 0, 2]; possibilitiesleft = 12; break;
  118. case 4: guess = [1, 1, 0, 0]; possibilitiesleft = 1; break;
  119. case 5: guess = [0, 2, 1, 2]; possibilitiesleft = 108; break;
  120. case 6: guess = [0, 2, 0, 0]; possibilitiesleft = 120; break;
  121. case 7: guess = [0, 1, 0, 2]; possibilitiesleft = 28; break;
  122. case 8: break;
  123. case 9: guess = [0, 2, 0, 2]; possibilitiesleft = 68; break;
  124. case 10:guess = [0, 1, 1, 2]; possibilitiesleft = 24; break;
  125. case 11:guess = [0, 1, 0, 2]; possibilitiesleft = 4; break;
  126. case 12:guess = [0, 0, 2, 3]; possibilitiesleft = 16; break;
  127. }
  128. break;
  129. case 6:
  130. switch (index) {
  131. case 0: guess = [2, 2, 3, 4]; possibilitiesleft = 256; break;
  132. case 1: guess = [1, 2, 3, 3]; possibilitiesleft = 256; break;
  133. case 2: guess = [1, 2, 3, 3]; possibilitiesleft = 96; break;
  134. case 3: guess = [0, 1, 0, 2]; possibilitiesleft = 16; break;
  135. case 4: guess = [1, 1, 0, 0]; possibilitiesleft = 1; break;
  136. case 5: guess = [0, 2, 3, 3]; possibilitiesleft = 256; break;
  137. case 6: guess = [0, 0, 2, 3]; possibilitiesleft = 208; break;
  138. case 7: guess = [0, 1, 0, 2]; possibilitiesleft = 36; break;
  139. case 8: break;
  140. case 9: guess = [0, 1, 2, 3]; possibilitiesleft = 114; break;
  141. case 10:guess = [0, 1, 1, 2]; possibilitiesleft = 32; break;
  142. case 11:guess = [0, 1, 0, 2]; possibilitiesleft = 4; break;
  143. case 12:guess = [0, 1, 1, 2]; possibilitiesleft = 20; break;
  144. }
  145. break;
  146. case 7:
  147. switch (index) {
  148. case 0: guess = [4, 4, 4, 5]; possibilitiesleft = 81; break;
  149. case 1: guess = [0, 4, 4, 5]; possibilitiesleft = 444; break;
  150. case 2: guess = [1, 2, 4, 2]; possibilitiesleft = 582; break;
  151. case 3: guess = [1, 2, 4, 2]; possibilitiesleft = 180; break;
  152. case 4: guess = [0, 0, 0, 1]; possibilitiesleft = 9; break;
  153. case 5: guess = [4, 4, 5, 5]; possibilitiesleft = 256; break;
  154. case 6: guess = [0, 1, 4, 5]; possibilitiesleft = 432; break;
  155. case 7: guess = [0, 0, 1, 1]; possibilitiesleft = 168; break;
  156. case 8: guess = [0, 0, 1, 2]; possibilitiesleft = 8; break;
  157. case 9: guess = [0, 2, 4, 5]; possibilitiesleft = 150; break;
  158. case 10:guess = [0, 0, 1, 1]; possibilitiesleft = 60; break;
  159. case 11:guess = [0, 0, 1, 1]; possibilitiesleft = 6; break;
  160. case 12:guess = [0, 0, 1, 1]; possibilitiesleft = 24; break;
  161. }
  162. break;
  163. case 8:
  164. switch (index) {
  165. case 0: guess = [4, 4, 5, 6]; possibilitiesleft = 256; break;
  166. case 1: guess = [4, 4, 5, 5]; possibilitiesleft = 976; break;
  167. case 2: guess = [1, 2, 0, 4]; possibilitiesleft = 936; break;
  168. case 3: guess = [1, 2, 4, 2]; possibilitiesleft = 224; break;
  169. case 4: guess = [0, 0, 0, 1]; possibilitiesleft = 9; break;
  170. case 5: guess = [4, 4, 5, 5]; possibilitiesleft = 500; break;
  171. case 6: guess = [0, 1, 4, 5]; possibilitiesleft = 660; break;
  172. case 7: guess = [0, 0, 1, 1]; possibilitiesleft = 204; break;
  173. case 8: guess = [0, 0, 1, 2]; possibilitiesleft = 8; break;
  174. case 9: guess = [0, 2, 4, 5]; possibilitiesleft = 216; break;
  175. case 10:guess = [0, 0, 1, 1]; possibilitiesleft = 72; break;
  176. case 11:guess = [0, 0, 1, 1]; possibilitiesleft = 6; break;
  177. case 12:guess = [0, 0, 1, 1]; possibilitiesleft = 28; break;
  178. }
  179. break;
  180. }
  181. } else {
  182. switch(numberofcolors) {
  183. case 4:
  184. switch (index) {
  185. case 0: guess = [3, 3, 3, 3]; possibilitiesleft = 1; break;
  186. case 1: guess = [0, 2, 2, 3]; possibilitiesleft = 12; break;
  187. case 2: guess = [3, 1, 0, 3]; possibilitiesleft = 28; break;
  188. case 3: guess = [3, 1, 2, 0]; possibilitiesleft = 12; break;
  189. case 4: guess = [2, 1, 0, 1]; possibilitiesleft = 1; break;
  190. case 5: guess = [0, 2, 3, 2]; possibilitiesleft = 14; break;
  191. case 6: guess = [1, 1, 3, 3]; possibilitiesleft = 34; break;
  192. case 7: guess = [1, 0, 2, 0]; possibilitiesleft = 30; break;
  193. case 8: guess = [1, 1, 2, 0]; possibilitiesleft = 3; break;
  194. case 9: guess = [3, 1, 1, 3]; possibilitiesleft = 24; break;
  195. case 10:guess = [1, 1, 3, 2]; possibilitiesleft = 17; break;
  196. case 11:guess = [2, 0, 1, 1]; possibilitiesleft = 4; break;
  197. case 12:guess = [0, 0, 1, 3]; possibilitiesleft = 11; break;
  198. }
  199. break;
  200. case 5:
  201. switch (index) {
  202. case 0: break;
  203. case 1: guess = [0, 0, 0, 4]; possibilitiesleft = 12; break;
  204. case 2: guess = [0, 0, 1, 2]; possibilitiesleft = 90; break;
  205. case 3: guess = [2, 0, 2, 3]; possibilitiesleft = 81; break;
  206. case 4: guess = [0, 1, 1, 2]; possibilitiesleft = 9; break;
  207. case 5: guess = [0, 0, 1, 3]; possibilitiesleft = 20; break;
  208. case 6: guess = [2, 0, 1, 1]; possibilitiesleft = 93; break;
  209. case 7: guess = [2, 1, 0, 1]; possibilitiesleft = 87; break;
  210. case 8: guess = [1, 1, 2, 3]; possibilitiesleft = 8; break;
  211. case 9: guess = [1, 0, 1, 2]; possibilitiesleft = 45; break;
  212. case 10:guess = [0, 1, 1, 4]; possibilitiesleft = 33; break;
  213. case 11:guess = [1, 1, 2, 2]; possibilitiesleft = 6; break;
  214. case 12:guess = [2, 2, 0, 1]; possibilitiesleft = 15; break;
  215. }
  216. break;
  217. case 6:
  218. switch (index) {
  219. case 0: guess = [3, 0, 3, 4]; possibilitiesleft = 192; break;
  220. case 1: guess = [3, 3, 1, 4]; possibilitiesleft = 208; break;
  221. case 2: guess = [3, 0, 1, 3]; possibilitiesleft = 84; break;
  222. case 3: guess = [2, 0, 1, 2]; possibilitiesleft = 15; break;
  223. case 4: guess = [2, 2, 1, 1]; possibilitiesleft = 1; break;
  224. case 5: guess = [3, 3, 2, 4]; possibilitiesleft = 208; break;
  225. case 6: guess = [3, 0, 2, 2]; possibilitiesleft = 183; break;
  226. case 7: guess = [1, 2, 1, 3]; possibilitiesleft = 34; break;
  227. case 8: break;
  228. case 9: guess = [2, 1, 0, 3]; possibilitiesleft = 101; break;
  229. case 10:guess = [1, 2, 2, 3]; possibilitiesleft = 30; break;
  230. case 11:guess = [0, 1, 1, 2]; possibilitiesleft = 4; break;
  231. case 12:guess = [1, 0, 1, 2]; possibilitiesleft = 19; break;
  232. }
  233. break;
  234. case 7:
  235. switch (index) {
  236. case 0: guess = [4, 4, 4, 5]; possibilitiesleft = 81; break;
  237. case 1: guess = [4, 5, 2, 5]; possibilitiesleft = 396; break;
  238. case 2: guess = [2, 4, 1, 1]; possibilitiesleft = 466; break;
  239. case 3: guess = [4, 1, 1, 2]; possibilitiesleft = 131; break;
  240. case 4: guess = [2, 3, 0, 1]; possibilitiesleft = 6; break;
  241. case 5: guess = [1, 4, 3, 5]; possibilitiesleft = 240; break;
  242. case 6: guess = [1, 0, 4, 5]; possibilitiesleft = 375; break;
  243. case 7: guess = [2, 4, 1, 2]; possibilitiesleft = 135; break;
  244. case 8: guess = [0, 0, 0, 2]; possibilitiesleft = 6; break;
  245. case 9: guess = [2, 0, 4, 5]; possibilitiesleft = 140; break;
  246. case 10:guess = [1, 2, 4, 2]; possibilitiesleft = 53; break;
  247. case 11:guess = [0, 0, 0, 3]; possibilitiesleft = 5; break;
  248. case 12:guess = [2, 0, 1, 4]; possibilitiesleft = 23; break;
  249. }
  250. break;
  251. case 8:
  252. switch (index) {
  253. case 0: guess = [5, 0, 5, 6]; possibilitiesleft = 192; break;
  254. case 1: guess = [5, 5, 6, 6]; possibilitiesleft = 807; break;
  255. case 2: guess = [2, 0, 4, 5]; possibilitiesleft = 837; break;
  256. case 3: guess = [2, 3, 5, 3]; possibilitiesleft = 213; break;
  257. case 4: guess = [0, 1, 1, 2]; possibilitiesleft = 9; break;
  258. case 5: guess = [1, 0, 5, 5]; possibilitiesleft = 425; break;
  259. case 6: guess = [5, 2, 3, 6]; possibilitiesleft = 597; break;
  260. case 7: guess = [1, 1, 2, 2]; possibilitiesleft = 195; break;
  261. case 8: guess = [1, 1, 2, 3]; possibilitiesleft = 8; break;
  262. case 9: guess = [2, 5, 3, 6]; possibilitiesleft = 198; break;
  263. case 10:guess = [0, 1, 3, 5]; possibilitiesleft = 69; break;
  264. case 11:guess = [1, 1, 2, 2]; possibilitiesleft = 6; break;
  265. case 12:guess = [2, 1, 3, 3]; possibilitiesleft = 27; break;
  266. }
  267. break;
  268. }
  269. if (guess != null) {
  270. guess[0] += legacyHelp;
  271. guess[1] += legacyHelp;
  272. guess[2] += legacyHelp;
  273. guess[3] += legacyHelp;
  274. guess[0] %= numberofcolors;
  275. guess[1] %= numberofcolors;
  276. guess[2] %= numberofcolors;
  277. guess[3] %= numberofcolors;
  278. }
  279. }
  280. } else {
  281. makePossibilities();
  282. for (var i = 0; i < previousGuesses.length; i++) {
  283. cleanse([previousGuesses[i][4], previousGuesses[i][5]], [previousGuesses[i][0], previousGuesses[i][1], previousGuesses[i][2], previousGuesses[i][3]], true);
  284. }
  285. allowpossibilitiesdisplay = true;
  286. possibilitiesleft = possibilities.length;
  287.  
  288. if (possibilities.length == 1) {
  289. guess = guesses[possibilities[0]];
  290. } else {
  291. for (var i = 0; i < 3; i++) {
  292. for (var j = 0; j < 5 - i; j++) {
  293. responses.push([i, j]);
  294. }
  295. }
  296. responses.push([3, 0]);
  297.  
  298. guess = findBestGuess();
  299. }
  300. }
  301.  
  302. element1.selectedIndex = guess[0];
  303. element2.selectedIndex = guess[1];
  304. element3.selectedIndex = guess[2];
  305. element4.selectedIndex = guess[3];
  306.  
  307. if (possibilitiesleft) {
  308. var temp = document.evaluate("//center/table/tbody/tr/td/form", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  309. if ((temp != null) && (temp.snapshotLength > 0)) {
  310. temp = temp.snapshotItem(0);
  311. var helper = document.createElement("div");
  312. var helperText = "<font size='+1' color='#A10000'><b>Possibilities Remaining</b></font>: " + possibilitiesleft + "<br />\n<div id='rvExpandSynchroDisplay'></div><div id='rvSynchroLinks'>";
  313. if (allowpossibilitiesdisplay)
  314. helperText += "<a href='javascript:;' id='rvExpandPossibilities' style='font-size: 12px; color: #a10000;' onfocus='this.blur();'><b>Expand Possibilities</b></a>";
  315. helperText += "</div>";
  316. helper.setAttribute("id", "rvMiniSynchroDisplay");
  317. helper.innerHTML = helperText;
  318. temp.parentNode.insertBefore(helper, temp.nextSibling);
  319. if (allowpossibilitiesdisplay)
  320. document.getElementById("rvExpandPossibilities").addEventListener("click", function() { ExpandPossibilities(0); }, false);
  321. } else {
  322. alert("Error:\n\nFailed to find spot to put helper");
  323. }
  324. }
  325. }
  326. } catch (e) { alert("Exception!\n\nError name: " + e.name + "\nError message: " + e.message); }
  327. }
  328.  
  329. Array.prototype.remove = function(from, to) {
  330. var rest = this.slice((to || from) + 1 || this.length);
  331. this.length = from < 0 ? this.length + from : from;
  332. return this.push.apply(this, rest);
  333. };
  334.  
  335. function ArrayRemove(array, from, to) {
  336. var rest = array.slice((to || from) + 1 || array.length);
  337. array.length = from < 0 ? array.length + from : from;
  338. array.push.apply(array, rest);
  339.  
  340. return array;
  341. }
  342.  
  343. function compareArray(arr1, arr2, maxColumn) {
  344. if ((maxColumn == null) || (maxColumn == undefined)) maxColumn = arr1.length;
  345.  
  346. for (var i = 0; i < maxColumn; i++) {
  347. if (arr1[i] != arr2[i]) return false;
  348. }
  349.  
  350. return true;
  351. }
  352.  
  353. function getLegacyHelp() {
  354. var snap = document.evaluate("//form/center/font/b", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  355.  
  356. if ((snap == null) && (snap.snapshotLength == 0))
  357. return null;
  358.  
  359. for (var i = 0; temp = snap.snapshotItem(i); i++) {
  360. if (match = temp.textContent.match("Legacy Hint\\: You have a strong feeling that the first Chakra isn't (.*)\\.\\.")) {
  361. return reverseElements[match[1]];
  362. }
  363. }
  364.  
  365. return null;
  366. }
  367.  
  368. function getPreviousGuesses() {
  369. var snap = document.evaluate("//center/table/tbody/tr/td/center/table/tbody/tr/td/table/tbody/tr", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  370.  
  371. if ((snap == null) && (snap.snapshotLength == 0))
  372. return;
  373.  
  374. for (var i = 0; temp = snap.snapshotItem(i); i++) {
  375. temp = temp.childNodes;
  376. previousGuesses[i] = [];
  377.  
  378. for (var j = 0; j < 4; j++) {
  379. previousGuesses[i][j] = reverseElements[temp[j].textContent];
  380. }
  381.  
  382. if (match = temp[4].textContent.match("(\\d+) / (\\d+)")) {
  383. previousGuesses[i][4] = (parseInt(match[1]) || 0);
  384. previousGuesses[i][5] = (parseInt(match[2]) || 0);
  385. }
  386. }
  387. }
  388.  
  389. function makePossibilities() {
  390. for (var i = 0; i < numberofcolors; i++) {
  391. for (var j = 0; j < numberofcolors; j++) {
  392. for (var k = 0; k < numberofcolors; k++) {
  393. for (var l = 0; l < numberofcolors; l++) {
  394.  
  395. if (i != legacyHelp)
  396. possibilities.push(guesses.length);
  397. guesses.push([i, j, k, l]);
  398. }
  399. }
  400. }
  401. }
  402. }
  403.  
  404. function guessResult(currentguess, solution) {
  405. var inplace = 0;
  406. var exist = 0;
  407. var tempcurrentguess = currentguess.slice(0);
  408. var tempsolution = solution.slice(0);
  409.  
  410. /*for (var i = 0; i < 4; i++) {
  411. if (tempcurrentguess[i] == tempsolution[i]) {
  412. inplace++;
  413. tempcurrentguess[i] = "?";
  414. tempsolution[i] = "!";
  415. continue;
  416. }
  417.  
  418. for (var j = 0; j < 4; j++) {
  419. if (tempcurrentguess[i] == tempsolution[j]) {
  420. exist++;
  421. tempcurrentguess[i] = "?";
  422. tempsolution[j] = "!";
  423. break;
  424. }
  425. }
  426. }*/
  427.  
  428. for (var i = 0; i < 4; i++) {
  429. if (tempcurrentguess[i] == tempsolution[i]) {
  430. inplace++;
  431. tempcurrentguess[i] = "?";
  432. tempsolution[i] = "!";
  433. }
  434. }
  435.  
  436. for (var i = 0; i < 4; i++) {
  437. for (var j = 0; j < 4; j++) {
  438. if (tempcurrentguess[i] == tempsolution[j]) {
  439. exist++;
  440. tempcurrentguess[i] = "?";
  441. tempsolution[j] = "!";
  442. break;
  443. }
  444. }
  445. }
  446.  
  447. return [inplace, exist];
  448. }
  449.  
  450. function cleanse(comparison, theguess, apply) {
  451. var count = 0;
  452.  
  453. for (var i = possibilities.length - 1; i >= 0; i--) {
  454. var lessee = guessResult(theguess, guesses[possibilities[i]]);
  455.  
  456. if ((lessee[0] != comparison[0]) || (lessee[1] != comparison[1])) {
  457. count++;
  458. if (apply)
  459. ArrayRemove(possibilities, i);
  460. }
  461. }
  462.  
  463. return count;
  464. }
  465.  
  466. function guessScore(guess) {
  467. var thisguessscore = 99999;
  468.  
  469. for (var j = 0; j < responses.length; j++) {
  470. thisguessscore = Math.min(thisguessscore, cleanse(responses[j], guess, false));
  471. }
  472.  
  473. return thisguessscore;
  474. }
  475.  
  476. function findBestGuess() {
  477. var bestguessscore = 0;
  478. var possible = false;
  479. var thisguessscore;
  480. var bestguess;
  481.  
  482. for (var i = 0; i < guesses.length; i++) {
  483. thisguessscore = guessScore(guesses[i]);
  484.  
  485. if (thisguessscore > bestguessscore) {
  486. bestguessscore = thisguessscore;
  487. bestguess = guesses[i];
  488. possible = (possibilities.indexOf(i) != -1);
  489. } else if ((thisguessscore == bestguessscore) && (!possible) && (possibilities.indexOf(i) != -1)) {
  490. bestguess = guesses[i];
  491. possible = true;
  492. }
  493. }
  494.  
  495. return bestguess;
  496. }
  497.  
  498. function ExpandPossibilities(pagescroll) {
  499. try {
  500. var helperText = "";
  501.  
  502. possibilitydisplaypage += pagescroll;
  503.  
  504. helperText += "<table border='0' cellspacing='0' cellpadding='0'>";
  505.  
  506. var temp;
  507. var i;
  508. var j;
  509. for (i = 0; i < 10; i++) {
  510. j = i + possibilitydisplaypage*10;
  511. if (j >= possibilitiesleft)
  512. break;
  513.  
  514. temp = guesses[possibilities[j]];
  515. helperText += ("<tr><td><b>Possibility #" + j + "</b>:&nbsp;</td><td>" + elementDisplay[temp[0]] + ",&nbsp;</td><td>" + elementDisplay[temp[1]] + ",&nbsp;</td><td>" + elementDisplay[temp[2]] + ",&nbsp;</td><td>" + elementDisplay[temp[3]] + "</td></tr>\n");
  516. }
  517.  
  518. helperText += "</table>";
  519.  
  520. document.getElementById("rvExpandSynchroDisplay").innerHTML = helperText;
  521.  
  522. if (pagescroll == 0) {
  523. helperText = "<a href='javascript:;' id='rvNextSet' style='display: inline; font-size: 12px; color: #a10000;' onfocus='this.blur();'><b>Next 10</b></a>";
  524. helperText += " <a href='javascript:;' id='rvPreviousSet' style='display: inline; font-size: 12px; color: #a10000;' onfocus='this.blur();'><b>Previous 10</b></a>";
  525.  
  526. document.getElementById("rvSynchroLinks").innerHTML = helperText;
  527.  
  528. document.getElementById("rvNextSet").addEventListener("click", function() { ExpandPossibilities(+1); }, false);
  529. document.getElementById("rvPreviousSet").addEventListener("click", function() { ExpandPossibilities(-1); }, false);
  530. }
  531.  
  532. if ((i == 10) && (j < possibilitiesleft-1))
  533. document.getElementById("rvNextSet").style.display = 'block';
  534. else
  535. document.getElementById("rvNextSet").style.display = 'none';
  536.  
  537. if (possibilitydisplaypage > 0)
  538. document.getElementById("rvPreviousSet").style.display = 'block';
  539. else
  540. document.getElementById("rvPreviousSet").style.display = 'none';
  541. } catch (e) { alert("Exception!\n\nError name: " + e.name + "\nError message: " + e.message); }
  542. }
  543.  
  544. var gvar = new Object();
  545.  
  546. function GM_ApiBrowserCheck() {
  547. if (typeof(unsafeWindow) == 'undefined') { unsafeWindow=window; }
  548. if (typeof(GM_log) == 'undefined') { GM_log = function(msg) { try { unsafeWindow.console.log('GM_log: ' + msg); } catch(e) {} }; }
  549. GM_clog = function(msg) { if (arguments.callee.counter) { arguments.callee.counter++; } else { arguments.callee.counter=1; } GM_log('('+arguments.callee.counter+') '+msg); }
  550. GM_addGlobalStyle = function(css) {
  551. var sel = document.createElement('style');
  552. sel.setAttribute('type','text/css');
  553. sel.appendChild(document.createTextNode(css));
  554. var hel = document.documentElement.firstChild;
  555. while (hel && hel.nodeName != 'HEAD') { hel=hel.nextSibling; }
  556. if (hel && hel.nodeName == 'HEAD') { hel.appendChild(sel); } else { document.body.insertBefore(sel,document.body.firstChild); }
  557. return sel;
  558. }
  559. var needApiUpgrade=false;
  560.  
  561. if(window.navigator.appName.match(/^opera/i) && typeof(window.opera) != 'undefined') {
  562. needApiUpgrade=true; gvar.isOpera=true; GM_log=window.opera.postError; GM_log('Opera detected...');
  563. }
  564.  
  565. if(typeof(GM_setValue) != 'undefined') {
  566. try {
  567. var gsv=GM_setValue.toString();
  568. if (gsv.indexOf('staticArgs') > 0) { gvar.isGreaseMonkey = true; GM_log('GreaseMonkey Api detected...'); }
  569. else if (gsv.match(/not\s+supported/)) { needApiUpgrade = true; gvar.isBuggedChrome = true; GM_log('Bugged Chrome GM Api detected...'); }
  570. } catch(e) {
  571. gvar.isGreaseMonkey = (typeof(GM_setValue) == 'function');
  572. if (gvar.isGreaseMonkey)
  573. GM_log('GreaseMonkey Api is assumed because of exception...');
  574. else
  575. needApiUpgrade = true;
  576. }
  577. } else {
  578. needApiUpgrade=true; GM_log('No GM Api detected...');
  579. }
  580.  
  581. if(needApiUpgrade) {
  582. GM_log('Try to recreate needed GM Api...');
  583. var ws = null;
  584. try { ws=typeof(unsafeWindow.localStorage); unsafeWindow.localStorage.length; } catch(e) { ws=null; } // Catch Security error
  585.  
  586. if (ws=='object') {
  587. GM_log('Using localStorage for GM Api.');
  588. GM_getValue=function(name,defValue) { var value=unsafeWindow.localStorage.getItem(GMSTORAGE_PATH+name); if(value==null) { return defValue; } else { switch(value.substr(0,2)) { case 'S]': return value.substr(2); case 'N]': return parseInt(value.substr(2)); case 'B]': return value.substr(2)=='true'; } } return value; }
  589. GM_setValue=function(name,value) { switch (typeof(value)) { case 'string': unsafeWindow.localStorage.setItem(GMSTORAGE_PATH+name,'S]'+value); break; case 'number': if(value.toString().indexOf('.')<0) { unsafeWindow.localStorage.setItem(GMSTORAGE_PATH+name,'N]'+value); } break; case 'boolean': unsafeWindow.localStorage.setItem(GMSTORAGE_PATH+name,'B]'+value); break; } }
  590. GM_deleteValue=function(name) { unsafeWindow.localStorage.removeItem(GMSTORAGE_PATH+name); }
  591. } else if(!gvar.isOpera || typeof(GM_setValue)=='undefined') {
  592. GM_log('Using temporarilyStorage for GM Api.'); gvar.temporarilyStorage=new Array();
  593. GM_getValue=function(name,defValue) { if(typeof(gvar.temporarilyStorage[GMSTORAGE_PATH+name])=='undefined') { return defValue; } else { return gvar.temporarilyStorage[GMSTORAGE_PATH+name]; } }
  594. GM_setValue=function(name,value) { switch (typeof(value)) { case "string": case "boolean": case "number": gvar.temporarilyStorage[GMSTORAGE_PATH+name]=value; } }
  595. GM_deleteValue=function(name) { delete gvar.temporarilyStorage[GMSTORAGE_PATH+name]; };
  596. }
  597. if(typeof(GM_addStyle)=='undefined') { GM_addStyle=function(css) { var heads = document.getElementsByTagName("head"); if (heads.length > 0) { var node = document.createElement("style"); node.type = "text/css"; node.appendChild(document.createTextNode(css)); heads[0].appendChild(node); } } }
  598. if(typeof(GM_openInTab)=='undefined') { GM_openInTab=function(url) { unsafeWindow.open(url,""); } }
  599. if(typeof(GM_registerMenuCommand)=='undefined') { GM_registerMenuCommand=function(name,cmd) { GM_log("Notice: GM_registerMenuCommand is not supported."); } } // Dummy
  600. if(!gvar.isOpera || typeof(GM_xmlhttpRequest)=='undefined') {
  601. GM_log('Using XMLHttpRequest for GM Api.');
  602. GM_xmlhttpRequest=function(obj) {
  603. var request=new XMLHttpRequest();
  604. request.onreadystatechange=function() { if(obj.onreadystatechange) { obj.onreadystatechange(request); }; if(request.readyState==4 && obj.onload) { obj.onload(request); } }
  605. request.onerror=function() { if(obj.onerror) { obj.onerror(request); } }
  606. try { request.open(obj.method,obj.url,true); } catch(e) { if(obj.onerror) { obj.onerror( {readyState:4,responseHeaders:'',responseText:'',responseXML:'',status:403,statusText:'Forbidden'} ); }; return; }
  607. if(obj.headers) { for(name in obj.headers) { request.setRequestHeader(name,obj.headers[name]); } }
  608. request.send(obj.data); return request;
  609. }
  610. }
  611. }
  612. }
  613.  
  614. function waitForReady(callback) {
  615. var docState;
  616. try { docState = unsafeWindow.document.readyState; } catch(e) { docState = null; }
  617. if(docState) {
  618. if ((docState != 'complete') && (docState != 'interactive')) {
  619. window.setTimeout(waitForReady, 150, callback);
  620. return;
  621. }
  622. }
  623. callback();
  624. }
  625.  
  626. GM_ApiBrowserCheck();
  627. waitForReady(load);