This is an auto MH KR Solver.
Dette script bør ikke installeres direkte. Det er et bibliotek, som andre scripts kan inkludere med metadirektivet // @require https://update.greasyfork.org/scripts/16036/257387/MH%20Auto%20KR%20Solver%20REVAMP.js
// ==UserScript== // @name MH Auto KR Solver REVAMP // @author NobodyRandom, Kevin Kwok, CnN // @version 1.0.6 // @namespace https://greasyfork.org/users/6398, https://devcnn.wordpress.com/, https://antimatter15.com/ // @description This is an auto MH KR Solver. // @license GPL-3.0+; http://www.gnu.org/copyleft/gpl.html // @include http://*/puzzleimage.php* // @include https://*/puzzleimage.php* // @include http://*.dropbox.com/* // @include https://*.dropbox.com/* // @grant unsafeWindow // @grant GM_info // @run-at document-end // ==/UserScript== //if (window.top == window.self) //don't run on the top window //return; var debug = true; function receiveMessage(event) { console.debug("Event origin: " + event.origin); console.debug("Event data: " + event.data); if (event.origin.indexOf("mousehunt") > -1) { try { event.source.postMessage(KingsRewardSolver(), event.origin); } catch (e) { console.debug("Error postMessage: " + e.message); event.source.postMessage("", event.origin); } } } function run() { var krR###lt = KingsRewardSolver(); console.log(krR###lt); try { window.parent.postMessage(krR###lt, "https://www.mousehuntgame.com/"); } catch (e) { console.debug("Error run(): " + e.message); } } function KingsRewardSolver() { var canvas = document.createElement('canvas'); var img = document.getElementsByTagName('img')[0]; canvas.width = img.width; canvas.height = img.height; var context = canvas.getContext('2d'); context.drawImage(img, 0, 0); var imgData = context.getImageData(0, 0, canvas.width, canvas.height); var thresholdImgData = context.createImageData(canvas.width, canvas.height); for (var i = 0; i < imgData.data.length; i += 4) { if (imgData.data[i + 3] == 0) thresholdImgData.data[i] = 255; else thresholdImgData.data[i] = imgData.data[i]; thresholdImgData.data[i] = (imgData.data[i] >= 190) ? 255 : 0; thresholdImgData.data[i + 1] = thresholdImgData.data[i]; thresholdImgData.data[i + 2] = thresholdImgData.data[i]; thresholdImgData.data[i + 3] = 255; } var dilateImgData = context.createImageData(canvas.width, canvas.height); var erodeImgData = context.createImageData(canvas.width, canvas.height); var isFirstRow, isLastRow; var abovePixel, belowPixel; for (var i = 0; i < thresholdImgData.data.length; i += 4) { if (thresholdImgData.data[i + 3] == 0) { dilateImgData.data[i] = 255; dilateImgData.data[i + 1] = 255; dilateImgData.data[i + 2] = 255; } else { dilateImgData.data[i] = thresholdImgData.data[i]; dilateImgData.data[i + 1] = thresholdImgData.data[i + 1]; dilateImgData.data[i + 2] = thresholdImgData.data[i + 2]; } dilateImgData.data[i + 3] = 255; if (thresholdImgData.data[i] != 255) { abovePixel = i - canvas.width * 4; belowPixel = i + canvas.width * 4; isFirstRow = (abovePixel < 0); isLastRow = (belowPixel > thresholdImgData.data.length); if (isFirstRow) dilateImgData.data[i] |= thresholdImgData.data[belowPixel]; else if (isLastRow) dilateImgData.data[i] |= thresholdImgData.data[abovePixel]; else dilateImgData.data[i] |= thresholdImgData.data[abovePixel] | thresholdImgData.data[belowPixel]; dilateImgData.data[i + 1] = dilateImgData.data[i]; dilateImgData.data[i + 2] = dilateImgData.data[i]; } } for (var i = 0; i < dilateImgData.data.length; i += 4) { if (dilateImgData.data[i + 3] == 0) { erodeImgData.data[i] = 255; erodeImgData.data[i + 1] = 255; erodeImgData.data[i + 2] = 255; } else { erodeImgData.data[i] = dilateImgData.data[i]; erodeImgData.data[i + 1] = dilateImgData.data[i + 1]; erodeImgData.data[i + 2] = dilateImgData.data[i + 2]; } erodeImgData.data[i + 3] = 255; if (dilateImgData.data[i] != 0) { abovePixel = i - canvas.width * 4; belowPixel = i + canvas.width * 4; isFirstRow = (abovePixel < 0); isLastRow = (belowPixel > dilateImgData.data.length); if (isFirstRow) erodeImgData.data[i] &= dilateImgData.data[belowPixel]; else if (isLastRow) erodeImgData.data[i] &= dilateImgData.data[abovePixel]; else erodeImgData.data[i] &= dilateImgData.data[abovePixel] & dilateImgData.data[belowPixel]; erodeImgData.data[i + 1] = erodeImgData.data[i]; erodeImgData.data[i + 2] = erodeImgData.data[i]; } } var dilateFinalImgData = context.createImageData(canvas.width, canvas.height); var erodeFinalImgData = context.createImageData(canvas.width, canvas.height); var isFirstCol, isLastCol; var leftPixel, rightPixel; for (var i = 0; i < erodeImgData.data.length; i += 4) { if (erodeImgData.data[i + 3] == 0) { erodeFinalImgData.data[i] = 255; erodeFinalImgData.data[i + 1] = 255; erodeFinalImgData.data[i + 2] = 255; } else { erodeFinalImgData.data[i] = erodeImgData.data[i]; erodeFinalImgData.data[i + 1] = erodeImgData.data[i + 1]; erodeFinalImgData.data[i + 2] = erodeImgData.data[i + 2]; } erodeFinalImgData.data[i + 3] = 255; if (erodeImgData.data[i] != 0) { leftPixel = i - 4; rightPixel = i + 4; isFirstCol = (leftPixel < 0); isLastCol = (rightPixel > erodeImgData.data.length); if (isFirstCol) erodeFinalImgData.data[i] &= erodeImgData.data[rightPixel]; else if (isLastCol) erodeFinalImgData.data[i] &= erodeImgData.data[leftPixel]; else erodeFinalImgData.data[i] &= erodeImgData.data[leftPixel] & erodeImgData.data[rightPixel]; erodeFinalImgData.data[i + 1] = erodeFinalImgData.data[i]; erodeFinalImgData.data[i + 2] = erodeFinalImgData.data[i]; } } for (var i = 0; i < erodeFinalImgData.data.length; i += 4) { if (erodeFinalImgData.data[i + 3] == 0) { dilateFinalImgData.data[i] = 255; dilateFinalImgData.data[i + 1] = 255; dilateFinalImgData.data[i + 2] = 255; } else { dilateFinalImgData.data[i] = erodeFinalImgData.data[i]; dilateFinalImgData.data[i + 1] = erodeFinalImgData.data[i + 1]; dilateFinalImgData.data[i + 2] = erodeFinalImgData.data[i + 2]; } dilateFinalImgData.data[i + 3] = 255; if (erodeFinalImgData.data[i] != 255) { leftPixel = i - 4; rightPixel = i + 4; isFirstCol = (leftPixel < 0); isLastCol = (rightPixel > erodeFinalImgData.data.length); if (isFirstCol) dilateFinalImgData.data[i] |= erodeFinalImgData.data[leftPixel]; else if (isLastCol) dilateFinalImgData.data[i] |= erodeFinalImgData.data[rightPixel]; else dilateFinalImgData.data[i] |= erodeFinalImgData.data[rightPixel] | erodeFinalImgData.data[leftPixel]; dilateFinalImgData.data[i + 1] = dilateFinalImgData.data[i]; dilateFinalImgData.data[i + 2] = dilateFinalImgData.data[i]; } } // REMOVE CnN's OCRAD, using require to link it in /*if (typeof OCRAD !== 'undefined') { var script = document.createElement('script'); script.type = "text/javascript"; script.src = "//greasyfork.org/scripts/16046-ocrad/code/OCRAD.js?version=100053"; document.getElementsByTagName('head')[0].appendChild(script); }*/ // Opening = erode -> dilate // Closing = dilate -> erode var r###ltClosing1 = OCRAD(dilateImgData); var r###ltClosing2 = OCRAD(erodeImgData); var r###ltOpening1 = OCRAD(erodeFinalImgData); var r###ltOpening2 = OCRAD(dilateFinalImgData); r###ltClosing1 = FilterR###lt(r###ltClosing1); r###ltClosing2 = FilterR###lt(r###ltClosing2); r###ltOpening1 = FilterR###lt(r###ltOpening1); r###ltOpening2 = FilterR###lt(r###ltOpening2); var r###ltFinalList = [r###ltClosing1, r###ltClosing2, r###ltOpening1, r###ltOpening2]; var r###ltFinal = CheckR###lt(r###ltFinalList); return r###ltFinal + "~" + CombineAllImageData(imgData, thresholdImgData, dilateImgData, erodeImgData, erodeFinalImgData, dilateFinalImgData); } function FilterR###lt(r###lt) { var regexp = /^[a-zA-Z0-9]+$/; var newR###lt = ""; for (var i = 0; i < r###lt.length; ++i) { if (r###lt.charAt(i).search(regexp) != -1) newR###lt = newR###lt.concat(r###lt.charAt(i)); } return newR###lt.toLowerCase(); } function CheckR###lt(r###ltList) { var hit = [0, 0, 0, 0]; var max = -1; var maxIndex = 0; var sum = 0; var strDebug = ""; for (var i = 0; i < r###ltList.length; ++i) { for (var j = 0; j < r###ltList.length; ++j) { if (i != j) { if (r###ltList[i] == r###ltList[j]) ++hit[i]; } } if (hit[i] > max) { max = hit[i]; maxIndex = i; } sum += hit[i]; strDebug += r###ltList[i] + ": " + hit[i] + " "; } console.debug(strDebug); if ((sum / 4) == hit[maxIndex]) return r###ltList[r###ltList.length - 1]; else return r###ltList[maxIndex]; } function CombineAllImageData(ori, threshold, dilate, erode, erodeFinal, dilateFinal) { var canvasAll = document.createElement('canvas'); canvasAll.width = ori.width * 2; canvasAll.height = ori.height * 3; var contextAll = canvasAll.getContext('2d'); var imgOri = new Image(); imgOri.src = getBaseImage(ori); var imgThres = new Image(); imgThres.src = getBaseImage(threshold); var imgDilate = new Image(); imgDilate.src = getBaseImage(dilate); var imgErode = new Image(); imgErode.src = getBaseImage(erode); var imgErodeFinal = new Image(); imgErodeFinal.src = getBaseImage(erodeFinal); var imgDilateFinal = new Image(); imgDilateFinal.src = getBaseImage(dilateFinal); contextAll.drawImage(imgOri, 0, 0); contextAll.drawImage(imgThres, ori.width, 0); contextAll.drawImage(imgDilate, 0, ori.height); contextAll.drawImage(imgErode, ori.width, ori.height); contextAll.drawImage(imgErodeFinal, 0, ori.height * 2); contextAll.drawImage(imgDilateFinal, ori.width, ori.height * 2); return canvasAll.toDataURL('image/png'); } function getBaseImage(imgData) { // Create an empty canvas element var canvas = document.createElement("canvas"); var img = new Image(); img.width = imgData.width; img.height = imgData.height; canvas.width = img.width; canvas.height = img.height; // Copy the image contents to the canvas var ctx = canvas.getContext("2d"); ctx.putImageData(imgData, 0, 0); return canvas.toDataURL("image/png"); } if (window.location.href.indexOf("puzzleimage.php") > -1 || window.location.href.indexOf("newpuzzzle") > -1) { if (debug) console.log("RUN KR OCR SCRIPT"); window.addEventListener("message", receiveMessage, false); var ocrDelayMin = 1; var ocrDelayMax = 3; var ocrDelay = ocrDelayMin + Math.floor(Math.random() * (ocrDelayMax - ocrDelayMin)); window.setTimeout(function () { run(); }, ocrDelay * 1000); }