MouseHunt - GWH Map Color Coder

Color codes mice on GWH maps according to decorations & cheese

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Necesitará instalar una extensión como Tampermonkey para instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==UserScript==
// @name         MouseHunt - GWH Map Color Coder
// @author       Tran Situ (tsitu)
// @namespace    https://greasyfork.org/en/users/232363-tsitu
// @version      1.3
// @description  Color codes mice on GWH maps according to decorations & cheese
// @match        http://www.mousehuntgame.com/*
// @match        https://www.mousehuntgame.com/*
// ==/UserScript==

const sportMice = [
  "Sporty Ski Instructor",
  "Young Prodigy Racer",
  "Toboggan Technician",
  "Free Skiing",
  "Nitro Racer",
  "Rainbow Racer",
  "Double Black Diamond Racer",
  "Black Diamond Racer"
];

const toyMice = [
  "Nutcracker",
  "Toy",
  "Slay Ride",
  "Squeaker Claws",
  "Destructoy",
  "Toy Tinkerer",
  "Mad Elf",
  "Elf"
];

const ornamentalMice = [
  "Christmas Tree",
  "Stocking",
  "Candy Cane",
  "Ornament",
  "Missile Toe",
  "Wreath Thief",
  "Ribbon",
  "Snowglobe"
];

const snowMice = [
  "Snow Fort",
  "Snowball Hoarder",
  "S.N.O.W. Golem",
  "Snow Sorceress",
  "Reinbo",
  "Tundra Huntress",
  "Snowblower",
  "Snow Boulder"
];

const fireworksMice = [
  "Frightened Flying Fireworks",
  "New Year's",
  "Party Head"
];

const glazyMice = ["Glazy", "Joy"];

const pecanMice = [
  "Borean Commander",
  "Builder",
  "Frigid Foreman",
  "Glacia Ice Fist",
  "Great Winter Hunt Impostor",
  "Iceberg Sculptor",
  "Naughty Nougat",
  "Nice Knitting",
  "Ridiculous Sweater",
  "Shorts-All-Year",
  "Snow Golem Jockey",
  "Snow Scavenger",
  "Stuck Snowball"
];

const sbMice = [
  "Mouse of Winter Future",
  "Mouse of Winter Past",
  "Mouse of Winter Present",
  "Scrooge"
];

const standardMice = [
  "Confused Courier",
  "Gingerbread",
  "Greedy Al",
  "Hoarder",
  "Miser",
  "Present",
  "Triple Lutz"
];

const liscMice = ["Snow Golem Architect"];

const winterMice = ["Snowflake"];

function colorize() {
  let sportColor = "#c97c49"; // brown-ish
  let sportCount = 0;
  let toyColor = "#f06a60"; // red
  let toyCount = 0;
  let ornamentalColor = "#5ae031"; // green
  let ornamentalCount = 0;
  let snowColor = "#4fcaf0"; // blue
  let snowCount = 0;
  let fireworksColor = "#cd87ff"; // light purple
  let fireworksCount = 0;
  let glazyColor = "#ff9966"; // orange
  let glazyCount = 0;
  let pecanColor = "#ffff66"; // yellow
  let pecanCount = 0;
  let sbColor = "#66ffff"; // teal-ish
  let sbCount = 0;
  let standardColor = "#afa500"; // mountain dew-ish
  let standardCount = 0;
  let liscColor = "#6a62ad"; // medium purple
  let liscCount = 0;
  let winterColor = "#338838"; // darker green
  let winterCount = 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 (sportMice.indexOf(mouseName) > -1) {
      el.style.backgroundColor = sportColor;
      if (el.className.indexOf(" complete ") < 0) {
        sportCount++;
      } else {
        if (isChecked) el.style.backgroundColor = "white";
      }
    } else if (toyMice.indexOf(mouseName) > -1) {
      el.style.backgroundColor = toyColor;
      if (el.className.indexOf(" complete ") < 0) {
        toyCount++;
      } else {
        if (isChecked) el.style.backgroundColor = "white";
      }
    } else if (ornamentalMice.indexOf(mouseName) > -1) {
      el.style.backgroundColor = ornamentalColor;
      if (el.className.indexOf(" complete ") < 0) {
        ornamentalCount++;
      } else {
        if (isChecked) el.style.backgroundColor = "white";
      }
    } else if (snowMice.indexOf(mouseName) > -1) {
      el.style.backgroundColor = snowColor;
      if (el.className.indexOf(" complete ") < 0) {
        snowCount++;
      } else {
        if (isChecked) el.style.backgroundColor = "white";
      }
    } else if (fireworksMice.indexOf(mouseName) > -1) {
      el.style.backgroundColor = fireworksColor;
      if (el.className.indexOf(" complete ") < 0) {
        fireworksCount++;
      } else {
        if (isChecked) el.style.backgroundColor = "white";
      }
    } else if (glazyMice.indexOf(mouseName) > -1) {
      el.style.backgroundColor = glazyColor;
      if (el.className.indexOf(" complete ") < 0) {
        glazyCount++;
      } else {
        if (isChecked) el.style.backgroundColor = "white";
      }
    } else if (pecanMice.indexOf(mouseName) > -1) {
      el.style.backgroundColor = pecanColor;
      if (el.className.indexOf(" complete ") < 0) {
        pecanCount++;
      } else {
        if (isChecked) el.style.backgroundColor = "white";
      }
    } else if (sbMice.indexOf(mouseName) > -1) {
      el.style.backgroundColor = sbColor;
      if (el.className.indexOf(" complete ") < 0) {
        sbCount++;
      } else {
        if (isChecked) el.style.backgroundColor = "white";
      }
    } else if (standardMice.indexOf(mouseName) > -1) {
      el.style.backgroundColor = standardColor;
      if (el.className.indexOf(" complete ") < 0) {
        standardCount++;
      } else {
        if (isChecked) el.style.backgroundColor = "white";
      }
    } else if (liscMice.indexOf(mouseName) > -1) {
      el.style.backgroundColor = liscColor;
      if (el.className.indexOf(" complete ") < 0) {
        liscCount++;
      } else {
        if (isChecked) el.style.backgroundColor = "white";
      }
    } else if (winterMice.indexOf(mouseName) > -1) {
      el.style.backgroundColor = winterColor;
      if (el.className.indexOf(" complete ") < 0) {
        winterCount++;
      } else {
        if (isChecked) el.style.backgroundColor = "white";
      }
    }
  });

  sportColor = sportCount > 0 ? sportColor : greyColor;
  toyColor = toyCount > 0 ? toyColor : greyColor;
  ornamentalColor = ornamentalCount > 0 ? ornamentalColor : greyColor;
  snowColor = snowCount > 0 ? snowColor : greyColor;
  fireworksColor = fireworksCount > 0 ? fireworksColor : greyColor;
  glazyColor = glazyCount > 0 ? glazyColor : greyColor;
  pecanColor = pecanCount > 0 ? pecanColor : greyColor;
  sbColor = sbCount > 0 ? sbColor : greyColor;
  standardColor = standardCount > 0 ? standardColor : greyColor;
  liscColor = liscCount > 0 ? liscColor : greyColor;
  winterColor = winterCount > 0 ? winterColor : 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 sportSpan = document.createElement("span");
  sportSpan.style = "background-color: " + sportColor + spanStyle;
  sportSpan.innerHTML = "Sport<br>" + sportCount;

  const toySpan = document.createElement("span");
  toySpan.style = "background-color: " + toyColor + spanStyle;
  toySpan.innerHTML = "Toy<br>" + toyCount;

  const ornamentalSpan = document.createElement("span");
  ornamentalSpan.style = "background-color: " + ornamentalColor + spanStyle;
  ornamentalSpan.innerHTML = "Orna<br>" + ornamentalCount;

  const snowSpan = document.createElement("span");
  snowSpan.style = "background-color: " + snowColor + spanStyle;
  snowSpan.innerHTML = "Snow<br>" + snowCount;

  const fireworksSpan = document.createElement("span");
  fireworksSpan.style = "background-color: " + fireworksColor + spanStyle;
  fireworksSpan.innerHTML = "Fire<br>" + fireworksCount;

  const glazySpan = document.createElement("span");
  glazySpan.style = "background-color: " + glazyColor + spanStyle;
  glazySpan.innerHTML = "Glazy<br>" + glazyCount;

  const pecanSpan = document.createElement("span");
  pecanSpan.style = "background-color: " + pecanColor + spanStyle;
  pecanSpan.innerHTML = "Pecan<br>" + pecanCount;

  const sbSpan = document.createElement("span");
  sbSpan.style = "background-color: " + sbColor + spanStyle;
  sbSpan.innerHTML = "SB+<br>" + sbCount;

  const standardSpan = document.createElement("span");
  standardSpan.style = "background-color: " + standardColor + spanStyle;
  standardSpan.innerHTML = "Basic<br>" + standardCount;

  const liscSpan = document.createElement("span");
  liscSpan.style = "background-color: " + liscColor + spanStyle;
  liscSpan.innerHTML = "LISC<br>" + liscCount;

  const winterSpan = document.createElement("span");
  winterSpan.style = "background-color: " + winterColor + spanStyle;
  winterSpan.innerHTML = "Winter<br>" + winterCount;

  // 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(sportSpan);
  masterDiv.appendChild(toySpan);
  masterDiv.appendChild(ornamentalSpan);
  masterDiv.appendChild(snowSpan);
  masterDiv.appendChild(fireworksSpan);
  masterDiv.appendChild(glazySpan);
  masterDiv.appendChild(pecanSpan);
  masterDiv.appendChild(sbSpan);
  masterDiv.appendChild(standardSpan);
  masterDiv.appendChild(liscSpan);
  masterDiv.appendChild(winterSpan);

  // 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("Nice Treasure Chest") >= 0 ||
          chestName.indexOf("Naughty Treasure Chest") >= 0)
      ) {
        colorize();
      }
    }
  });
  originalOpen.apply(this, arguments);
};