Sleazy Fork is available in English.

HaremHeroes Automatic

Open the menu in HaremHeroes(topleft) to toggle AutoControlls. Messages are printed in local console.

Verze ze dne 13. 07. 2017. Zobrazit nejnovější verzi.

// ==UserScript==
// @name         HaremHeroes Automatic
// @namespace    JDscripts
// @version      0.6
// @description  Open the menu in HaremHeroes(topleft) to toggle AutoControlls. Messages are printed in local console.
// @author       JD
// @match        http*://nutaku.haremheroes.com/*
// @require      https://cdn.jsdelivr.net/js-cookie/2.2.0/js.cookie.js
// @grant        GM_addStyle
// ==/UserScript==

GM_addStyle('/* The switch - the box around the slider */ .switch { position: relative; display: inline-block; width: 60px; height: 34px; } /* Hide default HTML checkbox */ .switch input {display:none;} /* The slider */ .slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; -webkit-transition: .4s; transition: .4s; } .slider:before { position: absolute; content: ""; height: 26px; width: 26px; left: 4px; bottom: 4px; background-color: white; -webkit-transition: .4s; transition: .4s; } input:checked + .slider { background-color: #2196F3; } input:focus + .slider { box-shadow: 0 0 1px #2196F3; } input:checked + .slider:before { -webkit-transform: translateX(26px); -ms-transform: translateX(26px); transform: translateX(26px); } /* Rounded sliders */ .slider.round { border-radius: 34px; } .slider.round:before { border-radius: 50%; }');

var proceedQuest = function()
{
    console.log("Starting auto quest.");
    var currentQuestMunuOption = $("nav div[rel='content'] a:has(.continue_quest)");
    if(typeof currentQuestMunuOption == "undefined"){console.log("Could not find current quest menu button for verification. Probably it hasn't yet loaded.");return;}
    // Check if at correct page.
    if(currentQuestMunuOption.attr("href") !== window.location.pathname)
    {
        // Click on current quest to naviagte to it.
        console.log("Navigating to current quest.");
        sessionStorage.autoLoop = "false";
        window.location = window.location.origin+$("nav div[rel='content'] a:has(.continue_quest)").attr("href");
        return;
    }

    // Get the proceed button type
    var proceedButtonMatch = $("#controls button:not([style='display: none;'])");
    var proceedCostEnergy = Number($("#controls .cost span[cur='*']").text());
    var proceedCostMoney = Number($("#controls .cost span[cur='$']").text());
    var proceedType = proceedButtonMatch.attr("act");

    if(proceedButtonMatch.length === 0)console.log("Could not find resume button.");
    else if(proceedType === "free")
    {
        console.log("Proceeding for free.");
        proceedButtonMatch.click();
    }
    else if(proceedType === "use_item")
    {
        console.log("Proceeding by using X"+Number($("#controls .item span").text())+" of the required item.");
        proceedButtonMatch.click();
    }
    else if(proceedType === "battle")
    {
        console.log("Proceeding to battle troll... W.I.P(Call auto-battle function here.)");
        sessionStorage.battleRequiredForQuest = "true";
        sessionStorage.questRequirement = "battle";  // Need at least 2 energy for quest battles.
        sessionStorage.autoLoop = "false";
        // Proceed to battle troll.
        proceedButtonMatch.click();
    }
    else if(proceedType === "end_archive")
    {
        console.log("Reached end of current archive. Proceeding to next archive.");
        sessionStorage.autoLoop = "false";
        proceedButtonMatch.click();
    }
    else {
        console.log("Could not identify given resume button.");
        sessionStorage.questRequirement = "unknownQuestButton";
    }
};

var getSalary = function(){
    try{
        if($("#breadcrumbs span").last().text() === "Harem"){
            console.log("Detected Harem Screen. Fetching Salary");
            $("#harem_whole #harem_left .salary:not('.loads') button").each(function(index){$(this).click();});
            document.cookie = "nextSalaryTime=;";
        }
        else
        {
            // Not at Harem screen then goto the Harem screen.
            console.log("Navigating to Harem window.");
            sessionStorage.autoLoop = "false";
            window.location = window.location.origin+$("nav div[rel='content'] a:has(.harem)").attr("href");
            return;
        }
    }
    catch(ex)
    {
        console.log("Could not collect salary... "+ex);
    }
};

var doBattle = function()
{
    console.log("Performing auto battle.");
    // Confirm if on correct screen.
    if($("#breadcrumbs span").last().text() === "Battle")
    {
        // On battle page.
        if($("#arena[class='canvas']").length === 1)
        {
            // Oponent choose screen
        }
        else if($("#battle[class='canvas']").length === 1)
        {
            // Battle screen
        }
        else
        {
            console.log("Could not identify battle screen.");
            if(sessionStorage.questRequirement === "battle")sessionStorage.questRequirement = "errorInAutoBattle";
            return;
        }
        if(sessionStorage.questRequirement === "battle")
        {
            // Battle Done.
            sessionStorage.questRequirement = "none";
        }
    }
};

var updateData = function()
{
    //console.log("updating UI");
    sessionStorage.autoSalary = document.getElementById("autoSalaryCheckbox").checked;
    sessionStorage.autoQuest = document.getElementById("autoQuestCheckbox").checked;
};

var autoLoop = function()
{
    updateData();
    //console.log("sal="+sessionStorage.autoSalary);
    if(sessionStorage.autoSalary === "true")
    {
        if(Cookies.get("nextSalaryTime") === undefined)
        {
            console.log("Time to fetch salary.");
            getSalary();
        }
        else if(Cookies.get("nextSalaryTime") === "")
        {
            console.log("Salary fetched. Getting next fetch time");
            if($("nav div[rel='content'] a:has(.home)").attr("href") !== window.location.pathname)
            {
                console.log("Moving to home.");
                sessionStorage.autoLoop = "false";
                // Goto Home page.
                window.location = window.location.origin+$("nav div[rel='content'] a:has(.home)").attr("href");
                return;
            }
            var closestTime = $("#collect_all_bar .in monospace m").first();
            closestTime = (Number(closestTime.text()+closestTime.next().text())*60 + Number(closestTime.next().next().text() + closestTime.next().next().next().text()));
            document.cookie = "nextSalaryTime=present;max-age="+(closestTime<0?0:closestTime);
            console.log("New fetch time stored in nextSalaryTime cookie.(+"+closestTime+" sec.)");
        }
    }
    if(sessionStorage.autoQuest === "true")
    {
        if(sessionStorage.questRequirement === "battle")
        {
            console.log("Quest requires battle.");
            doBattle();
        }
        else if(sessionStorage.questRequirement !== "none") {
            if(sessionStorage.questRequirement[0] === '$'){
                if(Number(sessionStorage.questRequirement.substr(1))<Number($("div[hero='soft_currency'] span").text().trim().replace(',','')))
                {
                    // We have enough money... requirement fulfilled.
                    console.log("Continuing quest, required money obtained.");
                    sessionStorage.questRequirement = "none";
                    proceedQuest();
                }
                else{
                    // Else we need more money.
                    console.log("Need money for quest, cannot continue. Fetching salary for money.");
                    getSalary();
                }
            }
            else if(sessionStorage.questRequirement[0] === '*'){
                var energyNeeded = Number(sessionStorage.questRequirement.substr(1));
                var energyCurrent = Number($("span[hero='energy_quest']").text());
                if(energyNeeded<=energyCurrent)
                {
                    // We have enough energy... requirement fulfilled.
                    console.log("Continuing quest, required energy obtained.");
                    sessionStorage.questRequirement = "none";
                    proceedQuest();
                }
                // Else we need energy, just wait.
                else
                {
                    console.log("Replenishing energy for quest.("+energyNeeded+" needed)");
                }
            }
            else if(sessionStorage.questRequirement === "unknownQuestButton")
            {
                console.log("AutoQuest disabled.AutoQuest cannot be performed due to unknown quest button. Please manually proceed the current quest screen.");
                document.getElementById("autoQuestCheckbox").checked = false;
                sessionStorage.autoQuest = "false";
                sessionStorage.questRequirement = "none";
            }
            else if(sessionStorage.questRequirement === "errorInAutoBattle")
            {
                console.log("AutoQuest disabled.AutoQuest cannot be performed due errors in AutoBattle. Please manually proceed the current quest screen.");
                document.getElementById("autoQuestCheckbox").checked = false;
                sessionStorage.autoQuest = "false";
                sessionStorage.questRequirement = "none";
            }
        }
        else proceedQuest();
    }
    if(sessionStorage.autoLoop === "true")setTimeout(autoLoop, Number(sessionStorage.autoLoopTimeMili));
    else console.log("autoLoop Disabled");
};

var setDefaults = function()
{
    sessionStorage.autoSalary = "false";
    sessionStorage.autoLoop = "true";
    sessionStorage.autoLoopTimeMili = "200";
    sessionStorage.autoQuest = "false";
    sessionStorage.questRequirement = "";
    sessionStorage.questRequirement = "none";
    sessionStorage.freshStart = "no";
};

var start = function()
{
    //console.log("script started");
    // Add UI buttons.
    $("#contains_all nav div[rel='content'] .extender").html('<center><table><td>AutoSal.</td><td>AutoQuest</td><tr><td><label class=\"switch\"><input id=\"autoSalaryCheckbox\" type=\"checkbox\"><span class=\"slider round\"></span></label></td><td><label class=\"switch\"><input id=\"autoQuestCheckbox\" type=\"checkbox\"><span class=\"slider round\"></span></label></td></tr></table></center>');
    document.getElementById("autoSalaryCheckbox").checked = sessionStorage.autoSalary === "true";
    document.getElementById("autoQuestCheckbox").checked = sessionStorage.autoQuest === "true";
    if(typeof sessionStorage.freshStart == "undefined" || isNaN(Number(sessionStorage.autoLoopTimeMili)) || sessionStorage.autoLoop == "false"){
        setDefaults();
    }
    autoLoop();
};
$("document").ready(start);