// ==UserScript==
// @name MouseHunt - Empyrean Sky Palace Treasure Map Helper
// @namespace https://greasyfork.org/en/scripts/445341-empyrean-sky-palace-treasure-map-helper
// @match http://www.mousehuntgame.com/*
// @match https://www.mousehuntgame.com/*
// @version 0.4
// @author viettrung9012
// @description Categorize missing mice
// @include http://apps.facebook.com/mousehunt/*
// @include https://apps.facebook.com/mousehunt/*
// @license MIT
// @downloadURL none
// ==/UserScript==
const spMaps = [
"Empyrean Sky Palace Treasure Chest",
"Rare Empyrean Sky Palace Treasure Chest"
];
const lookUp = {
1019: ['launchPad'],
1037: ['launchPad'],
1055: ['launchPad'],
1060: ['launchPad'],
1045: ['wardens'],
1029: ['wardens'],
1031: ['wardens'],
1069: ['wardens'],
1014: ['pirates', 'common'],
1022: ['pirates', 'common'],
1023: ['pirates', 'common'],
1066: ['pirates', 'common'],
1048: ['pirates', 'common'],
1040: ['pirates', 'common'],
1084: ['pirates', 'sp'],
1032: ['physical', 'common'],
1034: ['physical', 'common'],
1059: ['physical', 'common'],
1057: ['physical', 'hai'],
1044: ['physical', 'hai'],
1083: ['physical', 'sp'],
1017: ['shadow', 'common'],
1043: ['shadow', 'common'],
1065: ['shadow', 'common'],
1051: ['shadow', 'hai'],
1050: ['shadow', 'hai'],
1085: ['shadow', 'sp'],
1070: ['tactical', 'common'],
1033: ['tactical', 'common'],
1049: ['tactical', 'common'],
1018: ['tactical', 'hai'],
1067: ['tactical', 'hai'],
1086: ['tactical', 'sp'],
1052: ['arcane', 'common'],
1053: ['arcane', 'common'],
1054: ['arcane', 'common'],
1056: ['arcane', 'hai'],
1016: ['arcane', 'hai'],
1074: ['arcane', 'sp'],
1062: ['forgotten', 'common'],
1063: ['forgotten', 'common'],
1020: ['forgotten', 'common'],
1061: ['forgotten', 'hai'],
1030: ['forgotten', 'hai'],
1078: ['forgotten', 'sp'],
1042: ['hydro', 'common'],
1058: ['hydro', 'common'],
1021: ['hydro', 'common'],
1041: ['hydro', 'hai'],
1035: ['hydro', 'hai'],
1079: ['hydro', 'sp'],
1068: ['dragon', 'common'],
1028: ['dragon', 'common'],
1027: ['dragon', 'common'],
1046: ['dragon', 'hai'],
1026: ['dragon', 'hai'],
1077: ['dragon', 'sp'],
1025: ['law', 'common'],
1064: ['law', 'common'],
1039: ['law', 'common'],
1015: ['law', 'hai'],
1038: ['law', 'hai'],
1080: ['law', 'sp'],
1047: ['others', 'common'],
1075: ['others', 'sp'],
1076: ['others', 'sp'],
1081: ['others', 'sp'],
1082: ['others', 'sp'],
1087: ['others', 'sp']
}
function buildMiceDiv(parentEl, title, els) {
if (els.length > 0) {
let miceDiv = document.createElement('div');
miceDiv.innerHTML = "
" + title + "
";
els.forEach(el => miceDiv.appendChild(el));
parentEl.appendChild(miceDiv);
}
}
const commonTitle = "Common (available in LAI, HAI and SP)";
const haiTitle = "HAI only";
const spTitle = "Sky Palace only"
function categorize() {
const categorized = {
launchPad: [],
wardens: [],
pirates: {
common: [],
sp: []
},
others: {
common: [],
sp: []
}
};
const types = ['physical', 'shadow', 'tactical', 'arcane', 'forgotten', 'hydro', 'dragon', 'law'];
types.forEach(type => categorized[type] = {
common: [],
hai: [],
sp: []
})
const missingMiceDiv = document.querySelector('.treasureMapView-goals-groups').children[1];
Array.from(missingMiceDiv.children).forEach(child => {
const miceId = parseInt(child.getAttribute('data-unique-id'));
let arr = lookUp[miceId].reduce((curVal, path) => {
return curVal[path];
}, categorized);
arr.push(child);
});
types.forEach(type => {
var typeDiv;
let { common : commonMice, hai : haiMice, sp : spMice } = categorized[type];
if (commonMice.length > 0 || haiMice.length > 0 || spMice.length > 0) {
typeDiv = document.createElement('div');
typeDiv.innerHTML = "" + type.charAt(0).toUpperCase() + type.slice(1); + "";
}
buildMiceDiv(typeDiv, commonTitle, commonMice);
buildMiceDiv(typeDiv, haiTitle, haiMice);
buildMiceDiv(typeDiv, spTitle, spMice);
if (typeDiv.innerHTML !== '') {
typeDiv.innerHTML = typeDiv.innerHTML + "
"
missingMiceDiv.appendChild(typeDiv);
}
});
if (categorized.wardens.length > 0) {
let wardensDiv = document.createElement('div');
wardensDiv.innerHTML = "Wardens";
buildMiceDiv(wardensDiv, "", categorized.wardens);
wardensDiv.innerHTML = wardensDiv.innerHTML + "
"
missingMiceDiv.appendChild(wardensDiv);
}
if (categorized.pirates.common.length > 0 || categorized.pirates.sp.length > 0) {
let piratesDiv = document.createElement('div');
piratesDiv.innerHTML = "Pirates";
buildMiceDiv(piratesDiv, commonTitle, categorized.pirates.common);
buildMiceDiv(piratesDiv, spTitle, categorized.pirates.sp);
piratesDiv.innerHTML = piratesDiv.innerHTML + "
"
missingMiceDiv.appendChild(piratesDiv);
}
if (categorized.others.common.length > 0 || categorized.others.sp.length > 0) {
let othersDiv = document.createElement('div');
othersDiv.innerHTML = "Richard and rest of Sky Palace";
buildMiceDiv(othersDiv, commonTitle, categorized.others.common);
buildMiceDiv(othersDiv, spTitle, categorized.others.sp);
othersDiv.innerHTML = othersDiv.innerHTML + "
"
missingMiceDiv.appendChild(othersDiv);
}
if (categorized.launchPad.length > 0) {
let launchPadDiv = document.createElement('div');
launchPadDiv.innerHTML = "Launchpad";
buildMiceDiv(launchPadDiv, "", categorized.launchPad);
launchPadDiv.innerHTML = launchPadDiv.innerHTML + "
"
missingMiceDiv.appendChild(launchPadDiv);
}
}
// Listen to XHRs, opening a map always at least triggers board.php
const originalOpen = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function(method, url, async) {
this.addEventListener("load", function () {
if (url.endsWith("board.php")) {
const mapEl = document.querySelector(".treasureMapView-mapMenu-rewardName");
if (mapEl) {
const mapName = mapEl.textContent;
if (mapName && spMaps.indexOf(mapName) > -1) {
categorize();
}
}
}
});
originalOpen.apply(this, arguments);
};