TypeFinder

Find routes to farm

  1. // ==UserScript==
  2. // @name TypeFinder
  3. // @namespace Pokeclicker Scripts
  4. // @version 0.1
  5. // @description Find routes to farm
  6. // @author Maxteke
  7. // @match https://www.pokeclicker.com/
  8. // @grant none
  9. // @license MIT
  10. // ==/UserScript==
  11.  
  12. var scriptName = 'typeFinder'
  13.  
  14. var types = []
  15.  
  16. function hasType(pokemon, type) {
  17. var pokemon = pokemonList.find(element => element.name == pokemon)
  18. if (pokemon == undefined)
  19. return false;
  20. for (var t of pokemon.type) {
  21. if (PokemonType[t] == type)
  22. return true;
  23. }
  24. return false;
  25. }
  26.  
  27. function getScore(route, type) {
  28. var pokemons = [];
  29. var find = 0;
  30. pokemons = pokemons.concat(route.pokemon.headbutt);
  31. pokemons = pokemons.concat(route.pokemon.land);
  32. pokemons = pokemons.concat(route.pokemon.special);
  33. pokemons = pokemons.concat(route.pokemon.water);
  34. pokemons.forEach(pokemon => {
  35. if (hasType(pokemon, type))
  36. find++;
  37. });
  38. if (find == 0)
  39. return undefined;
  40. else
  41. return pokemons.length - find;
  42. }
  43.  
  44. function bestRoadForType(region, type) {
  45. var routes = Routes.getRoutesByRegion(region);
  46. var bestScore = 100;
  47. var bestRoute = undefined;
  48. routes.forEach(route => {
  49. var score = getScore(route, type);
  50. if (score < bestScore) {
  51. bestScore = score;
  52. bestRoute = route;
  53. }
  54. });
  55. return { route: bestRoute, score: bestScore };
  56. }
  57.  
  58. function findForEachRegion(type) {
  59. var regions = [];
  60. for (var i = 0; i <= player.highestRegion(); i++) {
  61. regions.push(bestRoadForType(i, type));
  62. }
  63. regions.sort((a, b) => a.score - b.score);
  64. types[type] = regions;
  65. }
  66.  
  67. function addOption(select, type) {
  68. var option = document.createElement('option');
  69. option.value = type;
  70. option.innerHTML = type;
  71. select.appendChild(option);
  72. }
  73.  
  74. function typeFinderCard() {
  75. var card = document.createElement('div');
  76. card.id = 'typeFinder';
  77. card.classList.add('card')
  78. card.classList.add('sortable')
  79. card.classList.add('border-secondary')
  80. card.classList.add('mb-3')
  81.  
  82. var header = document.createElement('div');
  83. header.classList.add('card-header');
  84. header.classList.add('p-0');
  85. header.setAttribute('data-toggle', 'collapse');
  86. header.setAttribute('href', '#typeFinderBody');
  87. var title = document.createElement('span');
  88. title.innerHTML = 'Type finder';
  89.  
  90. header.appendChild(title);
  91. card.appendChild(header);
  92.  
  93. var body = document.createElement('div');
  94. body.id = 'typeFinderBody'
  95. body.classList.add('card-body');
  96. body.classList.add('p-0');
  97. body.classList.add('collapse');
  98. body.classList.add('show');
  99.  
  100. var container = document.createElement('div');
  101. container.style.display = 'flex';
  102. container.style.flexDirection = 'column';
  103. container.style.alignContent = 'center';
  104. container.style.alignItems = 'center';
  105.  
  106. var result = document.createElement('div');
  107. result.style.display = 'flex';
  108. result.style.flexDirection = 'column';
  109. result.style.alignContent = 'center';
  110. result.style.alignItems = 'center';
  111. result.style.width = '100%';
  112.  
  113. var select = document.createElement('select');
  114. select.name = 'TypeSelect'
  115. select.autocomplete = 'off';
  116. select.classList.add('custom-select');
  117. select.onchange = function() {findRoutes(result, select.value)};
  118.  
  119. for (let type in PokemonType) {
  120. if (isNaN(Number(type)) && type != 'None') {
  121. findForEachRegion(type);
  122. addOption(select, type);
  123. }
  124. }
  125.  
  126. container.appendChild(select);
  127.  
  128.  
  129. container.appendChild(result);
  130.  
  131. body.appendChild(container);
  132. card.appendChild(body);
  133.  
  134. document.getElementById('left-column').prepend(card);
  135.  
  136. findRoutes(result, 'Normal');
  137. }
  138.  
  139. function addResult(result, route) {
  140. var button = document.createElement('button');
  141. button.classList.add('btn');
  142. button.classList.add('btn-block');
  143. button.classList.add('btn-primary');
  144. button.classList.add('m-0');
  145. button.onclick = function() {
  146. MapHelper.moveToRoute(route.route.number, route.route.region);
  147. };
  148. button.innerHTML = route.route.routeName;
  149. result.appendChild(button);
  150. }
  151.  
  152. function clearResult(result) {
  153. result.innerHTML = '';
  154. }
  155.  
  156. function findRoutes(result, type) {
  157. clearResult(result);
  158. types[type].forEach(route => {
  159. if (route.route != undefined)
  160. addResult(result, route);
  161. });
  162. }
  163.  
  164. function initTypeFinder() {
  165. typeFinderCard();
  166. }
  167.  
  168. function loadScript(){
  169. var oldInit = Preload.hideSplashScreen
  170.  
  171. Preload.hideSplashScreen = function(){
  172. var result = oldInit.apply(this, arguments)
  173. initTypeFinder()
  174. console.log(`[${GameConstants.formatDate(new Date())}] %cType finder loaded`, 'color:#8e44ad;font-weight:900;');
  175. return result
  176. }
  177. }
  178. if (document.getElementById('scriptHandler') != undefined){
  179. var scriptElement = document.createElement('div')
  180. scriptElement.id = scriptName
  181. document.getElementById('scriptHandler').appendChild(scriptElement)
  182. if (localStorage.getItem(scriptName) != null){
  183. if (localStorage.getItem(scriptName) == 'true'){
  184. loadScript()
  185. }
  186. }
  187. else{
  188. localStorage.setItem(scriptName, 'true')
  189. loadScript()
  190. }
  191. }
  192. else{
  193. loadScript();
  194. }