NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name Pokeassistant Appraisal Refiner
// @namespace http://tampermonkey.net/
// @version 1.1.2
// @description Adds a button to appraise your pokémon in order to refine the IVs possibilites.
// @author /u/rayanbvr & /u/dm_2112
// @match https://pokeassistant.com/main/ivcalculator*
// @grant none
// @downloadURL https://openuserjs.org/install/rayanbfvr/Pokeassistant_Appraisal_Refiner.user.js
// @updateURL https://openuserjs.org/meta/rayanbfvr/Pokeassistant_Appraisal_Refiner.meta.js
// ==/UserScript==
// credit to reddit user /u/dm_2112 - adapted by /u/rayanbfvr
// original comment https://www.reddit.com/r/pokemongodev/comments/4zbc3b/new_update_allows_much_more_accurate_iv/d6uhvtr
(function() {
'use strict';
$("head").append(
'<link ' +
'href="//ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.min.css" ' +
'rel="stylesheet" type="text/css">'
);
var ivs = [];
var attack;
var defense;
var hp;
var knownStat;
var maxKnownStat = 0;
function refineIVs() {
var translate = {
0: 'level',
1: 'attack',
2: 'defense',
3: 'hp',
4: 'perc'
};
$('#possiblecombis').children('tbody').children().each(function() {
if ($(this).index() != 0) {
var that = $(this);
var thisIVs = that.children();
var objEl = {
hidden: false
};
objEl['element'] = that;
for (var i = 0; i < thisIVs.length; i++) {
objEl[translate[i]] = thisIVs[i].textContent;
}
ivs.push(objEl);
}
});
}
function derivatePhrase() {
if (!isNaN(attack)) sortIVs("attack");
if (!isNaN(defense)) sortIVs("defense");
if (!isNaN(hp)) sortIVs("hp");
if (isNaN(attack)) hideNegativeOptions("attack");
if (isNaN(defense)) hideNegativeOptions("defense");
if (isNaN(hp)) hideNegativeOptions("hp");
if (!isNaN(attack) && !isNaN(defense) && !isNaN(hp)) {
ivs.forEach(function(el) {
if (el.attack !== el.defense || el.defense !== el.hp || el.attack !== el.hp) {
el.hidden = true;
el.element.hide();
}
});
}
if (!isNaN(attack) && !isNaN(defense) && isNaN(hp)) {
ivs.forEach(function(el) {
if (el.attack !== el.defense || el.defense === el.hp || el.attack === el.hp) {
el.hidden = true;
el.element.hide();
}
});
}
if (!isNaN(attack) && isNaN(defense) && isNaN(hp)) {
ivs.forEach(function(el) {
if (el.attack === el.defense || el.attack === el.hp) {
el.hidden = true;
el.element.hide();
}
});
}
if (isNaN(attack) && !isNaN(defense) && !isNaN(hp)) {
ivs.forEach(function(el) {
if (el.hp !== el.defense || el.defense === el.attack || el.hp === el.attack) {
el.hidden = true;
el.element.hide();
}
});
}
if (isNaN(attack) && !isNaN(defense) && isNaN(hp)) {
ivs.forEach(function(el) {
if (el.defense === el.attack || el.defense === el.hp) {
el.hidden = true;
el.element.hide();
}
});
}
if (!isNaN(attack) && isNaN(defense) && !isNaN(hp)) {
ivs.forEach(function(el) {
if (el.hp !== el.attack || el.defense === el.attack || el.defense === el.hp) {
el.hidden = true;
el.element.hide();
}
});
}
if (isNaN(attack) && isNaN(defense) && !isNaN(hp)) {
ivs.forEach(function(el) {
if (el.hp === el.attack || el.hp === el.defense) {
el.hidden = true;
el.element.hide();
}
});
}
}
function sortIVs(type) {
var arr = [];
ivs.forEach(function(el) {
if (!el.hidden) {
switch (type) {
case "attack":
arr.push(parseInt(el.attack));
break;
case "defense":
arr.push(parseInt(el.defense));
break;
case "hp":
arr.push(parseInt(el.hp));
break;
}
}
});
var isEqual = (arr.length && arr.reduce(function(a, b) {
return (a === b) ? a : false;
}) === arr[0]);
if (isEqual) knownStat = parseInt(arr[0]);
var currentMax = arr.sort(function(a, b) {
return a - b;
})[arr.length - 1];
if (maxKnownStat < currentMax) maxKnownStat = currentMax;
}
function hideNegativeOptions(type) {
var valExact = knownStat;
var maxValExact = maxKnownStat;
if (type === "attack" || type === "defense" || type === "hp") {
if (valExact) {
ivs.forEach(function(el) {
var stat = parseFloat(el[type]);
if (stat === valExact || stat > valExact) {
el.hidden = true;
el.element.hide();
}
});
} else {
ivs.forEach(function(el) {
var stat = parseFloat(el[type]);
if (stat > maxValExact) {
el.hidden = true;
el.element.hide();
}
});
}
}
}
function filterIVDivs(statType, valMin, valMax) {
ivs.forEach(function(el) {
var elStatType;
var elStat;
if (statType == "perc") elStat = parseFloat(el.perc.replace('%', ''));
else elStat = el[statType];
if (elStat < valMin || elStat > valMax) {
el.hidden = true;
el.element.hide();
}
});
}
function insertAfter(referenceNode, newNode) {
referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
}
function insertAppraiseBtn() {
var refinebtn = $(".col-xs-5")[1];
var appraisebtn = document.createElement("div");
appraisebtn.className = "col-xs-5";
appraisebtn.style.width = "15%";
var input = document.createElement("input");
input.type = "submit";
input.name = "commit";
input.value = "Appraise";
input.id = "appraisebtn";
input.className = "form-control center-block btn";
appraisebtn.appendChild(input);
$(appraisebtn).on('click', showOverallDialogBox);
insertAfter(refinebtn, appraisebtn);
}
var dialog = document.createElement('div');
dialog.id = "dialog";
document.body.appendChild(dialog);
function showOverallDialogBox() {
refineIVs();
$("#dialog").dialog({
autoOpen: true,
title: "How good is your pokémon?",
modal: true,
draggable: false,
resizable: false,
buttons: [{
text: "0: ...It can accomplish anything!",
click: function() {
processOverall(0);
}
}, {
text: "1: ...You should be proud!",
click: function() {
processOverall(1);
}
}, {
text: "2: ...is a decent Pokemon",
click: function() {
processOverall(2);
}
}, {
text: "3: ...but I still like it!",
click: function() {
processOverall(3);
}
}],
width: "400px"
});
$(".ui-dialog")[0].style.position = "fixed";
$(".ui-dialog")[0].style.zIndex = 9999;
$(".ui-button").css("display", "block");
$(".ui-dialog-buttonset").css("float", "none");
$(".ui-dialog-titlebar").css("background", "#24CCAA");
$(".ui-dialog-title").css("text-align", "center");
$(window).resize(function() {
$("#dialog").dialog("option", "position", {my: "center", at: "center", of: window});
});
}
function showStatDialogBox(type) {
$("#dialog").dialog({
autoOpen: true,
title: type.charAt(0).toUpperCase() + type.slice(1),
modal: true,
draggable: false,
resizable: false,
buttons: [{
text: "0: ...WOW!",
click: function() {
processStats(type, 0);
}
}, {
text: "1: ...How exciting!",
click: function() {
processStats(type, 1);
}
}, {
text: "2: ...it'll get the job done.",
click: function() {
processStats(type, 2);
}
}, {
text: "3: ...don't point to greatness in battle.",
click: function() {
processStats(type, 3);
}
}, {
text: "Click here if not provided.",
click: function() {
processStats(type, undefined);
}
}],
width: "400px"
});
$(".ui-button").css("display", "block");
}
function processOverall(value) {
var valMin, valMax;
switch (value) {
case 0:
valMin = 80;
valMax = 100;
break;
case 1:
valMin = 65;
valMax = 80;
break;
case 2:
valMin = 50;
valMax = 65;
break;
case 3:
valMin = 0;
valMax = 50;
break;
}
filterIVDivs("perc", valMin, valMax);
showStatDialogBox("attack");
}
function processStats(type, value) {
var valMin, valMax;
if (type === "attack" || type === "defense" || type === "hp") {
switch (value) {
case 0:
valMin = 15;
valMax = 15;
break;
case 1:
valMin = 13;
valMax = 14;
break;
case 2:
valMin = 8;
valMax = 12;
break;
case 3:
valMin = 0;
valMax = 7;
break;
}
filterIVDivs(type, valMin, valMax);
}
switch (type) {
case "attack":
showStatDialogBox("defense");
attack = value;
break;
case "defense":
showStatDialogBox("hp");
defense = value;
break;
case "hp":
$("#dialog").dialog("close");
hp = value;
derivatePhrase();
break;
}
}
insertAppraiseBtn();
})();