Greasy Fork is available in English.

hwmResoursesAsImages

Ресурсы и части в картинках

// ==UserScript==
// @name           hwmResoursesAsImages
// @namespace      hwmResoursesAsImages
// @description    Ресурсы и части в картинках
// @author         raTaHoa; Чеширский КотЪ; code: Dinozon2, ElMarado; style: sw.East
// @version        4.1
// @include        https://www.heroeswm.ru/pl_info.php*
// @include        https://www.lordswm.com/pl_info.php*
// @include        http://178.248.235.15/pl_info.php*
// @license MIT
// ==/UserScript==

addStyle (`
.resourceSlot{
   overflow: hidden;
   float: left;
   width: 48px;
   height: 48px;
   margin: 4px 4px 4px 0;
   padding: 0;
   border: 4px solid #fff;
   box-shadow: 0px 0px 5px #aaa;
   z-index: 1;
}
.resourceSlot img {
   display: block;
   width: 42px;
   height: 42px;
   margin: 3px 0 0 3px;
   padding: 0;
}
.resourceSlot a img {
   -webkit-transition: all 0.2s linear;
      -moz-transition: all 0.2s linear;
       -ms-transition: all 0.2s linear;
        -o-transition: all 0.2s linear;
           transition: all 0.2s linear;
}
.resourceSlot:hover a img {
   -webkit-transform: scale(1.20,1.20);
      -moz-transform: scale(1.20,1.20);
       -ms-transform: scale(1.20,1.20);
        -o-transform: scale(1.10,1.20);
           transform: scale(1.20,1.20);
   opacity:1;
}
.resourceSlot a{
   text-decoration: none;
}
.amountSlot {
   position: absolute;
   min-width: 14px;
   height: 13px;
   margin: -48px 0 0 -3px;
   padding: 0 1px 1px;
   color: #fff;
   border: 2px solid #fff;
   background: #222;
   -webkit-box-shadow: 1px 1px 1px #aaa;
      -moz-box-shadow: 1px 1px 1px #aaa;
           box-shadow: 1px 1px 1px #aaa;
   z-index: 15;
   font-size: 10px;
   text-align: center;
   text-decoration: none !important;
   text-shadow: 1px 1px 1px rgba(0,0,0, 0.8);
   cursor: pointer;
   opacity: .7;
   -webkit-transition: opacity 0.4s ease-in-out, visibility 0.4s ease-in-out;
      -moz-transition: opacity 0.4s ease-in-out, visibility 0.4s ease-in-out;
       -ms-transition: opacity 0.4s ease-in-out, visibility 0.4s ease-in-out;
        -o-transition: opacity 0.4s ease-in-out, visibility 0.4s ease-in-out;
           transition: opacity 0.4s ease-in-out, visibility 0.4s ease-in-out;
}` );
const ElementsArray = {
    "Сапоги страха": "part_fear_boots",
    "Роба страха": "part_fear_bonearmour",
    "Коса страха": "part_fear_scythe",
    "Плащ страха": "part_fear_cloack",
    "Амулет страха": "part_fear_amulk",
    "Щит страха": "part_fear_shield",
    "Магма меч": "part_magma_swrd",
    "Магма шлем": "part_magma_helm",
    "Магма кулон": "part_magma_pend",
    "Магма кольцо": "part_magma_rd",
    "Магма доспех": "part_magma_armor",
    "Магма плащ": "part_magma_clc",
    "Магма арбалет": "part_magma_arb",
    "Магма сапоги": "part_magma_boots",
    "Магма щит": "part_magma_lshield",
    "Магма кинжал": "part_magma_dagger",
    "Небесный посох": "part_heaven_staff",
    "Небесная диадема": "part_heaven_helm",
    "Небесные сандалии": "part_heaven_bts",
    "Небесный доспех": "part_heaven_armr",
    "Небесная мантия": "part_heaven_clk",
    "Небесный лук": "part_heaven_bow",
    "Небесный щит": "part_heaven_shield",
    "Небесный амулет": "part_heaven_amlt",
    "Небесное кольцо": "part_heaven_rn",
    "Небесный кинжал": "part_heaven_dagger",
        // *** Артефакты тьмы
    'Амулет тьмы':          'part_dark_amul',
    'Доспех тьмы':          'part_dark_armor',
    'Меч тьмы':             'part_dark_sword',
    'Сапоги тьмы':          'part_dark_boots',
    'Топор тьмы':           'part_dark_axe',
    'Шлем тьмы':            'part_dark_helmet',
    'Щит тьмы':             'part_dark_shield',
    'Плащ тьмы':            'part_dark_cloak',
    'Кинжал тьмы':          'part_dark_dagger',
    'Кольцо тьмы':          'part_dark_ring',
    'Лук тьмы':             'part_dark_bow',
        // *** Имперские артефакты
    'Имперский амулет':     'part_imp_amul',
    'Имперский арбалет':    'part_imp_crossbow',
    'Имперский доспех':     'part_imp_armor',
    'Имперский кинжал':     'part_imp_dagger',
    'Имперское кольцо':     'part_imp_ring',
    'Имперский меч':        'part_imp_sword',
    'Имперский плащ':       'part_imp_cloak',
    'Имперские сапоги':     'part_imp_boots',
    'Имперский шлем':       'part_imp_helmet',
    'Имперский щит':        'part_imp_shield',
        // *** Части Гильдии Лидеров
    'Части редкого отряда':       'https://dcdn.heroeswm.ru/i/rewards/gn/task3.png',
    'Частей редкого отряда':      'https://dcdn.heroeswm.ru/i/rewards/gn/task3.png',
    'Части очень редкого отряда': 'https://dcdn.heroeswm.ru/i/rewards/gn/task4.png',
    'Частей очень редкого отряда':'https://dcdn.heroeswm.ru/i/rewards/gn/task4.png',
    'Части таинственного свитка': 'https://i.imgur.com/38VoKxQ.png',
        // *** Элементы Гильдии Наёмников
    'Абразив':              'abrasive',
    'Змеиный яд':           'snake_poison',
    'Клык тигра':           'tiger_tusk',
    'Ледяной кристалл':     'ice_crystal',
    'Лунный камень':        'moon_stone',
    'Огненный кристалл':    'fire_crystal',
    'Осколок метеорита':    'meteorit',
    'Цветок ведьм':         'witch_flower',
    'Цветок ветров':        'wind_flower',
    'Цветок папоротника':   'fern_flower',
    'Ядовитый гриб':        'badgrib',
        // *** Элементы с предприятий
    'Кожа':                 'https://i.imgur.com/Xn82L25.png',
    'Сталь':                'https://i.imgur.com/hwThTJE.png',
    'Никель':               'https://i.imgur.com/6lHniay.png',
    'Волшебный порошок':    'https://i.imgur.com/IuqF7rI.png',
    'Мифриловая руда':      'https://i.imgur.com/dv6rzKn.png',
    'Обсидиан':             'https://i.imgur.com/4yOWbK8.png',
    'Мифрил':               'https://i.imgur.com/1Y1Z7Mq.png',
    'Орихалк':              'https://i.imgur.com/qRGZzCs.png'
};

main();
function main() {
    const resourcesPanel = getResourcesPanel();
    if(!resourcesPanel) {
        return;
    }
    const parsedResourcesInfo = getParsedResourcesInfo(resourcesPanel);
    for(const resource of parsedResourcesInfo) {
        if(resource.Amount > 0) {
            let resourceCode = ElementsArray[resource.Name];
            if(!resourceCode) {
                continue;
            }
            const toolTip = `${resource.Name}: ${resource.Amount}`;
            let html;
            if(resourceCode.startsWith("https")) {
                html = `<a href="#"><img src="${resourceCode}" alt="${toolTip}" title="${toolTip}"></a>`;
            } else {
                let artCategory;
                let imageSource;
                if(isArtPart(resource.Name)) { 
                    artCategory = "part";
                    imageSource = `/i/artifacts/parts/${resourceCode}.png`;
                } else {
                    artCategory = "elements";
                    imageSource = `/i/gn_res/${resourceCode}.png?v=0`;
                }
                html = `<a href="/auction.php?cat=${artCategory}&sort=0&art_type=${resourceCode}"><img src="${imageSource}" alt="${toolTip}" title="${toolTip}"></a>`;
            }
            let amountDivWidth = Math.max(15, Math.ceil(getNumberLength(resource.Amount) * 7.5));
            //console.log(`resource.Amount: ${resource.Amount}, amountDivWidth: ${amountDivWidth}`);
            html += `<div class="amountSlot" style="width: ${amountDivWidth}px">${resource.Amount}</div>`;
            if(resource.TextNode.nextSibling && resource.TextNode.nextSibling.tagName.toLowerCase() == "br") {
                resource.TextNode.nextSibling.remove();
            }
            resource.TextNode.replaceWith(createElement("div", { class: "resourceSlot", innerHTML: html }));
        }
    }
}
function isArtPart(name) { return name.includes('Импер') || name.includes('Магма') || name.includes('тьмы') || name.includes('Небесн') || name.includes('трах'); }
function getParsedResourcesInfo(resourcesPanel) {
    const walker = document.createTreeWalker(resourcesPanel, NodeFilter.SHOW_TEXT);
    let textNodes = [];
    while(walker.nextNode()) {
        textNodes.push(walker.currentNode)
    }
    textNodes = textNodes.map(x => [x, x.textContent.replace("\n", "").trimStart()]).filter(x => x[1] != "" && !x[1].includes("function")).map(x => { return { TextNode: x[0], Name: x[1].split(":")[0], Amount: parseInt(x[1].split(":")[1]) }; });
    //console.log(textNodes);
    return textNodes;
}
function getResourcesPanel() {
    const tables = document.querySelectorAll("table.wblight");
    for(const table of tables) {
        const bolds = table.querySelectorAll("b");
        for(const bold of bolds) {
            if(bold.innerText == "Ресурсы") {
                return table.rows[1].cells[0];
            }
        }
    }
}
function getNumberLength(number) { return number.toString().length; }
function addElement(type, parent, data) {
    let el = createElement(type, data);
    if(parent) {
        parent.appendChild(el);
    }
    return el;
}
function createElement(type, data) {
    let el = document.createElement(type);
    if(data) {
        for(let key in data) {
            if(key == "innerText" || key == "innerHTML") {
                el[key] = data[key];
            } else {
                el.setAttribute(key, data[key]);
            }
        }
    }
    return el;
}
function addStyle(css) { addElement("style", document.head, { type: "text/css", innerHTML: css }); }