Greasy Fork

MH: Profile+

Community requested features for the tabs on your MH profile.

目前为 2024-04-30 提交的版本。查看 最新版本

// ==UserScript==
// @name         MH: Profile+
// @author       Warden Slayer
// @namespace    https://greasyfork.org/en/users/227259-wardenslayer
// @version      1.44
// @description  Community requested features for the tabs on your MH profile.
// @grant        GM_xmlhttpRequest
// @icon         https://www.mousehuntgame.com/images/items/weapons/974151e440f297f1b6d55385310ac63c.jpg?cv=2
// @include      https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js
// @include      http://www.mousehuntgame.com/*
// @include      https://www.mousehuntgame.com/*
// @connect      http://www.mousehuntgame.com/*
// @connect      https://www.mousehuntgame.com/*
// @grant GM_setClipboard
// ==/UserScript==
//
$(document).ready(function() {
	const debug = localStorage.getItem('ws.debug');
	if (debug == true) {
		console.log('Profile+ Started');
	}
	localStorage.setItem('ws.pfp.sortUorD', 'down');
	loadFunction();

	addStyles(`#tipButton {
        position: absolute;
        top: 3px;
        right: 150px;
        float: right;
    }`);
});

function loadFunction() {
	if ($('.mousehuntHud-page-tabHeader.kings_crowns').hasClass('active')) {
		//On king's crowns tab
		generateCrowns();
	} else if ($('.mousehuntHud-page-tabHeader.items').hasClass('active')) {
		//On item tab
		manageCollected();
	} else if ($('.mousehuntHud-page-tabHeader.profile').hasClass('active')) {
		//On profile tab
		generateProfile();
	} else if ($('.mousehuntHud-page-tabHeader.mice').hasClass('active')) {
		//On mouse Tab
		generateMice();
	} else {
		return false;
	}
}

$(document).ajaxComplete(function(event, xhr, options) {
	if (
		options.url ==
		'https://www.mousehuntgame.com/managers/ajax/users/userData.php'
	) {} else if (
		options.url ==
		'https://www.mousehuntgame.com/managers/ajax/users/userInventory.php'
	) {} else {
		loadFunction();
	}
});

function addStyles(css) {
	// Check to see if the existing element exists.
	const existingStyles = document.getElementById('ws-profile-plus-styles');

	// If so, append our new styles to the existing element.
	if (existingStyles) {
		existingStyles.innerHTML += css;
		return;
	}

	const style = document.createElement('style');
	style.id = 'ws-profile-plus-styles';
	style.innerHTML = css;
	document.head.appendChild(style);
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Profile TAB
//
//
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function generateProfile() {
	//With the mhcc level, an egg, a checkmark, a crown, a star
	const debug = localStorage.getItem('ws.debug');
	let userID = '';
	const myProfileLink = $('.mousehuntHud-shield').attr('href');
	let maybeYourFriend = '';
	let eggMaster = localStorage.getItem('ws.pfp.eggMaster');
	if ($('.userInteractionButtonsView-relationship').get(0)) {
		userID = $('.userInteractionButtonsView-relationship').attr(
			'data-recipient-snuid'
		);
		maybeYourFriend = userID;
	} else if (myProfileLink) {
		if (myProfileLink.search('snuid=') == -1) {
			if (debug == true) {
				console.log('Your SNUID Not Found', myProfileLink);
			}
			return false;
		} else {
			userID = myProfileLink.split('snuid=')[1].split('&tab=')[0];
		}
	} else {
		if (debug == true) {
			console.log('SNUID Not Found', myProfileLink, userID);
		}
		return false;
	}
	localStorage.setItem('ws.pfp.eggMaster', '');
	const dataItemOfInterest = ['is_egg_master', 'not_a_real_field'];
	hg.utils.User.getUserData([userID], dataItemOfInterest, function(data) {
		eggMaster = localStorage.setItem('ws.pfp.eggMaster', data[0].is_egg_master);
	});
	setTimeout(flexEggMaster, 1000);
	if (debug == true) {
		console.log('Profile Tab', userID, eggMaster);
	}
	//stop the silly hyperlink on the hunter ID
	const hunterID = $('.hunterInfoView-idCardBlock-secondaryHeader').children();
	hunterID.removeAttr('href').removeAttr('onclick');
	//
	//tipping/misc
	if (maybeYourFriend) {
		const yourFriendsProfile = $('.friendsPage-friendRow-content');
		if ($('#tipButton').get(0)) {
			return false;
		} else {
			const tipButton = document.createElement('button');
			tipButton.id = 'tipButton';
			tipButton.title = 'Tip this hunter 10 SB+';
			tipButton.classList.add('mousehuntActionButton', 'tiny');

			const tipButtonText = document.createElement('span');
			tipButtonText.innerHTML = 'Tip 10 SB+';

			tipButton.appendChild(tipButtonText);
			yourFriendsProfile.prepend(tipButton);
		}
	} else if ($('.friendsProfileView-selfStats').get(0)) {
		const randomFriend = $('.friendsProfileView-randomFriend');
		const randoSNUID = randomFriend
			.attr('href')
			.split('snuid=')[1]
			.split('&tab=')[0];
		hg.utils.User.getUserData(
			[randoSNUID],
			['not_a_real_field'],
			function(data) {
				randomFriend.text('Visit Random Friend (' + data[0].name + ')');
			}
		);
	}
}

function flexEggMaster() {
	const eggMaster = localStorage.getItem('ws.pfp.eggMaster');
	if (eggMaster == 'true') {
		if ($('.eggMasterIcon').length > 0) return;
		const hunterID = $('.friendsPage-friendRow-titleBar');
		const eggMasterIcon = document.createElement('div');
		eggMasterIcon.classList.add('eggMasterIcon');
		$(eggMasterIcon).attr('title', 'Is an Egg Master');
		$(eggMasterIcon).css({
			'background-size': '25px 25px',
			'background-image': "url('https://www.mousehuntgame.com/images/items/convertibles/transparent_thumb/3ada6ff18f89d020908e35fee2de7a45.png')",
			width: '25px',
			height: '25px',
			float: 'right',
			'margin-right': '7px',
		});
		hunterID.append(eggMasterIcon);
	}
}

$(document).on('click', '#tipButton', function() {
	const debug = localStorage.getItem('ws.debug');
	const receivingHunter = $('.userInteractionButtonsView-relationship').attr(
		'data-recipient-snuid'
	);
	const receivingName = $('.friendsPage-friendRow-titleBar-name').attr(
		'data-text'
	);
	const sendingHunter = user.unique_hash;
	const url =
		'https://www.mousehuntgame.com/managers/ajax/users/supplytransfer.php?/sn=Hitgrab&hg_is_ajax=1&receiver=' +
		receivingHunter +
		'&uh=' +
		sendingHunter +
		'&item=super_brie_cheese&item_quantity=10';
	GM_xmlhttpRequest({
		method: 'POST',
		url: url,
		onload: function(response) {
			if (debug == true) {
				console.log('Tip Sent', receivingName, receivingHunter);
			}
			alert('10 SB+ sent to ' + receivingName);
		},
		onerror: function(response) {
			if (debug == true) {
				console.log('Tip No Good, Error', receivingName, receivingHunter, url);
			}
			alert('Error, nothing sent');
		},
	});
});

$(document).on(
	'click',
	'.hunterInfoView-idCardBlock-secondaryHeader',
	function() {
		const debug = localStorage.getItem('ws.debug');
		const copiedID = $('.hunterInfoView-hunterId').find('span').text();
		if (debug == true) {
			console.log('ID Copied', copiedID);
		}
		GM_setClipboard(copiedID);
	}
);

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Mouse TAB
//
//
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
function sumCategoryStats(category) {
	const categoryName = $(category).find('.mouseListView-categoryContent-name');
	const categoryTest = $(category).find(
		'.mouseListView-categoryContent-description'
	);
	let categoryCatches = 0;
	let categoryMisses = 0;
	const categoryMice = $(category).find(
		'.mouseListView-categoryContent-subgroup-mouse.stats:not(.header)'
	);
	categoryMice.each(function(i) {
		const thisCatches = parseInt(
			$(this).find('.catches').text().replace(',', ''),
			10
		);
		const thisMisses = parseInt(
			$(this).find('.misses').text().replace(',', ''),
			10
		);
		categoryCatches += thisCatches;
		categoryMisses += thisMisses;
	});
	const categoryTotal = categoryCatches + categoryMisses;
	let categoryStats = $(category).find('.categoryStats');
	if ($(categoryStats).length > 0) {} else {
		categoryStats = document.createElement('div');
		categoryStats.classList.add('categoryStats');
		$(categoryStats).insertAfter(categoryTest);
	}
	$(categoryStats).text(
		'Category Stats [Catches: ' +
		categoryCatches.toLocaleString() +
		', Misses: ' +
		categoryMisses.toLocaleString() +
		', Total: ' +
		categoryTotal.toLocaleString() +
		']'
	);
	$(categoryStats).css({
		fontSize: '16px',
		'margin-top': '3px',
	});
}

function generateMice() {
	const allMice = $(
		'.mouseListView-categoryContent-subgroup-mouse.stats:not(.header)'
	);
	const statsHeader = $(
		'.mouseListView-categoryContent-subgroup-mouse.stats.header'
	);
	allMice.each(function(i) {
		const thisThumb = $(this).find(
			'.mouseListView-categoryContent-subgroup-mouse-thumb'
		);
		const thisCatches = parseInt(
			$(this).find('.catches').text().replace(',', ''),
			10
		);
		const thisMisses = parseInt(
			$(this).find('.misses').text().replace(',', ''),
			10
		);
		const thisCrown = setCrownBorder(thisThumb, thisCatches);
	});
	$(statsHeader).css({
		cursor: 'pointer',
	});
	$('.mouseListView-categoryContent-subgroup-mouse.stats.header').on(
		'click',
		'.mouseListView-categoryContent-subgroup-mouse-stats',
		function() {
			SortMice(this);
		}
	);
	const theseCategories = $(
		'.mouseListView-categoryContent-category.all.active'
	);
	theseCategories.each(function(i) {
		sumCategoryStats(this);
	});
}

function SortMice(sortBy) {
	const sortUorD = localStorage.getItem('ws.pfp.sortUorD');
	let sortKey = '';
	if ($(sortBy).hasClass('name')) {
		sortKey = '.name';
	} else if ($(sortBy).hasClass('catches')) {
		sortKey = '.catches';
	} else if ($(sortBy).hasClass('misses')) {
		sortKey = '.misses';
	} else if ($(sortBy).hasClass('average_weight')) {
		sortKey = '.average_weight';
	} else if ($(sortBy).hasClass('heaviest_catch')) {
		sortKey = '.heaviest_catch';
	}
	if (sortUorD == 'up') {
		sortMiceBy(sortKey, 'down');
		localStorage.setItem('ws.pfp.sortUorD', 'down');
	} else {
		sortMiceBy(sortKey, 'up');
		localStorage.setItem('ws.pfp.sortUorD', 'up');
	}
}

function setCrownBorder(thumb, catches, expanded) {
	let top = '';
	let bottom = '';
	let crown = 'n';
	if (catches >= 2500) {
		top = '#c4eae6';
		bottom = '#63b9cf';
		crown = 'd';
	} else if (catches >= 1000) {
		top = '#9191ff';
		bottom = '#1d1781';
		crown = 'p';
	} else if (catches >= 500) {
		top = '#ffe589';
		bottom = '#b67800';
		crown = 'g';
	} else if (catches >= 100) {
		top = '#d1d7e9';
		bottom = '#66718b';
		crown = 's';
	} else if (catches >= 10) {
		top = '#f0c693';
		bottom = '#8d4823';
		crown = 'b';
	} else {
		//no crown
		top = '#ab9f92';
		bottom = '#251B0A';
	}
	let background = '';
	if (expanded === 'C') {
		background = '#c1d5e0';
	} else {
		background = '#fafafa';
	}
	$(thumb).css({
		cursor: 'pointer',
		'background-color': background,
		'border-style': 'solid',
		'border-width': '4px',
		'border-radius': '4px',
		'border-top-color': top,
		'border-left-color': top,
		'border-bottom-color': bottom,
		'border-right-color': bottom,
	});
	return crown;
}

function sortMiceBy(key, UD) {
	let activeGrouping = $(
		'.mousehuntHud-page-subTabContent.active[data-template-file="AdversariesPage"]'
	);
	let activeSubGroup = '';
	if (
		$('.mouseListView-categoryContent-category.active.hasFilter.caught')
		.length > 0
	) {
		activeSubGroup = $(activeGrouping).find(
			'.mouseListView-categoryContent-category.active.hasFilter.caught'
		);
	} else if (
		$('.mouseListView-categoryContent-category.active.hasFilter.uncaught')
		.length > 0
	) {
		activeSubGroup = $(activeGrouping).find(
			'.mouseListView-categoryContent-category.active.hasFilter.uncaught'
		);
	} else {
		activeSubGroup = $(activeGrouping).find(
			'.mouseListView-categoryContent-category.all.active'
		);
	}
	const mouseContainer = $(activeSubGroup).find(
		'.mouseListView-categoryContent-subgroupContainer'
	);
	const allMice = $(activeSubGroup).find(
		'.mouseListView-categoryContent-subgroup-mouse.stats:not(.header)'
	);
	$(allMice)
		.sort(function(a, b) {
			if (key == '.name') {
				a = $(a).find(key).text();
				b = $(b).find(key).text();
			} else if (key == '.catches' || key == '.misses') {
				a = parseInt($(a).find(key).text().replace(',', ''), 10);
				b = parseInt($(b).find(key).text().replace(',', ''), 10);
			} else if (key == '.average_weight' || key == '.heaviest_catch') {
				a = parseUntits($(a).find(key).text());
				b = parseUntits($(b).find(key).text());
			}
			if (UD == 'up' && a > b) {
				return -1;
			} else if (UD == 'up' && a < b) {
				return 1;
			} else if (UD == 'down' && a < b) {
				return -1;
			} else if (UD == 'down' && a > b) {
				return 1;
			}
		})
		.appendTo(mouseContainer);
}

function parseUntits(unitString) {
	let oz = 0;
	const rawNumArray = unitString
		.replace(' lb. ', ',')
		.replace(' oz.', '')
		.split(',');
	if (rawNumArray.length == 1) {
		oz = parseInt(rawNumArray[0], 10);
	} else {
		oz = 16 * parseInt(rawNumArray[0], 10) + parseInt(rawNumArray[1], 10);
	}
	return oz;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Crowns TAB
//
//
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function generateCrowns() {
	const debug = localStorage.getItem('ws.debug');
	if (debug == true) {
		console.log(
			'Crowns Tab',
			localStorage.getItem('Lock Favorites'),
			localStorage.getItem('ShowCommunityRanks')
		);
	}
	buildToolbar();
	decorate();
	if (
		localStorage.getItem('Lock Favorites') == 'Y' &&
		$('.mouseCrownsView-group-mouse-favouriteButton').length > 0
	) {
		lockFavorites();
	}
	if (localStorage.getItem('ShowCommunityRanks') == 'Y') {
		hg.utils.MouseUtil.getMouseNames(function(data) {
			const numMice = Object.keys($(data)[0]).length - 2;
			localStorage.setItem('ws.mh.pfp.numMice', numMice);
			if (debug == true) {
				console.log('Total Mice', numMice);
			}
			showCommunityRanks();
		});
	}
	if (localStorage.getItem('ShowPowerCrowns') == 'Y') {
		showPowerCrowns();
	}
}

function buildToolbar() {
	if ($('.toolBar').length > 0) return;
	const toolBar = document.createElement('div');
	toolBar.classList.add('toolBar');

	// Lock Favs CB
	const lockFavs = document.createElement('input');
	lockFavs.type = 'checkbox';
	lockFavs.name = 'lockFavs';
	lockFavs.value = '';
	lockFavs.id = 'lockFavs';
	if (localStorage.getItem('LockFavs') == 'Y') {
		lockFavs.checked = 'Yes';
	} else {
		lockFavs.checked = '';
	}

	const lockFavsLabel = document.createElement('label');
	lockFavsLabel.htmlFor = 'lockFavsLabel';
	lockFavsLabel.appendChild(document.createTextNode('Lock Favorites'));
	if ($('.mouseCrownsView-group-mouse-favouriteButton').length > 0) {
		toolBar.appendChild(lockFavs);
		toolBar.appendChild(lockFavsLabel);
	}
	// Community Ranks CB
	const communityRanks = document.createElement('input');
	communityRanks.type = 'checkbox';
	communityRanks.name = 'communityRanks';
	communityRanks.value = '';
	communityRanks.id = 'communityRanks';
	communityRanks.checked = '';
	if (localStorage.getItem('ShowCommunityRanks') == 'Y') {
		communityRanks.checked = 'Yes';
	} else {
		communityRanks.checked = '';
	}
	const communityRanksLabel = document.createElement('label');
	communityRanksLabel.htmlFor = 'communityRanksLabel';
	communityRanksLabel.appendChild(
		document.createTextNode('Show Crown Summary  ')
	);
	toolBar.appendChild(communityRanks);
	toolBar.appendChild(communityRanksLabel);
	// Power Crowns CB
	const powerCrowns = document.createElement('input');
	powerCrowns.type = 'checkbox';
	powerCrowns.name = 'powerCrowns';
	powerCrowns.value = '';
	powerCrowns.id = 'powerCrowns';
	powerCrowns.checked = '';
	if (localStorage.getItem('ShowPowerCrowns') == 'Y') {
		powerCrowns.checked = 'Yes';
	} else {
		powerCrowns.checked = '';
	}
	const powerCrownsLabel = document.createElement('label');
	powerCrownsLabel.htmlFor = 'powerCrownsLabel';
	powerCrownsLabel.appendChild(document.createTextNode('Show Power Crowns  '));
	toolBar.appendChild(powerCrowns);
	toolBar.appendChild(powerCrownsLabel);
	//Copy Crown Button
	const copyCrownsButton = document.createElement('button');
	copyCrownsButton.id = 'copyCrownsButton';
	if ($('.mouseCrownsView-group-mouse-favouriteButton').length > 0) {
		copyCrownsButton.addEventListener('click', copyMyCrowns);
	} else {
		copyCrownsButton.addEventListener('click', copyCrowns);
	}
	$(copyCrownsButton).attr('title', 'Copy Crowns to Clipboard');
	toolBar.appendChild(copyCrownsButton);
	$(copyCrownsButton).css({
		cursor: 'pointer',
		'border-style': 'solid',
		'border-color': 'grey',
		'border-width': '2px',
		'background-image': "url('https://cdn3.iconfinder.com/data/icons/files-folders-line/100/copy-512.png')",
		'background-repeat': 'no-repeat',
		'background-size': 'contain',
		width: '35px',
		height: '35px',
	});
	// Last
	let crownBreak = $('.mouseCrownsView-group.favourite').css({
		'margin-bottom': '40px',
	});
	crownBreak.append(toolBar);
	$('.toolBar').css({
		float: 'right',
	});
}

/********** Lock Favs **********/
$(document).on('change', '#lockFavs', function() {
	if (
		window.location.href.includes('profile.php') &&
		$('.mousehuntHud-page-tabHeader.kings_crowns').hasClass('active')
	) {
		// Check to see if the cb was JUST checked
		if (this.checked) {
			// Put the checked value into storage
			localStorage.setItem('LockFavs', 'Y');
			lockFavs.checked = 'Yes';
			lockFavorites();
		} else {
			// Put the checked value into storage
			localStorage.setItem('LockFavs', 'N');
			lockFavs.checked = '';
			unlockFavorites();
		}
	}
});

function lockFavorites() {
	localStorage.setItem('Lock Favorites', 'Y');
	if ($('.mouseCrownsView-group-mouse-favouriteButton').length < 0) {
		localStorage.setItem('LockFavs', 'N');
		lockFavs.checked = '';
		return;
	}
	const allMice = $('.mouseCrownsView-group-mouse').find(
		'.mouseCrownsView-group-mouse-favouriteButton'
	);
	allMice.css('pointer-events', 'none');
}

function unlockFavorites() {
	localStorage.setItem('Lock Favorites', 'N');
	const allMice = $('.mouseCrownsView-group-mouse').find(
		'.mouseCrownsView-group-mouse-favouriteButton'
	);
	allMice.css('pointer-events', 'auto');
	$('.mouseCrownsView-crown.favourite').css({
		'background-image': "url('https://www.mousehuntgame.com/images/ui/camp/trap/star_favorite.png')",
		display: 'inline-block',
		'vertical-align': 'middle',
		width: '50px',
		height: '50px',
		'margin-right': '5px',
		'background-repeat': 'no-repeat',
		'background-position': '50% 50%',
		'background-size': 'contain',
	});
}

/********** Community Ranks **********/
$(document).on('change', '#communityRanks', function() {
	if (
		window.location.href.includes('profile.php') &&
		$('.mousehuntHud-page-tabHeader.kings_crowns').hasClass('active')
	) {
		// Check to see if the cb was JUST checked
		if (this.checked) {
			// Put the checked value into storage
			localStorage.setItem('ShowCommunityRanks', 'Y');
			communityRanks.checked = 'Yes';
			showCommunityRanks();
		} else {
			// Put the checked value into storage
			localStorage.setItem('ShowCommunityRanks', 'N');
			communityRanks.checked = '';
			hideCommunityRanks();
		}
	}
});

function showCommunityRanks() {
	const debug = localStorage.getItem('ws.debug');
	const totalMice = localStorage.getItem('ws.mh.pfp.numMice');
	if ($('.mouseCrownsView-group-header.community').length > 0) {
		return;
	}
	const crownBreak = $('.mouseCrownsView-group.favourite');
	const communityCrownHeader = $('.mouseCrownsView-group-header')
		.first()
		.clone();
	communityCrownHeader.addClass('community');
	communityCrownHeader.css({
		//'height': '65px',
		padding: '3px',
		'margin-bottom': '10px',
	});
	communityCrownHeader
		.find('.mouseCrownsView-crown')
		.removeClass('favourite')
		.addClass('community')
		.css({
			'background-image': "url('https://icon-library.com/images/138339.png')",
			'background-repeat': 'no-repeat',
			'background-size': '40px 40px',
		});
	communityCrownHeader.find('.mouseCrownsView-group-header-subtitle');
	communityCrownHeader
		.find('.mouseCrownsView-group-header-name')
		.text('Crown Summary')
		.css({
			'font-weight': 'bold',
		});
	communityCrownHeader.insertAfter(crownBreak);
	const allUncrowned = $('.mouseCrownsView-group.none').find(
		'.mouseCrownsView-group-mouse'
	);
	const allBronze = $(
		'.mouseCrownsView-group.bronze,.mouseCrownsView-group.silver,.mouseCrownsView-group.gold,.mouseCrownsView-group.platinum,.mouseCrownsView-group.diamond'
	).find('.mouseCrownsView-group-mouse');
	const allSilver = $(
		'.mouseCrownsView-group.silver,.mouseCrownsView-group.gold,.mouseCrownsView-group.platinum,.mouseCrownsView-group.diamond'
	).find('.mouseCrownsView-group-mouse');
	const allGold = $(
		'.mouseCrownsView-group.gold,.mouseCrownsView-group.platinum,.mouseCrownsView-group.diamond'
	).find('.mouseCrownsView-group-mouse');
	const allPlat = $(
		'.mouseCrownsView-group.platinum,.mouseCrownsView-group.diamond'
	).find('.mouseCrownsView-group-mouse');
	const allDiamond = $('.mouseCrownsView-group.diamond').find(
		'.mouseCrownsView-group-mouse'
	);
	const bronzeCrowns = allBronze.length;
	const silverCrowns = allSilver.length;
	const goldCrowns = allGold.length;
	const platCrowns = allPlat.length;
	const diamondCrowns = allDiamond.length;
	const uncrowned = totalMice - bronzeCrowns;
	if (debug == true) {
		console.log(
			'Crown Counts',
			uncrowned,
			bronzeCrowns,
			silverCrowns,
			goldCrowns,
			platCrowns,
			diamondCrowns
		);
	}
	const bronzeLink =
		'https://docs.google.com/spreadsheets/d/19_wHCkwiT5M6LS7XNLt4NYny98fjpg4UlHbgOD05ijw/pub?fbclid=IwAR3a1Ku2xTl1mIDksUr8Lk5ORMEnuv7jnvIy9K6OBeziG6AyvYYlZaIQkHY';
	const silverLink =
		'https://docs.google.com/spreadsheets/d/e/2PACX-1vQG5g3vp-q7LRYug-yZR3tSwQzAdN7qaYFzhlZYeA32vLtq1mJcq7qhH80planwei99JtLRFAhJuTZn/pubhtml?fbclid=IwAR3sPXNLloGnFk324a0HShroP1E-sNcnQBlRTjJ7gScWTWosqmXv5InB_Ns';
	const goldLink =
		'https://docs.google.com/spreadsheets/d/10OGD5OYkGIEAbiez7v92qU5Fdul0ZtCRgEjlECkwZJE/pubhtml?gid=478731024&single=true&fbclid=IwAR28w7IQyMp91I62CR3GOILpbeLwgKaydIoQimMNm7j3S0DL8Mj_IsRpGD4';
	const rankSummary = $("<div class='rank summary'</div>");
	rankSummary.css({
		'font-size': '11.75px',
	});
	communityCrownHeader.append(rankSummary);
	const uncrownedText = document.createTextNode(
		'Uncrowned: ' +
		uncrowned +
		' (' +
		((uncrowned / totalMice) * 100).toFixed(2) +
		'%) | '
	);
	$(rankSummary).attr('title', 'Mobster and Leprechaun excluded from counts');
	const bronzeText = document.createTextNode(
		'Bronze: ' +
		bronzeCrowns +
		' (' +
		((bronzeCrowns / totalMice) * 100).toFixed(2) +
		'%) | '
	);
	const silverText = document.createTextNode(
		'Silver: ' +
		silverCrowns +
		' (' +
		((silverCrowns / totalMice) * 100).toFixed(2) +
		'%) | '
	);
	const goldText = document.createTextNode(
		'Gold: ' +
		goldCrowns +
		' (' +
		((goldCrowns / totalMice) * 100).toFixed(2) +
		'%) | '
	);
	const platText = document.createTextNode(
		'Platinum: ' +
		platCrowns +
		' (' +
		((platCrowns / totalMice) * 100).toFixed(2) +
		'%) | '
	);
	const diamondText = document.createTextNode(
		'Diamond: ' +
		diamondCrowns +
		' (' +
		((diamondCrowns / totalMice) * 100).toFixed(2) +
		'%)'
	);
	const aBronze = document.createElement('a');
	aBronze.appendChild(bronzeText);
	aBronze.title = '90% Crowned Scoreboard';
	aBronze.href = bronzeLink;
	$(aBronze).attr('target', '_blank');
	const aSilver = document.createElement('a');
	aSilver.appendChild(silverText);
	aSilver.title = 'MHCC Scoreboard';
	aSilver.href = silverLink;
	$(aSilver).attr('target', '_blank');
	const aGold = document.createElement('a');
	aGold.appendChild(goldText);
	aGold.title = 'MHCC Elite Scoreboard';
	aGold.href = goldLink;
	$(aGold).attr('target', '_blank');
	$(rankSummary)
		.append(uncrownedText)
		.append(aBronze)
		.append(aSilver)
		.append(aGold)
		.append(platText)
		.append(diamondText);
}

function hideCommunityRanks() {
	if ($('.mouseCrownsView-group-header.community').length > 0) {
		$('.mouseCrownsView-group-header.community').remove();
	}
}

/********** Power Crowns **********/
$(document).on('change', '#powerCrowns', function() {
	if (
		window.location.href.includes('profile.php') &&
		$('.mousehuntHud-page-tabHeader.kings_crowns').hasClass('active')
	) {
		if (this.checked) {
			localStorage.setItem('ShowPowerCrowns', 'Y');
			powerCrowns.checked = 'Yes';
			decorate();
			showPowerCrowns();
		} else {
			localStorage.setItem('ShowPowerCrowns', 'N');
			powerCrowns.checked = '';
			hidePowerCrowns();
		}
	}
});

function populatePowerCrowns(mouse) {
	const mouseName = $(mouse).find('.mouseCrownsView-group-mouse-name').text();
	if (mouseName == '-- Empty --') {
		return false;
	}
	let powerType = getMousePowerType(mouseName);
	let icon = 'https://www.mousehuntgame.com/images/powertypes/parental.png';
	let iconClass = '';
	if (powerType == 'normal') {
		powerType = 'multi';
		iconClass = 'pt ' + powerType;
	} else if (powerType == 'event') {
		iconClass = 'pt event';
		icon =
			'https://www.mousehuntgame.com/images/items/skins/73c91f2016a313406553794587625e24.jpg';
	} else if (powerType == 'prize') {
		iconClass = 'pt prize';
		icon =
			'https://www.mousehuntgame.com/images/items/convertibles/80cf614cbec2ec3d739502bd45c93ab3.gif?cv=2';
	} else {
		icon =
			'https://www.mousehuntgame.com/images/powertypes/' + powerType + '.png';
		iconClass = 'pt ' + powerType;
	}
	const label = $(mouse).find('.mouseCrownsView-group-mouse-label');
	if ($(label).find('img').length > 0) {} else {
		$(label).append(
			$('<img>', {
				class: iconClass,
				src: icon,
				title: powerType,
			})
		);
		$(label).find('img').css({
			width: '17.5px',
			height: '17.5px',
			'margin-left': '1px',
		});
	}
}

function showPowerCrowns() {
	const debug = localStorage.getItem('ws.debug');
	localStorage.setItem('ws.mh.pfp.ptProps', JSON.stringify({}));
	if ($('.mouseCrownsView-group-header.powerCrown').length > 0) {
		return;
	}
	let crownBreak = $('.mouseCrownsView-group.favourite');
	if ($('.mouseCrownsView-group-header.community').length > 0) {
		crownBreak = $('.mouseCrownsView-group-header.community');
	}
	const powerCrownHeader = $('.mouseCrownsView-group-header').first().clone();
	powerCrownHeader.addClass('powerCrown');
	powerCrownHeader
		.find('.mouseCrownsView-crown')
		.removeClass('favourite')
		.addClass('powerCrown')
		.css({
			'background-image': "url('https://icon-library.com/images/off-icon/off-icon-12.jpg')",
			'background-repeat': 'no-repeat',
			'background-size': '40px 40px',
		});
	powerCrownHeader.find('.mouseCrownsView-group-header-subtitle');
	powerCrownHeader
		.find('.mouseCrownsView-group-header-name')
		.text('Power Crowns')
		.css({
			'font-weight': 'bold',
		});
	powerCrownHeader.insertAfter(crownBreak);
	const ptBtnGroup = $("<div class='btn-group' id='powerTypeBtns'></div>");
	const powerTypes = [
		'arcane',
		'draconic',
		'forgotten',
		'hydro',
		'law',
		'physical',
		'rift',
		'shadow',
		'tactical',
		'parental',
		'event',
		'prize',
	];
	powerTypes.forEach(function(type, index) {
		const thisBtn = document.createElement('button');
		let icon = '';
		let title = type;
		let masterText = '';
		if (type == 'parental') {
			$(thisBtn).addClass('ptbtn multi');
			icon = 'https://www.mousehuntgame.com/images/powertypes/' + type + '.png';
			title = 'multi';
			masterText = 'Master of Multi!';
		} else if (type == 'event') {
			$(thisBtn).addClass('ptbtn ' + type);
			icon =
				'https://www.mousehuntgame.com/images/items/skins/73c91f2016a313406553794587625e24.jpg';
			masterText = 'Master of Events!';
		} else if (type == 'prize') {
			$(thisBtn).addClass('ptbtn ' + type);
			icon =
				'https://www.mousehuntgame.com/images/items/convertibles/80cf614cbec2ec3d739502bd45c93ab3.gif?cv=2';
			masterText = 'Master of Cheating because this is impossible :/';
		} else {
			$(thisBtn).addClass('ptbtn ' + type);
			icon = 'https://www.mousehuntgame.com/images/powertypes/' + type + '.png';
			masterText =
				'Master of ' + type.charAt(0).toUpperCase() + type.substring(1) + '!';
		}
		const powerTypeData = getPowerTypeTotals(type);
		const powerTypeIcon = $('<img>', {
			src: icon,
			title: title,
			width: '35',
			height: '35',
		});
		$(thisBtn).append(powerTypeIcon);
		//
		const countText = document.createElement('div');
		$(countText).append(powerTypeData[0]);
		//
		if (powerTypeData[2]) {
			const masterBtn = $('<img>', {
				src: 'https://www.mousehuntgame.com/images/ui/crowns/crown_silver.png?asset_cache_version=2',
				title: masterText,
			});
			$(thisBtn).append(masterBtn);
			$(masterBtn).css({
				position: 'relative',
				top: '-12px',
				left: '-5px',
				float: 'right',
			});
			$(powerTypeIcon).css({
				position: 'relative',
				top: '0px',
				left: '-5px',
			});
			$(countText).css({
				float: 'left',
				position: 'relative',
				top: '-12px',
				left: '0px',
				width: '100%',
			});
		} else {
			const percentText = document.createElement('div');
			$(percentText).append(powerTypeData[1]);
			$(percentText).css({
				position: 'relative',
				top: '-35px',
				left: '40px',
				width: '55%',
			});
			$(thisBtn).append(percentText);
			$(powerTypeIcon).css({
				position: 'relative',
				left: '-40px',
			});
			$(countText).css({
				position: 'relative',
				top: '-20px',
				left: '0px',
				width: '100%',
			});
		}
		$(thisBtn).append(countText);
		$(thisBtn).css({
			cursor: 'pointer',
			'background-color': '#008CBA',
			'border-radius': '4px',
			'font-size': '16px',
			padding: '7.5px 2.5px',
			height: '67.5px',
			width: '16.666666666666666666%',
		});
		$(thisBtn).on('click', function() {
			let ptProps = JSON.parse(localStorage.getItem('ws.mh.pfp.ptProps'));
			const type = $(this).attr('class').replace('ptbtn ', '');
			let allMice = $('.mouseCrownsView-group:not(.favourite)').find('.pt');
			$(allMice).parent().parent().parent().show();
			if (ptProps[type] == 'Show') {
				Object.keys(ptProps).forEach((e) => (ptProps[e] = 'Show'));
				ptBtnGroup.find('button').css({
					'border-color': 'black',
				});
				ptProps[type] = 'All';
			} else {
				Object.keys(ptProps).forEach((e) => (ptProps[e] = 'Hide'));
				ptBtnGroup.find('button').not(this).css({
					'border-color': 'black',
				});
				$(this).css({
					'border-color': '#f44336',
				});
				ptProps[type] = 'Show';
				$(allMice)
					.not('.pt.' + type)
					.parent()
					.parent()
					.parent()
					.hide();
			}
			localStorage.setItem('ws.mh.pfp.ptProps', JSON.stringify(ptProps));
		});
		$(ptBtnGroup).append(thisBtn);
	});
	powerCrownHeader.append(ptBtnGroup);
}

function getPowerTypeTotals(type) {
	const debug = localStorage.getItem('ws.debug');
	if (type == 'parental') {
		type = 'multi';
	}
	const totalMice = {
		arcane: 78,
		draconic: 37,
		forgotten: 87,
		hydro: 189,
		law: 68,
		physical: 79,
		rift: 142,
		shadow: 91,
		tactical: 106,
		multi: 138,
		event: 168,
		prize: 2,
	};
	const num = $(
		'.mouseCrownsView-group:not(.favourite):not(.none):not(.bronze)'
	).find('.pt.' + type).length;
	const percent = ((num / totalMice[type]) * 100).toFixed(2);
	let result = [];
	result.push('' + num + ' of ' + totalMice[type]);
	if (num == totalMice[type]) {
		result.push('isMaster');
	}
	result.push(' ' + percent + '% ');
	if (debug == true) {
		console.log(type, num, percent, result);
	}
	return result;
}

$(document).on(
	'click',
	'.mouseCrownsView-group-header.powerCrown',
	function(e) {
		const eventTarget = $(e.target).attr('class');
		const btnGroup = $(this).find('.btn-group');
		if (e.target === e.currentTarget) {
			btnGroup.toggle();
		} else if (eventTarget === 'mouseCrownsView-crown powerCrown') {
			btnGroup.toggle();
		} else if (eventTarget === 'mouseCrownsView-group-header-name') {
			btnGroup.toggle();
		}
	}
);

function getMousePowerType(mouseName) {
	const miceMap = {
		'Abominable Snow': 'normal',
		'Absolute Acolyte': 'rift',
		Acolyte: 'forgotten',
		'Admiral Arrrgh': 'event',
		'Admiral Cloudbeard': 'normal',
		Aether: 'tactical',
		Aged: 'physical',
		'Agent M': 'law',
		'Agitated Gentle Giant': 'rift',
		Alchemist: 'hydro',
		Alnilam: 'tactical',
		Alnitak: 'hydro',
		'Alpha Weremouse': 'shadow',
		'Amplified Brown': 'rift',
		'Amplified Grey': 'rift',
		'Amplified White': 'rift',
		'Ancient of the Deep': 'hydro',
		'Ancient Scribe': 'forgotten',
		Angelfish: 'hydro',
		Angler: 'hydro',
		'Angry Aphid': 'tactical',
		'Angry Train Staff': 'law',
		Aquos: 'shadow',
		'Arcana Overachiever': 'arcane',
		'Arcane Master Sorcerer': 'arcane',
		'Arcane Summoner': 'arcane',
		'Arch Champion Necromancer': 'rift',
		Archer: 'tactical',
		'Architeuthulhu of the Abyss': 'hydro',
		'Aristo-Cat Burglar': 'law',
		'Armored Archer': 'rift',
		'Artillery Commander': 'arcane',
		'Ascended Elder': 'rift',
		'Ash Golem': 'forgotten',
		Assassin: 'tactical',
		'Assassin Beast': 'rift',
		'Astrological Astronomer': 'shadow',
		'Audacious Alchemist': 'shadow',
		'Automated Sentry': 'rift',
		'Automated Stone Sentry': 'forgotten',
		Automorat: 'law',
		'Baba Gaga': 'event',
		'Balack the Banished': 'forgotten',
		'Ballroom Blitzers': 'physical',
		Bandit: 'physical',
		Bark: 'hydro',
		Barkshell: 'hydro',
		'Barmy Gunner': 'hydro',
		'Barnacle Beautician': 'hydro',
		'Baroness Von Bean': 'physical',
		'Baroque Dancer': 'physical',
		Barracuda: 'hydro',
		Bartender: 'law',
		Bat: 'shadow',
		'Battering Ram': 'normal',
		'Battle Cleric': 'forgotten',
		Beachcomber: 'hydro',
		Bear: 'tactical',
		'Bearded Elder': 'draconic',
		'Beast Tamer': 'tactical',
		Berserker: 'tactical',
		Berzerker: 'rift',
		Betta: 'hydro',
		'Big Bad Behemoth Burroughs': 'rift',
		'Big Bad Burroughs': 'normal',
		'Bilged Boatswain': 'hydro',
		Biohazard: 'hydro',
		Bionic: 'normal',
		Birthday: 'event',
		'Bitter Grammarian': 'forgotten',
		'Bitter Root': 'normal',
		'Black Diamond Racer': 'event',
		'Black Mage': 'shadow',
		'Black Powder Thief': 'law',
		'Black Widow': 'normal',
		Blacksmith: 'normal',
		'Bloomed Sylvan': 'rift',
		'Bog Beast': 'hydro',
		'Bonbon Gummy Globlin': 'event',
		Bookborn: 'tactical',
		Bookworm: 'shadow',
		'Borean Commander': 'event',
		Bottled: 'hydro',
		'Bottom Feeder': 'hydro',
		'Boulder Biter': 'rift',
		'Bounty Hunter': 'law',
		Brawny: 'rift',
		Breakdancer: 'event',
		'Breeze Borrower': 'normal',
		Briegull: 'hydro',
		Brimstone: 'shadow',
		'Broomstick Bungler': 'arcane',
		'Brothers Grimmaus': 'forgotten',
		Brown: 'normal',
		Bruticle: 'hydro',
		'Bruticus the Blazing': 'draconic',
		Buccaneer: 'hydro',
		Buckethead: 'event',
		'Budrich Thornborn': 'physical',
		Builder: 'event',
		'Bulwark of Ascent': 'rift',
		Burglar: 'law',
		'Burly Bruiser': 'draconic',
		'Cabin Boy': 'hydro',
		'Cagey Countess': 'physical',
		Calalilly: 'hydro',
		Calligraphy: 'event',
		Camoflower: 'hydro',
		Camofusion: 'hydro',
		'Candy Cane': 'event',
		'Candy Cat': 'event',
		'Candy Goblin': 'event',
		Cannonball: 'law',
		Captain: 'hydro',
		'Captain Cannonball': 'event',
		'Captain Cloudkicker': 'tactical',
		'Captain Croissant': 'normal',
		'Caravan Guard': 'normal',
		Cardshark: 'law',
		'Carefree Cook': 'event',
		'Careless Catfish': 'hydro',
		Caretaker: 'tactical',
		'Carmine the Apothecary': 'hydro',
		Carnivore: 'hydro',
		'Carrion Medium': 'rift',
		Cavalier: 'tactical',
		'Cavern Crumbler': 'forgotten',
		'Celestial Summoner': 'shadow',
		'Cell Sweeper': 'physical',
		Centaur: 'tactical',
		'Centaur Ranger': 'rift',
		'Chafed Cellist': 'physical',
		'Chamber Cleaver': 'rift',
		Chameleon: 'tactical',
		Champion: 'hydro',
		'Champion Danseuse': 'rift',
		'Champion Thief': 'rift',
		'Charming Chimer': 'arcane',
		'Cheat Sheet Conjurer': 'shadow',
		'Cheesy Party': 'event',
		Cherry: 'tactical',
		'Cherry Sprite': 'rift',
		'Chess Master': 'tactical',
		'Chip Chiseler': 'shadow',
		Chipper: 'hydro',
		Chitinous: 'shadow',
		'Chocolate Gold Foil': 'event',
		'Chocolate Overload': 'event',
		'Christmas Tree': 'event',
		Chrono: 'forgotten',
		Chronomaster: 'rift',
		Cinderstorm: 'draconic',
		'Circuit Judge': 'law',
		'City Noble': 'hydro',
		'City Worker': 'hydro',
		'Class Clown': 'arcane',
		'Classroom Disrupter': 'shadow',
		'Classroom Keener': 'shadow',
		'Clockwork Samurai': 'normal',
		'Clockwork Timespinner': 'rift',
		'Cloud Collector': 'normal',
		'Cloud Miner': 'normal',
		'Cloud Strider': 'hydro',
		Clownfish: 'hydro',
		Clump: 'rift',
		'Clumsy Carrier': 'hydro',
		'Clumsy Chemist': 'normal',
		'Clumsy Cupbearer': 'physical',
		'Coal Shoveller': 'law',
		Cobweb: 'event',
		'Coco Commander': 'event',
		'Coffin Zombie': 'shadow',
		'Confused Courier': 'event',
		Conjurer: 'tactical',
		Conqueror: 'tactical',
		'Constructively Critical Artist': 'arcane',
		'Consumed Charm Tinkerer': 'normal',
		Cook: 'hydro',
		Coral: 'hydro',
		'Coral Cuddler': 'hydro',
		'Coral Dragon': 'hydro',
		'Coral Gardener': 'hydro',
		'Coral Guard': 'hydro',
		'Coral Harvester': 'hydro',
		'Coral Queen': 'hydro',
		'Core Sample': 'normal',
		'Cork Defender': 'draconic',
		Corkataur: 'draconic',
		'Corky the Collector': 'draconic',
		'Corridor Bruiser': 'forgotten',
		Corrupt: 'arcane',
		'Corrupt Commodore': 'hydro',
		'Costumed Dog': 'event',
		'Costumed Dragon': 'event',
		'Costumed Horse': 'event',
		'Costumed Monkey': 'event',
		'Costumed Ox': 'event',
		'Costumed Pig': 'event',
		'Costumed Rabbit': 'event',
		'Costumed Rat': 'event',
		'Costumed Rooster': 'event',
		'Costumed Sheep': 'event',
		'Costumed Snake': 'event',
		'Costumed Tiger': 'event',
		'Count Vampire': 'rift',
		'Covetous Coastguard': 'hydro',
		Cowardly: 'normal',
		Cowbell: 'tactical',
		Crabolia: 'hydro',
		'Crag Elder': 'forgotten',
		'Craggy Ore': 'normal',
		'Cranky Caterpillar': 'rift',
		'Crate Camo': 'law',
		'Crazed Cultivator': 'tactical',
		'Crazed Goblin': 'rift',
		'Creepy Marionette': 'event',
		'Crimson Commander': 'normal',
		'Crimson Ranger': 'physical',
		'Crimson Titan': 'physical',
		'Crimson Watch': 'physical',
		'Croquet Crusher': 'law',
		'Crown Collector': 'normal',
		'Crystal Behemoth': 'forgotten',
		'Crystal Cave Worm': 'forgotten',
		'Crystal Controller': 'forgotten',
		'Crystal Golem': 'forgotten',
		'Crystal Lurker': 'forgotten',
		'Crystal Observer': 'forgotten',
		'Crystal Queen': 'forgotten',
		Crystalback: 'forgotten',
		'Crystalline Slasher': 'forgotten',
		Cumulost: 'forgotten',
		'Cupcake Camo': 'event',
		'Cupcake Candle Thief': 'event',
		'Cupcake Cutie': 'event',
		'Cupcake Runner': 'event',
		Cupid: 'tactical',
		'Curious Chemist': 'tactical',
		Cursed: 'arcane',
		'Cursed Crusader': 'rift',
		'Cursed Enchanter': 'arcane',
		'Cursed Engineer': 'arcane',
		'Cursed Librarian': 'arcane',
		'Cursed Taskmaster': 'arcane',
		'Cursed Thief': 'arcane',
		'Cute Cloud Conjurer': 'hydro',
		'Cute Crate Carrier': 'law',
		Cutpurse: 'rift',
		'Cutthroat Cannoneer': 'normal',
		'Cutthroat Pirate': 'normal',
		Cuttle: 'hydro',
		'Cyber Miner': 'rift',
		'Cybernetic Specialist': 'rift',
		Cyborg: 'rift',
		Cycloness: 'arcane',
		Cyclops: 'tactical',
		'Cyclops Barbarian': 'rift',
		'Dance Party': 'event',
		Dancer: 'tactical',
		'Dancing Assassin': 'rift',
		'Dangerous Duo': 'law',
		'Dark Magi': 'arcane',
		'Dark Templar': 'forgotten',
		'Dashing Buccaneer': 'hydro',
		'Dastardly Duchess': 'physical',
		'Data Devourer': 'shadow',
		'Davy Jones': 'shadow',
		'Dawn Guardian': 'arcane',
		Daydreamer: 'normal',
		'Decrepit Tentacle Terror': 'normal',
		Deep: 'hydro',
		'Deep Sea Diver': 'hydro',
		Defender: 'tactical',
		Dehydrated: 'hydro',
		Demolitions: 'normal',
		'Deranged Deckhand': 'hydro',
		Derpicorn: 'physical',
		Derpshark: 'hydro',
		'Derr Chieftain': 'physical',
		'Derr Lich': 'forgotten',
		'Desert Archer': 'physical',
		'Desert Architect': 'normal',
		'Desert Nomad': 'normal',
		'Desert Soldier': 'physical',
		Desperado: 'law',
		Destructoy: 'event',
		'Devious Gentleman': 'law',
		Diamond: 'normal',
		Diamondhide: 'forgotten',
		'Diminutive Detainee': 'physical',
		Dinosuit: 'event',
		'Dire Lycan': 'event',
		'Dirt Thing': 'forgotten',
		'Dojo Sensei': 'tactical',
		Doktor: 'rift',
		'Double Black Diamond Racer': 'event',
		'Draconic Warden': 'draconic',
		Dragon: 'draconic',
		Dragonbreather: 'draconic',
		Dragoon: 'draconic',
		'Dread Knight': 'rift',
		'Dread Pirate Mousert': 'hydro',
		'Dream Drifter': 'rift',
		Drudge: 'forgotten',
		Drummer: 'tactical',
		'Dumpling Chef': 'tactical',
		'Dumpling Delivery': 'rift',
		Dunehopper: 'shadow',
		'Dungeon Master': 'physical',
		Dwarf: 'normal',
		'Eagle Owl': 'tactical',
		Eclipse: 'forgotten',
		Eel: 'hydro',
		Effervescent: 'tactical',
		'Egg Painter': 'event',
		'Egg Scrambler': 'event',
		Eggscavator: 'event',
		'Eggsplosive Scientist': 'event',
		'Eggsquisite Entertainer': 'event',
		'El Flamenco': 'event',
		Elder: 'hydro',
		Elf: 'event',
		'Elite Guardian': 'hydro',
		'Elixir Maker': 'rift',
		'Elub Chieftain': 'hydro',
		'Elub Lich': 'forgotten',
		'Elven Princess': 'tactical',
		'Emberstone Scaled': 'draconic',
		'Empyrean Appraiser': 'normal',
		'Empyrean Empress': 'normal',
		'Empyrean Geologist': 'normal',
		'Empyrean Javelineer': 'draconic',
		'Enchanted Chess Club Champion': 'arcane',
		Enginseer: 'hydro',
		'Enlightened Labourer': 'rift',
		'Enslaved Spirit': 'shadow',
		'Epoch Golem': 'rift',
		'Escape Artist': 'physical',
		'Essence Collector': 'arcane',
		'Essence Guardian': 'arcane',
		'Ethereal Enchanter': 'arcane',
		'Ethereal Engineer': 'arcane',
		'Ethereal Guardian': 'forgotten',
		'Ethereal Librarian': 'arcane',
		'Ethereal Thief': 'arcane',
		'Evil Scientist': 'rift',
		'Excitable Electric': 'rift',
		'Exo-Tech': 'forgotten',
		Explorator: 'physical',
		'Extreme Everysports': 'normal',
		'Factory Technician': 'event',
		Fairy: 'tactical',
		'Fall Familiar': 'shadow',
		'Fallen Champion Footman': 'rift',
		'Falling Carpet': 'normal',
		Farmhand: 'normal',
		Farrier: 'law',
		Featherlight: 'arcane',
		Fencer: 'tactical',
		'Fete Fromager': 'event',
		'Fetid Swamp': 'shadow',
		Fibbocchio: 'forgotten',
		Fiddler: 'tactical',
		Field: 'normal',
		Fiend: 'hydro',
		'Fiery Crusher': 'shadow',
		Finder: 'tactical',
		Firebreather: 'tactical',
		Firefly: 'tactical',
		'Flamboyant Flautist': 'forgotten',
		'Flame Archer': 'physical',
		'Flame Ordnance': 'arcane',
		'Flame Warrior': 'physical',
		'Floating Spore': 'normal',
		Flutterby: 'tactical',
		'Fluttering Flutist': 'arcane',
		Flying: 'normal',
		Fog: 'normal',
		'Force Fighter Blue': 'event',
		'Force Fighter Green': 'event',
		'Force Fighter Pink': 'event',
		'Force Fighter Red': 'event',
		'Force Fighter Yellow': 'event',
		'Forgotten Elder': 'forgotten',
		'Fortuitous Fool': 'normal',
		Foxy: 'tactical',
		'Free Skiing': 'event',
		'Frightened Flying Fireworks': 'event',
		'Frigid Foreman': 'event',
		Frog: 'tactical',
		'Frost King': 'event',
		Frostbite: 'hydro',
		'Frostlance Guard': 'hydro',
		'Frostwing Commander': 'hydro',
		'Frosty Snow': 'normal',
		Frozen: 'normal',
		Fuel: 'law',
		"Ful'Mina the Mountain Queen": 'draconic',
		'Fungal Frog': 'rift',
		'Fungal Spore': 'hydro',
		'Fungal Technomorph': 'forgotten',
		Funglore: 'normal',
		'Fuzzy Drake': 'draconic',
		Gargantuamouse: 'draconic',
		Gargoyle: 'arcane',
		'Gate Guardian': 'arcane',
		'Gate Keeper': 'physical',
		'Gelatinous Octahedron': 'hydro',
		Gemorpher: 'forgotten',
		'Gemstone Worshipper': 'forgotten',
		'General Drheller': 'hydro',
		'Gentleman Caller': 'law',
		Ghost: 'shadow',
		'Ghost Pirate Queen': 'event',
		'Giant Snail': 'shadow',
		'Gilded Leaf': 'rift',
		Gingerbread: 'event',
		'Glacia Ice Fist': 'event',
		Gladiator: 'physical',
		'Glamorous Gladiator': 'physical',
		'Glass Blower': 'normal',
		Glazy: 'event',
		Glitchpaw: 'normal',
		'Gluttonous Zombie': 'shadow',
		Goblin: 'shadow',
		Gold: 'normal',
		Goldleaf: 'tactical',
		Golem: 'arcane',
		'Goliath Field': 'rift',
		Gorgon: 'arcane',
		'Gourd Ghoul': 'event',
		Gourdborg: 'event',
		'Grampa Golem': 'shadow',
		'Grand Master of the Dojo': 'rift',
		Grandfather: 'tactical',
		Granite: 'normal',
		'Granny Spice': 'arcane',
		'Grave Robber': 'event',
		'Great Giftnapper': 'event',
		'Great Winter Hunt Impostor': 'event',
		'Greedy Al': 'event',
		Greenbeard: 'forgotten',
		Grey: 'normal',
		'Grey Recluse': 'event',
		Greyrun: 'rift',
		'Grit Grifter': 'tactical',
		'Grizzled Silth': 'rift',
		'Ground Gavaleer': 'physical',
		Grubling: 'shadow',
		'Grubling Herder': 'shadow',
		Grunt: 'physical',
		Guardian: 'physical',
		Guppy: 'hydro',
		'Guqin Player': 'tactical',
		Gyrologer: 'tactical',
		'Hall Monitor': 'normal',
		'Hans Cheesetian Squeakersen': 'forgotten',
		Hapless: 'tactical',
		'Hapless Marionette': 'normal',
		'Harbinger of Death': 'rift',
		Hardboiled: 'event',
		'Hardworking Hauler': 'law',
		'Hare Razer': 'event',
		Harpy: 'shadow',
		'Harvest Harrier': 'shadow',
		Harvester: 'shadow',
		Hazmat: 'hydro',
		Healer: 'physical',
		'Heart of the Meteor': 'arcane',
		'Heavy Blaster': 'hydro',
		'Herbaceous Bravestalk': 'physical',
		Herc: 'physical',
		'High Roller': 'event',
		'Hired Eidolon': 'forgotten',
		Hoarder: 'event',
		Hollowed: 'event',
		'Hollowed Minion': 'event',
		Hollowhead: 'event',
		'Homeopathic Apothecary': 'normal',
		Hookshot: 'law',
		Hope: 'tactical',
		'Horned Cork Hoarder': 'draconic',
		'Hot Head': 'tactical',
		'Humphrey Dumphrey': 'forgotten',
		Huntereater: 'forgotten',
		Hurdle: 'normal',
		Hydra: 'normal',
		Hydrologist: 'hydro',
		Hydrophobe: 'physical',
		'Hypnotized Gunslinger': 'arcane',
		'Ice Regent': 'forgotten',
		'Iceberg Sculptor': 'event',
		Iceblade: 'hydro',
		Iceblock: 'hydro',
		Icebreaker: 'hydro',
		Icewing: 'hydro',
		Icicle: 'hydro',
		Ignatia: 'draconic',
		Ignis: 'shadow',
		'Illustrious Illusionist': 'arcane',
		Impersonator: 'physical',
		'Incompetent Ice Climber': 'hydro',
		'Industrious Digger': 'normal',
		'Inferna the Engulfed': 'arcane',
		'Inferno Mage': 'hydro',
		Infiltrator: 'tactical',
		'Invisible Fashionista': 'arcane',
		'Itty Bitty Rifty Burroughs': 'rift',
		'Itty-Bitty Burroughs': 'normal',
		Jellyfish: 'hydro',
		'Jovial Jailor': 'physical',
		Joy: 'event',
		Juliyes: 'normal',
		Jurassic: 'shadow',
		"Kalor'ignis of the Geyser": 'draconic',
		Karmachameleon: 'rift',
		Keeper: 'arcane',
		"Keeper's Assistant": 'arcane',
		'Key Master': 'physical',
		'King Grub': 'shadow',
		'King Scarab': 'shadow',
		'Kite Flyer': 'normal',
		Knight: 'tactical',
		Koimaid: 'hydro',
		'Kung Fu': 'tactical',
		'Lab Technician': 'hydro',
		'Lady Coldsnap': 'hydro',
		Lambent: 'rift',
		'Lambent Crystal': 'normal',
		'Lancer Guard': 'draconic',
		'Land Loafer': 'tactical',
		'Lasso Cowgirl': 'law',
		'Launchpad Labourer': 'normal',
		Lawbender: 'law',
		'Leafton Beanwell': 'physical',
		Leprechaun: 'prize',
		'Lethargic Guard': 'physical',
		Leviathan: 'hydro',
		Lich: 'arcane',
		'Lightning Rod': 'normal',
		'Limestone Miner': 'normal',
		'Little Bo Squeak': 'forgotten',
		'Little Miss Fluffet': 'forgotten',
		'Living Ice': 'hydro',
		'Living Salt': 'hydro',
		'Loathsome Locust': 'tactical',
		Lockpick: 'physical',
		Longtail: 'normal',
		'Lord Splodington': 'hydro',
		Lost: 'forgotten',
		'Lost Legionnaire': 'forgotten',
		'Lovely Sports': 'normal',
		Lucky: 'event',
		Lumahead: 'normal',
		Lumberjack: 'normal',
		'Lumi-lancer': 'rift',
		'Lunar Red Candle Maker': 'event',
		Lycan: 'shadow',
		Lycanoid: 'rift',
		M400: 'normal',
		M1000: 'normal',
		'Mad Elf': 'event',
		"Madame d'Ormouse": 'forgotten',
		'Mage Weaver': 'normal',
		Magic: 'normal',
		'Magic Champion': 'rift',
		'Magical Multitasker': 'shadow',
		'Magma Carrier': 'shadow',
		Magmarage: 'hydro',
		'Magmatic Crystal Thief': 'law',
		'Magmatic Golem': 'law',
		'Mairitime Pirate': 'normal',
		'Maize Harvester': 'event',
		'Malevolent Maestro': 'physical',
		'Malicious Marquis': 'physical',
		Mammoth: 'hydro',
		'Manaforge Smith': 'forgotten',
		Manatee: 'hydro',
		'Market Guard': 'normal',
		'Market Thief': 'law',
		Martial: 'rift',
		'Masked Pikeman': 'forgotten',
		'Master Burglar': 'law',
		'Master Exploder': 'rift',
		'Master of the Cheese Belt': 'tactical',
		'Master of the Cheese Claw': 'tactical',
		'Master of the Cheese Fang': 'tactical',
		'Master of the Chi Belt': 'rift',
		'Master of the Chi Claw': 'rift',
		'Master of the Chi Fang': 'rift',
		'Master of the Dojo': 'tactical',
		'Matriarch Gander': 'forgotten',
		'Matron of Machinery': 'forgotten',
		'Matron of Wealth': 'forgotten',
		'Mecha Tail': 'rift',
		Medicine: 'rift',
		'Melancholy Merchant': 'normal',
		'Melodramatic Minnow': 'hydro',
		'Menace of the Rift': 'rift',
		Mermouse: 'hydro',
		Mermousette: 'hydro',
		Mershark: 'hydro',
		'Meteorite Golem': 'arcane',
		'Meteorite Miner': 'law',
		'Meteorite Mover': 'law',
		'Meteorite Mystic': 'arcane',
		'Meteorite Snacker': 'law',
		Micro: 'rift',
		'Mighty Mite': 'tactical',
		'Mighty Mole': 'rift',
		'Mild Spicekin': 'draconic',
		'Militant Samurai': 'rift',
		Mimic: 'forgotten',
		'Mind Tearer': 'forgotten',
		Miner: 'normal',
		'Mining Materials Manager': 'law',
		Mintaka: 'physical',
		'Mischievous Meteorite Miner': 'law',
		'Mischievous Wereminer': 'shadow',
		Miser: 'event',
		'Misfortune Teller': 'arcane',
		'Missile Toe': 'event',
		'Mist Maker': 'hydro',
		'Mixing Mishap': 'shadow',
		'Mlounder Flounder': 'hydro',
		Mobster: 'prize',
		Mole: 'normal',
		'Molten Midas': 'forgotten',
		Monarch: 'tactical',
		Monk: 'tactical',
		'Monsoon Maker': 'shadow',
		Monster: 'normal',
		'Monster of the Meteor': 'arcane',
		'Monster Tail': 'hydro',
		'Monstrous Abomination': 'rift',
		'Monstrous Black Widow': 'rift',
		'Monstrous Midge': 'tactical',
		Moosker: 'tactical',
		'Mossy Moosker': 'rift',
		'Mouldy Mole': 'normal',
		Mountain: 'normal',
		'Mousataur Priestess': 'event',
		'Mouse of Elements': 'rift',
		'Mouse of Winter Future': 'event',
		'Mouse of Winter Past': 'event',
		'Mouse of Winter Present': 'event',
		'Mouse With No Name': 'law',
		'Mousevina von Vermin': 'shadow',
		Moussile: 'event',
		Mummy: 'shadow',
		Mush: 'normal',
		'Mush Monster': 'forgotten',
		'Mushroom Harvester': 'forgotten',
		'Mushroom Sprite': 'normal',
		'Mutant Mongrel': 'hydro',
		'Mutant Ninja': 'hydro',
		'Mutated Behemoth': 'hydro',
		'Mutated Brown': 'normal',
		'Mutated Grey': 'normal',
		'Mutated Mole': 'normal',
		'Mutated Siblings': 'hydro',
		'Mutated White': 'normal',
		'Mysterious Traveller': 'law',
		Mystic: 'hydro',
		'Mystic Bishop': 'tactical',
		'Mystic Guardian': 'forgotten',
		'Mystic Herald': 'forgotten',
		'Mystic King': 'tactical',
		'Mystic Knight': 'tactical',
		'Mystic Pawn': 'tactical',
		'Mystic Queen': 'tactical',
		'Mystic Rook': 'tactical',
		'Mystic Scholar': 'forgotten',
		'Mythical Giant King': 'physical',
		'Mythical Master Sorcerer': 'normal',
		Mythweaver: 'forgotten',
		'Nachore Golem': 'shadow',
		'Nachous the Molten': 'shadow',
		Narrator: 'tactical',
		Naturalist: 'rift',
		'Naughty Nougat': 'event',
		Necromancer: 'hydro',
		'Nefarious Nautilus': 'hydro',
		'Nerg Chieftain': 'tactical',
		'Nerg Lich': 'forgotten',
		"New Year's": 'event',
		Nibbler: 'normal',
		'Nice Knitting': 'event',
		'Night Shift Materials Manager': 'shadow',
		'Night Watcher': 'arcane',
		Nightfire: 'arcane',
		Nightmancer: 'shadow',
		'Nightshade Flower Girl': 'normal',
		'Nightshade Fungalmancer': 'forgotten',
		'Nightshade Maiden': 'normal',
		'Nightshade Masquerade': 'normal',
		'Nightshade Nanny': 'forgotten',
		Nimbomancer: 'hydro',
		Ninja: 'tactical',
		'Nitro Racer': 'event',
		Nomad: 'tactical',
		'Nomadic Warrior': 'rift',
		Nugget: 'normal',
		Nutcracker: 'event',
		'Obstinate Oboist': 'physical',
		Octomermaid: 'hydro',
		"Ol' King Coal": 'event',
		'Old One': 'hydro',
		'Old Spice Collector': 'arcane',
		'One-Mouse Band': 'rift',
		'Onion Chopper': 'event',
		Ooze: 'arcane',
		'Ore Chipper': 'shadow',
		Ornament: 'event',
		'Outbreak Assassin': 'hydro',
		Outlaw: 'law',
		'Over-Prepared': 'hydro',
		Overcaster: 'shadow',
		'Oxygen Baron': 'hydro',
		Pack: 'hydro',
		Page: 'tactical',
		Paladin: 'arcane',
		'Paladin Weapon Master': 'forgotten',
		'Pan Slammer': 'event',
		'Para Para Dancer': 'event',
		'Paragon of Arcane': 'arcane',
		'Paragon of Dragons': 'draconic',
		'Paragon of Forgotten': 'forgotten',
		'Paragon of Shadow': 'shadow',
		'Paragon of Strength': 'physical',
		'Paragon of Tactics': 'tactical',
		'Paragon of the Lawless': 'law',
		'Paragon of Water': 'hydro',
		'Parlour Player': 'law',
		'Party Head': 'event',
		Passenger: 'law',
		Pathfinder: 'tactical',
		'Peaceful Prisoner': 'physical',
		Pearl: 'hydro',
		'Pearl Diver': 'hydro',
		Pebble: 'normal',
		'Peevish Piccoloist': 'physical',
		'Peggy the Plunderer': 'normal',
		Penguin: 'hydro',
		'Pernicious Prince': 'physical',
		'Perpetual Detention': 'arcane',
		Phalanx: 'tactical',
		'Phase Zombie': 'rift',
		Photographer: 'law',
		'Pie Thief': 'law',
		Pinchy: 'hydro',
		Pinkielina: 'forgotten',
		Pintail: 'event',
		Pirate: 'hydro',
		'Pirate Anchor': 'hydro',
		'Plague Hag': 'hydro',
		'Plotting Page': 'physical',
		'Plutonium Tentacle': 'rift',
		'Pneumatic Dirt Displacement': 'rift',
		Pocketwatch: 'physical',
		'Polar Bear': 'hydro',
		'Pompous Perch': 'hydro',
		'Portable Generator': 'rift',
		'Portal Paladin': 'rift',
		'Portal Plunderer': 'rift',
		'Portal Pursuer': 'rift',
		'Possessed Armaments': 'rift',
		'Praetorian Champion': 'rift',
		Present: 'event',
		'Prestigious Adventurer': 'rift',
		'Prestigious Prestidigitator': 'shadow',
		Primal: 'shadow',
		'Princess and the Olive': 'forgotten',
		'Princess Fist': 'hydro',
		Prospector: 'law',
		Protector: 'hydro',
		Prototype: 'rift',
		Puddlemancer: 'physical',
		Puffer: 'hydro',
		Pugilist: 'normal',
		'Pump Raider': 'law',
		'Pumpkin Head': 'shadow',
		'Pumpkin Hoarder': 'event',
		'Puppet Champion': 'rift',
		'Puppet Master': 'normal',
		Puppetto: 'rift',
		'Pygmy Wrangler': 'shadow',
		Pyrehyde: 'draconic',
		Pyrite: 'law',
		'Queen Quesada': 'law',
		'Queso Extractor': 'law',
		Quesodillo: 'shadow',
		Quillback: 'normal',
		'Radioactive Ooze': 'rift',
		'Rain Collector': 'shadow',
		'Rain Summoner': 'shadow',
		'Rain Wallower': 'shadow',
		'Rainbow Racer': 'event',
		Rainmancer: 'shadow',
		'Rainwater Purifier': 'normal',
		'Rambunctious Rain Rumbler': 'draconic',
		'Rancid Bog Beast': 'rift',
		'Ravenous Zombie': 'shadow',
		'Raw Diamond': 'rift',
		'Reality Restitch': 'event',
		'Realm Ripper': 'arcane',
		'Reanimated Carver': 'forgotten',
		Reaper: 'arcane',
		'Record Keeper': 'rift',
		"Record Keeper's Assistant": 'rift',
		'Red Coat Bear': 'rift',
		'Red Envelope': 'event',
		'Red-Eyed Watcher Owl': 'rift',
		'Regal Spearman': 'draconic',
		Reinbo: 'event',
		'Relic Hunter': 'normal',
		Renegade: 'physical',
		'Retired Minotaur': 'forgotten',
		'Reveling Lycanthrope': 'shadow',
		Revenant: 'rift',
		Ribbon: 'event',
		'Richard the Rich': 'normal',
		'Ridiculous Sweater': 'event',
		'Rift Bio Engineer': 'rift',
		'Rift Guardian': 'rift',
		'Rift Tiger': 'rift',
		Rifterranian: 'rift',
		Riftweaver: 'rift',
		Riptide: 'normal',
		Robat: 'rift',
		'Rock Muncher': 'normal',
		Rocketeer: 'tactical',
		Rockstar: 'event',
		Rogue: 'physical',
		Romeno: 'normal',
		Romeo: 'normal',
		'Root Rummager': 'tactical',
		'RR-8': 'forgotten',
		'Rubble Rouser': 'shadow',
		'Rubble Rummager': 'shadow',
		Ruffian: 'law',
		'S.N.O.W. Golem': 'event',
		Saboteur: 'hydro',
		'Sacred Shrine': 'arcane',
		'Saloon Gal': 'law',
		'Salt Water Snapper': 'hydro',
		'Saltwater Axolotl': 'hydro',
		Samurai: 'tactical',
		'Sand Cavalry': 'tactical',
		'Sand Colossus': 'shadow',
		'Sand Dollar Diver': 'hydro',
		'Sand Dollar Queen': 'hydro',
		'Sand Pilgrim': 'shadow',
		'Sand Sifter': 'hydro',
		Sandmouse: 'event',
		'Sandwing Cavalry': 'tactical',
		Sanguinarian: 'forgotten',
		Sarcophamouse: 'shadow',
		'Sassy Salsa Dancer': 'physical',
		Scarab: 'shadow',
		Scarecrow: 'shadow',
		'Scarlet Revenger': 'normal',
		Scavenger: 'arcane',
		'Scheming Squire': 'physical',
		'School of Mish': 'hydro',
		'Scorned Pirate': 'event',
		Scout: 'hydro',
		'Scrap Metal Monster': 'hydro',
		Scribe: 'physical',
		Scrooge: 'event',
		Scruffy: 'normal',
		Seadragon: 'hydro',
		'Seasoned Islandographer': 'tactical',
		Seer: 'physical',
		'Sentient Slime': 'rift',
		Sentinel: 'physical',
		'Serpent Monster': 'hydro',
		Serpentine: 'shadow',
		'Shackled Servant': 'rift',
		'Shade of the Eclipse': 'rift',
		'Shadow Master Sorcerer': 'shadow',
		'Shadow Sage': 'shadow',
		'Shadow Stalker': 'forgotten',
		Shaman: 'tactical',
		'Shaolin Kung Fu': 'rift',
		'Shard Centurion': 'rift',
		Sharpshooter: 'law',
		'Shattered Carmine': 'hydro',
		'Shattered Obsidian': 'forgotten',
		Shelder: 'hydro',
		Shinobi: 'rift',
		Shipwrecked: 'hydro',
		Shopkeeper: 'law',
		Shortcut: 'event',
		'Shorts-All-Year': 'event',
		Shroom: 'hydro',
		Silth: 'hydro',
		Silvertail: 'normal',
		'Sinister Egg Painter': 'event',
		'Sinister Squid': 'hydro',
		'Sir Fleekio': 'forgotten',
		Siren: 'hydro',
		'Sizzle Pup': 'draconic',
		'Skeletal Champion': 'rift',
		Skeleton: 'arcane',
		'Sky Dancer': 'arcane',
		'Sky Glass Glazier': 'arcane',
		'Sky Glass Sorcerer': 'arcane',
		'Sky Glider': 'arcane',
		'Sky Greaser': 'normal',
		'Sky Highborne': 'arcane',
		'Sky Squire': 'physical',
		'Sky Surfer': 'hydro',
		'Sky Swordsman': 'physical',
		Skydiver: 'normal',
		'Slay Ride': 'event',
		Slayer: 'tactical',
		'Sleep Starved Scholar': 'arcane',
		Sleepwalker: 'event',
		'Sleepy Merchant': 'law',
		Slimefist: 'hydro',
		'Slope Swimmer': 'normal',
		Sludge: 'hydro',
		'Sludge Scientist': 'normal',
		'Sludge Soaker': 'hydro',
		'Sludge Swimmer': 'hydro',
		Smoldersnap: 'draconic',
		'Smug Smuggler': 'physical',
		'Snake Charmer': 'normal',
		Snooty: 'event',
		'Snow Boulder': 'event',
		'Snow Bowler': 'hydro',
		'Snow Fort': 'event',
		'Snow Golem Architect': 'event',
		'Snow Golem Jockey': 'event',
		'Snow Scavenger': 'event',
		'Snow Slinger': 'hydro',
		'Snow Sniper': 'hydro',
		'Snow Soldier': 'hydro',
		'Snow Sorceress': 'event',
		'Snowball Hoarder': 'event',
		Snowblind: 'hydro',
		Snowblower: 'event',
		Snowflake: 'event',
		Snowglobe: 'event',
		'Sock Puppet Ghost': 'normal',
		'Soldier of the Shade': 'rift',
		'Solemn Soldier': 'forgotten',
		Soothsayer: 'hydro',
		Sorcerer: 'arcane',
		'Soul Binder': 'forgotten',
		'Space Party-Time Plumber': 'event',
		'Spear Fisher': 'hydro',
		'Spectral Butler': 'event',
		'Spectral Swashbuckler': 'event',
		Spectre: 'arcane',
		Speedy: 'normal',
		Spellbinder: 'physical',
		'Spheric Diviner': 'forgotten',
		'Spice Farmer': 'arcane',
		'Spice Finder': 'arcane',
		'Spice Merchant': 'normal',
		'Spice Raider': 'arcane',
		'Spice Reaper': 'arcane',
		'Spice Seer': 'arcane',
		'Spice Sovereign': 'arcane',
		Spider: 'arcane',
		'Spiked Burrower': 'normal',
		'Spiky Devil': 'shadow',
		'Spirit Fox': 'rift',
		'Spirit Light': 'event',
		'Spirit of Balance': 'rift',
		'Spiritual Steel': 'rift',
		'Splintered Stone Sentry': 'forgotten',
		Spore: 'hydro',
		'Spore Muncher': 'normal',
		'Spore Salesman': 'normal',
		Sporeticus: 'normal',
		'Sporty Ski Instructor': 'event',
		Spotted: 'normal',
		'Spring Familiar': 'physical',
		'Spring Sprig': 'event',
		'Sprinkly Sweet Cupcake Cook': 'event',
		'Spry Sky Explorer': 'forgotten',
		'Spry Sky Seer': 'forgotten',
		Spud: 'normal',
		Squeaken: 'hydro',
		'Squeaker Bot': 'normal',
		'Squeaker Claws': 'event',
		'Stack of Thieves': 'law',
		'Stagecoach Driver': 'law',
		Stalagmite: 'forgotten',
		Stealth: 'physical',
		'Steam Grip': 'physical',
		'Steam Sailor': 'draconic',
		Steel: 'normal',
		'Steel Horse Rider': 'law',
		Stickybomber: 'hydro',
		Stinger: 'tactical',
		Stingray: 'hydro',
		Stocking: 'event',
		'Stone Cutter': 'normal',
		'Stone Maiden': 'forgotten',
		'Stonework Warrior': 'shadow',
		'Stormsurge the Vile Tempest': 'draconic',
		Stoutgear: 'law',
		Stowaway: 'law',
		Stratocaster: 'shadow',
		'Strawberry Hotcakes': 'hydro',
		'Stuck Snowball': 'event',
		'Student of the Cheese Belt': 'tactical',
		'Student of the Cheese Claw': 'tactical',
		'Student of the Cheese Fang': 'tactical',
		'Student of the Chi Belt': 'rift',
		'Student of the Chi Claw': 'rift',
		'Student of the Chi Fang': 'rift',
		'Stuffy Banker': 'law',
		'Suave Pirate': 'normal',
		Subterranean: 'normal',
		'Sugar Rush': 'event',
		'Sultry Saxophonist': 'physical',
		'Summer Mage': 'tactical',
		'Summoning Scholar': 'forgotten',
		'Sunken Banshee': 'hydro',
		'Sunken Citizen': 'hydro',
		'Super FighterBot MegaSupreme': 'event',
		'Super Mega Mecha Ultra RoboGold': 'rift',
		Supernatural: 'rift',
		'Supply Hoarder': 'law',
		'Supreme Sensei': 'rift',
		'Surgeon Bot': 'rift',
		Swabbie: 'hydro',
		'Swamp Runner': 'hydro',
		'Swamp Thang': 'event',
		'Swarm of Pygmy Mice': 'shadow',
		Swashblade: 'hydro',
		Sylvan: 'tactical',
		'Tackle Tracker': 'hydro',
		Tadpole: 'hydro',
		Taleweaver: 'hydro',
		Tanglefoot: 'physical',
		'Tech Golem': 'forgotten',
		'Tech Ravenous Zombie': 'rift',
		'Technic Bishop': 'tactical',
		'Technic King': 'tactical',
		'Technic Knight': 'tactical',
		'Technic Pawn': 'tactical',
		'Technic Queen': 'tactical',
		'Technic Rook': 'tactical',
		'Teenage Vampire': 'event',
		'Telekinetic Mutant': 'hydro',
		'Teleporting Truant': 'shadow',
		Tentacle: 'hydro',
		Terra: 'shadow',
		'Terrible Twos': 'event',
		'Terrified Adventurer': 'rift',
		'Terror Knight': 'arcane',
		'The Menace': 'hydro',
		'The Total Eclipse': 'rift',
		'Theurgy Warden': 'physical',
		Thirsty: 'hydro',
		Thistle: 'hydro',
		Thorn: 'hydro',
		'Thunder Strike': 'draconic',
		'Thundering Watcher': 'draconic',
		"⚡Thunderlord⚡": 'draconic',
		'Tidal Fisher': 'shadow',
		Tiger: 'tactical',
		'Time Punk': 'event',
		'Time Tailor': 'event',
		'Time Thief': 'event',
		'Timeless Lich': 'rift',
		'Timelost Thaumaturge': 'rift',
		'Timeslither Pythoness': 'rift',
		'Timid Explorer': 'rift',
		Tiny: 'normal',
		'Tiny Dragonfly': 'draconic',
		'Tiny Saboteur': 'law',
		'Tiny Toppler': 'shadow',
		'Titanic Brain-Taker': 'event',
		'Toboggan Technician': 'event',
		'Tomb Exhumer': 'event',
		'Tome Sprite': 'tactical',
		'Tonic Salesman': 'law',
		'Totally Not Tax Fraud': 'normal',
		'Toxic Avenger': 'rift',
		'Toxic Warrior': 'hydro',
		Toxikinetic: 'rift',
		Toy: 'event',
		'Toy Sylvan': 'normal',
		'Toy Tinkerer': 'event',
		Trailblazer: 'physical',
		'Train Conductor': 'law',
		'Train Engineer': 'law',
		Trampoline: 'normal',
		'Travelling Barber': 'law',
		'Treacherous Tubaist': 'physical',
		Treant: 'tactical',
		'Treant Queen': 'rift',
		'Treasure Brawler': 'forgotten',
		'Treasure Hoarder': 'hydro',
		'Treasure Keeper': 'hydro',
		Treasurer: 'event',
		Treat: 'event',
		'Tree Troll': 'rift',
		'Tri-dra': 'rift',
		Trick: 'event',
		'Tricky Witch': 'event',
		'Triple Lutz': 'event',
		Tritus: 'hydro',
		Troll: 'shadow',
		Tumbleweed: 'law',
		'Tundra Huntress': 'event',
		'Turret Guard': 'hydro',
		'Twisted Carmine': 'hydro',
		'Twisted Fiend': 'shadow',
		'Twisted Hotcakes': 'hydro',
		'Twisted Lilly': 'hydro',
		'Twisted Treant': 'rift',
		'Tyrannical Thaumaturge': 'arcane',
		'Uncoordinated Cauldron Carrier': 'shadow',
		Undertaker: 'law',
		'Unwavering Adventurer': 'rift',
		'Upper Class Lady': 'law',
		'Urchin King': 'hydro',
		Vampire: 'shadow',
		Vanguard: 'physical',
		Vanquisher: 'hydro',
		Vaporior: 'draconic',
		'Vicious Vampire Squid': 'hydro',
		'Vigilant Ward': 'rift',
		'Vincent the Magnificent': 'event',
		'Vindictive Viscount': 'physical',
		Vinetail: 'physical',
		'Vinneus Stalkhome': 'physical',
		'Violent Violinist': 'physical',
		'Violet Stormchild': 'draconic',
		Walker: 'tactical',
		'Wandering Monk': 'rift',
		'Warden of Fog': 'normal',
		'Warden of Frost': 'normal',
		'Warden of Rain': 'normal',
		'Warden of Wind': 'normal',
		'Warehouse Manager': 'law',
		'Warming Wyvern': 'draconic',
		Warmonger: 'physical',
		'Water Nymph': 'hydro',
		'Water Sprite': 'rift',
		'Water Wielder': 'hydro',
		'Wave Racer': 'normal',
		Wealth: 'rift',
		'Wealthy Werewarrior': 'shadow',
		Werehauler: 'shadow',
		Wereminer: 'shadow',
		Whelpling: 'draconic',
		'Whimsical Waltzer': 'physical',
		Whirleygig: 'shadow',
		White: 'normal',
		'White Mage': 'arcane',
		'Wicked Witch of Whisker Woods': 'tactical',
		Wiggler: 'tactical',
		Wight: 'arcane',
		'Wild Chainsaw': 'event',
		'Wily Weevil': 'tactical',
		'Wind Warrior': 'arcane',
		'Wind Watcher': 'arcane',
		'Windy Farmer': 'normal',
		'Winged Harpy': 'rift',
		'Winter Games': 'normal',
		'Winter Mage': 'hydro',
		'Withered Remains': 'rift',
		Wolfskie: 'hydro',
		Wordsmith: 'physical',
		Worker: 'tactical',
		'Worried Wayfinder': 'tactical',
		'Wound Up White': 'normal',
		'Wrathful Warden': 'physical',
		'Wreath Thief': 'event',
		Yeti: 'hydro',
		'Young Prodigy Racer': 'event',
		'Zealous Academic': 'shadow',
		Zephyr: 'shadow',
		Zombie: 'shadow',
		'Zombot Unipire': 'event',
		'Zombot Unipire the Third': 'rift',
		'Zurreal the Eternal': 'tactical',
	};
	if (miceMap[mouseName] == undefined) {
		console.warn('Mouse not found', mouseName, miceMap[mouseName]);
	}
	return miceMap[mouseName];
}

function hidePowerCrowns() {
	if ($('.mouseCrownsView-group-header.powerCrown').length > 0) {
		$('.mouseCrownsView-group-header.powerCrown').remove();
		$('.mouseCrownsView-group:not(.favorite)').find('.pt').remove();
	}
}

/********** Copy Crowns **********/
function copyMyCrowns() {
	const debug = localStorage.getItem('ws.debug');
	hg.utils.MouseUtil.getHuntingStats(function(data) {
		let statArray = [];
		data.forEach(function(arrayItem, index) {
			const mouseName = correctMouseName(arrayItem.name);
			const catches = arrayItem.num_catches;
			const misses = arrayItem.num_misses;
			statArray[index] = [mouseName, catches, misses];
		});
		if (debug == true) {
			console.log('My Mice Array', statArray);
		}
		let finalTable = statArray.map((e) => e.join(',')).join('\n');
		GM_setClipboard(finalTable);
		const copyCrownsButton = $('#copyCrownsButton');
		copyCrownsButton.css({
			'border-style': 'solid',
			'border-color': '#f44336',
			'border-width': '2px',
		});
		setTimeout(function() {
			copyCrownsButton.css({
				'border-style': 'solid',
				'border-color': 'grey',
				'border-width': '1px',
			});
		}, 1000);
	});
}

function copyCrowns() {
	const debug = localStorage.getItem('ws.debug');
	const allMice = $(
		'.mouseCrownsView-group.none,.mouseCrownsView-group.bronze,.mouseCrownsView-group.silver,.mouseCrownsView-group.gold,.mouseCrownsView-group.platinum,.mouseCrownsView-group.diamond'
	).find('.mouseCrownsView-group-mouse');
	let miceArray = [];
	allMice.each(function(i) {
		let $mouse = correctMouseName(
			$(this).find('.mouseCrownsView-group-mouse-name').text()
		);
		let $count = parseInt(
			$(this)
			.find('.mouseCrownsView-group-mouse-catches')
			.text()
			.replace(',', ''),
			10
		);
		miceArray[i] = [$mouse, $count];
	});
	// need to sort uncrowned by # instead of Alpha
	if (debug == true) {
		console.log('Their Mice Array', miceArray);
	}
	let finalTable = miceArray.map((e) => e.join(',')).join('\n');
	GM_setClipboard(finalTable);
	const copyCrownsButton = $('#copyCrownsButton');
	copyCrownsButton.css({
		'border-style': 'solid',
		'border-color': 'grey',
		'border-width': '1px',
	});
	setTimeout(function() {
		copyCrownsButton.css({
			'border-style': 'solid',
			'border-color': 'grey',
			'border-width': '1px',
		});
	}, 1000);
}

function correctMouseName(mouseName) {
	mouseName = mouseName.replace(' Mouse', '');
	let newMouseName = '';
	if (mouseName == "Ful'Mina, The Mountain Queen") {
		newMouseName = "Ful'mina the Mountain Queen";
	} else if (mouseName == 'Inferna, The Engulfed') {
		newMouseName = 'Inferna the Engulfed';
	} else if (mouseName == 'Nachous, The Molten') {
		newMouseName = 'Nachous the Molten';
	} else if (mouseName == 'Stormsurge, the Vile Tempest') {
		newMouseName = 'Stormsurge the Vile Tempest';
	} else if (mouseName == 'Bruticus, the Blazing') {
		newMouseName = 'Bruticus the Blazing';
	} else if (mouseName == 'Vincent, The Magnificent') {
		newMouseName = 'Vincent The Magnificent';
	} else if (mouseName == 'Corky, the Collector') {
		newMouseName = 'Corky the Collector';
	} else if (mouseName == "Ol' King Coal") {
		newMouseName = 'Ol King Coal';
	} else if (mouseName == 'Dread Piratert') {
		newMouseName = 'Dread Pirate Mousert';
	} else {
		newMouseName = mouseName;
	}
	return newMouseName;
}

function decorate() {
	let collapseProps = JSON.parse(
		localStorage.getItem('ws.mh.pfp.collapseProps')
	);
	if (collapseProps) {} else {
		collapseProps = {
			none: 'E',
			bronze: 'E',
			silver: 'E',
			gold: 'E',
			platinum: 'E',
			diamond: 'E',
			favourite: 'E',
		};
		localStorage.setItem(
			'ws.mh.pfp.collapseProps',
			JSON.stringify(collapseProps)
		);
	}
	let uncrowned = $('.mouseCrownsView-group.none').find(
		'.mouseCrownsView-crown.none'
	);
	$(uncrowned).css({
		'background-image': "url('https://cdn-icons-png.flaticon.com/512/3281/3281316.png')",
		'background-repeat': 'no-repeat',
		'background-size': 'contain',
	});
	let favorites = $('.mouseCrownsView-group-mouse');
	$(favorites).each(function(i) {
		const image = $(this).find('.mouseCrownsView-group-mouse-image');
		const catches = parseInt(
			$(this)
			.find('.mouseCrownsView-group-mouse-catches')
			.text()
			.replace(',', ''),
			10
		);
		setCrownBorder(image, catches);
		if (localStorage.getItem('ShowPowerCrowns') == 'Y') {
			populatePowerCrowns(this);
		}
	});
	$('.mouseCrownsView-group').each(function(index) {
		const thisCrown = $(this)
			.attr('class')
			.replace('mouseCrownsView-group ', '');
		const isHeaderExpanded = collapseProps[thisCrown];
		if (isHeaderExpanded == 'E') {
			$(this).find('.mouseCrownsView-group-mice').removeClass('hidden');
		} else {
			$(this).find('.mouseCrownsView-group-mice').addClass('hidden');
		}
		const header = $(this).find('.mouseCrownsView-group-header');
		let catches = header.find('.mouseCrownsView-group-header-subtitle').text();
		catches = parseInt(
			catches
			.replace('Earned at ', '')
			.replace(' catches', '')
			.replace(',', ''),
			10
		);
		setCrownBorder(header, catches, isHeaderExpanded);
	});
}

$(document).on(
	'click',
	'.mouseCrownsView-group-header:not(.community):not(.powerCrown)',
	function(e) {
		showHideCrowns($(this).parent());
	}
);

function showHideCrowns(thisGroup) {
	let collapseProps = JSON.parse(
		localStorage.getItem('ws.mh.pfp.collapseProps')
	);
	const thisCrown = $(thisGroup)
		.attr('class')
		.replace('mouseCrownsView-group ', '');
	const theseMice = $(thisGroup).find('.mouseCrownsView-group-mice');
	if (theseMice.hasClass('hidden')) {
		collapseProps[thisCrown] = 'E';
	} else {
		collapseProps[thisCrown] = 'C';
	}
	theseMice.toggle();
	localStorage.setItem(
		'ws.mh.pfp.collapseProps',
		JSON.stringify(collapseProps)
	);
	decorate();
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//ITEMS TAB
//
//
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function manageCollected() {
	let itemContainer = $('.hunterProfileItemsView-content-padding');
	//Hide LE Layout
	if ($('.hideLeContainer').length == 0) {
		let hideLeContainer = document.createElement('div');
		hideLeContainer.classList.add('hideLeContainer');
		let hideLeCb = document.createElement('input');
		hideLeCb.type = 'checkbox';
		hideLeCb.name = 'hideLeCb';
		hideLeCb.value = '';
		hideLeCb.id = 'hideLeCb';
		hideLeCb.checked = '';
		if (localStorage.getItem('hideLeItems') == 'Y') {
			hideLeCb.checked = 'Yes';
		} else {
			hideLeCb.checked = '';
		}
		let hideLeLabel = document.createElement('label');
		hideLeLabel.htmlFor = 'hideLeLabel';
		hideLeLabel.appendChild(document.createTextNode('Hide LE  Items'));
		hideLeContainer.append(hideLeCb);
		hideLeContainer.append(hideLeLabel);
		$(itemContainer).prepend(hideLeContainer);
		$(hideLeContainer).css({
			width: '100%',
		});
		$(hideLeLabel).css({
			fontSize: '14px',
			width: '80%',
		});
		$(hideLeCb).css({
			width: '5%',
		});
	}
	if (localStorage.getItem('hideLeItems') == 'Y') {
		hideLeItems();
	}
	let allTypes = $('.hunterProfileItemsView-categoryContent');
	let allItems = $(allTypes).children();
	allItems.click(function() {
		hg.views.ItemView.show($(this).attr('data-type'));
	});
}

function hideLeItems() {
	let allTypes = $('.hunterProfileItemsView-categoryContent.active');
	let allCollected = $(allTypes)
		.find('.hunterProfileItemsView-categoryContent-item.collected')
		.not('.limited_edition');
	let allUncollected = $(allTypes).find(
		'.hunterProfileItemsView-categoryContent-item.uncollected'
	);
	let collectedLe = $(allTypes).find(
		'.hunterProfileItemsView-categoryContent-item.collected.limited_edition'
	);
	let activeTab = $('.hunterProfileItemsView-filter').filter('.active');
	if ($(activeTab).hasClass('collected')) {
		$(allCollected).show();
		$(allUncollected).hide();
		$(collectedLe).hide();
	} else if ($(activeTab).hasClass('uncollected')) {
		$(allCollected).hide();
		$(allUncollected).show();
		$(collectedLe).hide();
	} else if ($(activeTab).hasClass('limited_edition')) {
		$(allCollected).hide();
		$(allUncollected).hide();
		$(collectedLe).show();
	} else if ($(activeTab).hasClass('all')) {
		$(allCollected).show();
		$(allUncollected).show();
		$(collectedLe).hide();
	}
}

function showLeItems() {
	let allTypes = $('.hunterProfileItemsView-categoryContent.active');
	let allCollected = $(allTypes)
		.find('.hunterProfileItemsView-categoryContent-item.collected')
		.not('.limited_edition');
	let allUncollected = $(allTypes).find(
		'.hunterProfileItemsView-categoryContent-item.uncollected'
	);
	let collectedLe = $(allTypes).find(
		'.hunterProfileItemsView-categoryContent-item.collected.limited_edition'
	);
	let activeTab = $('.hunterProfileItemsView-filter').filter('.active');
	if ($(activeTab).hasClass('collected')) {
		$(allCollected).show();
		$(allUncollected).hide();
		$(collectedLe).show();
	} else if ($(activeTab).hasClass('uncollected')) {
		$(allCollected).hide();
		$(allUncollected).show();
		$(collectedLe).hide();
	} else if ($(activeTab).hasClass('limited_edition')) {
		$(allCollected).hide();
		$(allUncollected).hide();
		$(collectedLe).show();
	} else if ($(activeTab).hasClass('all')) {
		$(allCollected).show();
		$(allUncollected).show();
		$(collectedLe).show();
	}
}

//Weapons Tab
$(document).on('click', "[data-category='weapon']", function() {
	if (localStorage.getItem('hideLeItems') == 'Y') {
		hideLeItems();
	} else {
		showLeItems();
	}
});
//Bases Tab
$(document).on('click', "[data-category='base']", function() {
	if (localStorage.getItem('hideLeItems') == 'Y') {
		hideLeItems();
	} else {
		showLeItems();
	}
});
//Maps Tab
$(document).on('click', "[data-category='map_piece']", function() {
	if (localStorage.getItem('hideLeItems') == 'Y') {
		hideLeItems();
	} else {
		showLeItems();
	}
});
//Collectible Tab
$(document).on('click', "[data-category='collectible']", function() {
	if (localStorage.getItem('hideLeItems') == 'Y') {
		hideLeItems();
	} else {
		showLeItems();
	}
});
//Skin Tab
$(document).on('click', "[data-category='skin']", function() {
	if (localStorage.getItem('hideLeItems') == 'Y') {
		hideLeItems();
	} else {
		showLeItems();
	}
});
//Collected tab
$(document).on(
	'click',
	'.hunterProfileItemsView-filter.collected',
	function() {
		if (localStorage.getItem('hideLeItems') == 'Y') {
			hideLeItems();
		} else {
			showLeItems();
		}
	}
);
//Uncollected tab
$(document).on(
	'click',
	'.hunterProfileItemsView-filter.uncollected',
	function() {
		if (localStorage.getItem('hideLeItems') == 'Y') {
			hideLeItems();
		} else {
			showLeItems();
		}
	}
);
//Limited Edition Tab
$(document).on(
	'click',
	'.hunterProfileItemsView-filter.limited_edition',
	function() {
		if (localStorage.getItem('hideLeItems') == 'Y') {
			hideLeItems();
		} else {
			showLeItems();
		}
	}
);
//All Tab
$(document).on('click', '.hunterProfileItemsView-filter.all', function() {
	if (localStorage.getItem('hideLeItems') == 'Y') {
		hideLeItems();
	} else {
		showLeItems();
	}
});

/********** Layout Opt-In **********/
$(document).on('change', '#hideLeCb', function() {
	// Check to see if the cb was JUST checked
	if (this.checked) {
		// Put the checked value into storage
		localStorage.setItem('hideLeItems', 'Y');
		this.checked = 'Yes';
		manageCollected();
	} else {
		// Put the checked value into storage
		localStorage.setItem('hideLeItems', 'N');
		this.checked = '';
		showLeItems();
	}
});