Greasy Fork is available in English.

BvS Synchro Helper

BvS WorldKai Synchro Helper 1.3

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