Guest User

HaremHeroes Automatic++

a guest
Oct 10th, 2020
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name         HaremHeroes Automatic++
  3. // @namespace    JDscripts
  4. // @version      4.353.1+
  5. // @description  Open the menu in HaremHeroes(topright) to toggle AutoControlls. Supports AutoSalary, AutoContest, AutoMission, AutoQuest, AutoTrollBattle, AutoArenaBattle and AutoPachinko(Free), AutoLeagues, AutoChampions and AutoStatUpgrades. Messages are printed in local console.
  6. // @author       JD and Dorten(a bit)
  7. // @match        http*://nutaku.haremheroes.com/*
  8. // @match        http*://*.hentaiheroes.com/*
  9. // @grant        GM_addStyle
  10. // @license      MIT
  11. // @note         T.1m Just fix a few things and add a new function (AutoPlaceofPower) It's not perfect but it works. All thanks to the authors and grant.
  12. // ==/UserScript==
  13.  
  14. GM_addStyle('/* The switch - the box around the slider */ .switch { position: relative; display: inline-block; width: 40px; height: 24px; } /* 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: 16px; width: 16px; 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(16px); -ms-transform: translateX(16px); transform: translateX(16px); } /* Rounded sliders */ .slider.round { border-radius: 24px; } .slider.round:before { border-radius: 50%; }');
  15.  
  16. // var d="@require      https://cdn.jsdelivr.net/js-cookie/2.2.0/js.cookie.js"
  17.  
  18. function Storage()
  19. {
  20.     return localStorage.settPerTab==="true"?sessionStorage:localStorage;
  21. }
  22.  
  23. function getHero()
  24. {
  25.     if(unsafeWindow.Hero === undefined)
  26.     {
  27.         setTimeout(autoLoop, Number(Storage().autoLoopTimeMili))
  28.         //console.log(window.wrappedJSObject)
  29.     }
  30.     //console.log(unsafeWindow.Hero);
  31.     return unsafeWindow.Hero;
  32. }
  33.  
  34. function getGirlsMap()
  35. {
  36.     return unsafeWindow.GirlSalaryManager.girlsMap;
  37. }
  38.  
  39. function getPage()
  40. {
  41.     try{
  42.         var ob = document.getElementById("hh_nutaku");
  43.         if(ob===undefined || ob === null)
  44.         {
  45.             ob = document.getElementById("hh_hentai");
  46.         }
  47.         var p=ob.className.match(/.*page-(.*) .*/i)[1];
  48.         if (p=="missions" && $('h4.contests.selected').size()>0)
  49.         {
  50.             return "activities"
  51.         }
  52.         else
  53.         {
  54.             if (p=="missions" && $('h4.pop.selected').size()>0)
  55.             {
  56.                 return "pop"
  57.             }
  58.             else
  59.             {
  60.                 return p;
  61.             }
  62.         }
  63.     }
  64.     catch(err)
  65.     {
  66.         return ""
  67.     }
  68. }
  69.  
  70. function url_add_param(url, param) {
  71.     if (url.indexOf('?') === -1) url += '?';
  72.     else url += '&';
  73.     return url+param;
  74. }
  75.  
  76. // Retruns true if on correct page.
  77. function gotoPage(page)
  78. {
  79.     var cp=getPage();
  80.     console.log('going '+cp+'->'+page);
  81.     if(getPage() === page)
  82.     {
  83.         if (page=='missions')
  84.         {
  85.             $('h4.missions').each(function(){this.click();});
  86.         }
  87.         if (page=='activities')
  88.         {
  89.             $('h4.contests').each(function(){this.click();});
  90.         }
  91.         if (page=='pop')
  92.         {
  93.             $('h4.pop').each(function(){this.click();});
  94.         }
  95.         return true;
  96.     }
  97.     else
  98.     {
  99.         console.log("Navigating to page: "+page);
  100.         var togoto = undefined;
  101.         // get page path
  102.         switch(page)
  103.         {
  104.             case "missions":
  105.                 togoto = $("nav div[rel='content'] a:has(.activities)").attr("href");
  106.                 break;
  107.             case "activities":
  108.                 togoto = $("nav div[rel='content'] a:has(.activities)").attr("href");
  109.                 break;
  110.             case "pop":
  111.                 togoto = $("nav div[rel='content'] a:has(.activities)").attr("href");
  112.                 break;
  113.             case "harem":
  114.                 togoto = $("nav div[rel='content'] a:has(.harem)").attr("href");
  115.                 break;
  116.             case "map":
  117.                 togoto = $("nav div[rel='content'] a:has(.map)").attr("href");
  118.                 break;
  119.             case "arena":
  120.                 togoto =$("nav div[rel='content'] a:has(.arena)").attr("href");
  121.                 break;
  122.             case "pachinko":
  123.                 togoto = $("nav div[rel='content'] a:has(.pachinko)").attr("href");
  124.                 break;
  125.             case "leaderboard":
  126.                 togoto = $("nav div[rel='content'] a:has(.leaderboard)").attr("href");
  127.                 break;
  128.             case "shop":
  129.                 togoto = $("nav div[rel='content'] a:has(.shop)").attr("href");
  130.                 break;
  131.             case "quest":
  132.                 togoto = getHero().infos.questing.current_url;
  133.                 if (togoto.includes("world"))
  134.                 {
  135.                     console.log("All quests finished, turning off AutoQuest!");
  136.                     Storage().autoQuest = false;
  137.                     location.reload();
  138.                     return false;
  139.                 }
  140.                 console.log("Current quest page: "+togoto);
  141.                 break;
  142.             case "champions_map":
  143.                 togoto = $("nav div[rel='content'] a:has(.champions)").attr("href");
  144.                 break;
  145.             default:
  146.                 console.log("Unknown goto page request. No page \'"+page+"\' defined.");
  147.         }
  148.         console.log("TOGOTO: "+togoto);
  149.         if(togoto != undefined)
  150.         {
  151.             if (page=="missions")
  152.             {
  153.                 togoto = url_add_param(togoto, "tab=" + "missions");
  154.             }
  155.             if (page=="activities")
  156.             {
  157.                 togoto = url_add_param(togoto, "tab=" + "contests");
  158.             }
  159.             if (page=="pop")
  160.             {
  161.                 togoto = url_add_param(togoto, "tab=" + "pop");
  162.             }
  163.             sessionStorage.autoLoop = "false";
  164.             window.location = window.location.origin + togoto;
  165.         }
  166.         else console.log("Couldn't find page path. Page was undefined...");
  167.         return false;
  168.     }
  169. }
  170.  
  171. var proceedQuest = function () {
  172.     //console.log("Starting auto quest.");
  173.     // Check if at correct page.
  174.     if (!gotoPage("quest")) {
  175.         // Click on current quest to naviagte to it.
  176.         console.log("Navigating to current quest.");
  177.         return;
  178.     }
  179.     $("#popup_message close").click();
  180.     // Get the proceed button type
  181.     var proceedButtonMatch = $("#controls button:not([style='display: none;'])");
  182.     if (proceedButtonMatch.length === 0){proceedButtonMatch = $("#controls button[act='free']");}
  183.     var proceedCostEnergy = Number($("#controls .cost span[cur='*']").text());
  184.     var units = [" ", "K", "M", "G", "T", "P", "E", "Z", "Y"]
  185.     var proceedCostMoney = $("#controls .cost span[cur='$']").text();
  186.     var Unit=proceedCostMoney.substr(-1);
  187.     if (units.includes(Unit))
  188.     {
  189.         proceedCostMoney=Number(proceedCostMoney.split(Unit)[0].replace(",","").trim())*(1000**units.indexOf(Unit))
  190.     }
  191.     else
  192.     {
  193.         proceedCostMoney=Number(proceedCostMoney.replace(",","").trim());
  194.     }
  195.  
  196.     var proceedType = proceedButtonMatch.attr("act");
  197.  
  198.     if (proceedButtonMatch.length === 0) console.log("Could not find resume button.");
  199.     else if (proceedType === "free") {
  200.         console.log("Proceeding for free.");
  201.         proceedButtonMatch.click();
  202.     }
  203.     else if (proceedType === "pay") {
  204.         var energyCurrent = getHero().infos.energy_quest;
  205.         var moneyCurrent = getHero().infos.soft_currency;
  206.         if(proceedCostEnergy <= energyCurrent)
  207.         {
  208.             // We have energy.
  209.             console.log("Spending "+proceedCostEnergy+" Energy to proceed.");
  210.         }
  211.         else
  212.         {
  213.             console.log("Quest requires "+proceedCostEnergy+" Energy to proceed.");
  214.             sessionStorage.questRequirement = "*"+proceedCostEnergy;
  215.             return;
  216.         }
  217.         if(proceedCostMoney <= moneyCurrent)
  218.         {
  219.             // We have money.
  220.             console.log("Spending "+proceedCostMoney+" Money to proceed.");
  221.         }
  222.         else
  223.         {
  224.             console.log("Spending "+proceedCostEnergy+" Energy to proceed.");
  225.             sessionStorage.questRequirement = "$"+proceedCostMoney;
  226.             return;
  227.         }
  228.         proceedButtonMatch.click();
  229.         sessionStorage.autoLoop = "false";
  230.         location.reload();
  231.     }
  232.     else if (proceedType === "use_item") {
  233.         console.log("Proceeding by using X" + Number($("#controls .item span").text()) + " of the required item.");
  234.         proceedButtonMatch.click();
  235.     }
  236.     else if (proceedType === "battle") {
  237.         console.log("Proceeding to battle troll...");
  238.         sessionStorage.questRequirement = "battle";
  239.         // Proceed to battle troll.
  240.         proceedButtonMatch.click();
  241.         sessionStorage.autoLoop = "false";
  242.         location.reload();
  243.     }
  244.     else if (proceedType === "end_archive") {
  245.         console.log("Reached end of current archive. Proceeding to next archive.");
  246.         sessionStorage.autoLoop = "false";
  247.         proceedButtonMatch.click();
  248.     }
  249.     else if (proceedType === "end_play") {
  250.         console.log("Reached end of current play. Proceeding to next play.");
  251.         sessionStorage.autoLoop = "false";
  252.         proceedButtonMatch.click();
  253.     }
  254.     else {
  255.         console.log("Could not identify given resume button.");
  256.         sessionStorage.questRequirement = "unknownQuestButton";
  257.     }
  258. };
  259.  
  260. /**
  261. * Recieves a list of mission objects and returns the mission object to use.
  262. * A mission object looks similar to this :-
  263. * 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}]}
  264. * 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":[]}}]}
  265. * 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}]}
  266. * Eg 1 has mission rewards of xp and money.
  267. * Eg 2 has mission rewards of xp and item.
  268. * Eg 3 has mission rewards of koban/hard_currency.
  269. * cost is the koban price for instant complete.
  270. */
  271. function getSuitableMission(missionsList)
  272. {
  273.     var msn = missionsList[0];
  274.     for(var m in missionsList)
  275.     {
  276.         if(Number(msn.duration) > Number(missionsList[m].duration))
  277.         {
  278.             msn = missionsList[m];
  279.         }
  280.     }
  281.     return msn;
  282. }
  283.  
  284. // returns boolean to set busy
  285. function doMissionStuff()
  286. {
  287.     if(!gotoPage("missions"))
  288.     {
  289.         console.log("Navigating to activities page.");
  290.         // return busy
  291.         return true;
  292.     }
  293.     else
  294.     {
  295.         console.log("On activities page.");
  296.         if (Storage().autoMissionC==="true")
  297.         {
  298.             console.log("Collecting finished mission's reward.");
  299.             $(".mission_button button:visible[rel='claim']").click();
  300.         }
  301.         // TODO: select new missions and parse reward data from HTML, it's there in data attributes of tags
  302.         var missions = [];
  303.         var allGood = true;
  304.         // parse missions
  305.         $(".mission_object").each(function(idx,missionObject){
  306.             var data = $.data(missionObject).d;
  307.             // Do not list completed missions
  308.             var toAdd=true;
  309.             if(data.remaining_time !== null){
  310.                 // This is not a fresh mission
  311.                 if(data.remaining_time > 0)
  312.                 {
  313.                     console.log("Unfinished mission detected...("+data.remaining_time+"sec. remaining)");
  314.                     setTimer('nextMissionTime',Number(data.remaining_time)+1);
  315.                     allGood = false;
  316.                     return;
  317.                 }
  318.                 else{
  319.                     console.log("Unclaimed mission detected...");
  320.                     if (Storage().autoMissionC==="true")
  321.                     {
  322.                         allGood = false;
  323.                     }
  324.                 }
  325.                 return;
  326.             }
  327.             data.missionObject = missionObject;
  328.             var rewards = [];
  329.             // set rewards
  330.             {
  331.                 // get Reward slots
  332.                 var slots = missionObject.querySelectorAll(".slot");
  333.                 // traverse slots
  334.                 $.each(slots,function(idx,slotDiv){
  335.                     var reward = {};
  336.                     // get slot class list
  337.                     reward.classList = slotDiv.classList;
  338.                     // set reward type
  339.                     if(reward.classList.contains("slot_xp"))reward.type = "xp";
  340.                     else if(reward.classList.contains("slot_SC"))reward.type = "money";
  341.                     else if(reward.classList.contains("slot_HC"))reward.type = "koban";
  342.                     else reward.type = "item";
  343.                     // set value if xp
  344.                     if(reward.type === "xp" || reward.type === "money" || reward.type === "koban")
  345.                     {
  346.                         // remove all non numbers and HTML tags
  347.                         try{
  348.                             reward.data = Number(slotDiv.innerHTML.replace(/<.*?>/g,'').replace(/\D/g,''));
  349.                         }
  350.                         catch(e){
  351.                             console.log("Couldn't parse xp/money data.");
  352.                             console.log(slotDiv);
  353.                         }
  354.                     }
  355.                     // set item details if item
  356.                     else if(reward.type === "item")
  357.                     {
  358.                         try{
  359.                             reward.data = $.data(slotDiv).d;
  360.                         }
  361.                         catch(e){
  362.                             console.log("Couldn't parse item reward slot details.");
  363.                             console.log(slotDiv);
  364.                             reward.type = "unknown";
  365.                         }
  366.                     }
  367.                     rewards.push(reward);
  368.                 });
  369.             }
  370.             data.rewards = rewards;
  371.  
  372.             missions.push(data);
  373.         });
  374.         if(!allGood){
  375.             console.log("Something went wrong, need to retry later...");
  376.             // busy
  377.             return true;
  378.         }
  379.         console.log("Missions parsed, mission list is:-");
  380.         console.log(missions);
  381.         if(missions.length > 0)
  382.         {
  383.             console.log("Selecting mission from list.");
  384.             var mission = getSuitableMission(missions);
  385.             console.log("Selected mission:-");
  386.             console.log(mission);
  387.             console.log("Selected mission duration: "+mission.duration+"sec.");
  388.             var missionButton = $(mission.missionObject).find("button:visible").first();
  389.             console.log("Mission button of type: "+missionButton.attr("rel"));
  390.             console.log("Clicking mission button.");
  391.             missionButton.click();
  392.             setTimer('nextMissionTime',Number(mission.duration)+1);
  393.         }
  394.         else{
  395.             console.log("No missions detected...!");
  396.             // get gift
  397.             var ck = sessionStorage['giftleft'];
  398.             var isAfterGift = document.querySelector("#missions .after_gift").style.display === 'block';
  399.             if(!isAfterGift){
  400.                 if(ck === undefined || ck === 'giftleft')
  401.                 {
  402.                     console.log("Collecting gift.");
  403.                     delete sessionStorage['giftleft'];
  404.                     document.querySelector(".end_gift button").click();
  405.                 }
  406.                 else{
  407.                     console.log("Refreshing to collect gift...");
  408.                     sessionStorage['giftleft']='giftleft';
  409.                     window.reload();
  410.                     // is busy
  411.                     return true;
  412.                 }
  413.             }
  414.             var time = 0;
  415.             for(var e in unsafeWindow.HHTimers.timers){
  416.                 try{if(unsafeWindow.HHTimers.timers[e].$elm.selector.includes("#missions_counter"))
  417.                     time=unsafeWindow.HHTimers.timers[e];
  418.                    }
  419.                 catch(e){}
  420.             }
  421.             if (time !== undefined)
  422.             {
  423.                 time = time.remainingTime;
  424.             }
  425.             if(time === undefined)
  426.             {
  427.                 //try again with different selector
  428.                 for(e in unsafeWindow.HHTimers.timers){
  429.                     try{if(unsafeWindow.HHTimers.timers[e].$elm.selector.includes(".after_gift"))
  430.                         time=unsafeWindow.HHTimers.timers[e];
  431.                        }
  432.                     catch(e){}
  433.                 }
  434.                 if (time !== undefined)
  435.                 {
  436.                     time = time.remainingTime;
  437.                 }
  438.             }
  439.             if(time === undefined){
  440.                 console.log("New mission time was undefined... Setting it manually to 10min.");
  441.                 time = 10*60;
  442.             }
  443.             setTimer('nextMissionTime',Number(time)+1);
  444.         }
  445.         // not busy
  446.         return false;
  447.     }
  448. }
  449.  
  450. // returns boolean to set busy
  451. function doContestStuff()
  452. {
  453.     if(!gotoPage("activities"))
  454.     {
  455.         console.log("Navigating to activities page.");
  456.         // return busy
  457.         return true;
  458.     }
  459.     else
  460.     {
  461.         console.log("On activities page.");
  462.         console.log("Collecting finished contests's reward.");
  463.         $(".contest .ended button[rel='claim']").click();
  464.         // need to get next contest timer data
  465.         var time = 0;
  466.         for(var e in unsafeWindow.HHTimers.timers){
  467.             try{if(unsafeWindow.HHTimers.timers[e].$barElm/*.selector.includes(".contest_timer")*/)
  468.                 time=unsafeWindow.HHTimers.timers[e];
  469.                }
  470.             catch(e){}
  471.         }
  472.         time = time.remainingTime;
  473.         try{if(time === undefined)
  474.         {
  475.             //try again with different selector
  476.             time = undefined;
  477.             for(e in unsafeWindow.HHTimers.timers){
  478.                 if(unsafeWindow.HHTimers.timers[e].$elm && unsafeWindow.HHTimers.timers[e].$elm[0].className.includes("contest_timer"))
  479.                     // get closest time
  480.                     if(!(unsafeWindow.HHTimers.timers[e].remainingTime>time))
  481.                         time=unsafeWindow.HHTimers.timers[e].remainingTime;
  482.             }
  483.         }}catch(e){}
  484.         if(time === undefined){
  485.             console.log("New contest time was undefined... Setting it manually to 10min.");
  486.             time = 10*60;
  487.         }
  488.         setTimer('nextContestTime',Number(time)+1);
  489.         // Not busy
  490.         return false;
  491.     }
  492. }
  493.  
  494. // returns boolean to set busy
  495. function doPoPowerStuff()
  496. {
  497.     if(!gotoPage("pop"))
  498.     {
  499.         console.log("Navigating to activities page.");
  500.         // return busy
  501.         return true;
  502.     }
  503.     else
  504.     {
  505.         console.log("On popower page.");
  506.         console.log("Collecting finished popower reward.");
  507.                 $('#pop .pop_central_part>button[rel=pop_claim]').click();
  508.                 if ($("#rewards_popup .blue_text_button").size()>0)
  509.                 {
  510.                     $("#rewards_popup .blue_text_button").click();
  511.                 }
  512.                 if ($("#rewards_popup .blue_button_L").size()>0)
  513.                 {
  514.                     $("#rewards_popup .blue_button_L").click();
  515.                 }
  516.     console.log("Auto Assing popower.");
  517.     $('#pop .pop_right_part>[rel=pop_auto_assign]').click();
  518.     console.log("Start popower.");
  519.     $('#pop .pop_central_part>button[rel=pop_action]').click();
  520.  
  521.         // need to get next popower timer data.
  522.         var tpop;
  523.         var e;
  524.  
  525.             for(e in unsafeWindow.HHTimers.timers){
  526.                 if(unsafeWindow.HHTimers.timers[e].$elm && unsafeWindow.HHTimers.timers[e].$elm.selector.startsWith(".pop"))
  527.                     tpop=unsafeWindow.HHTimers.timers[e].remainingTime;
  528.             }
  529.             if(tpop !== undefined && tpop !== 0)
  530.             {
  531.                 console.log(tpop);
  532.                 setTimer('nextPoPowerTime',Number(tpop)+1);
  533.             }
  534.             else
  535.             {
  536.             console.log("New popwer time was undefined... Setting it manually to 10s.");
  537.             setTimer('nextPoPowerTime',2);
  538.             }
  539.  
  540.         // Not busy
  541.         return false;
  542.     }
  543. }
  544.  
  545. function randomInterval(min,max) // min and max included
  546. {
  547.     return Math.floor(Math.random()*(max-min+1)+min);
  548. }
  549.  
  550. var CollectMoney = function()
  551. {
  552.     var Clicked=[];
  553.     var ToClick=[];
  554.  
  555.     function ClickThem()
  556.     {
  557.         //console.log('Need to click: ',ToClick.length);
  558.         if (ToClick.length>0)
  559.         {
  560.             //console.log('clicking N ',ToClick[0].formAction.split('/').last())
  561.             $(ToClick[0]).click();
  562.             ToClick.shift();
  563.             //console.log('will click again');
  564.             setTimeout(ClickThem,randomInterval(300,900));
  565.  
  566.             window.top.postMessage({ImAlive:true},'*');
  567.         }
  568.         else
  569.         {
  570.             //console.log('nothing to click, checking data');
  571.             CollectData();
  572.         }
  573.     }
  574.  
  575.     function CollectData()
  576.     {
  577.         var btns=$("#harem_whole #harem_left .salary:not('.loads') button");
  578.         //console.log('buttons: ',btns.size())
  579.         btns.each(function (index, element) {
  580.             //console.log(index,element.formAction);
  581.             var gid=Number(element.parentElement.parentElement.parentElement.getAttribute('girl'));
  582.             //console.log('checking '+gid);
  583.             if (!Clicked.includes(gid))
  584.             {
  585.                 Clicked.push(gid);
  586.                 ToClick.push(element);
  587.                 //console.log('added! ',Clicked,ToClick);
  588.             }
  589.         });
  590.  
  591.         console.log('Collected Data: ',Clicked,ToClick);
  592.  
  593.         if (ToClick.length>0)
  594.         {
  595.             //console.log('clicking!');
  596.             setTimeout(ClickThem,randomInterval(150,500));
  597.         }
  598.         else//nothing to collect
  599.         {
  600.             var closestTime = undefined;
  601.             var closestGirl = 0;
  602.             var gMap = getGirlsMap();
  603.             if(gMap === undefined)
  604.             {
  605.                 // error
  606.                 console.log("Girls Map was undefined...! Error, manually setting salary time to 2 min.");
  607.                 closestTime = 2*60;
  608.             }
  609.             else
  610.             {
  611.                 try{
  612.                     // Calc. closest time
  613.                     for(var key in gMap)
  614.                     {
  615.                         // undefined comparision is always false so first iteration is false, hence the not(!)
  616.                         if(!(closestTime<gMap[key].gData.pay_in) && !Clicked.includes(key) && gMap[key].gData.pay_in!=0)
  617.                         {
  618.                             closestTime = gMap[key].gData.pay_in;
  619.                             closestGirl = key;
  620.                         }
  621.                     }
  622.                 }
  623.                 catch(exp){
  624.                     // error
  625.                     console.log("Girls Map had undefined property...! Error, manually setting salary time to 2 min.");
  626.                     closestTime = 2*60;
  627.                 }
  628.             }
  629.             if(closestTime === undefined)
  630.             {
  631.                 console.log("closestTime was undefined...! Error, manually setting salary time to 2 min.");
  632.                 closestTime = 2*60;
  633.             }
  634.             var st=Number(Storage().autoSalaryTimer?Storage().autoSalaryTimer:"120");
  635.             if(closestTime <= st )
  636.             {
  637.                 console.log("closestTime is "+closestTime+" ("+closestGirl+")");
  638.                 closestTime = st;
  639.             }
  640.             setTimer('nextSalaryTime',Number(closestTime)+1);
  641.             sessionStorage.autoLoop = "true";
  642.             setTimeout(autoLoop, Number(Storage().autoLoopTimeMili));
  643.         }
  644.     }
  645.  
  646.     CollectData();
  647. }
  648.  
  649. var getSalary = function () {
  650.     try {
  651.         if(!gotoPage("harem"))
  652.         {
  653.             // Not at Harem screen then goto the Harem screen.
  654.             console.log("Navigating to Harem window.");
  655.             // return busy
  656.             return true;
  657.         }
  658.         else {
  659.             console.log("Detected Harem Screen. Fetching Salary");
  660.             is_cheat_click=function(e) {
  661.                 return false;
  662.             };
  663.             sessionStorage.autoLoop = "false";
  664.             CollectMoney();
  665.             // return busy
  666.             return true;
  667.         }
  668.     }
  669.     catch (ex) {
  670.         console.log("Could not collect salary... " + ex);
  671.         // return not busy
  672.         return false;
  673.     }
  674. };
  675.  
  676. var doStatUpgrades=function()
  677. {
  678.     //Stats?
  679.     //console.log('stats');
  680.     var Hero=getHero();
  681.     var level=Hero.infos.level;
  682.     var stats=[Hero.infos.carac1,Hero.infos.carac2,Hero.infos.carac3];
  683.     var money=Hero.infos.soft_currency;
  684.     var count=0;
  685.     var M=Storage().autoStats?Number(Storage().autoStats):500000000;
  686.     var MainStat=stats[Hero.infos.class-1];
  687.     var Limit=Hero.infos.level*30;//Hero.infos.level*19+Math.min(Hero.infos.level,25)*21;
  688.     var carac=Hero.infos.class;
  689.     var mp=0;
  690.     var mults=[60,30,10,1];
  691.     for (var car=0; car<3; car++)
  692.     {
  693.         //console.log('stat '+carac);
  694.         var s=stats[carac-1];
  695.         for (var mu=0;mu<5;mu++)
  696.         {
  697.             var mult=mults[mu];
  698.             var price = 5+s*2+(Math.max(0,s-2000)*2)+(Math.max(0,s-4000)*2)+(Math.max(0,s-6000)*2)+(Math.max(0,s-8000)*2);
  699.             price*=mult;
  700.             if (carac==Hero.infos.class)
  701.             {
  702.                 mp=price;
  703.             }
  704.             //console.log('money: '+money+' stat'+carac+': '+stats[carac-1]+' price: '+price);
  705.             if ((stats[carac-1]+mult)<=Limit && (money-price)>M && (carac==Hero.infos.class || price<mp/2 || (MainStat+mult)>Limit))
  706.             {
  707.                 count++;
  708.                 console.log('money: '+money+' stat'+carac+': '+stats[carac-1]+' [+'+mult+'] price: '+price);
  709.                 money-=price;
  710.                 var params = {
  711.                     class: "Hero",
  712.                     carac: carac,
  713.                     action: "update_stats",
  714.                     nb: mult
  715.                 };
  716.                 hh_ajax(params, function(data) {
  717.  
  718.                 });
  719.                 break;
  720.             }
  721.         }
  722.         carac=(carac+1)%3+1;
  723.     }
  724. }
  725.  
  726. var doShopping=function()
  727. {
  728.     try
  729.     {
  730.         var Hero=getHero();
  731.         var MS='carac'+Hero.infos.class;
  732.         var SS1='carac'+(Hero.infos.class%3+1);
  733.         var SS2='carac'+((Hero.infos.class+1)%3+1);
  734.         var money=Hero.infos.soft_currency;
  735.  
  736.         try
  737.         {
  738.             var shop=JSON.parse(sessionStorage.storeContents);
  739.         }
  740.         catch(wtf)
  741.         {
  742.             sessionStorage.charLevel=0;
  743.             return;
  744.         }
  745.  
  746.         if (!sessionStorage.haveAff)
  747.         {
  748.             sessionStorage.charLevel=0;
  749.             return;
  750.         }
  751.  
  752.         var LGM=Number(Storage().autoLGM);
  753.         var EGM=Number(Storage().autoEGM);
  754.         var LGR=Number(Storage().autoLGR);
  755.         var Exp=Number(Storage().autoExp);
  756.         var Aff=Number(Storage().autoAff);
  757.         var MaxAff=Number(Storage().MaxAff);
  758.         var MaxExp=Number(Storage().MaxExp);
  759.         var HaveAff=Number(sessionStorage.haveAff);
  760.         var HaveExp=Number(sessionStorage.haveExp);
  761.  
  762.         console.log(HaveAff,HaveExp);
  763.  
  764.         if (Storage().autoLGMW==="true" || Storage().autoLGRW==="true" || Storage().autoEGMW==="true")
  765.         {
  766.             //console.log('items');
  767.             var Was=shop[0].length;
  768.             for (var n=shop[0].length-1;n>=0;n--)
  769.             {
  770.  
  771.                 if (Storage().autoLGMW==="true" && money>=LGM+Number(shop[0][n].price) && shop[0][n][MS]>0 && shop[0][n][SS1]==0 && shop[0][n][SS2]==0 && shop[0][n].chance==0 && shop[0][n].endurance==0 && shop[0][n].rarity=='legendary'||
  772.                    Storage().autoEGMW==="true" && money>=EGM+Number(shop[0][n].price) && shop[0][n][MS]>0 && shop[0][n][SS1]==0 && shop[0][n][SS2]==0 && shop[0][n].chance==0 && shop[0][n].endurance==0 && shop[0][n].rarity=='epic'||
  773.                    Storage().autoLGRW==="true" && money>=LGR+Number(shop[0][n].price) && shop[0][n][MS]>0 && shop[0][n][SS1]>0 && shop[0][n][SS2]>0 && shop[0][n].rarity=='legendary')
  774.                 {
  775.                     console.log('wanna buy ',shop[0][n]);
  776.                     if (money>=shop[0][n].price)
  777.                     {
  778.                         console.log("yay?");
  779.                         money-=shop[0][n].price;
  780.                         var params = {
  781.                             class: "Item",
  782.                             action: "buy",
  783.                             id_item: shop[0][n].id_item,
  784.                             type: "armor",
  785.                             who: 1,
  786.                             id_skin: shop[0][n].id_skin,
  787.                             id_equip: shop[0][n].id_equip,
  788.                         };
  789.                         hh_ajax(params, function(data) {
  790.  
  791.                         });
  792.                         shop[0].splice(n,1);
  793.                     }
  794.                     else
  795.                     {
  796.                         console.log("but can't");
  797.                     }
  798.                 }
  799.             }
  800.             if (shop[0].length==0 && Was>0)
  801.             {
  802.                 sessionStorage.charLevel=0;
  803.             }
  804.         }
  805.  
  806.         if (Storage().autoAffW==="true" && HaveAff<MaxAff)
  807.         {
  808.             //console.log('gifts');
  809.             Was=shop[1].length;
  810.             for (var nn=shop[1].length-1;nn>=0;nn--)
  811.             {
  812.                 console.log('wanna buy ',shop[1][nn]);
  813.                     if (money>=Aff+Number(shop[1][nn].price) && money>=shop[1][nn].price)
  814.                     {
  815.                         console.log("yay?");
  816.                         money-=shop[1][nn].price;
  817.                         var params2 = {
  818.                             class: "Item",
  819.                             action: "buy",
  820.                             id_item: shop[1][nn].id_item,
  821.                             type: "gift",
  822.                             who: 1
  823.                         };
  824.                         hh_ajax(params2, function(data) {
  825.  
  826.                         });
  827.                         shop[1].splice(nn,1);
  828.                     }
  829.                     else
  830.                     {
  831.                         console.log("but can't");
  832.                     }
  833.             }
  834.             if (shop[1].length==0 && Was>0)
  835.             {
  836.                 sessionStorage.charLevel=0;
  837.             }
  838.         }
  839.  
  840.         if (Storage().autoExpW==="true" && HaveExp<MaxExp)
  841.         {
  842.             //console.log('books');
  843.             Was=shop[2].length;
  844.             for (var nnn=shop[2].length-1;nnn>=0;nnn--)
  845.             {
  846.                 console.log('wanna buy ',shop[2][nnn]);
  847.                     if (money>=Exp+Number(shop[2][nnn].price) && money>=shop[2][nnn].price)
  848.                     {
  849.                         console.log("yay?");
  850.                         money-=shop[2][nnn].price;
  851.                         var params3 = {
  852.                             class: "Item",
  853.                             action: "buy",
  854.                             id_item: shop[2][nnn].id_item,
  855.                             type: "potion",
  856.                             who: 1
  857.                         };
  858.                         hh_ajax(params3, function(data) {
  859.  
  860.                         });
  861.                         shop[2].splice(nnn,1);
  862.                     }
  863.                     else
  864.                     {
  865.                         console.log("but can't");
  866.                     }
  867.             }
  868.             if (shop[2].length==0 && Was>0)
  869.             {
  870.                 sessionStorage.charLevel=0;
  871.             }
  872.         }
  873.         sessionStorage.storeContents=JSON.stringify(shop);
  874.         unsafeWindow.Hero.infos.soft_currency=money;
  875.     }
  876.     catch (ex)
  877.     {
  878.         console.log(ex);
  879.         sessionStorage.charLevel=0;
  880.     }
  881. }
  882.  
  883. var doBossBattle = function()
  884. {
  885.     var currentPower = getHero().infos.energy_fight;
  886.     if(currentPower < 1)
  887.     {
  888.         //console.log("No power for battle.");
  889.         return;
  890.     }
  891.  
  892.     var TTF;
  893.     if (Storage().plusEvent==="true" && !checkTimer("eventGoing") && sessionStorage.eventTroll)
  894.     {
  895.         TTF=sessionStorage.eventTroll;
  896.         console.log("Event troll fight");
  897.     }
  898.     else if(Storage().trollToFight !== undefined && !isNaN(Storage().trollToFight) && Storage().trollToFight !== "0")
  899.     {
  900.         TTF=Storage().trollToFight;
  901.         console.log("Custom troll fight.");
  902.     }
  903.     else
  904.     {
  905.         TTF=getHero().infos.questing.id_world-1;
  906.         console.log("Last troll fight");
  907.     }
  908.  
  909.     console.log("Fighting troll N "+TTF);
  910.     console.log("Going to crush: "+Trollz[Number(TTF)]);
  911.  
  912.     // Battles the latest boss.
  913.     // Navigate to latest boss.
  914.     //console.log('!!!!!',window.location.href,window.location.href=="/battle.html?id_troll=" + TTF);
  915.     if(window.location.pathname=="/battle.html" && window.location.search=="?id_troll=" + TTF)
  916.     {
  917.         // On the battle screen.
  918.         CrushThem();
  919.     }
  920.     else
  921.     {
  922.         console.log("Navigating to chosen Troll.");
  923.         sessionStorage.autoLoop = "false";
  924.         location.href = "/battle.html?id_troll=" + TTF;
  925.         return true;
  926.     }
  927. };
  928.  
  929. var doChampionStuff=function()
  930. {
  931.     var page=getPage();
  932.     if (page=='champions')
  933.     {
  934.         console.log('on champion page');
  935.         if ($('button[rel=perform].blue_button_L').length==0)
  936.         {
  937.             console.log('Something is wrong!');
  938.             location.href = "/home.html";
  939.             return true;
  940.         }
  941.         else
  942.         {
  943.             var TCount=Number($('div.input-field > span')[1].innerText.split(' / ')[1]);
  944.             var ECount= getHero().infos.energy_quest;
  945.             console.log("T:"+TCount+" E:"+ECount+" "+(Storage().autoChampsUseEne==="true"))
  946.             if ( TCount==0)
  947.             {
  948.                 console.log("No tickets!");
  949.                 setTimer('nextChampionTime',15*60);
  950.                 return false;
  951.             }
  952.             else
  953.             {
  954.                 if (TCount!=0)
  955.                 {
  956.                     console.log("Using ticket");
  957.                     $('button[rel=perform].blue_button_L').click();
  958.                 }
  959.                 setTimeout(function(){gotoPage('champions_map');},500);
  960.                 return true;
  961.             }
  962.         }
  963.     }
  964.     else if (page=='champions_map')
  965.     {
  966.         console.log('on champion map');
  967.         var Filter=Storage().autoChampsFilter.split(';').map(s=>Number(s));
  968.  
  969.         for (let i=0;i<$('span.stage-bar-tier').length;i++)
  970.         {
  971.             let Impression=$('span.stage-bar-tier')[i].getAttribute("hh_title");
  972.             let Started=Impression.split('/')[0]!="0";
  973.             let OnTimer=$($('a.champion-lair div.champion-lair-name')[i+1]).find('div[rel=timer]').length>0;
  974.             let Filtered=Filter.includes(i+1);
  975.             console.log("Champion "+(i+1)+" ["+Impression+"]"+(Started?" Started;":" Not started;")+(OnTimer?" on timer;":" not on timer;")+(Filtered?" Included in filter":" Excluded from filter"));
  976.  
  977.             if (Started && !OnTimer && Filtered)
  978.             {
  979.                 console.log("Let's do him!");
  980.                 window.location = window.location.origin + '/champions/'+(i+1);
  981.                 return true;
  982.             }
  983.         }
  984.         console.log("No good candidate");
  985.         setTimer('nextChampionTime',15*60);
  986.         return false;
  987.     }
  988.     else
  989.     {
  990.         gotoPage('champions_map');
  991.         return true;
  992.     }
  993. }
  994.  
  995. var doBattle = function () {
  996.     //console.log("Performing auto battle.");
  997.     // Confirm if on correct screen.
  998.     var page = getPage();
  999.     if(page === "arena")
  1000.     {
  1001.         if ($("#arena[class='canvas']").length === 1) {
  1002.             // Oponent choose screen
  1003.             console.log("On opponent choose screen.");
  1004.             if(document.getElementById("popups").style.display === "block")
  1005.             {
  1006.                 console.log("Popup detetcted. Refresh page.");
  1007.                 unsafeWindow.reload();
  1008.                 return;
  1009.             }
  1010.             else{
  1011.                 console.log("No popups.");
  1012.             }
  1013.  
  1014.             var fought = sessionStorage.fought?sessionStorage.fought:0;
  1015.             console.log('already fought: '+fought);
  1016.             if(fought>=3)
  1017.             {
  1018.                 console.log("No arena opponents found, storing nextArenaTime...")
  1019.                 var arenatime = 0;
  1020.                 for(var e in unsafeWindow.HHTimers.timers){
  1021.                     try{
  1022.                         if(unsafeWindow.HHTimers.timers[e].$elm.selector.startsWith(".arena_refresh_counter"))
  1023.                         arenatime=unsafeWindow.HHTimers.timers[e];
  1024.                        }
  1025.                     catch(e){}
  1026.                 }
  1027.                 arenatime = arenatime.remainingTime;
  1028.                 setTimer('nextArenaTime',Number(arenatime)+1);
  1029.                 sessionStorage.fought=0;
  1030.                 return;
  1031.             }
  1032.             //selbutton[0].click();
  1033.             sessionStorage.autoLoop = "false";
  1034.             sessionStorage.fought=Number(fought)+1;
  1035.             window.location = window.location.origin + '/battle.html?id_arena='+fought;
  1036.         }
  1037.     }
  1038.     else if (page==="battle")
  1039.     {
  1040.         CrushThem();
  1041.     }
  1042.     else
  1043.     {
  1044.         // Switch to the correct screen
  1045.         console.log("Switching to battle screen.");
  1046.         gotoPage("arena");
  1047.         return;
  1048.     }
  1049. };
  1050.  
  1051. var doLeagueBattle = function () {
  1052.     //console.log("Performing auto leagues.");
  1053.     // Confirm if on correct screen.
  1054.     var currentPower = getHero().infos.energy_challenge;
  1055.     var ltime;
  1056.  
  1057.     var page = getPage();
  1058.     if(page==='battle')
  1059.     {
  1060.         // On the battle screen.
  1061.         CrushThem();
  1062.     }
  1063.     else if(page === "leaderboard")
  1064.     {
  1065.        // console.log('ls! '+$('h4.leagues').size());
  1066.         $('h4.leagues').each(function(){this.click();});
  1067.  
  1068.         if(currentPower < 1)
  1069.         {
  1070.             console.log("No power for leagues.");
  1071.             for(var e in unsafeWindow.HHTimers.timers){
  1072.                try{
  1073.                    if(unsafeWindow.HHTimers.timers[e].type=="energy_challenge")
  1074.                        ltime=unsafeWindow.HHTimers.timers[e];
  1075.                    }
  1076.                catch(e){}
  1077.                }
  1078.             ltime = Number(ltime.remainingTime)+15;
  1079.             setTimer('nextLeaguesTime',ltime);
  1080.             return;
  1081.         }
  1082.  
  1083.         while ($("span[sort_by='level'][select='asc']").size()==0)
  1084.         {
  1085.             console.log('resorting');
  1086.             $("span[sort_by='level']").each(function(){this.click()});
  1087.         }
  1088.         console.log('parsing enemies');
  1089.         var Data=[];
  1090.         $(".leadTable[sorting_table] tr").each(function(){if (this.cells[3].innerHTML==='0/3' || this.cells[3].innerHTML==='1/3' || this.cells[3].innerHTML==='2/3'){Data.push(this);}});
  1091.         if (Data.length==0)
  1092.         {
  1093.             ltime=35*60;
  1094.             console.log('No valid targets!');
  1095.             setTimer('nextLeaguesTime',ltime);
  1096.         }
  1097.         else
  1098.         {
  1099.             console.log(Data.length+' valid targets!');
  1100.             sessionStorage.autoLoop = "false";
  1101.             console.log("Hit?");
  1102.             location.href = "/battle.html?league_battle=1&id_member=" + $(Data[0]).attr("sorting_id")
  1103.         }
  1104.     }
  1105.     else if (page==="battle")
  1106.     {
  1107.         CrushThem();
  1108.     }
  1109.     else
  1110.     {
  1111.         // Switch to the correct screen
  1112.         console.log("Switching to leagues screen.");
  1113.         gotoPage("leaderboard");
  1114.         return;
  1115.     }
  1116. };
  1117.  
  1118. var  CrushThem = function()
  1119. {
  1120.     if (getPage() === "battle") {
  1121.         // On battle page.
  1122.         if ($("#rewards_popup .blue_text_button").size()>0)
  1123.         {
  1124.             $("#rewards_popup .blue_text_button").click();
  1125.         }
  1126.         if ($("#rewards_popup .blue_button_L").size()>0)
  1127.         {
  1128.             $("#rewards_popup .blue_button_L").click();
  1129.         }
  1130.  
  1131.         //console.log("On Battle Page.");
  1132.         if ($("#battle[class='canvas']").length === 1) {
  1133.             // Battle screen
  1134.             console.log("On battle screen.");
  1135.             // get button with no autofight, i.e. no koban
  1136.             var battleButton = $('#battle button[rel="launch"]:not(.autofight)');
  1137.             //console.log(battleButton.get());
  1138.             //console.log(battleButton);
  1139.             var currentPower = getHero().infos.energy_fight;
  1140.             if(battleButton === undefined){
  1141.                 console.log("Battle Button was undefined. Disabling all auto-battle.");
  1142.                 document.getElementById("autoBattleCheckbox").checked = false;
  1143.                 document.getElementById("autoArenaCheckbox").checked = false;
  1144.                 if (sessionStorage.questRequirement === "battle")
  1145.                 {
  1146.                     document.getElementById("autoQuestCheckbox").checked = false;
  1147.                     console.log("Auto-quest disabled since it requires battle and auto-battle has errors.");
  1148.                 }
  1149.                 return;
  1150.             }
  1151.             var battle_price = battleButton.find('span').size()>0?battleButton.attr("price_fe"):0;
  1152.  
  1153.             if (location.search.split("league_battle=")[1])
  1154.             {
  1155.                 currentPower=getHero().infos.energy_challenge;
  1156.             }
  1157.             if(battle_price === undefined){
  1158.                 console.log("Could not detect battle button price. Error.");
  1159.                 console.log("Disabling all auto-battle.");
  1160.                 document.getElementById("autoBattleCheckbox").checked = false;
  1161.                 document.getElementById("autoArenaCheckbox").checked = false;
  1162.                 if (sessionStorage.questRequirement === "battle")
  1163.                 {
  1164.                     document.getElementById("autoQuestCheckbox").checked = false;
  1165.                     console.log("Auto-quest disabled since it requires battle and auto-battle has errors.");
  1166.                 }
  1167.                 return;
  1168.             }
  1169.             console.log("battle price: "+battle_price+"P")
  1170.             if(currentPower >= battle_price)
  1171.             {
  1172.                 // We have the power.
  1173.                 is_cheat_click=function(e) {
  1174.                     return false;
  1175.                 };
  1176.                 battleButton.click();
  1177.                 // Skip
  1178.                 setTimeout(function(){$("#battle_middle button[rel='skip']").click();},2000);
  1179.                 setTimeout(function(){$("#rewards_popup .blue_text_button").click();$("#rewards_popup .blue_button_L").click();},3500);
  1180.  
  1181.                 if (sessionStorage.questRequirement === "battle") {
  1182.                     // Battle Done.
  1183.                     sessionStorage.questRequirement = "none";
  1184.                 }
  1185.  
  1186.                 location.href = "/home.html";
  1187.                 return true;
  1188.             }
  1189.             else
  1190.             {
  1191.                 // We need more power.
  1192.                 console.log("Battle requires "+battle_price+" power.");
  1193.                 sessionStorage.battlePowerRequired = battle_price;
  1194.                 if(sessionStorage.questRequirement === "battle")sessionStorage.questRequirement = "P"+battle_price;
  1195.             }
  1196.         }
  1197.         else {
  1198.             console.log("Could not identify battle screen.");
  1199.             if (sessionStorage.questRequirement === "battle") sessionStorage.questRequirement = "errorInAutoBattle";
  1200.             return;
  1201.         }
  1202.     }
  1203. }
  1204.  
  1205. var setTimer=function(name, seconds)
  1206. {
  1207.     var ND=new Date().getTime() + seconds * 1000;
  1208.     Timers[name]=ND;
  1209.     sessionStorage.Timers=JSON.stringify(Timers);
  1210.     console.log(name+" set to "+toHHMMSS(ND/1000-new Date().getTimezoneOffset()*60)+' ('+ toHHMMSS(seconds)+')');
  1211. }
  1212.  
  1213. var clearTimer=function(name)
  1214. {
  1215.     delete Timers[name];
  1216.     sessionStorage.Timers=JSON.stringify(Timers);
  1217. }
  1218.  
  1219. var checkTimer=function(name)
  1220. {
  1221.     if (!Timers[name])
  1222.     {
  1223.         return true;
  1224.     }
  1225.     if (Timers[name]<new Date())
  1226.     {
  1227.         return true;
  1228.     }
  1229.     return false;
  1230. }
  1231.  
  1232. var getSecondsLeft=function(name)
  1233. {
  1234.     if (!Timers[name])
  1235.     {
  1236.         return 0;
  1237.     }
  1238.     return Math.ceil(Timers[name]/1000)-Math.ceil(new Date().getTime()/1000);
  1239. }
  1240.  
  1241. var getTimeLeft=function(name)
  1242. {
  1243.     if (!Timers[name])
  1244.     {
  1245.         return "No timer";
  1246.     }
  1247.     var diff=getSecondsLeft(name);
  1248.     if (diff<=0)
  1249.     {
  1250.         return "Time's up!";
  1251.     }
  1252.     return toHHMMSS(diff);
  1253. }
  1254.  
  1255.  
  1256.  
  1257. var updateData = function () {
  1258.     //console.log("updating UI");
  1259.  
  1260.     var trollOptions = document.getElementById("autoTrollSelector");
  1261.     Storage().autoTrollSelectedIndex = trollOptions.selectedIndex;
  1262.     Storage().trollToFight = trollOptions.value;
  1263.     Storage().plusEvent = document.getElementById("plusEvent").checked;
  1264.     Storage().autoSalary = document.getElementById("autoSalaryCheckbox").checked;
  1265.     Storage().autoSalaryTimer = document.getElementById("autoSalaryTextbox").value;
  1266.     Storage().autoContest = document.getElementById("autoContestCheckbox").checked;
  1267.     //nextPoPowerTime
  1268.     Storage().autoPoPower = document.getElementById("autoPoPowerCheckbox").checked;
  1269.     Storage().autoMission = document.getElementById("autoMissionCheckbox").checked;
  1270.     Storage().autoMissionC = document.getElementById("autoMissionCollect").checked;
  1271.     Storage().autoQuest = document.getElementById("autoQuestCheckbox").checked;
  1272.     Storage().autoTrollBattle = document.getElementById("autoBattleCheckbox").checked;
  1273.     Storage().eventTrollOrder = document.getElementById("eventTrollOrder").value;
  1274.     Storage().buyCombTimer = document.getElementById("buyCombTimer").value;
  1275.     Storage().autoArenaBattle = document.getElementById("autoArenaCheckbox").checked;
  1276.     Storage().autoLeagues = document.getElementById("autoLeagues").checked;
  1277.     Storage().autoStats = document.getElementById("autoStats").value;
  1278.     Storage().paranoia = document.getElementById("paranoia").checked;
  1279.     Storage().autoFreePachinko = document.getElementById("autoFreePachinko").checked;
  1280.     Storage().autoExp = document.getElementById("autoExp").value;
  1281.     Storage().autoExpW = document.getElementById("autoExpW").checked;
  1282.     Storage().MaxExp = document.getElementById("maxExp").value;
  1283.     Storage().autoAff = document.getElementById("autoAff").value;
  1284.     Storage().autoAffW = document.getElementById("autoAffW").checked;
  1285.     Storage().MaxAff = document.getElementById("maxAff").value;
  1286.     Storage().autoLGM = document.getElementById("autoLGM").value;
  1287.     Storage().autoLGMW = document.getElementById("autoLGMW").checked;
  1288.     Storage().autoLGR = document.getElementById("autoLGR").value;
  1289.     Storage().autoLGRW = document.getElementById("autoLGRW").checked;
  1290.     Storage().autoEGM = document.getElementById("autoEGM").value;
  1291.     Storage().autoEGMW = document.getElementById("autoEGMW").checked;
  1292.     Storage().showInfo = document.getElementById("showInfo").checked;
  1293.     Storage().autoChamps = document.getElementById("autoChamps").checked;
  1294.     Storage().autoChampsUseEne = document.getElementById("autoChampsUseEne").checked;
  1295.     Storage().autoChampsFilter = document.getElementById("autoChampsFilter").value;
  1296.  
  1297.     Storage().spendKobans0 = document.getElementById("spendKobans0").checked;
  1298.     Storage().spendKobans1 = document.getElementById("spendKobans1").checked && Storage().spendKobans0=="true";
  1299.     document.getElementById("spendKobans1").checked=Storage().spendKobans1=="true";
  1300.     Storage().spendKobans2 = document.getElementById("spendKobans2").checked && Storage().spendKobans1=="true" && Storage().spendKobans0=="true"
  1301.     document.getElementById("spendKobans2").checked=Storage().spendKobans2=="true";
  1302.  
  1303.     Storage().buyCombat=document.getElementById("buyCombat").checked && Storage().spendKobans2=="true" && Storage().spendKobans1=="true" && Storage().spendKobans0=="true"
  1304.     document.getElementById("buyCombat").checked=Storage().buyCombat=="true";
  1305.     Storage().kobanBank=document.getElementById("kobanBank").value;
  1306.  
  1307.     localStorage.settPerTab = document.getElementById("settPerTab").checked;
  1308.  
  1309.     Storage().master=document.getElementById("master").checked;
  1310.  
  1311.     if (Storage().showInfo=="true")
  1312.     {
  1313.         var Tegzd='';
  1314.         Tegzd+='Master: '+(Storage().master==="true"?"ON":"OFF");
  1315.         if (Storage().paranoia=="true")
  1316.         {
  1317.             Tegzd+=(Tegzd.length>0?'\r\n':'')+sessionStorage.pinfo+': '+getTimeLeft('paranoiaSwitch');
  1318.         }
  1319.         if (Storage().autoSalary=="true")
  1320.         {
  1321.             Tegzd+=(Tegzd.length>0?'\r\n':'')+'Salary check: '+getTimeLeft('nextSalaryTime');
  1322.         }
  1323.         if (Storage().autoArenaBattle=="true")
  1324.         {
  1325.             Tegzd+=(Tegzd.length>0?'\r\n':'')+'Arena fight: '+getTimeLeft('nextArenaTime');
  1326.         }
  1327.         if (Storage().autoLeagues=="true")
  1328.         {
  1329.             Tegzd+=(Tegzd.length>0?'\r\n':'')+'League fight: '+getTimeLeft('nextLeaguesTime');
  1330.         }
  1331.         if (Storage().autoChamps=="true")
  1332.         {
  1333.             Tegzd+=(Tegzd.length>0?'\r\n':'')+'Champions check: '+getTimeLeft('nextChampionTime');
  1334.         }
  1335.        // if (autoBuy())
  1336.         {
  1337.             Tegzd+=(Tegzd.length>0?'\r\n':'')+'Shop update: '+getTimeLeft('nextShopTime');
  1338.         }
  1339.         if (Storage().autoMission=="true")
  1340.         {
  1341.             Tegzd+=(Tegzd.length>0?'\r\n':'')+'Mission: '+getTimeLeft('nextMissionTime');
  1342.         }
  1343.         if (Storage().autoContest=="true")
  1344.         {
  1345.             Tegzd+=(Tegzd.length>0?'\r\n':'')+'Contest: '+getTimeLeft('nextContestTime');
  1346.         }
  1347.         //nextPoPowerTime
  1348.         if (Storage().autoPoPower=="true")
  1349.         {
  1350.             Tegzd+=(Tegzd.length>0?'\r\n':'')+'PoPower: '+getTimeLeft('nextPoPowerTime');
  1351.         }
  1352.         if (Storage().autoFreePachinko=="true")
  1353.         {
  1354.             Tegzd+=(Tegzd.length>0?'\r\n':'')+'Great Pachinko: '+getTimeLeft('nextPachinkoTime');
  1355.             Tegzd+=(Tegzd.length>0?'\r\n':'')+'Mythic Pachinko: '+getTimeLeft('nextPachinko2Time');
  1356.         }
  1357.         if (Tegzd.length>0)
  1358.         {
  1359.             document.getElementById('pInfo').style.display='block';
  1360.             document.getElementById('pInfo').textContent=Tegzd;
  1361.         }
  1362.         else
  1363.         {
  1364.             document.getElementById('pInfo').style.display='none';
  1365.         }
  1366.     }
  1367.     else
  1368.     {
  1369.         document.getElementById('pInfo').style.display='none';
  1370.     }
  1371. };
  1372.  
  1373. var getPachinko = function(){
  1374.     try {
  1375.         if(!gotoPage("pachinko"))
  1376.         {
  1377.             // Not at Pachinko screen then goto the Pachinko screen.
  1378.             console.log("Navigating to Pachinko window.");
  1379.             return;
  1380.         }
  1381.         else {
  1382.             console.log("Detected Pachinko Screen. Fetching Pachinko");
  1383.  
  1384.                 console.log('to great');
  1385.                 butt1=$('.game-simple-block[type-pachinko=great]')[0].click();
  1386.  
  1387.             if ($('#playzone-replace-info button[free="0"]')[0])
  1388.             {
  1389.                 console.log('Not ready yet');
  1390.             }
  1391.             else
  1392.             {
  1393.                 butt1=$('#playzone-replace-info button[free="1"]')[0].click();
  1394.             }
  1395.             var npach;
  1396.             for(var e in unsafeWindow.HHTimers.timers){
  1397.                 if(unsafeWindow.HHTimers.timers[e].$elm && unsafeWindow.HHTimers.timers[e].$elm.selector.startsWith(".pachinko_change"))
  1398.                     npach=unsafeWindow.HHTimers.timers[e].remainingTime;
  1399.             }
  1400.             if(npach !== undefined || npach !== 0)
  1401.             {
  1402.                 setTimer('nextPachinkoTime',Number(npach)+1);
  1403.             }
  1404.             else
  1405.             {
  1406.                 clearTimer('nextPachinkoTime');
  1407.             }
  1408.         }
  1409.     }
  1410.     catch (ex) {
  1411.         console.log("Could not collect Great Pachinko... " + ex);
  1412.     }
  1413. };
  1414.  
  1415. var getPachinko2 = function(){
  1416.     try {
  1417.         if(!gotoPage("pachinko"))
  1418.         {
  1419.             // Not at Pachinko screen then goto the Pachinko screen.
  1420.             console.log("Navigating to Pachinko window.");
  1421.             return;
  1422.         }
  1423.         else {
  1424.             console.log("Detected Pachinko Screen. Fetching Pachinko");
  1425.  
  1426.                 console.log('to mythic');
  1427.                 butt=$('.game-simple-block[type-pachinko=mythic]')[0].click();
  1428.  
  1429.             if ($('#playzone-replace-info button[free="0"]')[0])
  1430.             {
  1431.                 console.log('Not ready yet');
  1432.             }
  1433.             else
  1434.             {
  1435.                 butt=$('#playzone-replace-info button[free="1"]')[0].click();
  1436.             }
  1437.             var npach;
  1438.             for(var e in unsafeWindow.HHTimers.timers){
  1439.                 if(unsafeWindow.HHTimers.timers[e].$elm && unsafeWindow.HHTimers.timers[e].$elm.selector.startsWith('.game-simple-block[type-pachinko="mythic"]'))
  1440.                     npach=unsafeWindow.HHTimers.timers[e].remainingTime;
  1441.             }
  1442.             if(npach !== undefined || npach !== 0)
  1443.             {
  1444.                 setTimer('nextPachinko2Time',Number(npach)+1);
  1445.             }
  1446.             else
  1447.             {
  1448.                 clearTimer('nextPachinko2Time');
  1449.             }
  1450.         }
  1451.     }
  1452.     catch (ex) {
  1453.         console.log("Could not collect Mythic Pachinko... " + ex);
  1454.     }
  1455. };
  1456.  
  1457. var updateShop=function()
  1458. {
  1459.         if(!gotoPage("shop"))
  1460.         {
  1461.             console.log("Navigating to Market window.");
  1462.             return true;
  1463.         }
  1464.         else {
  1465.             console.log("Detected Market Screen. Fetching Assortment");
  1466.  
  1467.             var assA=[];
  1468.             var assG=[];
  1469.             var assP=[];
  1470.             //$('#shop div.armor .slot').each(function(){if (this.dataset.d)assA.push(JSON.parse(this.dataset.d));});
  1471.             $('#shop div.gift .slot').each(function(){if (this.dataset.d)assG.push(JSON.parse(this.dataset.d));});
  1472.             $('#shop div.potion .slot').each(function(){if (this.dataset.d)assP.push(JSON.parse(this.dataset.d));});
  1473.  
  1474.             var HaveAff=0;
  1475.             var HaveExp=0;
  1476.             $('#inventory div.gift .slot').each(function(){if (this.dataset.d) { var d=JSON.parse(this.dataset.d); HaveAff+=d.count*d.value;}});
  1477.             $('#inventory div.potion .slot').each(function(){if (this.dataset.d) { var d=JSON.parse(this.dataset.d); HaveExp+=d.count*d.value;}});
  1478.  
  1479.             sessionStorage.haveAff=HaveAff;
  1480.             sessionStorage.haveExp=HaveExp;
  1481.  
  1482.             console.log('counted',sessionStorage.haveAff,sessionStorage.haveExp);
  1483.  
  1484.             sessionStorage.storeContents = JSON.stringify([assA,assG,assP]);
  1485.             sessionStorage.charLevel=getHero().infos.level;
  1486.  
  1487.             var nshop;
  1488.             for(var e in unsafeWindow.HHTimers.timers){
  1489.                 if(unsafeWindow.HHTimers.timers[e].$elm && unsafeWindow.HHTimers.timers[e].$elm.selector.startsWith(".shop_count"))
  1490.                     nshop=unsafeWindow.HHTimers.timers[e].remainingTime;
  1491.             }
  1492.             if(nshop !== undefined && nshop !== 0)
  1493.             {
  1494.                 console.log(nshop);
  1495.                 setTimer('nextShopTime',Number(nshop)+1);
  1496.             }
  1497.             else
  1498.             {
  1499.                 setTimer('nextShopTime',60);
  1500.             }
  1501.         }
  1502.     return false;
  1503. }
  1504.  
  1505. var toHHMMSS = function (secs)  {
  1506.     var sec_num = parseInt(secs, 10);
  1507.     var days   = Math.floor(sec_num / 86400);
  1508.     var hours   = Math.floor(sec_num / 3600) % 24;
  1509.     var minutes = Math.floor(sec_num / 60) % 60;
  1510.     var seconds = sec_num % 60;
  1511.     var n=0;
  1512.     return [days,hours,minutes,seconds]
  1513.         .map(v => v < 10 ? "0" + v : v)
  1514.         .filter((v,i) => {if (v !== "00"){n++; return true;} return n > 0})
  1515.         .join(":");
  1516. }
  1517.  
  1518. var flipParanoia=function()
  1519. {
  1520.     var burst=getBurst();
  1521.  
  1522.     var Setting=Storage().paranoiaSettings;
  1523.  
  1524.     var S1=Setting.split('/').map(s=>s.split('|').map(s=>s.split(':')));
  1525.  
  1526.     var toNextSwitch;
  1527.     var period;
  1528.     var n = new Date().getHours();
  1529.     S1[2].some(x => {if (n<x[0]) {period=x[1]; return true;}});
  1530.  
  1531.     if (burst && getHero().infos.energy_fight!=0 && Storage().autoTrollBattle=='true') //double(or more) burst if we want to fight
  1532.     {
  1533.         burst=false;
  1534.     }
  1535.  
  1536.     if (burst)
  1537.     {
  1538.         //going into hiding
  1539.         sessionStorage.burst="false";
  1540.  
  1541.         var periods=Object.assign(...S1[1].map(d => ({[d[0]]: d[1].split('-')})));
  1542.  
  1543.         toNextSwitch=randomInterval(Number(periods[period][0]),Number(periods[period][1]));
  1544.         if (toNextSwitch<=1800 && Storage().autoArenaBattle == "true")
  1545.         {
  1546.             var sl=getSecondsLeft("nextArenaTime");
  1547.             toNextSwitch=toNextSwitch<sl?toNextSwitch:sl;
  1548.         }
  1549.     }
  1550.     else
  1551.     {
  1552.         //if (getPage()!='home') return;
  1553.         //going to work
  1554.         sessionStorage.autoLoop = "false";
  1555.         sessionStorage.burst="true";
  1556.         var b=S1[0][0][0].split('-');
  1557.         toNextSwitch=randomInterval(Number(b[0]),Number(b[1]));
  1558.     }
  1559.     var ND=new Date().getTime() + toNextSwitch * 1000;
  1560.     var offs=new Date().getTimezoneOffset();
  1561.     var message=period+(burst?" rest":" burst");
  1562.     console.log("PARANOIA: "+message);
  1563.     sessionStorage.pinfo=message;
  1564.  
  1565.     setTimer('paranoiaSwitch',toNextSwitch);
  1566.     if (sessionStorage.burst=="true")
  1567.     {
  1568.         if (hh_nutaku)
  1569.         {
  1570.             window.top.postMessage({reloadMe:true},'*');
  1571.         }
  1572.         else
  1573.         {
  1574.             window.top.location.reload();
  1575.         }
  1576.     }
  1577. }
  1578.  
  1579. var autoLoop = function () {
  1580.     updateData();
  1581.     if (!sessionStorage.questRequirement)
  1582.     {
  1583.         sessionStorage.questRequirement="none";
  1584.     }
  1585.     if (!sessionStorage.userLink)
  1586.     {
  1587.         sessionStorage.userLink="none"
  1588.     }
  1589.     if (!sessionStorage.battlePowerRequired)
  1590.     {
  1591.         sessionStorage.battlePowerRequired="0";
  1592.     }
  1593.  
  1594.     var busy = false;
  1595.     var page = window.location.href;
  1596.     var currentPower = getHero().infos.energy_fight;
  1597.  
  1598.     var burst=getBurst();
  1599.  
  1600.     if (burst /*|| checkTimer('nextMissionTime')*/)
  1601.     {
  1602.         if(Storage().autoFreePachinko === "true" && busy === false){
  1603.         // Navigate to pachinko
  1604.  
  1605.             if (checkTimer("nextPachinkoTime")) {
  1606.                 console.log("Time to fetch Great Pachinko.");
  1607.                 getPachinko();
  1608.                 busy = true;
  1609.             }
  1610.             if (checkTimer("nextPachinko2Time")) {
  1611.                 console.log("Time to fetch Mythic Pachinko.");
  1612.                 getPachinko2();
  1613.                 busy = true;
  1614.             }
  1615.         }
  1616.         if(Storage().autoLeagues === "true" && getHero().infos.level>=20 && busy === false ){
  1617.             // Navigate to leagues
  1618.             if (checkTimer('nextLeaguesTime')) {
  1619.                 console.log("Time to fight in Leagues.");
  1620.                 doLeagueBattle();
  1621.                 busy = true;
  1622.             }
  1623.         }
  1624.         if(Storage().autoContest === "true" && busy === false){
  1625.             if (checkTimer('nextContestTime') || unsafeWindow.has_contests_datas ||$(".contest .ended button[rel='claim']").size()>0){
  1626.                 console.log("Time to get contest rewards.");
  1627.                 busy = doContestStuff();
  1628.             }
  1629.         }
  1630.         //nextPoPowerTime
  1631.         if(Storage().autoPoPower === "true" && busy === false){
  1632.             if (checkTimer('nextPoPowerTime') || unsafeWindow.has_contests_datas ||$(".pop .ended button[rel='claim']").size()>0){
  1633.                 console.log("Time to get popower rewards.");
  1634.                 busy = doPoPowerStuff();
  1635.             }
  1636.         }
  1637.         if(Storage().autoMission === "true" && busy === false){
  1638.             if (checkTimer('nextMissionTime')){
  1639.                 console.log("Time to do missions.");
  1640.                 busy = doMissionStuff();
  1641.             }
  1642.         }
  1643.  
  1644.         if (Storage().autoQuest === "true" && busy === false) {
  1645.             if (sessionStorage.questRequirement === "battle") {
  1646.                 console.log("Quest requires battle.");
  1647.                 doBossBattle();
  1648.                 busy = true;
  1649.             }
  1650.             else if (sessionStorage.questRequirement[0] === '$') {
  1651.                 if (Number(sessionStorage.questRequirement.substr(1)) < getHero().infos.soft_currency) {
  1652.                     // We have enough money... requirement fulfilled.
  1653.                     console.log("Continuing quest, required money obtained.");
  1654.                     sessionStorage.questRequirement = "none";
  1655.                     proceedQuest();
  1656.                     busy = true;
  1657.                 }
  1658.                 else {
  1659.                     if(isNaN(sessionStorage.questRequirement.substr(1)))
  1660.                     {
  1661.                         console.log(sessionStorage.questRequirement);
  1662.                         sessionStorage.questRequirement = "none";
  1663.                         console.log("Invalid money in session storage quest requirement !");
  1664.                     }
  1665.                     else{
  1666.                         // Else we need more money.
  1667.                         //console.log("Need money for quest, cannot continue. Turning ON AutoSalary.");
  1668.                         Storage().autoQuest = "true";
  1669.                     }
  1670.                     busy = false;
  1671.                 }
  1672.             }
  1673.             else if (sessionStorage.questRequirement[0] === '*') {
  1674.                 var energyNeeded = Number(sessionStorage.questRequirement.substr(1));
  1675.                 var energyCurrent = getHero().infos.energy_quest;
  1676.                 if (energyNeeded <= energyCurrent) {
  1677.                     // We have enough energy... requirement fulfilled.
  1678.                     console.log("Continuing quest, required energy obtained.");
  1679.                     sessionStorage.questRequirement = "none";
  1680.                     proceedQuest();
  1681.                     busy = true;
  1682.                 }
  1683.                 // Else we need energy, just wait.
  1684.                 else {
  1685.                     busy = false;
  1686.                     //console.log("Replenishing energy for quest.(" + energyNeeded + " needed)");
  1687.                 }
  1688.             }
  1689.             else if (sessionStorage.questRequirement[0] === 'P')
  1690.             {
  1691.                 // Battle power required.
  1692.                 var neededPower = Number(sessionStorage.questRequirement.substr(1));
  1693.                 if(currentPower < neededPower)
  1694.                 {
  1695.                     console.log("Quest requires "+neededPower+" Battle Power for advancement. Waiting...");
  1696.                     busy = false;
  1697.                 }
  1698.                 else
  1699.                 {
  1700.                     console.log("Battle Power obtained, resuming quest...");
  1701.                     sessionStorage.questRequirement = "none";
  1702.                     proceedQuest();
  1703.                     busy = true;
  1704.                 }
  1705.             }
  1706.             else if (sessionStorage.questRequirement === "unknownQuestButton") {
  1707.                 console.log("AutoQuest disabled.AutoQuest cannot be performed due to unknown quest button. Please manually proceed the current quest screen.");
  1708.                 document.getElementById("autoQuestCheckbox").checked = false;
  1709.                 Storage().autoQuest = "false";
  1710.                 sessionStorage.questRequirement = "none";
  1711.                 busy = false;
  1712.             }
  1713.             else if (sessionStorage.questRequirement === "errorInAutoBattle") {
  1714.                 console.log("AutoQuest disabled.AutoQuest cannot be performed due errors in AutoBattle. Please manually proceed the current quest screen.");
  1715.                 document.getElementById("autoQuestCheckbox").checked = false;
  1716.                 Storage().autoQuest = "false";
  1717.                 sessionStorage.questRequirement = "none";
  1718.                 busy = false;
  1719.             }
  1720.             else if(sessionStorage.questRequirement === "none")
  1721.             {
  1722.                 //console.log("NONE req.");
  1723.                 busy = true;
  1724.                 proceedQuest();
  1725.             }
  1726.             else
  1727.             {
  1728.                 console.log("Invalid quest requirement : "+sessionStorage.questRequirement);
  1729.                 busy=false;
  1730.             }
  1731.         }
  1732.         else if(Storage().autoQuest === "false"){sessionStorage.questRequirement = "none";}
  1733.  
  1734.         if(Storage().autoArenaBattle === "true" && busy === false)
  1735.         {
  1736.             if (/*unsafeWindow.arena_data && unsafeWindow.arena_data.active_opponent*/$('a[rel=arena] span.button-notification-icon').size()>0)
  1737.             {
  1738.                 console.log('Missed one in arena!');
  1739.                 setTimer('nextArenaTime',0);
  1740.             }
  1741.             if(checkTimer("nextArenaTime"))
  1742.             {
  1743.                 console.log("Time to fight in arena.");
  1744.                 doBattle();
  1745.                 busy = true;
  1746.             }
  1747.         }
  1748.  
  1749.  
  1750.         if(Storage().autoTrollBattle === "true" && getHero().infos.questing.id_world>0)
  1751.         {
  1752.             if(busy === false && currentPower >= Number(sessionStorage.battlePowerRequired) && currentPower > 0)
  1753.             {
  1754.                 sessionStorage.battlePowerRequired = "0";
  1755.                 busy = true;
  1756.                 if(Storage().autoQuest === "true")
  1757.                 {
  1758.                     if(sessionStorage.questRequirement[0] === 'P')
  1759.                     {
  1760.                         console.log("AutoBattle disabled for power collection for AutoQuest.");
  1761.                         document.getElementById("autoBattleCheckbox").checked = false;
  1762.                         Storage().autoTrollBattle = "false";
  1763.                         busy = false;
  1764.                     }
  1765.                     else
  1766.                     {
  1767.                         doBossBattle();
  1768.                     }
  1769.                 }
  1770.                 else
  1771.                 {
  1772.                     doBossBattle();
  1773.                 }
  1774.             }
  1775.         }
  1776.         else{sessionStorage.battlePowerRequired = "0";}
  1777.  
  1778.         var ECt= getHero().infos.energy_quest;
  1779.         if (ECt>=60 && (Storage().autoChampsUseEne==="true"))
  1780.             {
  1781.                 console.log('Buying ticket with energy');
  1782.                 var amount = 1;
  1783.                 var currency = 'energy_quest';
  1784.                 var params = {
  1785.                     namespace: 'h\\Champions',
  1786.                     class: 'Champions',
  1787.                     action: 'buy_ticket',
  1788.                     currency: currency,
  1789.                     amount: amount
  1790.                 };
  1791.  
  1792.                 hh_ajax(params, function(data) {
  1793.                     anim_number($('.tickets_number_amount'), data.tokens - amount, amount);
  1794.                     Hero.updates(data.heroChangesUpdate);
  1795.                 });
  1796.         }
  1797.  
  1798.         if (busy==false && Storage().autoChamps==="true" && checkTimer('nextChampionTime'))
  1799.         {
  1800.             console.log("Time to check on champions!");
  1801.             busy=doChampionStuff();
  1802.         }
  1803.  
  1804.         if (/*autoBuy() &&*/ busy===false)
  1805.         {
  1806.             if (sessionStorage.charLevel===undefined)
  1807.             {
  1808.                 sessionStorage.charLevel=0;
  1809.             }
  1810.             if (checkTimer('nextShopTime') || sessionStorage.charLevel<getHero().infos.level) {
  1811.                 console.log("Time to check shop.");
  1812.                 busy = updateShop();
  1813.             }
  1814.         }
  1815.  
  1816.         if (Storage().autoSalary === "true" && busy === false) {
  1817.             if (checkTimer("nextSalaryTime")) {
  1818.                 console.log("Time to fetch salary.");
  1819.                 busy = getSalary();
  1820.             }
  1821.         }
  1822.  
  1823.         if(busy === true && sessionStorage.userLink==="none" && !window.location.pathname.startsWith("/quest"))
  1824.         {
  1825.             sessionStorage.userLink = page;
  1826.         }
  1827.         else if(sessionStorage.userLink !=="none" && busy === false)
  1828.         {
  1829.             console.log("Restoring page "+sessionStorage.userLink);
  1830.             window.location = sessionStorage.userLink;
  1831.             sessionStorage.userLink = "none";
  1832.         }
  1833.     }
  1834.  
  1835.     if(Storage().paranoia === "true" && Storage().master==="true"){
  1836.          if (checkTimer("paranoiaSwitch")) {
  1837.              flipParanoia();
  1838.          }
  1839.     }
  1840.  
  1841.     if(isNaN(Storage().autoLoopTimeMili)){
  1842.         console.log("AutoLoopTimeMili is not a number.");
  1843.         setDefaults();
  1844.     }
  1845.     else{
  1846.         if (sessionStorage.autoLoop === "true") setTimeout(autoLoop, Number(localStorage.autoLoopTimeMili));
  1847.         else console.log("autoLoop Disabled");
  1848.     }
  1849. };
  1850.  
  1851. var setDefaults = function () {
  1852.     console.log("Setting Defaults.");
  1853.     Storage().autoSalary = "true";
  1854.     Storage().autoSalaryTimer = "120";
  1855.     Storage().autoContest = "true";
  1856.     Storage().autoPoPower = "true";
  1857.     Storage().autoMission = "true";
  1858.     Storage().autoMissionC = "true";
  1859.     Storage().autoLeagues = "true";
  1860.     Storage().autoStats = "500000000";
  1861.     sessionStorage.autoLoop = "true";
  1862.     sessionStorage.userLink = "none";
  1863.     Storage().autoLoopTimeMili = "500";
  1864.     Storage().autoQuest = "true";
  1865.     Storage().autoTrollBattle = "true";
  1866.     Storage().eventTrollOrder="";
  1867.     Storage().buyCombTimer="16";
  1868.     Storage().autoArenaBattle = "true";
  1869.     sessionStorage.battlePowerRequired = "0";
  1870.     sessionStorage.questRequirement = "none";
  1871.     Storage().freshStart = "no";
  1872.     Storage().autoChamps="true";
  1873.     Storage().autoChampsUseEne="true";
  1874.     Storage().autoChampsFilter="1;2;3;4;5;6";
  1875.     Storage().autoFreePachinko = "true";
  1876.     Storage().autoExp = "500000000";
  1877.     Storage().autoExpW = "true";
  1878.     Storage().MaxExp = "999999999999999";
  1879.     Storage().autoAff = "500000000";
  1880.     Storage().autoAffW = "true";
  1881.     Storage().MaxAff = "999999999999999";
  1882.     Storage().autoLGM = "500000000";
  1883.     Storage().autoLGMW = "true";
  1884.     Storage().autoLGR = "500000000";
  1885.     Storage().autoLGRW = "true";
  1886.     Storage().autoEGM = "500000000";
  1887.     Storage().autoEGMW = "true";
  1888.     Storage().paranoia="false";
  1889.     Storage().showInfo="true";
  1890.     Storage().spendKobans0="true";
  1891.     Storage().paranoiaSettings="120-300/Sleep:28800-29400|Active:300-420|Casual:1800-2100/6:Sleep|18:Active|22:Casual|24:Sleep";
  1892.     Storage().master="true";
  1893. };
  1894.  
  1895. var CollectEventData=function()
  1896. {
  1897.     if (unsafeWindow.event_data)
  1898.     {
  1899.         var timeLeft=event_data.seconds_until_event_end;
  1900.         setTimer('eventGoing',timeLeft);
  1901.         var Trollz=[];
  1902.         for (var i=0;i<event_data.girls.length;i++)
  1903.         {
  1904.             if (!event_data.girls[i].owned_girl && event_data.girls[i].troll)
  1905.             {
  1906.                 if (Number(event_data.girls[i].troll.id_troll)<getHero().infos.questing.id_world)
  1907.                 {
  1908.                     Trollz.push(Number(event_data.girls[i].troll.id_troll));
  1909.                 }
  1910.             }
  1911.         }
  1912.  
  1913.         var Priority=(Storage().eventTrollOrder?Storage().eventTrollOrder:"").split(";");
  1914.         console.log(Priority);
  1915.         console.log(Trollz);
  1916.         if (Trollz.length>0)
  1917.         {
  1918.             if (Priority[0]!='')
  1919.             {
  1920.                 var found=false;
  1921.                 for (var n=0;n<Priority.length;n++)
  1922.                 {
  1923.                     if (Trollz.includes(Number(Priority[n])))
  1924.                     {
  1925.                         console.log("ET: "+Priority[n]);
  1926.                         sessionStorage.eventTroll=Number(Priority[n]);
  1927.                         found=true;
  1928.                         break;
  1929.                     }
  1930.                 }
  1931.                 if (!found)
  1932.                 {
  1933.                     delete sessionStorage.eventTroll;
  1934.                     //sessionStorage.eventTroll=Trollz.sort((a,b)=>{return a-b;})[0];
  1935.                 }
  1936.             }
  1937.             else
  1938.             {
  1939.                 sessionStorage.eventTroll=Trollz.sort((a,b)=>{return a-b;})[0];
  1940.             }
  1941.         }
  1942.         else
  1943.         {
  1944.             delete sessionStorage.eventTroll;
  1945.         }
  1946.         //console.log('WTF?');
  1947.         if (Storage().buyCombat=="true" && Storage().plusEvent=="true")
  1948.         {
  1949.             //console.log('WTF!');
  1950.             var diff=Math.ceil(Timers["eventGoing"]/1000)-Math.ceil(new Date().getTime()/1000);
  1951.             //console.log(diff);
  1952.             var hero=getHero();
  1953.             if (diff<Storage().buyCombTimer*3600 && sessionStorage.eventTroll && hero.infos.energy_fight==0)//Less than 20 hours remains and we still haven't get all troll girls
  1954.             {
  1955.                 var price=hero.get_recharge_cost("fight");
  1956.                 //console.log('PRC: '+price);
  1957.                 if (hero.infos.hard_currency>=price+Number(Storage().kobanBank))
  1958.                 {
  1959.                     console.log('Buying comb');
  1960.                     RechargeCombat(price);
  1961.                 }
  1962.             }
  1963.         }
  1964.         return true;
  1965.     }
  1966.     console.log('no  event');
  1967.     return false;
  1968. }
  1969.  
  1970. var RechargeCombat=function(price) {
  1971.     hh_ajax(
  1972.         {
  1973.             class: "Hero",
  1974.             action: "recharge",
  1975.             type: "fight"
  1976.         }, function(data) {
  1977.                 Hero.update("energy_fight", Hero.infos["energy_fight_max"]);
  1978.                 Hero.update("hard_currency", 0 - price, true);
  1979.             });
  1980.  
  1981. }
  1982.  
  1983. /*var autoBuy=function()
  1984. {
  1985.     return true ;
  1986. }*/
  1987.  
  1988. var getBurst=function()
  1989. {
  1990.     if (document.getElementById('sMenu'))
  1991.     {
  1992.         if (document.getElementById('sMenu').parentElement.style.display=='block')
  1993.         {
  1994.             return false;
  1995.         }
  1996.     }
  1997.     return Storage().master==="true"&&(!(Storage().paranoia==="true") || sessionStorage.burst==="true");
  1998. }
  1999.  
  2000. var Trollz=["Latest","Dark Lord","Ninja Spy","Gruntt","Edwarda","Donatien","Silvanus","Bremen","Finalmecia","Roko Senseï","Karole","Jackson\'s Crew","Pandora witch","Nike"];
  2001. var Timers={};
  2002.  
  2003. var start = function () {
  2004.  
  2005.     if (unsafeWindow.Hero===undefined)
  2006.     {
  2007.         console.log('???no Hero???');
  2008.         $('.hh_logo').click();
  2009.         return;
  2010.     }
  2011.     $('.redirect.gayharem').hide();
  2012.  
  2013.     $('#starter_offer').hide();
  2014.     $('#starter_offer_background').hide();
  2015.     if (sessionStorage.Timers)
  2016.     {
  2017.         Timers=JSON.parse(sessionStorage.Timers);
  2018.     }
  2019.     // Add UI buttons.
  2020.     var UIcontainer = $("#contains_all nav div[rel='content']");
  2021.     UIcontainer.html( '<div style="font-size:x-small;position: absolute;right: 22%;width: inherit;text-align: center;display:flex;flex-direction:column;z-index:1000" id="sMenu">'
  2022.                      + '<div style="display:flex;flex-direction:row;">'
  2023.                      +  '<div style="padding:10px; display:flex;flex-direction:column;">'
  2024.                      +   '<span>Master switch</span><div><label class=\"switch\" title=\"Turn off to pause script\"><input id=\"master\" type=\"checkbox\"><span class=\"slider round\"></span></label></div>'
  2025.                      +   '<span>Questionable Shit</span><div><label class=\"switch\"><input id=\"spendKobans0\" type=\"checkbox\"><span class=\"slider round\"></span></label></div>'
  2026.                      +   '<span>Are you sure?</span><div><label class=\"switch\"><input id=\"spendKobans1\" type=\"checkbox\"><span class=\"slider round\"></span></label></div>'
  2027.                      +   '<span>You\'ve been warned</span><div><label class=\"switch\"><input id=\"spendKobans2\" type=\"checkbox\"><span class=\"slider round\"></span></label></div>'
  2028.                      +   '<span>Buy comb. in events</span><div><label class=\"switch\"><input id=\"buyCombat\" type=\"checkbox\"><span class=\"slider round\"></span></label><input id="kobanBank" type="text"></div>'
  2029.                      +   '<span>Hours to buy Comb</span><div><input id="buyCombTimer" style="width:80%" type="text"></div>'
  2030.                      +   '<span>Event Troll Order</span><div><input id="eventTrollOrder" style="width:80%" type="text"></div>'
  2031.                      +  '</div>'
  2032.                      +  '<div style="padding:10px; display:flex;flex-direction:column;">'
  2033.                      +   '<span>Settings per tab</span><div><label class=\"switch\"><input id=\"settPerTab\" type=\"checkbox\"><span class=\"slider round\"></span></label></div>'
  2034.                      +   '<div style="display:flex;flex-direction:row;">'
  2035.                      +    '<div style="padding:10px; display:flex;flex-direction:column;">'
  2036.                      +     '<span>AutoSal.</span><div><label class=\"switch\"><input id=\"autoSalaryCheckbox\" type=\"checkbox\"><span class=\"slider round\"></span></label></div>'
  2037.                      +    '</div>'
  2038.                      +    '<div style="padding:10px; display:flex;flex-direction:column;">'
  2039.                      +     '<span>min wait</span><div><input id="autoSalaryTextbox" style="width:80%" type="text"></div>'
  2040.                      +    '</div>'
  2041.                      +   '</div>'
  2042.                      +   '<span>AutoContest</span><div><label class=\"switch\"><input id=\"autoContestCheckbox\" type=\"checkbox\"><span class=\"slider round\"></span></label></div>'
  2043.                      +   '<span>AutoPoPower</span><div><label class=\"switch\"><input id=\"autoPoPowerCheckbox\" type=\"checkbox\"><span class=\"slider round\"></span></label></div>'
  2044.                      +   '<div style="display:flex;flex-direction:row;">'
  2045.                      +    '<div style="padding:10px; display:flex;flex-direction:column;">'
  2046.                      +     '<span>AutoMission</span><div><label class=\"switch\"><input id=\"autoMissionCheckbox\" type=\"checkbox\"><span class=\"slider round\"></span></label></div>'
  2047.                      +    '</div>'
  2048.                      +    '<div style="padding:10px; display:flex;flex-direction:column;">'
  2049.                      +     '<span>Collect</span><div><label class=\"switch\"><input id=\"autoMissionCollect\" type=\"checkbox\"><span class=\"slider round\"></span></label></div>'
  2050.                      +    '</div>'
  2051.                      +   '</div>'
  2052.                      +   '<span>AutoQuest</span><div><label class=\"switch\"><input id=\"autoQuestCheckbox\" type=\"checkbox\"><span class=\"slider round\"></span></label></div>'
  2053.                      +   '<div style="display:flex;flex-direction:row;">'
  2054.                      +    '<div style="padding:10px; display:flex;flex-direction:column;">'
  2055.                      +     '<span>AutoTrollBattle</span><div><label class=\"switch\"><input id=\"autoBattleCheckbox\" type=\"checkbox\"><span class=\"slider round\"></span></label><select id=\"autoTrollSelector\"></select></div>'
  2056.                      +    '</div>'
  2057.                      +    '<div style="padding:10px; display:flex;flex-direction:column;">'
  2058.                      +     '<span>+Event</span><div><label class=\"switch\"><input id=\"plusEvent\" type=\"checkbox\"><span class=\"slider round\"></span></label></div>'
  2059.                      +    '</div>'
  2060.                      +   '</div>'
  2061.                      +   '<span>AutoArenaBattle</span><div><label class=\"switch\"><input id=\"autoArenaCheckbox\" type=\"checkbox\"><span class=\"slider round\"></span></label></div>'
  2062.                      +   '<span>AutoPachinko(Free)</span><div><label class=\"switch\"><input id=\"autoFreePachinko\" type=\"checkbox\"><span class=\"slider round\"></span></label></div>'
  2063.                      +   '<span>Paranoia mode</span><div><label class=\"switch\"><input id=\"paranoia\" type=\"checkbox\"><span class=\"slider round\"></span></label></div>'
  2064.                      +  '</div>'
  2065.                      +  '<div style="padding:10px; display:flex;flex-direction:column;">'
  2066.                      +   '<span>AutoLeagues</span><div><label class=\"switch\"><input id=\"autoLeagues\" type=\"checkbox\"><span class=\"slider round\"></span></label></div>'
  2067.                      +   '<div style="display:flex;flex-direction:row;">'
  2068.                      +    '<div style="padding:10px; display:flex;flex-direction:column;">'
  2069.                      +     '<span>AutoChampions</span><div><label class=\"switch\"><input id=\"autoChamps\" type=\"checkbox\"><span class=\"slider round\"></span></label></div>'
  2070.                      +    '</div>'
  2071.                      +    '<div style="padding:10px; display:flex;flex-direction:column;">'
  2072.                      +     '<span>UseEne</span><div><label class=\"switch\"><input id=\"autoChampsUseEne\" type=\"checkbox\"><span class=\"slider round\"></span></label></div>'
  2073.                      +    '</div>'
  2074.                      +    '<div style="padding:10px; display:flex;flex-direction:column;">'
  2075.                      +     '<span>Filter</span><div><input id="autoChampsFilter" type="text"></div>'
  2076.                      +    '</div>'
  2077.                      +   '</div>'
  2078.                      +   '<span>AutoStats</span><div><input id="autoStats" type="text"></div>'
  2079.                      +   '<span>Buy Exp</span><div style="width:200px"><label class=\"switch\"><input id=\"autoExpW\" type=\"checkbox\"><span class=\"slider round\"></span></label><input id="autoExp" style="width:50%" type="text"><input id="maxExp" style="width:30%" type="text"></div>'
  2080.                      +   '<span>Buy Aff</span><div style="width:200px"><label class=\"switch\"><input id=\"autoAffW\" type=\"checkbox\"><span class=\"slider round\"></span></label><input id="autoAff" style="width:50%" type="text"><input id="maxAff" style="width:30%" type="text"></div>'
  2081.                      +   '<span>Buy Leg Gear Mono</span><div><label class=\"switch\"><input id=\"autoLGMW\" type=\"checkbox\"><span class=\"slider round\"></span></label><input id="autoLGM" type="text"></div>'
  2082.                      +   '<span>Buy Leg Gear Rainbow</span><div><label class=\"switch\"><input id=\"autoLGRW\" type=\"checkbox\"><span class=\"slider round\"></span></label><input id="autoLGR" type="text"></div>'
  2083.                      +   '<span>Buy Epi Gear Mono</span><div><label class=\"switch\"><input id=\"autoEGMW\" type=\"checkbox\"><span class=\"slider round\"></span></label><input id="autoEGM" type="text"></div>'
  2084.                      +   '<span>Show info</span><div><label class=\"switch\"><input id=\"showInfo\" type=\"checkbox\"><span class=\"slider round\"></span></label></div>'
  2085.                      +  '</div>'
  2086.                      + '</div>'
  2087.                      +'</div>'+UIcontainer.html());
  2088.  
  2089.     var div = document.createElement('div');
  2090.     div.innerHTML = '<div id="pInfo" style="padding-left:3px;z-index:-1;white-space: pre;position: absolute;right: 5%; left:70%; top:8%;border: 1px solid #ffa23e;background-color: rgba(0,0,0,.5);border-radius: 5px;"></div>'.trim();
  2091.     document.getElementById('contains_all').appendChild(div.firstChild);
  2092.  
  2093.     // Add auto troll options
  2094.     var trollOptions = document.getElementById("autoTrollSelector");
  2095.  
  2096.     for (var i=0;i<unsafeWindow.Hero.infos.questing.id_world;i++)
  2097.     {
  2098.         var option = document.createElement("option");
  2099.         option.value=i;
  2100.         option.text = Trollz[i];
  2101.         trollOptions.add(option);
  2102.     };
  2103.  
  2104.     document.getElementById("settPerTab").checked = localStorage.settPerTab === "true";
  2105.     trollOptions.selectedIndex = Storage().autoTrollSelectedIndex;
  2106.     document.getElementById("autoSalaryCheckbox").checked = Storage().autoSalary === "true";
  2107.     document.getElementById("autoSalaryTextbox").value = Storage().autoSalaryTimer?Storage().autoSalaryTimer:"120";
  2108.     document.getElementById("autoContestCheckbox").checked = Storage().autoContest === "true";
  2109.     document.getElementById("autoPoPowerCheckbox").checked = Storage().autoPoPower === "true";
  2110.     document.getElementById("autoMissionCheckbox").checked = Storage().autoMission === "true";
  2111.     document.getElementById("autoMissionCollect").checked = Storage().autoMissionC === "true";
  2112.     document.getElementById("autoQuestCheckbox").checked = Storage().autoQuest === "true";
  2113.     document.getElementById("autoBattleCheckbox").checked = Storage().autoTrollBattle === "true";
  2114.     document.getElementById("eventTrollOrder").value = Storage().eventTrollOrder?Storage().eventTrollOrder:"1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20";
  2115.     document.getElementById("buyCombTimer").value = Storage().buyCombTimer?Storage().buyCombTimer:"16";
  2116.     document.getElementById("autoArenaCheckbox").checked = Storage().autoArenaBattle === "true";
  2117.     document.getElementById("autoFreePachinko").checked = Storage().autoFreePachinko === "true";
  2118.     document.getElementById("autoLeagues").checked = Storage().autoLeagues === "true";
  2119.     document.getElementById("autoStats").value = Storage().autoStats?Storage().autoStats:"500000000";
  2120.     document.getElementById("paranoia").checked = Storage().paranoia==="true";
  2121.     document.getElementById("autoExp").value = Storage().autoExp?Storage().autoExp:"500000000";
  2122.     document.getElementById("autoExpW").checked = Storage().autoExpW === "true";
  2123.     document.getElementById("autoAff").value = Storage().autoAff?Storage().autoAff:"500000000";
  2124.     document.getElementById("autoAffW").checked = Storage().autoAffW === "true";
  2125.     document.getElementById("maxExp").value = Storage().MaxExp?Storage().MaxExp:"999999999999999";
  2126.     document.getElementById("maxAff").value = Storage().MaxAff?Storage().MaxAff:"999999999999999";
  2127.     document.getElementById("autoLGM").value = Storage().autoLGM?Storage().autoLGM:"500000000";
  2128.     document.getElementById("autoLGMW").checked = Storage().autoLGMW === "true";
  2129.     document.getElementById("autoLGR").value = Storage().autoLGR?Storage().autoLGR:"500000000";
  2130.     document.getElementById("autoLGRW").checked = Storage().autoLGRW === "true";
  2131.     document.getElementById("autoEGM").value = Storage().autoEGM?Storage().autoEGM:"500000000";
  2132.     document.getElementById("autoEGMW").checked = Storage().autoEGMW === "true";
  2133.     document.getElementById("showInfo").checked = Storage().showInfo === "true";
  2134.     document.getElementById("plusEvent").checked = Storage().trollToFight=="-1" || Storage().plusEvent === "true";
  2135.  
  2136.     document.getElementById("autoChamps").checked = Storage().autoChamps === "true";
  2137.     document.getElementById("autoChampsUseEne").checked = Storage().autoChampsUseEne === "true";
  2138.     document.getElementById("autoChampsFilter").value = Storage().autoChampsFilter?Storage().autoChampsFilter:"1;2;3;4;5;6";
  2139.  
  2140.     document.getElementById("spendKobans0").checked = Storage().spendKobans0 === "true";
  2141.     document.getElementById("spendKobans1").checked = Storage().spendKobans1 === "true";
  2142.     document.getElementById("spendKobans2").checked = Storage().spendKobans2 === "true";
  2143.     document.getElementById("buyCombat").checked = Storage().buyCombat === "true";
  2144.     document.getElementById("kobanBank").value = Storage().kobanBank?Storage().kobanBank:"1000000";
  2145.  
  2146.     document.getElementById("master").checked = Storage().master!=="false";
  2147.  
  2148.     sessionStorage.autoLoop = "true";
  2149.     if (typeof Storage().freshStart == "undefined" || isNaN(Number(Storage().autoLoopTimeMili))) {
  2150.         setDefaults();
  2151.     }
  2152.  
  2153.     if(getPage()=="shop")
  2154.     {
  2155.         updateShop();
  2156.     }
  2157.  
  2158.     if (/*autoBuy() &&*/ getBurst())
  2159.     {
  2160.         doShopping();
  2161.     /*}
  2162.     if (Storage().autoStats === "true" && getBurst())
  2163.     {*/
  2164.         doStatUpgrades();
  2165.     }
  2166.  
  2167.     if (!CollectEventData())
  2168.     {
  2169.         setTimeout(function(){CollectEventData();},5000);
  2170.     }
  2171.  
  2172.  
  2173.     if (hh_nutaku)
  2174.     {
  2175.         function Alive()
  2176.         {
  2177.             window.top.postMessage({ImAlive:true},'*');
  2178.             if (sessionStorage.autoLoop=="true")
  2179.             {
  2180.                 setTimeout(Alive,2000);
  2181.             }
  2182.         }
  2183.         Alive();
  2184.     }
  2185.  
  2186.     autoLoop();
  2187. };
  2188.  
  2189. var started=false;
  2190. var hardened_start=function()
  2191. {
  2192.     if (!started)
  2193.     {
  2194.         started=true;
  2195.         start();
  2196.     }
  2197. }
  2198.  
  2199. $("document").ready(function()
  2200. {
  2201.     setTimeout(hardened_start,1000);
  2202.  
  2203. });
  2204.  
  2205. setTimeout(hardened_start,5000);
Add Comment
Please, Sign In to add comment