WoD 拉取装备要求

Display minimum equipment requirements!

// ==UserScript==
// @name         WoD 拉取装备要求
// @namespace    https://www.wannaexpresso.com/
// @description  Display minimum equipment requirements!
// @author       DotIN13
// @modifier     Christophero
// @version      2023.04.23.1
// @include      http*://*.world-of-dungeons.org/wod/spiel/hero/items.php*
// @include      https://*.wannaexpresso.com/wod/spiel/hero/items.php*
// @grant        none
// ==/UserScript==

// todo:
// add error notification

(function () {
  "use strict";

  if (!$('h1:contains("装备着的物品")').length) return;
  var reqList = [];
  var hasTooltip = [];
  var xhr = [];
  var progress = 1;
  var equipSel;

  // Sort Equipment Requirements //////////////////////////////////////////////

  function sortReq() {
    var sortList = [
      { item: [], req: "力量至少为0" },
      { item: [], req: "体质至少为0" },
      { item: [], req: "智力至少为0" },
      { item: [], req: "灵巧至少为0" },
      { item: [], req: "魅力至少为0" },
      { item: [], req: "敏捷至少为0" },
      { item: [], req: "感知至少为0" },
      { item: [], req: "意志至少为0" },
    ];
    for (var i = 0; i < equipSel.length; i++) {
      if (reqList[i] != "") {
        for (var j = 0; j < reqList[i].length; j++) {
          var isMatch = false;
          for (var k = 0; k < sortList.length; k++) {
            if (
              reqList[i][j].replace(/\d*/g, "") ==
              sortList[k].req.replace(/\d*/g, "")
            ) {
              //console.log(reqList[i][j] + "match" + sortList[k].req);
              var requestVal = parseInt(
                reqList[i][j]
                  .replace(/(<([^>]+)>)/gi, "")
                  .match(/[^0-9]*(\d*)/)[1]
              );
              var sortVal = parseInt(
                sortList[k].req
                  .replace(/(<([^>]+)>)/gi, "")
                  .match(/[^0-9]*(\d*)/)[1]
              );
              if (requestVal > sortVal) {
                sortList[k].req = reqList[i][j];
                sortList[k].item = [
                  equipSel[i].options[equipSel[i].selectedIndex].innerText,
                ];
              } else if (requestVal == sortVal) {
                sortList[k].item.push(
                  equipSel[i].options[equipSel[i].selectedIndex].innerText
                );
              }
              isMatch = true;
            }
          }
          if (!isMatch)
            sortList.push({
              item: [equipSel[i].options[equipSel[i].selectedIndex].innerText],
              req: reqList[i][j],
            });
        }
      }
    }
    //console.log("done");
    var outputHTML = "<tr class = 'header'><th>装备</th><th>要求</th></tr>";
    for (var m = 0; m < sortList.length; m++) {
      if (m % 2) {
        outputHTML +=
          "<tr class = 'row1'><td>" +
          sortList[m].item.join("<br>") +
          "</td><td>" +
          sortList[m].req +
          "</td></tr>\n";
      } else {
        outputHTML +=
          "<tr class = 'row0'><td>" +
          sortList[m].item.join("<br>") +
          "</td><td>" +
          sortList[m].req +
          "</td></tr>\n";
      }
    }
    outputTable.innerHTML = outputHTML;
  }

  // XMLrequest /////////////////////////////////////////////////////////////

  window.XMLrequest = function (URL, i, length) {
    xhr[i] = new XMLHttpRequest();
    xhr[i].onreadystatechange = function () {
      if (this.readyState == 4 && this.status == 200) {
        outputDiv.innerHTML = "正在加载第" + progress + "件物品";
        var reqTitle = $(
          "#details>table>tbody>tr>td:contains('装备要求')",
          this.responseXML
        )[0];
        if (reqTitle != undefined) {
          var req = reqTitle.parentElement.lastElementChild.innerHTML.trim();
          //console.log(req);
          if (!hasTooltip[i]) {
            wodToolTip(equipSel[i].parentElement, req);
            hasTooltip[i] = true;
          } else {
            wodToolTipContent[equipSel[i].parentElement.id] = req;
          }
          reqList[i] = req.replace("<i>无任何需求</i>", "").split("<br>");
        } else {
          reqList[i] = [""];
        }
        progress++;
        if (progress == length + 1) {
          outputDiv.innerHTML = "加载完成";
          progress = 1;
          //console.log(reqList);
          sortReq();
        }
      }
    };
    xhr[i].open("GET", URL);
    xhr[i].responseType = "document";
    xhr[i].send();
  };

  // Add WoD Tip to Equipments //////////////////////////////////////////////

  window.equipmentTip = function () {
    equipSel = document.querySelectorAll("form table select");
    if (equipSel[0] != undefined) {
      var id, req, i;
      for (i = 0; i < equipSel.length; i++) {
        id =
          equipSel[i].options[equipSel[i].selectedIndex].value == "0"
            ? -equipSel[i].firstElementChild.value
            : equipSel[i].options[equipSel[i].selectedIndex].value;
        var URL = "/wod/spiel/hero/item.php?item_instance_id=" + id;
        equipSel[i].setAttribute(
          "onchange",
          "document.getElementById('outputDiv').innerHTML = '正在加载第1件物品'; var id = this.value == '0' ? -this.firstElementChild.value : this.value; XMLrequest('/wod/spiel/hero/item.php?item_instance_id=' + id, " +
            i +
            ", 1);"
        );
        XMLrequest(URL, i, equipSel.length);
      }
    } else {
      alert("请先清包!");
    }
  };

  // Frontend ////////////////////////////////////////////////////////////

  //let calcButton = document.createElement("input");
  //calcButton.id = "reqCalcButton";
  //calcButton.type = "button";
  //calcButton.setAttribute("class","button clickable");
  //calcButton.value = "计算最低装备要求";

  let tipButton = document.createElement("input");
  tipButton.id = "reqTipButton";
  tipButton.type = "button";
  tipButton.setAttribute("class", "button clickable");
  tipButton.value = "拉取装备要求";
  tipButton.setAttribute("onclick", "equipmentTip();");

  let outputDiv = document.createElement("div");
  outputDiv.id = "outputDiv";

  let outputTable = document.createElement("table");
  outputTable.id = "outputTable";
  outputTable.setAttribute("class", "content_table");

  var equipTable = document.querySelector("form table");
  //equipTable.parentNode.insertBefore(calcButton, equipTable.nextElementSibling);
  equipTable.parentNode.insertBefore(
    outputTable,
    equipTable.nextElementSibling
  );
  equipTable.parentNode.insertBefore(outputDiv, equipTable.nextElementSibling);
  equipTable.parentNode.insertBefore(tipButton, equipTable.nextElementSibling);
  var pageBody = document.querySelector("#gadgettable-center-gadgets");
})();