// ==UserScript==
// @name MouseHunt - Empyrean Sky Palace Map Colour Coder
// @author SEASIA
// @namespace https://greasyfork.org/en/users/885460-seasia
// @version 1.0
// @description Color codes mice on sky palace maps according to type
// @match http://www.mousehuntgame.com/*
// @match https://www.mousehuntgame.com/*
// @license MIT
// @downloadURL none
// ==/UserScript==
const launchpadMice = [
"Skydiver",
"Skygreaser",
"Launchpad Labourer",
"Cloud Miner"
];
const wardenMice = [
"Warden of Rain",
"Warden of Wind",
"Warden of Frost",
"Warden of Fog"
];
const physicalMice = [
"Ground Gavaleer",
"Sky Swordsman",
"Herc",
"Sky Squire",
"Paragon of Strength"
];
const shadowMice = [
"Paragon of Shadow",
"Astrological Astronomer",
"Overcaster",
"Stratocaster",
"Shadow Sage"
];
const tacticalMice = [
"Paragon of Tactics",
"Worried Wayfinder",
"Gyrologer",
"Seasoned Islandographer",
"Captain Cloudkicker"
];
const arcaneMice = [
"Paragon of Arcane",
"Sky Glass Sorcerer",
"Sky Glass Glazier",
"Sky Dancer",
"Sky Highborne"
];
const forgottenMice = [
"Paragon of Forgotten",
"Spry Sky Explorer",
"Spry Sky Seer",
"Cumulost",
"Spheric Diviner"
];
const hydroMice = [
"Paragon of Water",
"Nimbomancer",
"Sky Surfer",
"Cute Cloud Conjurer",
"Mist Maker"
];
const draconicMice = [
"Paragon of Dragons",
"Tiny Dragonfly",
"Lancer Guard",
"Dragonbreather",
"Regal Spearman"
];
const lawMice = [
"Paragon of the Lawless",
"Devious Gentleman",
"Stack of Thieves",
"Lawbender",
"Agent M"
];
const pirateMice = [
"Suave Pirate",
"Cutthroat Pirate",
"Cutthroat Cannoneer",
"Scarlet Revenger",
"Mairitime Pirate",
"Admiral Cloudbeard"
];
const empressMice = [
"Empyrean Empress"
];
const physicalSPMice = [
"Glamorous Gladiator"
];
const shadowSPMice = [
"Zealous Academic"
];
const tacticalSPMice = [
"Rocketeer"
];
const arcaneSPMice = [
"Sky Glider"
];
const forgottenSPMice = [
"Forgotten Elder"
];
const hydroSPMice = [
"Cloud Strider"
];
const draconicSPMice = [
"Empyrean Javelineer"
];
const lawSPMice = [
"Aristo-Cat Burglar"
];
const pirateSPMice = [
"Peggy the Plunderer",
"Empyrean Appraiser",
"Consumed Charm Tinkerer",
"Empyrean Geologist",
"Empyrean Empress",
];
function colorize() {
let launchpadColor = "#c97c49"; // brown
let launchpadCount = 0;
let wardenColor = "ffffff"; // white
let wardenCount = 0;
let physicalColor = "#5ae031"; // green
let physicalCount = 0;
let shadowColor = "#8f75e2"; // purple
let shadowCount = 0;
let tacticalColor = "#fff935"; // yellow
let tacticalCount = 0;
let arcaneColor = "#0be496"; // light green
let arcaneCount = 0;
let forgottenColor = "#338838"; // darker green
let forgottenCount = 0;
let hydroColor = "#5d9fce"; // blue
let hydroCount = 0;
let draconicColor = "#f06a60"; // red
let draconicCount = 0;
let lawColor = "#f9a645"; // orange
let lawCount = 0;
let pirateColor = "#ECA4A6"; // pink
let pirateCount = 0;
let empressColor = "#006400"; // dark green
let empressCount = 0;
let physicalSPColor = "#5ae031"; // green
let physicalSPCount = 0;
let shadowSPColor = "#8f75e2"; // purple
let shadowSPCount = 0;
let tacticalSPColor = "#fff935"; // yellow
let tacticalSPCount = 0;
let arcaneSPColor = "#0be496"; // light green
let arcaneSPCount = 0;
let forgottenSPColor = "#338838"; // darker green
let forgottenSPCount = 0;
let hydroSPColor = "#5d9fce"; // blue
let hydroSPCount = 0;
let draconicSPColor = "#f06a60"; // red
let draconicSPCount = 0;
let lawSPColor = "#f9a645"; // orange
let lawSPCount = 0;
let SPColor = "#ADD8E6"; // pink
let SPCount = 0;
const greyColor = "#949494";
const isChecked =
localStorage.getItem("highlightPref") === "uncaught-only" ? true : false;
const isCheckedStr = isChecked ? "checked" : "";
if (
document.querySelectorAll(".treasureMapView-goals-group-goal").length === 0
) {
return;
}
document.querySelectorAll(".treasureMapView-goals-group-goal").forEach(el => {
el.querySelector("span").style = "color: black; font-size: 11px;";
const mouseName = el.querySelector(".treasureMapView-goals-group-goal-name")
.textContent;
if (launchpadMice.indexOf(mouseName) > -1) {
el.style.backgroundColor = launchpadColor;
if (el.className.indexOf(" complete ") < 0) {
launchpadCount++;
} else {
if (isChecked) el.style.backgroundColor = "white";
}
} else if (wardenMice.indexOf(mouseName) > -1) {
el.style.backgroundColor = wardenColor;
if (el.className.indexOf(" complete ") < 0) {
wardenCount++;
} else {
if (isChecked) el.style.backgroundColor = "white";
}
} else if (physicalMice.indexOf(mouseName) > -1) {
el.style.backgroundColor = physicalColor;
if (el.className.indexOf(" complete ") < 0) {
physicalCount++;
} else {
if (isChecked) el.style.backgroundColor = "white";
}
} else if (shadowMice.indexOf(mouseName) > -1) {
el.style.backgroundColor = shadowColor;
if (el.className.indexOf(" complete ") < 0) {
shadowCount++;
} else {
if (isChecked) el.style.backgroundColor = "white";
}
} else if (tacticalMice.indexOf(mouseName) > -1) {
el.style.backgroundColor = tacticalColor;
if (el.className.indexOf(" complete ") < 0) {
tacticalCount++;
} else {
if (isChecked) el.style.backgroundColor = "white";
}
} else if (arcaneMice.indexOf(mouseName) > -1) {
el.style.backgroundColor = arcaneColor;
if (el.className.indexOf(" complete ") < 0) {
arcaneCount++;
} else {
if (isChecked) el.style.backgroundColor = "white";
}
} else if (forgottenMice.indexOf(mouseName) > -1) {
el.style.backgroundColor = forgottenColor;
if (el.className.indexOf(" complete ") < 0) {
forgottenCount++;
} else {
if (isChecked) el.style.backgroundColor = "white";
}
} else if (hydroMice.indexOf(mouseName) > -1) {
el.style.backgroundColor = hydroColor;
if (el.className.indexOf(" complete ") < 0) {
hydroCount++;
} else {
if (isChecked) el.style.backgroundColor = "white";
}
} else if (draconicMice.indexOf(mouseName) > -1) {
el.style.backgroundColor = draconicColor;
if (el.className.indexOf(" complete ") < 0) {
draconicCount++;
} else {
if (isChecked) el.style.backgroundColor = "white";
}
} else if (lawMice.indexOf(mouseName) > -1) {
el.style.backgroundColor = lawColor;
if (el.className.indexOf(" complete ") < 0) {
lawCount++;
} else {
if (isChecked) el.style.backgroundColor = "white";
}
} else if (pirateMice.indexOf(mouseName) > -1) {
el.style.backgroundColor = pirateColor;
if (el.className.indexOf(" complete ") < 0) {
pirateCount++;
} else {
if (isChecked) el.style.backgroundColor = "white";
}
// begin of sp mice
} else if (empressMice.indexOf(mouseName) > -1) {
el.style.backgroundColor = empressColor;
el.style.color = "ffffff";
if (el.className.indexOf(" complete ") < 0) {
empressCount++;
} else {
if (isChecked) el.style.backgroundColor = "white";
}
} else if (physicalSPMice.indexOf(mouseName) > -1) {
el.style.backgroundColor = physicalSPColor;
if (el.className.indexOf(" complete ") < 0) {
physicalSPCount++;
} else {
if (isChecked) el.style.backgroundColor = "white";
}
} else if (shadowSPMice.indexOf(mouseName) > -1) {
el.style.backgroundColor = shadowSPColor;
if (el.className.indexOf(" complete ") < 0) {
shadowSPCount++;
} else {
if (isChecked) el.style.backgroundColor = "white";
}
} else if (tacticalSPMice.indexOf(mouseName) > -1) {
el.style.backgroundColor = tacticalSPColor;
if (el.className.indexOf(" complete ") < 0) {
tacticalSPCount++;
} else {
if (isChecked) el.style.backgroundColor = "white";
}
} else if (arcaneSPMice.indexOf(mouseName) > -1) {
el.style.backgroundColor = arcaneSPColor;
if (el.className.indexOf(" complete ") < 0) {
arcaneSPCount++;
} else {
if (isChecked) el.style.backgroundColor = "white";
}
} else if (forgottenSPMice.indexOf(mouseName) > -1) {
el.style.backgroundColor = forgottenSPColor;
if (el.className.indexOf(" complete ") < 0) {
forgottenSPCount++;
} else {
if (isChecked) el.style.backgroundColor = "white";
}
} else if (hydroSPMice.indexOf(mouseName) > -1) {
el.style.backgroundColor = hydroSPColor;
if (el.className.indexOf(" complete ") < 0) {
hydroSPCount++;
} else {
if (isChecked) el.style.backgroundColor = "white";
}
} else if (draconicSPMice.indexOf(mouseName) > -1) {
el.style.backgroundColor = draconicSPColor;
if (el.className.indexOf(" complete ") < 0) {
draconicSPCount++;
} else {
if (isChecked) el.style.backgroundColor = "white";
}
} else if (lawSPMice.indexOf(mouseName) > -1) {
el.style.backgroundColor = lawSPColor;
if (el.className.indexOf(" complete ") < 0) {
lawSPCount++;
} else {
if (isChecked) el.style.backgroundColor = "white";
}
} else if (pirateSPMice.indexOf(mouseName) > -1) {
el.style.backgroundColor = SPColor;
if (el.className.indexOf(" complete ") < 0) {
SPCount++;
} else {
if (isChecked) el.style.backgroundColor = "white";
}
}
});
launchpadColor = launchpadCount > 0 ? launchpadColor : greyColor;
wardenColor = wardenCount > 0 ? wardenColor : greyColor;
physicalColor = physicalCount > 0 ? physicalColor : greyColor;
shadowColor = shadowCount > 0 ? shadowColor : greyColor;
tacticalColor = tacticalCount > 0 ? tacticalColor : greyColor;
arcaneColor = arcaneCount > 0 ? arcaneColor : greyColor;
forgottenColor = forgottenCount > 0 ? forgottenColor : greyColor;
hydroColor = hydroCount > 0 ? hydroColor : greyColor;
draconicColor = draconicCount > 0 ? draconicColor : greyColor;
lawColor = lawCount > 0 ? lawColor : greyColor;
pirateColor = pirateCount > 0 ? pirateColor : greyColor;
empressColor = empressCount > 0 ? empressColor : greyColor;
physicalSPColor = physicalSPCount > 0 ? physicalSPColor : greyColor;
shadowSPColor = shadowSPCount > 0 ? shadowSPColor : greyColor;
tacticalSPColor = tacticalSPCount > 0 ? tacticalSPColor : greyColor;
arcaneSPColor = arcaneSPCount > 0 ? arcaneSPColor : greyColor;
forgottenSPColor = forgottenSPCount > 0 ? forgottenSPColor : greyColor;
hydroSPColor = hydroSPCount > 0 ? hydroSPColor : greyColor;
draconicSPColor = draconicSPCount > 0 ? draconicSPColor : greyColor;
lawSPColor = lawSPCount > 0 ? lawSPColor : greyColor;
SPColor = SPCount > 0 ? SPColor : greyColor;
// Remove existing GWH Map related elements before proceeding
document.querySelectorAll(".tsitu-gwh-map").forEach(el => el.remove());
const masterDiv = document.createElement("div");
masterDiv.className = "tsitu-gwh-map";
masterDiv.style =
"display: inline-flex; margin-bottom: 10px; width: 100%; text-align: center; line-height: 1.5; overflow: hidden";
const spanStyle =
"; width: auto; padding: 5px; font-weight: bold; font-size: 12.75px; text-shadow: 0px 0px 11px white";
const masterDiv1 = document.createElement("div");
masterDiv1.className = "tsitu-gwh-map";
masterDiv1.style =
"display: inline-flex; margin-bottom: 5px; width: 100%; text-align: center; line-height: 1.5; overflow: hidden";
const subSpanStyle =
"; width: auto; padding: 5px; font-weight: bold; color: black; font-size: 12.75px; text-shadow: 0px 0px 11px white";
const launchpadSpan = document.createElement("span");
launchpadSpan.style = "background-color: " + launchpadColor + spanStyle;
launchpadSpan.innerHTML = "LP
" + launchpadCount;
const wardenSpan = document.createElement("span");
wardenSpan.style = "background-color: " + wardenColor + spanStyle;
wardenSpan.innerHTML = "Ward
" + wardenCount;
const physicalSpan = document.createElement("span");
physicalSpan.style = "background-color: " + physicalColor + spanStyle;
physicalSpan.innerHTML = "Phys
" + physicalCount;
const shadowSpan = document.createElement("span");
shadowSpan.style = "background-color: " + shadowColor + spanStyle;
shadowSpan.innerHTML = "Shadow
" + shadowCount;
const tacticalSpan = document.createElement("span");
tacticalSpan.style = "background-color: " + tacticalColor + spanStyle;
tacticalSpan.innerHTML = "Tact
" + tacticalCount;
const arcaneSpan = document.createElement("span");
arcaneSpan.style = "background-color: " + arcaneColor + spanStyle;
arcaneSpan.innerHTML = "Arc
" + arcaneCount;
const forgottenSpan = document.createElement("span");
forgottenSpan.style = "background-color: " + forgottenColor + spanStyle;
forgottenSpan.innerHTML = "Forg
" + forgottenCount;
const hydroSpan = document.createElement("span");
hydroSpan.style = "background-color: " + hydroColor + spanStyle;
hydroSpan.innerHTML = "Hydro
" + hydroCount;
const draconicSpan = document.createElement("span");
draconicSpan.style = "background-color: " + draconicColor + spanStyle;
draconicSpan.innerHTML = "Draco
" + draconicCount;
const lawSpan = document.createElement("span");
lawSpan.style = "background-color: " + lawColor + spanStyle;
lawSpan.innerHTML = "Law
" + lawCount;
const pirateSpan = document.createElement("span");
pirateSpan.style = "background-color: " + pirateColor + spanStyle;
pirateSpan.innerHTML = "Pirate
" + pirateCount;
const empressSpan = document.createElement("span");
empressSpan.style = "background-color: " + empressColor + subSpanStyle;
empressSpan.innerHTML = "Emp
" + empressCount;
const physicalSPSpan = document.createElement("span");
physicalSPSpan.style = "background-color: " + physicalSPColor + subSpanStyle;
physicalSPSpan.innerHTML = "PhySP
" + physicalSPCount;
const shadowSPSpan = document.createElement("span");
shadowSPSpan.style = "background-color: " + shadowSPColor + subSpanStyle;
shadowSPSpan.innerHTML = "ShaSP
" + shadowSPCount;
const tacticalSPSpan = document.createElement("span");
tacticalSPSpan.style = "background-color: " + tacticalSPColor + subSpanStyle;
tacticalSPSpan.innerHTML = "TacSP
" + tacticalSPCount;
const arcaneSPSpan = document.createElement("span");
arcaneSPSpan.style = "background-color: " + arcaneSPColor + subSpanStyle;
arcaneSPSpan.innerHTML = "ArcSP
" + arcaneSPCount;
const forgottenSPSpan = document.createElement("span");
forgottenSPSpan.style = "background-color: " + forgottenSPColor + subSpanStyle;
forgottenSPSpan.innerHTML = "ForSP
" + forgottenSPCount;
const hydroSPSpan = document.createElement("span");
hydroSPSpan.style = "background-color: " + hydroSPColor + subSpanStyle;
hydroSPSpan.innerHTML = "HydSP
" + hydroSPCount;
const draconicSPSpan = document.createElement("span");
draconicSPSpan.style = "background-color: " + draconicSPColor + subSpanStyle;
draconicSPSpan.innerHTML = "DraSP
" + draconicSPCount;
const lawSPSpan = document.createElement("span");
lawSPSpan.style = "background-color: " + lawSPColor + subSpanStyle;
lawSPSpan.innerHTML = "LawSP
" + lawSPCount;
const SPSpan = document.createElement("span");
SPSpan.style = "background-color: " + SPColor + subSpanStyle;
SPSpan.innerHTML = "SP
" + SPCount;
// Highlight uncaught only feature
const highlightLabel = document.createElement("label");
highlightLabel.htmlFor = "tsitu-highlight-box";
highlightLabel.innerText = "Highlight uncaught mice only";
const highlightBox = document.createElement("input");
highlightBox.type = "checkbox";
highlightBox.name = "tsitu-highlight-box";
highlightBox.style.verticalAlign = "middle";
highlightBox.checked = isChecked;
highlightBox.addEventListener("click", function () {
if (highlightBox.checked) {
localStorage.setItem("highlightPref", "uncaught-only");
} else {
localStorage.setItem("highlightPref", "all");
}
colorize();
});
const highlightDiv = document.createElement("div");
highlightDiv.className = "tsitu-gwh-map";
highlightDiv.style = "float: right; position: relative; z-index: 1";
highlightDiv.appendChild(highlightBox);
highlightDiv.appendChild(highlightLabel);
// Assemble masterDiv
masterDiv.appendChild(launchpadSpan);
masterDiv.appendChild(wardenSpan);
masterDiv.appendChild(physicalSpan);
masterDiv.appendChild(shadowSpan);
masterDiv.appendChild(tacticalSpan);
masterDiv.appendChild(arcaneSpan);
masterDiv.appendChild(forgottenSpan);
masterDiv.appendChild(hydroSpan);
masterDiv.appendChild(draconicSpan);
masterDiv.appendChild(lawSpan);
masterDiv.appendChild(pirateSpan);
masterDiv1.appendChild(empressSpan);
masterDiv1.appendChild(physicalSPSpan);
masterDiv1.appendChild(shadowSPSpan);
masterDiv1.appendChild(tacticalSPSpan);
masterDiv1.appendChild(arcaneSPSpan);
masterDiv1.appendChild(forgottenSPSpan);
masterDiv1.appendChild(hydroSPSpan);
masterDiv1.appendChild(draconicSPSpan);
masterDiv1.appendChild(lawSPSpan);
masterDiv1.appendChild(SPSpan);
// Inject into DOM
const insertEl = document.querySelector(
".treasureMapView-leftBlock .treasureMapView-block-content"
);
if (
insertEl &&
document.querySelector(
".treasureMapRootView-header-navigation-item.tasks.active" // On "Active Maps"
)
) {
insertEl.insertAdjacentElement("afterbegin", highlightDiv);
insertEl.insertAdjacentElement("afterbegin", masterDiv);
insertEl.insertAdjacentElement("afterbegin", masterDiv1);
}
// "Goals" button
document.querySelector("[data-type='show_goals']").onclick = function () {
colorize();
};
}
// Listen to XHRs, opening a map always at least triggers board.php
const originalOpen = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function () {
this.addEventListener("load", function () {
const chestEl = document.querySelector(
".treasureMapView-mapMenu-rewardName"
);
// 2019: Nice/Naughty List descriptors present in HUD, not so in 2020
// 2020: "2018-2020 [Rare] Nice Treasure Chest" & "2020 [Rare] Naughty Treasure Chest"
if (chestEl) {
const chestName = chestEl.textContent;
if (
chestName &&
(chestName.indexOf("Empyrean Sky Palace Treasure Chest") >= 0)
) {
colorize();
}
}
});
originalOpen.apply(this, arguments);
};