Sleazy Fork is available in English.

HaremHeroes Automatic

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

Verzia zo dňa 14.07.2017. Pozri najnovšiu verziu.

// ==UserScript==
// @name         HaremHeroes Automatic
// @namespace    JDscripts
// @version      0.7
// @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);