NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name HaremHeroes Automatic // @namespace JDscripts // @version 3.22 Forked v1.07 // @description Open the menu in HaremHeroes(topright) to toggle AutoControlls. Supports AutoSalary, AutoContest, AutoMission, AutoQuest, AutoTrollBattle, AutoArenaBattle and AutoPachinko(Free). Messages are printed in local console. // @author JD // @match http*://nutaku.haremheroes.com/* // @match http*://*.hentaiheroes.com/* // @updateURL https://openuserjs.org/meta/eileen12/HaremHeroes_Automatic.meta.js // @require https://cdn.jsdelivr.net/js-cookie/2.2.0/js.cookie.js // @grant GM_addStyle // @license MIT // ==/UserScript== GM_addStyle('/* The switch - the box around the slider */ .switch { position: relative; display: inline-block; width: 60px; height: 34px; } /* Hide default HTML checkbox */ .switch input {display:none;} /* The slider */ .slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; -webkit-transition: .4s; transition: .4s; } .slider:before { position: absolute; content: ""; height: 26px; width: 26px; left: 4px; bottom: 4px; background-color: white; -webkit-transition: .4s; transition: .4s; } input:checked + .slider { background-color: #2196F3; } input:focus + .slider { box-shadow: 0 0 1px #2196F3; } input:checked + .slider:before { -webkit-transform: translateX(26px); -ms-transform: translateX(26px); transform: translateX(26px); } /* Rounded sliders */ .slider.round { border-radius: 34px; } .slider.round:before { border-radius: 50%; }'); var globalWorldMap; function getHero() { if(unsafeWindow.Hero === undefined) { setTimeout(autoLoop, Number(sessionStorage.autoLoopTimeMili)); //console.log(window.wrappedJSObject) } return unsafeWindow.Hero; } function getGirlsMap() { return unsafeWindow.GirlSalaryManager.girlsMap; } function getPage() { try{ var ob = document.getElementById("hh_nutaku"); if(ob===undefined || ob === null) { ob = document.getElementById("hh_hentai"); } return ob.className.match(/.*page-(.*) .*/i)[1]; } catch(err) { return ""; } } // Retruns true if on correct page. function gotoPage(page) { if(getPage() === page) { return true; } else { console.log("Navigating to page: "+page); var togoto; // get page path switch(page) { case "missions": case "activities": togoto = $("nav div[rel='content'] a:has(.activities)").attr("href"); break; case "harem": togoto = $("nav div[rel='content'] a:has(.harem)").attr("href"); break; case "map": togoto = $("nav div[rel='content'] a:has(.map)").attr("href"); break; case "arena": togoto = $("nav div[rel='content'] a:has(.battle)").attr("href"); break; case "pachinko": togoto = $("nav div[rel='content'] a:has(.pachinko)").attr("href"); break; case "quest": togoto = getHero().infos.questing.current_url; console.log("Current quest page: "+togoto); break; default: console.log("Unknown goto page request. No page \'"+page+"\' defined."); } if(togoto !== undefined) { sessionStorage.autoLoop = "false"; window.location = window.location.origin + togoto; } else console.log("Couldn't find page path. Page was undefined..."); return false; } } var proceedQuest = function () { //console.log("Starting auto quest."); // Check if at correct page. if (!gotoPage("quest")) { // Click on current quest to naviagte to it. console.log("Navigating to current quest."); return; } // Get the proceed button type var proceedButtonMatch = $("#controls button:not([style='display: none;'])"); var proceedCostEnergy = Number($("#controls .cost span[cur='*']").text()); var proceedCostMoney = Number($("#controls .cost span[cur='$']").text().trim().replace(',', '')); var proceedType = proceedButtonMatch.attr("act"); if (proceedButtonMatch.length === 0) console.log("Could not find resume button."); else if (proceedType === "free") { console.log("Proceeding for free."); proceedButtonMatch.click(); } else if (proceedType === "pay") { var energyCurrent = getHero().infos.energy_quest; var moneyCurrent = getHero().infos.soft_currency; if(proceedCostEnergy <= energyCurrent) { // We have energy. console.log("Spending "+proceedCostEnergy+" Energy to proceed."); } else { console.log("Quest requires "+proceedCostEnergy+" Energy to proceed."); sessionStorage.questRequirement = "*"+proceedCostEnergy; return; } if(proceedCostMoney <= moneyCurrent) { // We have money. console.log("Spending "+proceedCostMoney+" Money to proceed."); } else { console.log("Spending "+proceedCostEnergy+" Money to proceed."); sessionStorage.questRequirement = "$"+proceedCostMoney; return; } proceedButtonMatch.click(); sessionStorage.autoLoop = "false"; location.reload(); } else if (proceedType === "use_item") { console.log("Proceeding by using X" + Number($("#controls .item span").text()) + " of the required item."); proceedButtonMatch.click(); } else if (proceedType === "battle") { console.log("Proceeding to battle troll..."); sessionStorage.questRequirement = "battle"; // Proceed to battle troll. proceedButtonMatch.click(); sessionStorage.autoLoop = "false"; location.reload(); } else if (proceedType === "end_archive") { console.log("Reached end of current archive. Proceeding to next archive."); sessionStorage.autoLoop = "false"; proceedButtonMatch.click(); } else if (proceedType === "end_play") { console.log("Reached end of current play. Proceeding to next play."); sessionStorage.autoLoop = "false"; proceedButtonMatch.click(); } else { console.log("Could not identify given resume button."); sessionStorage.questRequirement = "unknownQuestButton"; } }; /** * Recieves a list of mission objects and returns the mission object to use. * A mission object looks similar to this :- * Eg 1: {"id_member_mission":"256160093","id_mission":"23","duration":"53","cost":"1","remaining_time":"-83057","rewards":[{"classList":{"0":"slot","1":"slot_xp"},"type":"xp","data":28},{"classList":{"0":"slot","1":"slot_SC"},"type":"money","data":277}]} * Eg 2: {"id_member_mission":"256160095","id_mission":"10","duration":"53","cost":"1","remaining_time":"-81330","rewards":[{"classList":{"0":"slot","1":"slot_xp"},"type":"xp","data":28},{"classList":{"0":"slot","1":"rare"},"type":"item","data":{"id_item":"23","type":"gift","subtype":"0","identifier":"K3","rarity":"rare","value":"80","carac1":0,"carac2":0,"carac3":0,"endurance":0,"chance":0,"ego":0,"damage":0,"duration":0,"level_mini":"1","name":"Bracelet","Name":"Bracelet","ico":"https://content.haremheroes.com/pictures/items/K3.png","price_sell":5561,"count":1,"id_m_i":[]}}]} * Eg 3: {"id_member_mission":"256822795","id_mission":"337","duration":"17172","cost":"144","remaining_time":null,"remaining_cost":"144","rewards":[{"classList":{"0":"slot","1":"slot_HC"},"type":"koban","data":11}]} * Eg 1 has mission rewards of xp and money. * Eg 2 has mission rewards of xp and item. * Eg 3 has mission rewards of koban/hard_currency. * cost is the koban price for instant complete. */ function getSuitableMission(missionsList) { var msn = missionsList[0]; for(var m in missionsList) { if(Number(msn.duration) > Number(missionsList[m].duration)) { msn = missionsList[m]; } } return msn; } // retruns a map of WorldName->fullLink/href // else returns false if navigating there function getUnlockedWorlds() { if(gotoPage("map")) { var map = new Map(); // fill the map document.querySelectorAll("a.link-world").forEach( function(elem) { var name = elem.nextElementSibling.textContent.trim(); map.set(name, elem.href); } ); // set global latest map sessionStorage.globalWorldMap = JSON.stringify([...map]); globalWorldMap = map; //return not busy return map; } else { console.log("Navigating to worldmap."); // not done return false; } } // returns boolean to set busy function doMissionStuff() { if(!gotoPage("missions")) { console.log("Navigating to activities page."); // return busy return true; } else { console.log("On activities page."); console.log("Collecting finished mission's reward."); $(".mission_button button:visible[rel='claim']").click(); // TODO: select new missions and parse reward data from HTML, it's there in data attributes of tags var missions = []; var allGood = true; // parse missions $(".mission_object").each(function(idx,missionObject){ var data = $.data(missionObject).d; // Do not list completed missions if(data.remaining_time !== null){ // This is not a fresh mission if(data.remaining_time > 0) { console.log("Unfinished mission detected...("+data.remaining_time+"sec. remaining)"); Cookies.set('nextMissionTime',data.remaining_time,{expires:new Date(new Date().getTime() + data.remaining_time * 1000)}); } else{ console.log("Unclaimed mission detected..."); } allGood = false; return; } data.missionObject = missionObject; var rewards = []; // set rewards { // get Reward slots var slots = missionObject.querySelectorAll(".slot"); // traverse slots $.each(slots,function(idx,slotDiv){ var reward = {}; // get slot class list reward.classList = slotDiv.classList; // set reward type if(reward.classList.contains("slot_xp"))reward.type = "xp"; else if(reward.classList.contains("slot_SC"))reward.type = "money"; else if(reward.classList.contains("slot_HC"))reward.type = "koban"; else reward.type = "item"; // set value if xp if(reward.type === "xp" || reward.type === "money" || reward.type === "koban") { // remove all non numbers and HTML tags try{ reward.data = Number(slotDiv.innerHTML.replace(/<.*?>/g,'').replace(/\D/g,'')); } catch(e){ console.log("Couldn't parse xp/money data."); console.log(slotDiv); } } // set item details if item else if(reward.type === "item") { try{ reward.data = $.data(slotDiv).d; } catch(e){ console.log("Couldn't parse item reward slot details."); console.log(slotDiv); reward.type = "unknown"; } } rewards.push(reward); }); } data.rewards = rewards; missions.push(data); }); if(!allGood){ console.log("Something went wrong, need to retry later..."); // busy return true; } console.log("Missions parsed, mission list is:-"); console.log(missions); if(missions.length > 0) { console.log("Selecting mission from list."); var mission = getSuitableMission(missions); console.log("Selected mission:-"); console.log(mission); console.log("Selected mission duration: "+mission.duration+"sec."); var missionButton = $(mission.missionObject).find("button:visible").first(); console.log("Mission button of type: "+missionButton.attr("rel")); console.log("Clicking mission button."); missionButton.click(); Cookies.set('nextMissionTime',mission.duration,{expires:new Date(new Date().getTime() + mission.duration * 1000)}); } else{ console.log("No missions detected...!"); // get gift var ck = Cookies.get('nextMissionTime'); var isAfterGift = document.querySelector("#missions .after_gift").style.display === 'block'; if(!isAfterGift){ if(ck === undefined || ck === 'giftleft') { console.log("Collecting gift."); // click button document.querySelector(".end_gift button").click(); } else{ console.log("Refreshing to collect gift..."); Cookies.set('nextMissionTime','giftleft'); window.reload(); // is busy return true; } } var time = 0; for(var e in unsafeWindow.HHTimers.timers){ if(typeof unsafeWindow.HHTimers.timers[e].$elm != "undefined" && unsafeWindow.HHTimers.timers[e].$elm.selector.includes("#missions_counter")) time=unsafeWindow.HHTimers.timers[e]; } time = time.remainingTime; if(time === undefined) { //try again with different selector for(e in unsafeWindow.HHTimers.timers){ if(typeof unsafeWindow.HHTimers.timers[e].$elm != "undefined" && unsafeWindow.HHTimers.timers[e].$elm.selector.includes(".after_gift")) time=unsafeWindow.HHTimers.timers[e]; } time = time.remainingTime; } if(time === undefined){ console.log("New mission time was undefined... Setting it manually to 10min."); time = 10*60; } console.log("New missions in: "+time+"sec."); Cookies.set('nextMissionTime',time,{expires:new Date(new Date().getTime() + time * 1000)}); } // not busy return false; } } // returns boolean to set busy function doContestStuff() { if(!gotoPage("missions")) { console.log("Navigating to activities page."); // return busy return true; } else { console.log("On activities page."); console.log("Collecting finished contests's reward."); $(".contest .ended button[rel='claim']").click(); // need to get next contest timer data var time = 0; for(var e in unsafeWindow.HHTimers.timers){ if(typeof unsafeWindow.HHTimers.timers[e].$elm != "undefined" && unsafeWindow.HHTimers.timers[e].$elm.selector.includes(".contest_timer")) time=unsafeWindow.HHTimers.timers[e]; } time = time.remainingTime; if(time === undefined) { //try again with different selector time = undefined; for(e in unsafeWindow.HHTimers.timers){ if(typeof unsafeWindow.HHTimers.timers[e].$elm != "undefined" && unsafeWindow.HHTimers.timers[e].$elm[0].className.includes("contest_timer")) // get closest time if(!(unsafeWindow.HHTimers.timers[e].remainingTime>time)) time=unsafeWindow.HHTimers.timers[e].remainingTime; } } if(time === undefined){ console.log("New contest time was undefined... Setting it manually to 10min."); time = 10*60; } Cookies.set('nextContestTime',time,{expires:new Date(new Date().getTime() + time * 1000)}); console.log("Next contest time stored in nextContestTime cookie.(+" + time + " sec.)"); // Not busy return false; } } var getSalary = function () { try { if(!gotoPage("harem")) { // Not at Harem screen then goto the Harem screen. console.log("Navigating to Harem window."); // return busy return true; } else { console.log("Detected Harem Screen. Fetching Salary"); $("#harem_whole #harem_left .salary:not('.loads') button").each(function (index) { $(this).click(); }); console.log("Salary fetched. Getting next fetch time"); // In seconds var closestTime; var gMap = getGirlsMap(); if(gMap === undefined) { // error console.log("Girls Map was undefined...! Error, manually setting salary time to 2 min."); closestTime = 2*60; } else { try{ // Calc. closest time for(var key in gMap) { // undefined comparision is always false so first iteration is false, hence the not(!) if(!(closestTime<gMap[key].gData.pay_in)) { closestTime = gMap[key].gData.pay_in; } } } catch(exp){ // error console.log("Girls Map had undefined property...! Error, manually setting salary time to 2 min."); closestTime = 2*60; } } if(closestTime === undefined) { console.log("closestTime was undefined...! Error, manually setting salary time to 2 min."); closestTime = 2*60; } if(closestTime <= 2) { console.log("closestTime is less than/equal to 2 sec. Staying on this page."); // return busy return true; } Cookies.set('nextSalaryTime',closestTime,{expires:new Date(new Date().getTime() + closestTime * 1000)}); console.log("New fetch time stored in nextSalaryTime cookie.(+" + closestTime + " sec.)"); // return not busy return false; } } catch (ex) { console.log("Could not collect salary... " + ex); // return not busy return false; } }; var doBossBattle = function() { var currentPower = getHero().infos.energy_fight; if(currentPower < 1) { //console.log("No power for battle."); return; } // Battles the latest boss. // Navigate to latest boss. if(window.location.pathname.startsWith("/battle.html")) { // On the battle screen. doBattle(); } else if(window.location.pathname.startsWith("/world")) { // On some world screen. // Click on the local Boss's battle button. console.log("Entering battle with this troll."); sessionStorage.autoLoop = "false"; window.location = window.location.origin + $("#worldmap a[class='troll_world']").attr("href"); return; } else if(sessionStorage.trollToFight !== undefined && sessionStorage.trollToFight !== "latest") { console.log("Custom troll fight."); console.log("Fighting troll at: "+sessionStorage.trollToFight); var worldMap = getUnlockedWorlds(); if(worldMap === false) { console.log("Finding unlocked worlds..."); return; } var worldPage = worldMap.get(sessionStorage.trollToFight); if(worldPage === undefined) { console.log("ERROR! worldPage undefined for troll at: "+sessionStorage.trollToFight); return; } console.log("Troll world at: "+worldPage); window.location = worldPage; sessionStorage.autoLoop = "false"; } else if(window.location.pathname.startsWith("/quest")) { // On some quest screen. // Goto this area's screen. console.log("Navigating to latest Troll."); sessionStorage.autoLoop = "false"; window.location = window.location.origin + $("#breadcrumbs a[class='back']").last().attr("href"); return; } else{ console.log("Navigating to latest Troll."); sessionStorage.autoLoop = "false"; window.location = window.location.origin + $("nav div[rel='content'] a:has(.continue_quest)").attr("href"); return; } }; var doBattle = function () { //console.log("Performing auto battle."); // Confirm if on correct screen. var page = getPage(); if(page === "arena") { if ($("#arena[class='canvas']").length === 1) { // Oponent choose screen console.log("On opponent choose screen."); if(document.getElementById("popups").style.display === "block") { console.log("Popup detetcted. Refresh page."); unsafeWindow.reload(); return; } else{ console.log("No popups."); } // Fight the first opponent in list. var selbutton = $(".opponents_arena .sub_block button:contains('Select')"); if(selbutton.length<1) { console.log("No arena opponents found, storing nextArenaTime..."); var arenatime = 0; for(var e in unsafeWindow.HHTimers.timers){ if(typeof unsafeWindow.HHTimers.timers[e].$elm != "undefined" && unsafeWindow.HHTimers.timers[e].$elm.selector.startsWith(".arena_refresh_counter")) arenatime=unsafeWindow.HHTimers.timers[e]; } if(arenatime !== undefined || arenatime !== 0) { arenatime = arenatime.remainingTime; Cookies.set('nextArenaTime',arenatime,{expires:new Date(new Date().getTime() + arenatime * 1000)}); console.log("New arena time stored in nextArenaTime cookie.(+" + arenatime + " sec.)"); return; } if (Cookies.get('nextArenaTime') === undefined || Cookies.get('nextArenaTime') === 0 || isNaN(Cookies.get('nextArenaTime'))) { // Backup if timer fails console.log("nextArenaTime was undefined/0/NaN...! Error, manually setting arena time to correct time."); var BNA = $(".opponents_arena .arena_refresh_counter").text().replace('New opponents in: ', '').replace(/\s/g, ""); console.log(BNA); if (isNaN(BNA) || BNA === undefined) { console.log(BNA); unsafeWindow.reload(); } if (BNA.includes('m')) { console.log(BNA); BNA.replace('m', ''); arenatime = Number(BNA.replace('m', '')) * 60; } if (BNA.includes('s')) { console.log(BNA); BNA.replace('s', ''); arenatime = Number(BNA.replace('s', '')); } Cookies.set('nextArenaTime',arenatime,{expires:new Date(new Date().getTime() + arenatime * 1000)}); console.log('Next arena in : ' + Cookies.get('nextArenaTime') + ' secs'); } } selbutton[0].click(); sessionStorage.autoLoop = "false"; } } else if (page === "battle") { // On battle page. //console.log("On Battle Page."); if ($("#battle[class='canvas']").length === 1) { // Battle screen console.log("On battle screen."); // get button with no autofight, i.e. no koban var battleButton = $("#battle_middle button[rel='launch']:not(.autofight)"); var currentPower = getHero().infos.energy_fight; if(battleButton === undefined){ console.log("Battle Button was undefined. Disabling all auto-battle."); document.getElementById("autoBattleCheckbox").checked = false; document.getElementById("autoArenaCheckbox").checked = false; if (sessionStorage.questRequirement === "battle") { document.getElementById("autoQuestCheckbox").checked = false; console.log("Auto-quest disabled since it requires battle and auto-battle has errors."); } return; } var battle_price = battleButton.attr("price_fe"); if(battle_price === undefined){ console.log("Could not detect battle button price. Error."); console.log("Disabling all auto-battle."); document.getElementById("autoBattleCheckbox").checked = false; document.getElementById("autoArenaCheckbox").checked = false; if (sessionStorage.questRequirement === "battle") { document.getElementById("autoQuestCheckbox").checked = false; console.log("Auto-quest disabled since it requires battle and auto-battle has errors."); } return; } console.log("battle price: "+battle_price+"P"); if(currentPower >= battle_price) { // We have the power. battleButton.click(); // Skip setTimeout(function(){$("#battle_middle button[rel='skip']").click();},1000); setTimeout(function(){$("#battle_end div[style*='display: block;'] .blue_text_button").click();},2500); if (sessionStorage.questRequirement === "battle") { // Battle Done. sessionStorage.questRequirement = "none"; } } else { // We need more power. console.log("Battle requires "+battle_price+" power."); sessionStorage.battlePowerRequired = battle_price; if(sessionStorage.questRequirement === "battle")sessionStorage.questRequirement = "P"+battle_price; } } else { console.log("Could not identify battle screen."); if (sessionStorage.questRequirement === "battle") sessionStorage.questRequirement = "errorInAutoBattle"; return; } } else { // Switch to the correct screen console.log("Switching to battle screen."); gotoPage("arena"); return; } }; var updateData = function () { //console.log("updating UI"); var trollOptions = document.getElementById("autoTrollSelector"); sessionStorage.autoTrollSelectedIndex = trollOptions.selectedIndex; sessionStorage.trollToFight = trollOptions.value; sessionStorage.autoSalary = document.getElementById("autoSalaryCheckbox").checked; sessionStorage.autoContest = document.getElementById("autoContestCheckbox").checked; sessionStorage.autoMission = document.getElementById("autoMissionCheckbox").checked; sessionStorage.autoQuest = document.getElementById("autoQuestCheckbox").checked; sessionStorage.autoTrollBattle = document.getElementById("autoBattleCheckbox").checked; sessionStorage.autoArenaBattle = document.getElementById("autoArenaCheckbox").checked; sessionStorage.autoFreePachinko = document.getElementById("autoFreePachinko").checked; }; var getPachinko = function(){ try { if(!gotoPage("pachinko")) { // Not at Pachinko screen then goto the Pachinko screen. console.log("Navigating to Pachinko window."); return; } else { console.log("Detected Pachinko Screen. Fetching Pachinko"); $("#pachinko button[free=1]")[0].click(); var npach; for(var e in unsafeWindow.HHTimers.timersListMin){ if (typeof unsafeWindow.HHTimers.timers[e].$elm != "undefined" && unsafeWindow.HHTimers.timersListMin[e].$elm.selector.startsWith(".pachinko_change")) npach=unsafeWindow.HHTimers.timersListMin[e].remainingTime; } if(npach !== undefined || npach !== 0) { Cookies.set('nextPachinkoTime',npach,{expires:new Date(new Date().getTime() + npach * 1000)}); console.log("Time until next free pachinko stored in nextPachinkoTime cookie.(+" + npach + " sec.)"); } if (npach === undefined || npach === 0 || npach === 86400) { console.log("Errored time attempted to pass us by (+" + npach + " sec.)"); unsafeWindow.reload(); getPachinko1(); } else { Cookies.remove('nextPachinkoTime'); } } } catch (ex) { console.log("Could not collect pachinko... " + ex); } }; //Backup in case timers mess up var getPachinko1 = function(){ try { if(!gotoPage("pachinko")) { // Not at Pachinko screen then goto the Pachinko screen. console.log("Navigating to Pachinko window."); return; } else { console.log("Detected Pachinko Screen. Fetching Pachinko"); var npach; var NPT = $("#pachinko #pachinko_left .count").text().replace('New free game in: ', '').replace(/\s/g, ""); console.log(NPT) //console.log(NPT) if (NPT.includes('d') || isNaN(NPT) || NPT === undefined) { console.log(NPT) unsafeWindow.reload(); } if (NPT.includes('h') && NPT.includes('m')) { NPT = $("#pachinko #pachinko_left .count").text().replace('New free game in: ', '').replace('h', '').replace('m', '').replace(' ', '').replace(/\s/g, ""); console.log(NPT) if (NPT.length == 1) { npach = Number((NPT[0]) * 3600); } if (NPT.length == 2) { npach = Number((NPT[0]) * 3600) + (Number(NPT[1]) * 60); } if (NPT.length == 3) { npach = Number((NPT[0]) * 3600) + (Number(NPT[1] + NPT[2]) * 60); } if (NPT.length == 4) { npach = Number((NPT[0] + NPT[1]) * 3600) + (Number(NPT[2] + NPT[3]) * 60); } } if (NPT.includes('m')) { console.log(NPT) NPT.replace('m', ''); npach = Number(NPT.replace('m', '')) * 60; } if (NPT.includes('s')) { console.log(NPT) NPT.replace('s', ''); npach = Number(NPT.replace('s', '')); } Cookies.set('nextPachinkoTime',npach,{expires:new Date(new Date().getTime() + npach * 1000)}); console.log("Time until next free pachinko stored in nextPachinkoTime cookie.(+" + npach + " sec.)"); $("#pachinko button[free=1]")[0].click(); } } catch (ex) { console.log("Could not collect pachinko... " + ex); } }; /*var popupWindows = function () { sessionStorage.autoLoop = "false"; try { console.log("Detected popup screen. Clicking button"); var buttonMatch = $("#popups button:not([style='display: none;'])"); var harem = $("#popups #popup_messages button:contains('Harem')"); var lvlup = $("#popups #level_up button:contains('Continue')"); var card = $("#popups #monthly_card_received button:contains('Awesome')"); var battle = $("#popups #battle_end button:contains(' Ok ')"); var preward = $("#popups #pachinko_rewards button:contains('Awesome')"); var mreward = $("#popups #missions_rewards button:contains(' Groovy ')"); var bunny = $("#popups #popup_bunny button:contains('Got it!')"); setTimeout(buttonMatch, 1000); if (buttonMatch.length === 0) console.log("Could not find popup button."); else if (buttonMatch.length >= 1) { console.log("Popup detetcted. Refresh page."); //console.log(buttonMatch.text()); unsafeWindow.reload(); return; } else if (harem) { harem.click(); return; } else if (lvlup) { lvlup.click(); return; } else if (card) { card.click(); return; } else if (battle) { battle.click(); return; } else if (preward) { preward.click(); return; } else if (mreward) { mreward.click(); return; } else if (bunny) { bunny.click(); return; } } catch (ex) { console.log("Popup exception : " + ex); } }*/ var autoLoop = function () { updateData(); var busy = false; var page = window.location.href; var currentPower = getHero().infos.energy_fight; //console.log("sal="+sessionStorage.autoSalary); /* if(document.getElementById("popups").style.display === "block" && busy === false) { //console.log('Dealing with annoying popups...'); //popupWindows(); //busy = true; }*/ if(sessionStorage.autoFreePachinko === "true" && busy === false){ // Navigate to pachinko if (Cookies.get("nextPachinkoTime") === undefined) { console.log("Time to fetch Pachinko."); getPachinko(); busy = true; } } if(sessionStorage.autoContest === "true" && busy === false){ if (Cookies.get("nextContestTime") === undefined){ console.log("Time to get contest rewards."); busy = doContestStuff(); } } if(sessionStorage.autoMission === "true" && busy === false){ if (Cookies.get("nextMissionTime") === undefined){ console.log("Time to do missions."); busy = doMissionStuff(); } } if (sessionStorage.autoSalary === "true" && busy === false) { if (Cookies.get("nextSalaryTime") === undefined) { console.log("Time to fetch salary."); busy = getSalary(); } } if (sessionStorage.autoQuest === "true" && busy === false) { if (sessionStorage.questRequirement === "battle") { console.log("Quest requires battle."); doBossBattle(); busy = true; } else if (sessionStorage.questRequirement[0] === '$') { if (Number(sessionStorage.questRequirement.substr(1)) < getHero().infos.soft_currency) { // We have enough money... requirement fulfilled. console.log("Continuing quest, required money obtained."); sessionStorage.questRequirement = "none"; proceedQuest(); busy = true; } else { if(isNaN(sessionStorage.questRequirement.substr(1))) { sessionStorage.questRequirement = "none"; console.log("Invalid money in session storage quest requirement !"); } else{ // Else we need more money. //console.log("Need money for quest, cannot continue. Turning ON AutoSalary."); sessionStorage.autoQuest = "true"; } busy = false; } } else if (sessionStorage.questRequirement[0] === '*') { var energyNeeded = Number(sessionStorage.questRequirement.substr(1)); var energyCurrent = getHero().infos.energy_quest; if (energyNeeded <= energyCurrent) { // We have enough energy... requirement fulfilled. console.log("Continuing quest, required energy obtained."); sessionStorage.questRequirement = "none"; proceedQuest(); busy = true; } // Else we need energy, just wait. else { busy = false; //console.log("Replenishing energy for quest.(" + energyNeeded + " needed)"); } } else if (sessionStorage.questRequirement[0] === 'P') { // Battle power required. var neededPower = Number(sessionStorage.questRequirement.substr(1)); if(currentPower < neededPower) { console.log("Quest requires "+neededPower+" Battle Power for advancement. Waiting..."); busy = false; } else { console.log("Battle Power obtained, resuming quest..."); sessionStorage.questRequirement = "none"; proceedQuest(); busy = true; } } else if (sessionStorage.questRequirement === "unknownQuestButton") { console.log("AutoQuest disabled.AutoQuest cannot be performed due to unknown quest button. Please manually proceed the current quest screen."); document.getElementById("autoQuestCheckbox").checked = false; sessionStorage.autoQuest = "false"; sessionStorage.questRequirement = "none"; busy = false; } else if (sessionStorage.questRequirement === "errorInAutoBattle") { console.log("AutoQuest disabled.AutoQuest cannot be performed due errors in AutoBattle. Please manually proceed the current quest screen."); document.getElementById("autoQuestCheckbox").checked = false; sessionStorage.autoQuest = "false"; sessionStorage.questRequirement = "none"; busy = false; } else if(sessionStorage.questRequirement === "none") { //console.log("NONE req."); busy = true; proceedQuest(); } else { console.log("Invalid quest requirement : "+sessionStorage.questRequirement); busy=false; } } else if(sessionStorage.autoQuest === "false"){sessionStorage.questRequirement = "none";} if(sessionStorage.autoArenaBattle === "true" && busy === false) { if(Cookies.get("nextArenaTime") === undefined) { console.log("Time to fight in arena."); doBattle(); busy = true; } } if(sessionStorage.autoTrollBattle === "true") { if(busy === false && currentPower >= Number(sessionStorage.battlePowerRequired) && currentPower > 0) { sessionStorage.battlePowerRequired = "0"; busy = true; if(sessionStorage.autoQuest === "true") { if(sessionStorage.questRequirement[0] === 'P') { console.log("AutoBattle disabled for power collection for AutoQuest."); document.getElementById("autoBattleCheckbox").checked = false; sessionStorage.autoTrollBattle = "false"; busy = false; } else { doBossBattle(); } } else { doBossBattle(); } } } else{sessionStorage.battlePowerRequired = "0";} if(busy === true && sessionStorage.userLink==="none" && !window.location.pathname.startsWith("/quest")) { sessionStorage.userLink = page; } else if(sessionStorage.userLink !=="none" && busy === false) { console.log("Restoring page "+sessionStorage.userLink); window.location = sessionStorage.userLink; sessionStorage.userLink = "none"; } if(isNaN(sessionStorage.autoLoopTimeMili)){ console.log("AutoLoopTimeMili is not a number."); setDefaults(); } else{ if (sessionStorage.autoLoop === "true") setTimeout(autoLoop, Number(sessionStorage.autoLoopTimeMili)); else console.log("autoLoop Disabled"); } }; var setDefaults = function () { console.log("Setting Defaults."); sessionStorage.autoSalary = "false"; sessionStorage.autoContest = "false"; sessionStorage.autoMission = "false"; sessionStorage.autoFreePachinko = "false"; sessionStorage.autoLoop = "true"; sessionStorage.userLink = "none"; sessionStorage.autoLoopTimeMili = "200"; sessionStorage.autoQuest = "false"; sessionStorage.autoTrollBattle = "false"; sessionStorage.autoArenaBattle = "false"; sessionStorage.battlePowerRequired = "0"; sessionStorage.questRequirement = "none"; sessionStorage.freshStart = "no"; }; var start = function () { //console.log("script started"); // get world map try{ globalWorldMap = new Map(JSON.parse(sessionStorage.globalWorldMap)); if(!(globalWorldMap instanceof Map) || globalWorldMap.size<1)throw false; } catch(e) { console.log("Need world map NOW..."); if(!getUnlockedWorlds()) { sessionStorage.userLink = window.location.href; return; } } // Add UI buttons. var UIcontainer = $("#contains_all nav div[rel='content']"); UIcontainer.html('<div style="position: absolute;right: 18.66%; padding: 10px;width: inherit;text-align: center;display:flex;flex-direction:column;">'+ '<span>AutoSal.</span><div><label class=\"switch\"><input id=\"autoSalaryCheckbox\" type=\"checkbox\"><span class=\"slider round\"></span></label></div>'+ '<span>AutoContest</span><div><label class=\"switch\"><input id=\"autoContestCheckbox\" type=\"checkbox\"><span class=\"slider round\"></span></label></div>'+ '<span>AutoMission</span><div><label class=\"switch\"><input id=\"autoMissionCheckbox\" type=\"checkbox\"><span class=\"slider round\"></span></label></div>'+ '<span>AutoQuest</span><div><label class=\"switch\"><input id=\"autoQuestCheckbox\" type=\"checkbox\"><span class=\"slider round\"></span></label></div>'+ '<span>AutoTrollBattle</span><div><label class=\"switch\"><input id=\"autoBattleCheckbox\" type=\"checkbox\"><span class=\"slider round\"></span></label><select id=\"autoTrollSelector\"><option value=\"latest\">Latest</option></select></div>'+ '<span>AutoArenaBattle</span><div><label class=\"switch\"><input id=\"autoArenaCheckbox\" type=\"checkbox\"><span class=\"slider round\"></span></label></div>'+ '<span>AutoPachinko(Free)</span><div><label class=\"switch\"><input id=\"autoFreePachinko\" type=\"checkbox\"><span class=\"slider round\"></span></label></div>'+ '</div>'+UIcontainer.html()); // Add auto troll options var trollOptions = document.getElementById("autoTrollSelector"); globalWorldMap.forEach(function(val,key){ var option = document.createElement("option"); option.text = key; trollOptions.add(option); }); trollOptions.selectedIndex = sessionStorage.autoTrollSelectedIndex; document.getElementById("autoSalaryCheckbox").checked = sessionStorage.autoSalary === "true"; document.getElementById("autoContestCheckbox").checked = sessionStorage.autoContest === "true"; document.getElementById("autoMissionCheckbox").checked = sessionStorage.autoMission === "true"; document.getElementById("autoQuestCheckbox").checked = sessionStorage.autoQuest === "true"; document.getElementById("autoBattleCheckbox").checked = sessionStorage.autoTrollBattle === "true"; document.getElementById("autoArenaCheckbox").checked = sessionStorage.autoArenaBattle === "true"; document.getElementById("autoFreePachinko").checked = sessionStorage.autoFreePachinko === "true"; sessionStorage.autoLoop = "true"; if (typeof sessionStorage.freshStart == "undefined" || isNaN(Number(sessionStorage.autoLoopTimeMili))) { setDefaults(); } autoLoop(); }; $("document").ready(start);