Dette script bør ikke installeres direkte. Det er et bibliotek, som andre scripts kan inkludere med metadirektivet // @require https://update.greasyfork.org/scripts/39327/257389/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.
// @icon https://raw.githubusercontent.com/nobodyrandom/mhAutobot/master/resource/mice.png
// @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 krResult = KingsRewardSolver();
console.log(krResult);
try {
window.parent.postMessage(krResult, "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 resultClosing1 = OCRAD(dilateImgData);
var resultClosing2 = OCRAD(erodeImgData);
var resultOpening1 = OCRAD(erodeFinalImgData);
var resultOpening2 = OCRAD(dilateFinalImgData);
resultClosing1 = FilterResult(resultClosing1);
resultClosing2 = FilterResult(resultClosing2);
resultOpening1 = FilterResult(resultOpening1);
resultOpening2 = FilterResult(resultOpening2);
var resultFinalList = [resultClosing1, resultClosing2, resultOpening1, resultOpening2];
var resultFinal = CheckResult(resultFinalList);
return resultFinal + "~" + CombineAllImageData(imgData, thresholdImgData, dilateImgData, erodeImgData, erodeFinalImgData, dilateFinalImgData);
}
function FilterResult(result) {
var regexp = /^[a-zA-Z0-9]+$/;
var newResult = "";
for (var i = 0; i < result.length; ++i) {
if (result.charAt(i).search(regexp) != -1)
newResult = newResult.concat(result.charAt(i));
}
return newResult.toLowerCase();
}
function CheckResult(resultList) {
var hit = [0, 0, 0, 0];
var max = -1;
var maxIndex = 0;
var sum = 0;
var strDebug = "";
for (var i = 0; i < resultList.length; ++i) {
for (var j = 0; j < resultList.length; ++j) {
if (i != j) {
if (resultList[i] == resultList[j])
++hit[i];
}
}
if (hit[i] > max) {
max = hit[i];
maxIndex = i;
}
sum += hit[i];
strDebug += resultList[i] + ": " + hit[i] + " ";
}
console.debug(strDebug);
if ((sum / 4) == hit[maxIndex])
return resultList[resultList.length - 1];
else
return resultList[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);
}