Greasy Fork is available in English.

MH: Profile+

Community requested features for the tabs on your MH profile.

La data de 26-04-2024. Vezi ultima versiune.

// ==UserScript==
// @name         MH: Profile+
// @author       Warden Slayer
// @namespace    https://greasyfork.org/en/users/227259-wardenslayer
// @version      1.43
// @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: 'event',
    '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: 'event',
    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();
  }
});