// ==UserScript==
// @name MouseHunt - Sky Pirate Map Colour Coder
// @author in59te
// @namespace https://greasyfork.org/en/users/739524-in59te
// @version 1.0
// @description Color codes mice on sky pirate maps according to type
// @match http://www.mousehuntgame.com/*
// @match https://www.mousehuntgame.com/*
// ==/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"
];
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;
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";
}
}
});
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;
// 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 launchpadSpan = document.createElement("span");
launchpadSpan.style = "background-color: " + launchpadColor + spanStyle;
launchpadSpan.innerHTML = "LP<br>" + launchpadCount;
const wardenSpan = document.createElement("span");
wardenSpan.style = "background-color: " + wardenColor + spanStyle;
wardenSpan.innerHTML = "Ward<br>" + wardenCount;
const physicalSpan = document.createElement("span");
physicalSpan.style = "background-color: " + physicalColor + spanStyle;
physicalSpan.innerHTML = "Phys<br>" + physicalCount;
const shadowSpan = document.createElement("span");
shadowSpan.style = "background-color: " + shadowColor + spanStyle;
shadowSpan.innerHTML = "Shadow<br>" + shadowCount;
const tacticalSpan = document.createElement("span");
tacticalSpan.style = "background-color: " + tacticalColor + spanStyle;
tacticalSpan.innerHTML = "Tact<br>" + tacticalCount;
const arcaneSpan = document.createElement("span");
arcaneSpan.style = "background-color: " + arcaneColor + spanStyle;
arcaneSpan.innerHTML = "Arc<br>" + arcaneCount;
const forgottenSpan = document.createElement("span");
forgottenSpan.style = "background-color: " + forgottenColor + spanStyle;
forgottenSpan.innerHTML = "Forg<br>" + forgottenCount;
const hydroSpan = document.createElement("span");
hydroSpan.style = "background-color: " + hydroColor + spanStyle;
hydroSpan.innerHTML = "Hydro<br>" + hydroCount;
const draconicSpan = document.createElement("span");
draconicSpan.style = "background-color: " + draconicColor + spanStyle;
draconicSpan.innerHTML = "Draco<br>" + draconicCount;
const lawSpan = document.createElement("span");
lawSpan.style = "background-color: " + lawColor + spanStyle;
lawSpan.innerHTML = "Law<br>" + lawCount;
const pirateSpan = document.createElement("span");
pirateSpan.style = "background-color: " + pirateColor + spanStyle;
pirateSpan.innerHTML = "Pirate<br>" + pirateCount;
// 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);
// 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);
}
// "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("Sky Pirate Treasure Chest") >= 0)
) {
colorize();
}
}
});
originalOpen.apply(this, arguments);
};