🐭️ MouseHunt - Halloween Map Helper

Easily see and equip the cheese needed for Halloween Trick or Treat maps.

目前為 2022-10-19 提交的版本,檢視 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         🐭️ MouseHunt - Halloween Map Helper
// @version      1.1.4
// @description  Easily see and equip the cheese needed for Halloween Trick or Treat maps.
// @license      MIT
// @author       bradp
// @namespace    bradp
// @match        https://www.mousehuntgame.com/*
// @icon         https://brrad.com/mouse.png
// @grant        none
// @run-at       document-end
// ==/UserScript==

(function () {
	'use strict';

	const cheeseIdToId = {
		super_brie_cheese: 1114,
		cauldron_tier_1_cheese: 3305,
		cauldron_tier_2_cheese: 3306,
		cauldron_tier_3_cheese: 3307,
		cauldron_tier_4_cheese: 3308,
	};

	const miceCheeses = [
		{
			name: 'Grey Recluse',
			cheese: 'Standard',
			cheeseId: 'super_brie_cheese'
		},
		{
			name: 'Cobweb',
			cheese: 'Standard',
			cheeseId: 'super_brie_cheese'
		},
		{
			name: 'Teenage Vampire',
			cheese: 'Standard',
			cheeseId: 'super_brie_cheese'
		},
		{
			name: 'Zombot Unipire',
			cheese: 'Standard',
			cheeseId: 'super_brie_cheese'
		},
		{
			name: 'Candy Cat',
			cheese: 'Standard',
			cheeseId: 'super_brie_cheese'
		},
		{
			name: 'Candy Goblin',
			cheese: 'Standard',
			cheeseId: 'super_brie_cheese'
		},
		{
			name: 'Shortcut',
			cheese: 'Standard',
			cheeseId: 'super_brie_cheese'
		},
		{
			name: 'Tricky Witch',
			cheese: 'Standard',
			cheeseId: 'super_brie_cheese'
		},
		{
			name: 'Sugar Rush',
			cheese: 'Standard',
			cheeseId: 'super_brie_cheese'
		},
		{
			name: 'Spirit Light',
			cheese: 'Monterey Jack-O-Lantern',
			cheeseId: 'cauldron_tier_1_cheese'
		},
		{
			name: 'Gourdborg',
			cheese: 'Monterey Jack-O-Lantern',
			cheeseId: 'cauldron_tier_1_cheese'
		},
		{
			name: 'Pumpkin Hoarder',
			cheese: 'Monterey Jack-O-Lantern',
			cheeseId: 'cauldron_tier_1_cheese'
		},
		{
			name: 'Trick',
			cheese: 'Monterey Jack-O-Lantern',
			cheeseId: 'cauldron_tier_1_cheese'
		},
		{
			name: 'Treat',
			cheese: 'Monterey Jack-O-Lantern',
			cheeseId: 'cauldron_tier_1_cheese'
		},
		{
			name: 'Wild Chainsaw',
			cheese: 'Monterey Jack-O-Lantern',
			cheeseId: 'cauldron_tier_1_cheese'
		},
		{
			name: 'Maize Harvester',
			cheese: 'Monterey Jack-O-Lantern',
			cheeseId: 'cauldron_tier_1_cheese'
		},
		{
			name: 'Creepy Marionette',
			cheese: 'Bonefort',
			cheeseId: 'cauldron_tier_2_cheese'
		},
		{
			name: 'Dire Lycan',
			cheese: 'Bonefort',
			cheeseId: 'cauldron_tier_2_cheese'
		},
		{
			name: 'Grave Robber',
			cheese: 'Bonefort',
			cheeseId: 'cauldron_tier_2_cheese'
		},
		{
			name: 'Hollowhead',
			cheese: 'Bonefort',
			cheeseId: 'cauldron_tier_2_cheese'
		},
		{
			name: 'Mousataur Priestess',
			cheese: 'Bonefort',
			cheeseId: 'cauldron_tier_2_cheese'
		},
		{
			name: 'Sandmouse',
			cheese: 'Bonefort',
			cheeseId: 'cauldron_tier_2_cheese'
		},
		{
			name: 'Titanic Brain-Taker',
			cheese: 'Bonefort',
			cheeseId: 'cauldron_tier_2_cheese'
		},
		{
			name: 'Tomb Exhumer',
			cheese: 'Bonefort',
			cheeseId: 'cauldron_tier_2_cheese'
		},
		{
			name: 'Admiral Arrrgh',
			cheese: 'Polter-Geitost',
			cheeseId: 'cauldron_tier_3_cheese'
		},
		{
			name: 'Captain Cannonball',
			cheese: 'Polter-Geitost',
			cheeseId: 'cauldron_tier_3_cheese'
		},
		{
			name: 'Ghost Pirate Queen',
			cheese: 'Polter-Geitost',
			cheeseId: 'cauldron_tier_3_cheese'
		},
		{
			name: 'Gourd Ghoul',
			cheese: 'Polter-Geitost',
			cheeseId: 'cauldron_tier_3_cheese'
		},
		{
			name: 'Scorned Pirate',
			cheese: 'Polter-Geitost',
			cheeseId: 'cauldron_tier_3_cheese'
		},
		{
			name: 'Spectral Butler',
			cheese: 'Polter-Geitost',
			cheeseId: 'cauldron_tier_3_cheese'
		},
		{
			name: 'Spectral Swashbuckler',
			cheese: 'Polter-Geitost',
			cheeseId: 'cauldron_tier_3_cheese'
		},
		{
			name: 'Baba Gaga',
			cheese: 'Scream',
			cheeseId: 'cauldron_tier_4_cheese'
		},
		{
			name: 'Bonbon Gummy Globlin',
			cheese: 'Scream',
			cheeseId: 'cauldron_tier_4_cheese'
		},
		{
			name: 'Hollowed',
			cheese: 'Scream',
			cheeseId: 'cauldron_tier_4_cheese'
		},
		{
			name: 'Hollowed Minion',
			cheese: 'Scream',
			cheeseId: 'cauldron_tier_4_cheese'
		},
		{
			name: 'Swamp Thang',
			cheese: 'Scream',
			cheeseId: 'cauldron_tier_4_cheese'
		}
	];

	/**
	 * Add styles to the page.
	 *
	 * @param {string} styles The styles to add.
	 */
	const addStyles = (styles) => {
		const existingStyles = document.getElementById('mh-mouseplace-custom-styles');

		if (existingStyles) {
			existingStyles.innerHTML += styles;
		} else {
			const style = document.createElement('style');
			style.id = 'mh-mouseplace-custom-styles';

			style.innerHTML = styles;
			document.head.appendChild(style);
		}
	};

	/**
	 * Do something when the overlay is shown or hidden.
	 *
	 * @param {Object}   callbacks
	 * @param {Function} callbacks.show   The callback to call when the overlay is shown.
	 * @param {Function} callbacks.hide   The callback to call when the overlay is hidden.
	 * @param {Function} callbacks.change The callback to call when the overlay is changed.
	 */
	const onOverlayChange = (callbacks) => {
		const observer = new MutationObserver(() => {
			if (callbacks.change) {
				callbacks.change();
			}

			if (document.getElementById('overlayBg').classList.length > 0) {
				if (callbacks.show) {
					callbacks.show();
				}
			} else if (callbacks.hide) {
				callbacks.hide();
			}
		});
		observer.observe(
			document.getElementById('overlayBg'),
			{
				attributes: true,
				attributeFilter: ['class']
			}
		);
	};

	/**
	 * Add links to the mouse details on the map.
	 */
	const addCheeseLinks = () => {
		const overlayClasses = document.getElementById('overlayPopup').classList;
		if (! overlayClasses.contains('treasureMapPopup')) {
			return;
		}

		const mapName = document.querySelector('.treasureMapView-mapMenu-rewardName');
		if (! mapName) {
			setTimeout(addCheeseLinks, 500);
			return;
		}

		if (! mapName.innerText) {
			return;
		}

		if (! mapName.innerText.includes('Halloween')) {
			return;
		}

		const mouseIcon = document.querySelectorAll('.treasureMapView-goals-group-goal');
		if (mouseIcon.length === 0) {
			setTimeout(addCheeseLinks, 500);
		}

		mouseIcon.forEach((mouse) => {
			const classes = mouse.classList;
			if (classes.contains('complete')) {
				return;
			}

			const mouseName = mouse.querySelector('.treasureMapView-goals-group-goal-name span');
			if (! (mouseName && mouseName.textContent)) {
				return;
			}

			const mouseContainer = mouse.querySelector('.treasureMapView-goals-group-goal-name');
			if (! mouseContainer) {
				return;
			}

			// grab the data outof the micecheese array
			const mouseData = miceCheeses.find((mouseCheese) => mouseCheese.name === mouseName.textContent);
			if (! mouseData) {
				return;
			}

			// add in a button and a background color
			const mouseButton = document.createElement('a');
			mouseButton.classList.add('mh-halloween-cheese-selector');

			const currentCheese = user.bait_item_id; // eslint-disable-line no-undef
			if (cheeseIdToId[ mouseData.cheeseId ] === currentCheese) {
				mouseButton.textContent = `${ mouseData.cheese } equipped`;
			} else {
				mouseButton.textContent = `Equip ${ mouseData.cheese }`;
			}

			const parent = mouseContainer.parentNode.parentNode;
			parent.classList.add('mh-halloween-cheese-' + mouseData.cheeseId);

			parent.addEventListener('click', () => {
				hg.utils.TrapControl.setBait(mouseData.cheeseId); // eslint-disable-line no-undef
				hg.utils.TrapControl.go(); // eslint-disable-line no-undef

				const close = document.getElementById('jsDialogClose');
				if (close) {
					close.click();
				}
			});

			mouseContainer.appendChild(mouseButton);
		});
	};

	addStyles(`.treasureMapView.event.halloween_treat_2021 .treasureMapView-goals-groups div:nth-child(2),
	.treasureMapView.event.halloween_trick_2021 .treasureMapView-goals-groups div:nth-child(2) {
		display: grid;
    	grid-template-columns: repeat(2, 1fr);
		padding: 1em;
	}

	.treasureMapView.event.halloween_treat_2021 .treasureMapView-highlight .treasureMapView-goals-groups div:nth-child(2),
	.treasureMapView.event.halloween_trick_2021 .treasureMapView-highlight .treasureMapView-goals-groups div:nth-child(2) {
		display: block;
	}

	.treasureMapView.event.halloween_treat_2021 .treasureMapView-block-content .treasureMapView-goals-group-goal,
	.treasureMapView.event.halloween_trick_2021 .treasureMapView-block-content .treasureMapView-goals-group-goal {
		width: 90%;
		cursor: initial;
	}

	.treasureMapView.event.halloween_treat_2021 .treasureMapView-goals-group-goal:hover:before,
	.treasureMapView.event.halloween_trick_2021 .treasureMapView-goals-group-goal:hover:before {
		background-color: transparent;
		left: 0;
		right: -2px;
	}

	.treasureMapView.event.halloween_treat_2021 .treasureMapView-block-content .treasureMapView-goals-group-goal-padding .treasureMapView-goals-group-goal-name,
	.treasureMapView.event.halloween_trick_2021 .treasureMapView-block-content .treasureMapView-goals-group-goal-padding .treasureMapView-goals-group-goal-name {
		display: flex;
		flex-direction: column;
	}

	.treasureMapView.event.halloween_treat_2021 .treasureMapView-goals-group-goal:hover:before,
	.treasureMapView.event.halloween_trick_2021 .treasureMapView-goals-group-goal:hover:before {
		box-shadow: 0 0 0 1px #646363;
		left: 0;
		right: 0;
		top: 0;
		bottom: 0;
	}

	.mh-halloween-cheese-selector {
		margin-top: 0.5em;
	}

	.mh-halloween-cheese-cauldron_tier_1_cheese {
		background-color: #ffaa4c !important;
		border-radius: 5px;
	}

	.mh-halloween-cheese-cauldron_tier_2_cheese {
		background-color: #eac2d1 !important;
		border-radius: 5px;
	}

	.mh-halloween-cheese-cauldron_tier_3_cheese {
		background-color: #cfeaec !important;
		border-radius: 5px;
	}

	.mh-halloween-cheese-cauldron_tier_4_cheese {
		background-color: #b5d652 !important;
		border-radius: 5px;
	}`);

	onOverlayChange({ show: addCheeseLinks });
}());