// ==UserScript==
// @name Pokevision Enhancer
// @namespace https://greasyfork.org/en/users/814-bunta
// @description Save/Load filter list, scan an area for pokemon, plus more!
// @include *pokevision.com/*
// @version 1.2
// @Author Bunta
// @license http://creativecommons.org/licenses/by-nc-sa/3.0/us/
// @grant none
// ==/UserScript==
var scanDelay = 1000; // time between scans for each lat/long position. Should be no lower than 1000 (1s)
var autoDelay = 60000; // time between scans repeating when Auto checkbox is enabled
var scanOnLoad = false; // if true will perform scan as soon as page is loaded or refreshed
var minLat = -36.84, maxLat = -36.86, minLon = 174.62, maxLon = 174.64; // bounds for the scan area. minLat is northmost value, minLon is westmost value. Scans adjust lat/long by 0.01
/* run below code (after setting above position variables) in console to view the bounds of your search area
App.home.createMarker(1,{latitude: minLat,longitude:minLon,pokemonId:151,}); // Mew should be top left
App.home.createMarker(1,{latitude: minLat,longitude:maxLon,pokemonId:25,}); // Pikachu should be top right
App.home.createMarker(1,{latitude: maxLat,longitude:minLon,pokemonId:26,}); // Raichu should be bottom left
App.home.createMarker(1,{latitude: maxLat,longitude:maxLon,pokemonId:150,}); // MewTwo should be bottom right
*/
var pokemonAlertList = { //Choose which pokemon you want to be alerted about!
"Bulbasaur": false,
"Ivysaur":false,
"Venusaur":false,
"Charmander":false,
"Charmeleon":true,
"Charizard":true,
"Squirtle":false,
"Wartortle":false,
"Blastoise":true,
"Caterpie":false,
"Metapod":false,
"Butterfree":false,
"Weedle":false,
"Kakuna":false,
"Beedrill":false,
"Pidgey":false,
"Pidgeotto":false,
"Pidgeot":false,
"Rattata":false,
"Raticate":false,
"Spearow":false,
"Fearow":false,
"Ekans":false,
"Arbok":false,
"Pikachu":true,
"Raichu":true,
"Sandshrew":false,
"Sandslash":false,
"Nidoran♀":false,
"Nidorina":false,
"Nidoqueen":true,
"Nidoran♂":false,
"Nidorino":false,
"Nidoking":false,
"Clefairy":false,
"Clefable":false,
"Vulpix":false,
"Ninetales":true,
"Jigglypuff":false,
"Wigglytuff":false,
"Zubat":false,
"Golbat":false,
"Oddish":false,
"Gloom":false,
"Vileplume":true,
"Paras":false,
"Parasect":false,
"Venonat":false,
"Venomoth":false,
"Diglett":false,
"Dugtrio":true,
"Meowth":false,
"Persian":false,
"Psyduck":false,
"Golduck":false,
"Mankey":false,
"Primeape":true,
"Growlithe":false,
"Arcanine":false,
"Poliwag":false,
"Poliwhirl":false,
"Poliwrath":false,
"Abra":false,
"Kadabra":false,
"Alakazam":true,
"Machop":false,
"Machoke":true,
"Machamp":true,
"Bellsprout":false,
"Weepinbell":false,
"Victreebel":false,
"Tentacool":false,
"Tentacruel":false,
"Geodude":false,
"Graveler":false,
"Golem":true,
"Ponyta":false,
"Rapidash":true,
"Slowpoke":false,
"Slowbro":false,
"Magnemite":false,
"Magneton":true,
"Farfetch'd":true,
"Doduo":false,
"Dodrio":false,
"Seel":false,
"Dewgong":true,
"Grimer":false,
"Muk":true,
"Shellder":false,
"Cloyster":true,
"Gastly":false,
"Haunter":false,
"Gengar":true,
"Onix":false,
"Drowzee":false,
"Hypno":true,
"Krabby":false,
"Kingler":false,
"Voltorb":false,
"Electrode":false,
"Exeggcute":false,
"Exeggutor":true,
"Cubone":false,
"Marowak":true,
"Hitmonlee":false,
"Hitmonchan":false,
"Lickitung":false,
"Koffing":false,
"Weezing":false,
"Rhyhorn":false,
"Rhydon":true,
"Chansey":false,
"Tangela":false,
"Kangaskhan":true,
"Horsea":false,
"Seadra":false,
"Goldeen":false,
"Seaking":false,
"Staryu":false,
"Starmie":false,
"Mr. Mime":true,
"Scyther":false,
"Jynx":false,
"Electabuzz":false,
"Magmar":false,
"Pinsir":false,
"Tauros":true,
"Magikarp":false,
"Gyarados":true,
"Lapras":true,
"Ditto":true,
"Eevee":false,
"Vaporeon":false,
"Jolteon":true,
"Flareon":true,
"Porygon":false,
"Omanyte":false,
"Omastar":true,
"Kabuto":false,
"Kabutops":true,
"Aerodactyl":false,
"Snorlax":false,
"Articuno":true,
"Zapdos":true,
"Moltres":true,
"Dratini":false,
"Dragonair":false,
"Dragonite":true,
"Mewtwo":true,
"Mew":true,
}
// Test if local storage is available
function storageAvailable(type) {
try {
var storage = window[type],
x = '__storage_test__';
storage.setItem(x, x);
storage.removeItem(x);
return true;
}
catch(e) {
return false;
}
}
var storageAllowed = storageAvailable('localStorage');
// Start with some style fixes to improve map visibility
function addGlobalStyle(css) {
var head, style;
head = document.getElementsByTagName('head')[0];
if (!head) { return; }
style = document.createElement('style');
style.type = 'text/css';
style.innerHTML = css;
head.appendChild(style);
}
addGlobalStyle("header { padding: 5px 0 ! important }")
addGlobalStyle("body.home { padding: 40px 0px 0px 0 ! important }")
$("footer").remove()
// Function to update the pokemon list to the selected pokemon above
function refreshFilter() {
$("button.bs-deselect-all").click()
for (key in pokemonAlertList) {
if (pokemonAlertList[key]) {
$("ul.dropdown-menu.inner li span").filter(function(index) { return $(this).text() === key; }).click();
}
}
}
// Function to save the pokemon list to local storage
function saveFilter() {
var selectedPokemon = [];
$('.dropdown-menu.inner li.selected').each(function(_, el){
selectedPokemon.push($(el).data('original-index'));
});
localStorage.setItem('selectedPokemon', JSON.stringify(selectedPokemon));
}
// Function to load the pokemon list from local storage
function loadFilter() {
var selectedPokemon
try {
selectedPokemon = JSON.parse(localStorage.selectedPokemon);
} catch(e) {
refreshFilter();
return;
}
if (selectedPokemon == null || selectedPokemon == "") { refreshFilter(); return; }
$("button.bs-deselect-all").click()
selectedPokemon.forEach(function(pokemonId) {
$("ul.dropdown-menu.inner li[data-original-index=" + pokemonId + "] a").click();
});
}
var scanning = false;
// function to perform scanning in grid area bound by lat/long variables set above
function scanLoop(lat,lon) {
if (lon > maxLon) {
lat -= 0.01;
lon = minLon;
}
if (lat < maxLat) {
console.log("Scanning Complete:", (new Date()).toLocaleTimeString());
if ($("#autoRescan").prop("checked"))
{
console.log("Next scan will start:", (new Date((new Date()).getTime() + autoDelay)).toLocaleTimeString());
setTimeout(function() {
console.log("Initiating Scan:", (new Date()).toLocaleTimeString());
scanLoop(minLat,minLon);
}, autoDelay);
} else {
scanning = false;
}
return;
}
//console.log("scanning:",lat,lon);
App.home.findNearbyPokemon(lat, lon);
setTimeout(function() { scanLoop(lat,lon+0.01); }, scanDelay);
}
// Add buttons to header bar
if (storageAllowed) {
$("a.header-map-locate").before('<input type="checkbox" name="autoRescan" id="autoRescan" value="Auto">Auto <button id="rescanPokes">Scan</Rescan><button id="saveFilter">Save Filter</button><button id="loadFilter">Load Filter</button>');
} else {
$("a.header-map-locate").before('<input type="checkbox" name="autoRescan" id="autoRescan" value="Auto">Auto <button id="rescanPokes">Scan</Rescan><button id="refreshFilter">Filter</button>');
}
// Add click functions to buttons
$("#rescanPokes").click(function() {
console.log("rescanPokes");
if (!scanning) {
scanning = true;
console.log("Initiating Scan:", (new Date()).toLocaleTimeString());
scanLoop(minLat,minLon);
}
});
$("#refreshFilter").click(function() {
console.log("refreshFilter");
refreshFilter();
});
$("#saveFilter").click(function() {
console.log("saveFilter");
saveFilter();
});
$("#loadFilter").click(function() {
console.log("loadFilter");
loadFilter();
});
// Update filter and scan on page load (if enabled)
$(window).load(function(){
if (storageAllowed) {
loadFilter();
} else {
refreshFilter();
}
if (!scanning && scanOnLoad) {
scanning = true;
console.log("Initiating Scan:", (new Date()).toLocaleTimeString());
scanLoop(minLat,minLon);
}
});