// ==UserScript== // @name [Pokeclicker] Enhanced Auto Clicker // @namespace Pokeclicker Scripts // @match https://www.pokeclicker.com/ // @grant none // @version 1.6 // @author Ephenia (Original/Credit: Ivan Lay, Novie53) // @description Clicks through battles appropriately depending on the game state. Also, includes a toggle button to turn Auto Clicking on or off and various insightful statistics. Now also includes an automatic Gym battler as well as Auto Dungeon with different modes. // @downloadURL none // ==/UserScript== var clickState; var clickColor; var awaitAutoClick; var autoClickerLoop; var autoClickDPS; var clickDPS; var reqDPS; var enemySpeedRaw; var enemySpeed; var colorDPS; var gymState; var gymColor; var gymSelect; var dungeonState; var dungeonColor; var dungeonSelect; var foundBoss = false; var foundBossX; var foundBossY; var newSave; var trainerCards; var battleView = document.getElementsByClassName('battle-view')[0]; function initAutoClicker() { if (clickState == "OFF") { clickColor = "danger" clickDPS = 0 } else { clickColor = "success" clickDPS = +localStorage.getItem('storedClickDPS'); } if (gymState == "OFF") { gymColor = "danger" } else { gymColor = "success" } if (dungeonState == "OFF") { dungeonColor = "danger" } else { dungeonColor = "success" } var elemAC = document.createElement("table"); elemAC.innerHTML = ` ` battleView.before(elemAC) document.getElementById('gym-select').value = gymSelect; document.getElementById('dungeon-select').value = dungeonSelect; $("#auto-click-start").click(toggleAutoClick) $("#auto-gym-start").click(toggleAutoGym) $("#gym-select").change(changeSelectedGym) $("#auto-dungeon-start").click(toggleAutoDungeon) $("#dungeon-select").change(changeSelectedDungeon) addGlobalStyle('#auto-click-info { display: flex;flex-direction: row;justify-content: center; }'); addGlobalStyle('#auto-click-info > div { width: 33.3%; }'); addGlobalStyle('#dungeonMap { padding-bottom: 9.513%; }'); if (clickState == "ON") { autoClicker(); calcClickDPS(); } } function toggleAutoClick() { if (clickState == "OFF") { clickState = "ON" document.getElementById("auto-click-start").classList.remove('btn-danger'); document.getElementById("auto-click-start").classList.add('btn-success'); clickDPS = +localStorage.getItem('storedClickDPS'); autoClicker(); calcClickDPS(); } else { clickState = "OFF" document.getElementById("auto-click-start").classList.remove('btn-success'); document.getElementById("auto-click-start").classList.add('btn-danger'); clickDPS = 0; reqDPS = 0; enemySpeedRaw = 0; clearInterval(autoClickerLoop) clearInterval(autoClickDPS) } localStorage.setItem("autoClickState", clickState); document.getElementById('auto-click-start').innerHTML = `Auto Click [` + clickState + `]
Auto Click DPS:
`+ clickDPS.toLocaleString('en-US') + `
Req. DPS:
0
Enemy/s:
0
` } function toggleAutoGym() { if (gymState == "OFF") { gymState = "ON" document.getElementById("auto-gym-start").classList.remove('btn-danger'); document.getElementById("auto-gym-start").classList.add('btn-success'); } else { gymState = "OFF" document.getElementById("auto-gym-start").classList.remove('btn-success'); document.getElementById("auto-gym-start").classList.add('btn-danger'); } localStorage.setItem("autoGymState", gymState); document.getElementById('auto-gym-start').innerHTML = `Auto Gym [` + gymState + `]` } function toggleAutoDungeon() { if (dungeonState == "OFF") { dungeonState = "ON" document.getElementById("auto-dungeon-start").classList.remove('btn-danger'); document.getElementById("auto-dungeon-start").classList.add('btn-success'); } else { dungeonState = "OFF" document.getElementById("auto-dungeon-start").classList.remove('btn-success'); document.getElementById("auto-dungeon-start").classList.add('btn-danger'); } localStorage.setItem("autoDungeonState", dungeonState); document.getElementById('auto-dungeon-start').innerHTML = `Auto Dungeon [` + dungeonState + `]` } function changeSelectedGym() { if (gymSelect != +document.getElementById('gym-select').value) { gymSelect = +document.getElementById('gym-select').value localStorage.setItem("selectedGym", gymSelect); } } function changeSelectedDungeon() { if (dungeonSelect != +document.getElementById('dungeon-select').value) { dungeonSelect = +document.getElementById('dungeon-select').value localStorage.setItem("selectedDungeon", dungeonSelect); } } function getRandomInt(max) { return Math.floor(Math.random() * max); } function calcClickDPS() { autoClickDPS = setInterval(function () { var enemyHealth; try { enemyHealth = Battle.enemyPokemon().maxHealth(); } catch (err) { enemyHealth = 0; } if (clickDPS != App.game.party.calculateClickAttack() * 20) { clickDPS = App.game.party.calculateClickAttack() * 20; document.getElementById('click-DPS').innerHTML = `Auto Click DPS:
` + clickDPS.toLocaleString('en-US'); +`
` localStorage.setItem('storedClickDPS', clickDPS) } if (reqDPS != enemyHealth * 20) { reqDPS = enemyHealth * 20; if (clickDPS >= reqDPS) { colorDPS = "greenyellow" } else { colorDPS = "darkred" } document.getElementById('req-DPS').innerHTML = `Req. DPS:
` + reqDPS.toLocaleString('en-US'); +`
` } if (enemySpeedRaw != ((App.game.party.calculateClickAttack() * 20) / enemyHealth).toFixed(1)) { enemySpeed = ((App.game.party.calculateClickAttack() * 20) / enemyHealth).toFixed(1); enemySpeedRaw = enemySpeed //console.log(enemySpeedRaw) if (enemySpeedRaw == 'Infinity') { enemySpeed = 0 } if (enemySpeedRaw >= 20 && enemySpeedRaw != 'Infinity') { enemySpeed = 20 } document.getElementById('enemy-DPS').innerHTML = `Enemy/s:
` + enemySpeed + `
` } }, 1000); } function autoClicker() { autoClickerLoop = setInterval(function () { // Click while in a normal battle if (App.game.gameState == GameConstants.GameState.fighting) { Battle.clickAttack(); } //Auto Gym checking if (gymState == "ON") { autoGym(); } //Auto Dungeon checking if (dungeonState == "ON" && DungeonRunner.fighting() == false && DungeonBattle.catching() == false) { autoDungeon(); } //Reset the values for the boss coordinates if we timeout or turn off autoDungeon if ((dungeonState == "OFF" && foundBoss) || (dungeonState == "ON" && DungeonRunner.dungeonFinished() && foundBoss)){ foundBoss = false bossCoords.length = 0 } // Click while in a gym battle if (App.game.gameState === GameConstants.GameState.gym) { GymBattle.clickAttack(); } // Click while in a dungeon - will also interact with non-battle tiles (e.g. chests) if (App.game.gameState === GameConstants.GameState.dungeon) { if (DungeonRunner.fighting() && !DungeonBattle.catching()) { DungeonBattle.clickAttack(); } } }, 50); // The app hard-caps click attacks at 50 } function autoGym() { if (player.town().hasOwnProperty("gym") || player.town().hasOwnProperty("gymList")) { if (player.town().gym != null || player.town().gym !== undefined) { if (MapHelper.calculateTownCssClass(player.town().name) != "currentLocation") { MapHelper.moveToTown(player.town().name) } if (player.region != player.town().region) { player.region = player.town().region } if (App.game.gameState != GameConstants.GameState.gym) { if (player.town().hasOwnProperty("gymList")) { var selGym; for (var i = 0; i <= gymSelect; i++) { if (Gym.isUnlocked(player.town().gymList[i]) == true) { selGym = i; } else { selGym = (i - 1) i = gymLength; } if (selGym != -1) { GymRunner.startGym(player.town().gymList[i]) } } } else { if (Gym.isUnlocked(player.town().gym) == true) { GymRunner.startGym(player.town().gym) } } } } } } var bossCoords = [] function autoDungeon() { //Rewrite if (player.town().hasOwnProperty("dungeon") == true && player.town().dungeon !== undefined) { var getTokens = App.game.wallet.currencies[GameConstants.Currency.dungeonToken](); var dungeonCost = player.town().dungeon.tokenCost; if (MapHelper.calculateTownCssClass(player.town().name) != "currentLocation") { MapHelper.moveToTown(player.town().name) } //Don't think this condition is ever possible /*if (player.region != player.town().region) { player.region = player.town().region }*/ if (getTokens >= dungeonCost && App.game.gameState != GameConstants.GameState.dungeon) { DungeonRunner.initializeDungeon(player.town().dungeon) } if (App.game.gameState === GameConstants.GameState.dungeon) { var dungeonBoard = DungeonRunner.map.board(); //The boss can be found at any time if (foundBoss == false){ bossCoords = scan(dungeonBoard) } //Wander around until we can move to the boss tile //Pathfinding should be implemented here, A* looks like the best algorithm else if (foundBoss == true && dungeonSelect == 1){ wander(dungeonBoard, bossCoords) } else if (dungeonSelect == 0){ fullClear(dungeonBoard, bossCoords) } } } } function scan(dungeonBoard){ /*var bossCoords = [] var playerCoords = []*/ for (var i = 0; i < dungeonBoard.length; i++){ for (var j = 0; j