// ==UserScript==
// @name HaremHeroes Automatic
// @namespace JDscripts
// @version 3.24.3
// @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/*
// @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.round: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 = undefined;
// 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){
try{if(unsafeWindow.HHTimers.timers[e].$elm.selector.includes("#missions_counter"))
time=unsafeWindow.HHTimers.timers[e];
}
catch(e){}
}
time = time.remainingTime;
if(time === undefined)
{
//try again with different selector
for(e in unsafeWindow.HHTimers.timers){
try{if(unsafeWindow.HHTimers.timers[e].$elm.selector.includes(".after_gift"))
time=unsafeWindow.HHTimers.timers[e];
}
catch(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){
try{if(unsafeWindow.HHTimers.timers[e].$elm.selector.includes(".contest_timer"))
time=unsafeWindow.HHTimers.timers[e];
}
catch(e){}
}
time = time.remainingTime;
try{if(time === undefined)
{
//try again with different selector
time = undefined;
for(e in unsafeWindow.HHTimers.timers){
if(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;
}
}}catch(e){}
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) {
is_cheat_click=function(e) { return false; };
$(this).click();
});
console.log("Salary fetched. Getting next fetch time");
// In seconds
var closestTime = undefined;
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){
try{
if(unsafeWindow.HHTimers.timers[e].$elm.selector.startsWith(".arena_refresh_counter"))
arenatime=unsafeWindow.HHTimers.timers[e];
}
catch(e){}
}
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;
}
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.find('span').size()>0?battleButton.attr("price_fe"):0;
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.
is_cheat_click=function(e) { return false; };
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(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)});
}
else
{
Cookies.remove('nextPachinkoTime');
}
}
}
catch (ex) {
console.log("Could not collect pachinko... " + 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(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);