MH Auto KR Solver REVAMP

This is an auto MH KR Solver.

Ezt a szkriptet nem ajánlott közvetlenül telepíteni. Ez egy könyvtár más szkriptek számára, amik tartalmazzák a // @require https://update.greatest.deepsurf.us/scripts/39327/257389/MH%20Auto%20KR%20Solver%20REVAMP.js hivatkozást.

  1. // ==UserScript==
  2. // @name MH Auto KR Solver REVAMP
  3. // @author NobodyRandom, Kevin Kwok, CnN
  4. // @version 1.0.6
  5. // @namespace https://greatest.deepsurf.us/users/6398, https://devcnn.wordpress.com/, https://antimatter15.com/
  6. // @description This is an auto MH KR Solver.
  7. // @icon https://raw.githubusercontent.com/nobodyrandom/mhAutobot/master/resource/mice.png
  8. // @license GPL-3.0+; http://www.gnu.org/copyleft/gpl.html
  9. // @include http://*/puzzleimage.php*
  10. // @include https://*/puzzleimage.php*
  11. // @include http://*.dropbox.com/*
  12. // @include https://*.dropbox.com/*
  13. // @grant unsafeWindow
  14. // @grant GM_info
  15. // @run-at document-end
  16. // ==/UserScript==
  17.  
  18. //if (window.top == window.self) //don't run on the top window
  19. //return;
  20.  
  21. var debug = true;
  22.  
  23. function receiveMessage(event) {
  24. console.debug("Event origin: " + event.origin);
  25. console.debug("Event data: " + event.data);
  26. if (event.origin.indexOf("mousehunt") > -1) {
  27. try {
  28. event.source.postMessage(KingsRewardSolver(), event.origin);
  29. }
  30. catch (e) {
  31. console.debug("Error postMessage: " + e.message);
  32. event.source.postMessage("", event.origin);
  33. }
  34. }
  35. }
  36.  
  37. function run() {
  38. var krResult = KingsRewardSolver();
  39. console.log(krResult);
  40. try {
  41. window.parent.postMessage(krResult, "https://www.mousehuntgame.com/");
  42. }
  43. catch (e) {
  44. console.debug("Error run(): " + e.message);
  45. }
  46. }
  47.  
  48. function KingsRewardSolver() {
  49. var canvas = document.createElement('canvas');
  50. var img = document.getElementsByTagName('img')[0];
  51. canvas.width = img.width;
  52. canvas.height = img.height;
  53. var context = canvas.getContext('2d');
  54. context.drawImage(img, 0, 0);
  55. var imgData = context.getImageData(0, 0, canvas.width, canvas.height);
  56. var thresholdImgData = context.createImageData(canvas.width, canvas.height);
  57. for (var i = 0; i < imgData.data.length; i += 4) {
  58. if (imgData.data[i + 3] == 0)
  59. thresholdImgData.data[i] = 255;
  60. else
  61. thresholdImgData.data[i] = imgData.data[i];
  62.  
  63. thresholdImgData.data[i] = (imgData.data[i] >= 190) ? 255 : 0;
  64. thresholdImgData.data[i + 1] = thresholdImgData.data[i];
  65. thresholdImgData.data[i + 2] = thresholdImgData.data[i];
  66. thresholdImgData.data[i + 3] = 255;
  67. }
  68.  
  69. var dilateImgData = context.createImageData(canvas.width, canvas.height);
  70. var erodeImgData = context.createImageData(canvas.width, canvas.height);
  71. var isFirstRow, isLastRow;
  72. var abovePixel, belowPixel;
  73. for (var i = 0; i < thresholdImgData.data.length; i += 4) {
  74. if (thresholdImgData.data[i + 3] == 0) {
  75. dilateImgData.data[i] = 255;
  76. dilateImgData.data[i + 1] = 255;
  77. dilateImgData.data[i + 2] = 255;
  78. }
  79. else {
  80. dilateImgData.data[i] = thresholdImgData.data[i];
  81. dilateImgData.data[i + 1] = thresholdImgData.data[i + 1];
  82. dilateImgData.data[i + 2] = thresholdImgData.data[i + 2];
  83. }
  84. dilateImgData.data[i + 3] = 255;
  85. if (thresholdImgData.data[i] != 255) {
  86. abovePixel = i - canvas.width * 4;
  87. belowPixel = i + canvas.width * 4;
  88. isFirstRow = (abovePixel < 0);
  89. isLastRow = (belowPixel > thresholdImgData.data.length);
  90. if (isFirstRow)
  91. dilateImgData.data[i] |= thresholdImgData.data[belowPixel];
  92. else if (isLastRow)
  93. dilateImgData.data[i] |= thresholdImgData.data[abovePixel];
  94. else
  95. dilateImgData.data[i] |= thresholdImgData.data[abovePixel] | thresholdImgData.data[belowPixel];
  96.  
  97. dilateImgData.data[i + 1] = dilateImgData.data[i];
  98. dilateImgData.data[i + 2] = dilateImgData.data[i];
  99. }
  100. }
  101.  
  102. for (var i = 0; i < dilateImgData.data.length; i += 4) {
  103. if (dilateImgData.data[i + 3] == 0) {
  104. erodeImgData.data[i] = 255;
  105. erodeImgData.data[i + 1] = 255;
  106. erodeImgData.data[i + 2] = 255;
  107. }
  108. else {
  109. erodeImgData.data[i] = dilateImgData.data[i];
  110. erodeImgData.data[i + 1] = dilateImgData.data[i + 1];
  111. erodeImgData.data[i + 2] = dilateImgData.data[i + 2];
  112. }
  113. erodeImgData.data[i + 3] = 255;
  114. if (dilateImgData.data[i] != 0) {
  115. abovePixel = i - canvas.width * 4;
  116. belowPixel = i + canvas.width * 4;
  117. isFirstRow = (abovePixel < 0);
  118. isLastRow = (belowPixel > dilateImgData.data.length);
  119. if (isFirstRow)
  120. erodeImgData.data[i] &= dilateImgData.data[belowPixel];
  121. else if (isLastRow)
  122. erodeImgData.data[i] &= dilateImgData.data[abovePixel];
  123. else
  124. erodeImgData.data[i] &= dilateImgData.data[abovePixel] & dilateImgData.data[belowPixel];
  125.  
  126. erodeImgData.data[i + 1] = erodeImgData.data[i];
  127. erodeImgData.data[i + 2] = erodeImgData.data[i];
  128. }
  129. }
  130.  
  131. var dilateFinalImgData = context.createImageData(canvas.width, canvas.height);
  132. var erodeFinalImgData = context.createImageData(canvas.width, canvas.height);
  133. var isFirstCol, isLastCol;
  134. var leftPixel, rightPixel;
  135. for (var i = 0; i < erodeImgData.data.length; i += 4) {
  136. if (erodeImgData.data[i + 3] == 0) {
  137. erodeFinalImgData.data[i] = 255;
  138. erodeFinalImgData.data[i + 1] = 255;
  139. erodeFinalImgData.data[i + 2] = 255;
  140. }
  141. else {
  142. erodeFinalImgData.data[i] = erodeImgData.data[i];
  143. erodeFinalImgData.data[i + 1] = erodeImgData.data[i + 1];
  144. erodeFinalImgData.data[i + 2] = erodeImgData.data[i + 2];
  145. }
  146. erodeFinalImgData.data[i + 3] = 255;
  147. if (erodeImgData.data[i] != 0) {
  148. leftPixel = i - 4;
  149. rightPixel = i + 4;
  150. isFirstCol = (leftPixel < 0);
  151. isLastCol = (rightPixel > erodeImgData.data.length);
  152. if (isFirstCol)
  153. erodeFinalImgData.data[i] &= erodeImgData.data[rightPixel];
  154. else if (isLastCol)
  155. erodeFinalImgData.data[i] &= erodeImgData.data[leftPixel];
  156. else
  157. erodeFinalImgData.data[i] &= erodeImgData.data[leftPixel] & erodeImgData.data[rightPixel];
  158.  
  159. erodeFinalImgData.data[i + 1] = erodeFinalImgData.data[i];
  160. erodeFinalImgData.data[i + 2] = erodeFinalImgData.data[i];
  161. }
  162. }
  163.  
  164. for (var i = 0; i < erodeFinalImgData.data.length; i += 4) {
  165. if (erodeFinalImgData.data[i + 3] == 0) {
  166. dilateFinalImgData.data[i] = 255;
  167. dilateFinalImgData.data[i + 1] = 255;
  168. dilateFinalImgData.data[i + 2] = 255;
  169. }
  170. else {
  171. dilateFinalImgData.data[i] = erodeFinalImgData.data[i];
  172. dilateFinalImgData.data[i + 1] = erodeFinalImgData.data[i + 1];
  173. dilateFinalImgData.data[i + 2] = erodeFinalImgData.data[i + 2];
  174. }
  175. dilateFinalImgData.data[i + 3] = 255;
  176. if (erodeFinalImgData.data[i] != 255) {
  177. leftPixel = i - 4;
  178. rightPixel = i + 4;
  179. isFirstCol = (leftPixel < 0);
  180. isLastCol = (rightPixel > erodeFinalImgData.data.length);
  181. if (isFirstCol)
  182. dilateFinalImgData.data[i] |= erodeFinalImgData.data[leftPixel];
  183. else if (isLastCol)
  184. dilateFinalImgData.data[i] |= erodeFinalImgData.data[rightPixel];
  185. else
  186. dilateFinalImgData.data[i] |= erodeFinalImgData.data[rightPixel] | erodeFinalImgData.data[leftPixel];
  187.  
  188. dilateFinalImgData.data[i + 1] = dilateFinalImgData.data[i];
  189. dilateFinalImgData.data[i + 2] = dilateFinalImgData.data[i];
  190. }
  191. }
  192.  
  193. // REMOVE CnN's OCRAD, using require to link it in
  194. /*if (typeof OCRAD !== 'undefined') {
  195. var script = document.createElement('script');
  196. script.type = "text/javascript";
  197. script.src = "//greatest.deepsurf.us/scripts/16046-ocrad/code/OCRAD.js?version=100053";
  198. document.getElementsByTagName('head')[0].appendChild(script);
  199. }*/
  200.  
  201. // Opening = erode -> dilate
  202. // Closing = dilate -> erode
  203. var resultClosing1 = OCRAD(dilateImgData);
  204. var resultClosing2 = OCRAD(erodeImgData);
  205. var resultOpening1 = OCRAD(erodeFinalImgData);
  206. var resultOpening2 = OCRAD(dilateFinalImgData);
  207.  
  208. resultClosing1 = FilterResult(resultClosing1);
  209. resultClosing2 = FilterResult(resultClosing2);
  210. resultOpening1 = FilterResult(resultOpening1);
  211. resultOpening2 = FilterResult(resultOpening2);
  212.  
  213. var resultFinalList = [resultClosing1, resultClosing2, resultOpening1, resultOpening2];
  214. var resultFinal = CheckResult(resultFinalList);
  215.  
  216. return resultFinal + "~" + CombineAllImageData(imgData, thresholdImgData, dilateImgData, erodeImgData, erodeFinalImgData, dilateFinalImgData);
  217. }
  218.  
  219. function FilterResult(result) {
  220. var regexp = /^[a-zA-Z0-9]+$/;
  221. var newResult = "";
  222. for (var i = 0; i < result.length; ++i) {
  223. if (result.charAt(i).search(regexp) != -1)
  224. newResult = newResult.concat(result.charAt(i));
  225. }
  226. return newResult.toLowerCase();
  227. }
  228.  
  229. function CheckResult(resultList) {
  230. var hit = [0, 0, 0, 0];
  231. var max = -1;
  232. var maxIndex = 0;
  233. var sum = 0;
  234. var strDebug = "";
  235. for (var i = 0; i < resultList.length; ++i) {
  236. for (var j = 0; j < resultList.length; ++j) {
  237. if (i != j) {
  238. if (resultList[i] == resultList[j])
  239. ++hit[i];
  240. }
  241. }
  242. if (hit[i] > max) {
  243. max = hit[i];
  244. maxIndex = i;
  245. }
  246. sum += hit[i];
  247. strDebug += resultList[i] + ": " + hit[i] + " ";
  248. }
  249. console.debug(strDebug);
  250. if ((sum / 4) == hit[maxIndex])
  251. return resultList[resultList.length - 1];
  252. else
  253. return resultList[maxIndex];
  254. }
  255.  
  256. function CombineAllImageData(ori, threshold, dilate, erode, erodeFinal, dilateFinal) {
  257. var canvasAll = document.createElement('canvas');
  258. canvasAll.width = ori.width * 2;
  259. canvasAll.height = ori.height * 3;
  260. var contextAll = canvasAll.getContext('2d');
  261. var imgOri = new Image();
  262. imgOri.src = getBaseImage(ori);
  263. var imgThres = new Image();
  264. imgThres.src = getBaseImage(threshold);
  265. var imgDilate = new Image();
  266. imgDilate.src = getBaseImage(dilate);
  267. var imgErode = new Image();
  268. imgErode.src = getBaseImage(erode);
  269. var imgErodeFinal = new Image();
  270. imgErodeFinal.src = getBaseImage(erodeFinal);
  271. var imgDilateFinal = new Image();
  272. imgDilateFinal.src = getBaseImage(dilateFinal);
  273. contextAll.drawImage(imgOri, 0, 0);
  274. contextAll.drawImage(imgThres, ori.width, 0);
  275. contextAll.drawImage(imgDilate, 0, ori.height);
  276. contextAll.drawImage(imgErode, ori.width, ori.height);
  277. contextAll.drawImage(imgErodeFinal, 0, ori.height * 2);
  278. contextAll.drawImage(imgDilateFinal, ori.width, ori.height * 2);
  279. return canvasAll.toDataURL('image/png');
  280. }
  281.  
  282. function getBaseImage(imgData) {
  283. // Create an empty canvas element
  284. var canvas = document.createElement("canvas");
  285. var img = new Image();
  286. img.width = imgData.width;
  287. img.height = imgData.height;
  288. canvas.width = img.width;
  289. canvas.height = img.height;
  290.  
  291. // Copy the image contents to the canvas
  292. var ctx = canvas.getContext("2d");
  293. ctx.putImageData(imgData, 0, 0);
  294.  
  295. return canvas.toDataURL("image/png");
  296. }
  297.  
  298. if (window.location.href.indexOf("puzzleimage.php") > -1 || window.location.href.indexOf("newpuzzzle") > -1) {
  299. if (debug) console.log("RUN KR OCR SCRIPT");
  300.  
  301. window.addEventListener("message", receiveMessage, false);
  302. var ocrDelayMin = 1;
  303. var ocrDelayMax = 3;
  304. var ocrDelay = ocrDelayMin + Math.floor(Math.random() * (ocrDelayMax - ocrDelayMin));
  305. window.setTimeout(function () {
  306. run();
  307. }, ocrDelay * 1000);
  308. }
  309.