Greasy Fork is available in English.

HWM_Monster_Links

Добавляет ссылку на описание существ и монстров в заданиях ГН

// ==UserScript==
// @name HWM_Monster_Links
// @author  Zeleax
// @namespace   Zeleax
// @description Добавляет ссылку на описание существ и монстров в заданиях ГН
// @include /https?:\/\/(www.heroeswm.ru|178.248.235.15|www.lordswm.com|my.lordswm.com)\/(plstats_hunters.php|mercenary_guild.php)/
// @include https://daily.heroeswm.ru/help/gn/monsters.php*
// @version 1.15
// @license MIT
// @grant  none
// ==/UserScript==
// GM functions
if (typeof GM_getValue != 'function') {this.GM_getValue=function (key,def) {return localStorage[key] || def;};this.GM_setValue=function (key,value) {return localStorage[key]=value;};	this.GM_deleteValue=function (key) {return delete localStorage[key];};}

var monsterarr, monstersDaily, res, rows, txt, i, href, mlink;

if(/plstats_hunters.php/.test(location.href)){
   monsterarr = new Object();
   var ratetable = getClosestParentByTagName(getE("(//td[contains(text(),'Монстры')])"), 'table');

   rows=ratetable.getElementsByClassName("pi");
   for(i=0; i<rows.length; i++)
   {
      el = rows[i];
      if ((href = el.getAttribute("href")) && (res = /army_info.php\?name=(\S+)/.exec(href)) && res[1]){
         monsterarr[el.innerHTML] = res[1];
      }
   }
   if (Object.keys(monsterarr).length > 1) GM_setValue("monsters", JSON.stringify(monsterarr));
}
else if(/mercenary_guild.php/.test(location.href))
{
    var el = getE('//td[contains(text(),"Репутация:")]');
    txt = el.innerHTML;

    var monstername, link;

    if(((res = /'(.{2,25}) {\d+}'/.exec(txt)) || (res = /'<b>(.{2,25})-набеги \{\d+\}/.exec(txt))) && (monstername = res[1]) && (link = getCreatures()[monstername])){
        el.innerHTML = txt.replace(monstername,'<a target="_blank" href="army_info.php\?name='+link+'">'+monstername+'</a>');
    }
    else if ((res = /<b>(.{2,25})-монстр {(\d+)}/.exec(txt)) && (monstername = res[1]))
    {
        var monsterId;
        monstersDaily=getMonstersDaily();

        if(monstersDaily) monsterId= monstersDaily[monstername];
        if(!monsterId) monsterId=0;

        el.innerHTML = txt.replace(monstername+'-монстр','<a target="_blank" href="http://daily.heroeswm.ru/help/gn/monsters.php?id='+monsterId+'&lvl='+res[2]+'">'+monstername+'-монстр'+'</a>');
    }
}
else if(/daily/.test(location.href))
{
    var resLvl, x, row;
    var resId=/id=(\d+)/.exec(location.href);
    if((resId) && (resId[1]==0) ){ // значит нужно обновить и сохранить список монстров
        monstersDaily = new Object();
        el = document.getElementById('id');
        var list = getL("./option[not (@value='0')]", el);
        for (i=0 ; i<list.snapshotLength; i++) monstersDaily[list.snapshotItem(i).text]=list.snapshotItem(i).value;

        if (Object.keys(monstersDaily).length > 1) {
            console.log('Сохранить для getMonstersDaily():', JSON.stringify(monstersDaily));
        }
    }
    else if((resLvl=/lvl=(\d+)/.exec(location.href)) && (x = document.getElementsByClassName("Table")))
    {
        let regex = new RegExp( '\\{'+resLvl[1]+'\\}','i');
        for(i=0, row; row=x[0].rows[i]; i++)
            if(regex.test(row.cells[0].innerHTML)) {row.style.backgroundColor = "yellow"; break; }
    }
}

function getCreatures(){
   if ((monsterarr==null || monsterarr==undefined) && !(monsterarr=JSON.parse( GM_getValue("monsters", null))))
      window.open(document.location.origin+'/plstats_hunters.php');
   return monsterarr;
}

function getMonstersDaily(){
return JSON.parse( '{"Адепты":"494","Адские жеребцы":"76","Адские жнецы":"284","Адские псы":"74","Ангелы":"132","Арбалетчики":"42","Архангелы":"249","Архидемоны":"293","Архидьяволы":"292","Архиличи":"146","Архимаги":"104","Ассасины":"56","Астральные драконы":"514","Баньши":"515","Бегемоты":"131","Берсерки":"163","Бестии":"49","Бесы":"78","Бехолдеры":"207","Боевые грифоны":"36","Боевые единороги":"147","Боевые кентавры":"309","Боевые маги":"578","Вампиры":"15","Вармонгеры":"330","Ведьмы-призраки":"522","Великие левиафаны":"214","Верховные друиды":"120","Вестники смерти":"235","Виверны":"336","Визири джиннов":"579","Владычицы тени":"239","Водные элементали":"156","Вожаки":"436","Воздушные элементали":"153","Воины-наёмники":"21","Воители":"158","Воры-колдуны":"125","Воры-разведчики":"123","Воры-убийцы":"124","Высшие ангелы":"496","Высшие вампиры":"118","Высшие личи":"341","Гарпии":"200","Гарпии-ведьмы":"201","Гарпунеры":"378","Гигантские ящеры":"45","Гидры":"50","Глубоководные черти":"212","Гниющие зомби":"270","Гоблины":"14","Гоблины-лучники":"314","Гоблины-маги":"545","Гоблины-трапперы":"386","Гоги":"285","Големы смерти":"520","Головорезы":"254","Горные стражи":"339","Гремлины":"9","Гремлины-вредители":"253","Грифоны":"3","Громовержцы":"167","Демонессы":"122","Детёныши ящера":"46","Джинны":"39","Джинны-султаны":"105","Дикие энты":"589","Дочери земли":"333","Дочери неба":"332","Древние бегемоты":"301","Древние энты":"238","Дриады":"31","Друиды":"26","Духи":"512","Дьяволы":"82","Дьяволята":"281","Единороги":"38","Железные големы":"12","Жрецы рун":"164","Защитники веры":"260","Защитники гор":"157","Зелёные драконы":"103","Земные элементали":"154","Злобные глаза":"208","Зомби":"5","Изумрудные драконы":"100","Имперские грифоны":"117","Инквизиторы":"145","Искусительницы":"485","Ифриты":"280","Ифриты султаны":"282","Каменные горгульи":"8","Камнегрызы":"203","Камнееды":"202","Кентавры":"310","Князья вампиров":"513","Колоссы":"106","Кони преисподней":"290","Костоломы":"114","Костяные драконы":"133","Кочевые кентавры":"311","Кошмары":"150","Красные драконы":"747","Крестьяне":"4","Кристальные драконы":"590","Кровавые ящеры":"47","Кровоглазые циклопы":"399","Кшатрии ракшасы":"580","Лазутчики":"52","Латники":"71","Левиафаны":"213","Лесные снайперы":"261","Личи":"29","Ловчие":"696","Лучники":"2","Маги":"16","Магма драконы":"169","Магнитные големы":"259","Магоги":"287","Мастера копья":"160","Мастера лука":"72","Мегеры":"315","Медведи":"172","Метатели копья":"159","Минотавры":"55","Минотавры-надсмотрщики":"317","Минотавры-стражи":"70","Могильные големы":"521","Монахи":"37","Морские черти":"211","Мумии":"268","Мумии фараонов":"269","Мятежники":"35","Наездники на волках":"18","Наездники на гиенах":"859","Наездники на кабанах":"318","Наездники на медведях":"161","Наездники на ящерах":"51","Налётчики на волках":"43","Нимфы":"255","Обсидиановые горгульи":"44","Огненные гончие":"288","Огненные демоны":"79","Огненные драконы":"168","Огненные птицы":"536","Огненные элементали":"155","Огры":"24","Огры-ветераны":"535","Огры-маги":"119","Огры-шаманы":"855","Ополченцы":"34","Орки":"23","Орки-вожди":"73","Орки-тираны":"534","Орки-шаманы":"546","Паладины":"234","Палачи":"335","Пауки":"198","Пехотинцы":"10","Пещерные владыки":"236","Пещерные гидры":"149","Пещерные демоны":"83","Пещерные отродья":"291","Привидения":"11","Призраки":"68","Призрачные драконы":"300","Принцессы ракшас":"93","Проворные наездники":"316","Проклятые бегемоты":"861","Птицы грома":"148","Птицы тьмы":"544","Раджи ракшас":"108","Рогатые демоны":"77","Рогатые жнецы":"283","Роки":"30","Рыцари":"90","Рыцари смерти":"273","Рыцари тьмы":"272","Светлые единороги":"588","Свирепые бегемоты":"538","Свободные циклопы":"433","Сирены":"209","Сирены-искусительницы":"210","Скелеты":"1","Скелеты-арбалетчики":"340","Скелеты-воины":"267","Скелеты-лучники":"28","Стальные големы":"69","Старейшины рун":"165","Старшие гремлины":"32","Старшие демоны":"289","Старшие друиды":"587","Степные бойцы":"320","Степные воины":"319","Степные волки":"27","Степные гоблины":"329","Степные циклопы":"397","Стихийные горгульи":"256","Стрелки":"257","Стрелки-наёмники":"20","Суккубы":"81","Сумеречные ведьмы":"94","Сумеречные драконы":"102","Танцующие с ветром":"258","Танцующие с клинками":"25","Танцующие со смертью":"41","Таны":"166","Тёмные виверны":"337","Тёмные всадники":"121","Тёмные гидры":"746","Титаны":"107","Титаны шторма":"581","Тролли":"204","Убийцы":"334","Умертвия":"91","Феи":"17","Фениксы":"464","Фурии":"53","Хобгоблины":"33","Хозяева медведей":"162","Хозяйки ночи":"745","Церберы":"75","Циклопы":"89","Циклопы-генералы":"537","Циклопы-короли":"237","Циклопы-шаманы":"860","Чародеи-наёмники":"126","Чемпионы":"495","Черные тролли":"205","Черти":"80","Чёрные драконы":"101","Чумные зомби":"40","Шаманки":"331","Штурмовые грифоны":"493","Эльфийские лучники":"19","Энты":"92","Ядовитые пауки":"199"}')}

// доступ по xpath
function getE(xpath,el,docObj){return (docObj?docObj:document).evaluate(xpath,(el?el:(docObj?docObj.body:document.body)),null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;}
function getL(xpath,el,docObj){return (docObj?docObj:document).evaluate(xpath,(el?el:(docObj?docObj.body:document.body)),null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);}

// поиск ближайшего родителя по имени тега
function getClosestParentByTagName(el, tag){var p, e, fnd=false, tf=tag.toLowerCase();e=el;do{p=e.parentElement;if((p) && (p.tagName.toLowerCase()==tf)){fnd=true;break;} e=p;} while (e);
return fnd?p:null;}