Greasy Fork 支持简体中文。

WoD Hero Roster

One click hero switching.

// ==UserScript==
// @name         WoD Hero Roster
// @namespace    https://www.wannaexpresso.com
// @version      0.1
// @description  One click hero switching.
// @author       DotIN13
// @include      http*://*.wannaexpresso.*/*
// @include      http*://*.world-of-dungeons.*/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // Build select from array of heroes
    function buildSelect(heroes) {
        var select = document.createElement("select");
        heroes.forEach(h => {
            select.innerHTML += "<option value='" + h.link + "' data-name='" + h.name + "'>" + h.name + "</option>";
        })
        return select;
    }

    function buildLinkArray(heroes) {
        var searchArgs = window.location.search.match(/[^\?&]*=[^\?&]*/g).filter(i => !i.match(/goto|session_hero_id/));
        var newSearch = "?" + searchArgs.join("&");
        var currentURL = window.location.pathname + newSearch;
        heroes.forEach((h, i) => {
            var reference = (i == heroes.length - 1 ? 0 : i + 1);
            h.link = currentURL + "&goto=prevactivehero&session_hero_id=" + heroes[reference].id;
        })
        return heroes;
    }

    /* Remove hero links
    document.getElementsByClassName("prevHeroLink")[0].remove();
    document.getElementsByClassName("nextHeroLink")[0].remove();*/

    var heroesBanner = document.getElementsByClassName("hero_short")[0];

    if (heroesBanner) {
        var heroesLink = heroesBanner.getElementsByClassName("changeHeroLink")[0];

        // Get hero list with XML request
        var XmlHttp = new XMLHttpRequest();
        XmlHttp.onreadystatechange = function() {
            if (XmlHttp.readyState == 4 && XmlHttp.status == 200) {
                var activeHeroes = [];
                var response = XmlHttp.responseText;
                var parser = new DOMParser();
                var xmlDoc = parser.parseFromString(response,"text/html");
                var activeHeroesLink = xmlDoc.querySelectorAll(".content_table .hero_active");
                //console.log(activeHeroesLink);
                for (const el of activeHeroesLink) {
                    activeHeroes.push({name: el.innerText, id: el.closest(".content_table").firstElementChild.value});
                };
                //console.log(activeHeroes);

                // Add hero select
                var select = buildSelect(buildLinkArray(activeHeroes))
                heroesLink.parentNode.prepend(select);

                // Preselect current hero
                select.querySelector("option[data-name=" + heroesLink.innerHTML + "]").selected = true;

                // Open link on select change
                select.addEventListener("change", function(e) {
                    window.open(e.target.value, "_self");
                })
            };
        };
        XmlHttp.open("GET", heroesLink.href, true);
        XmlHttp.send();
    }
})();