MouseHunt - GWH Map Color Coder

Color codes mice on GWH maps according to decorations & cheese

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==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);
};