hwmHuntHelper

Помощник ГО

当前为 2024-11-23 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name           hwmHuntHelper
// @namespace      Tamozhnya1
// @description    Помощник ГО
// @author         Mantens, ElMarado, CheckT, Pagan of Dark, Tamozhnya1
// @version        10.1
// @include        https://www.heroeswm.ru/group_wars.php*
// @include        https://www.heroeswm.ru/plstats_hunters.php*
// @include        https://www.heroeswm.ru/home.php*
// @include        https://www.heroeswm.ru/map.php*
// @include        https://www.heroeswm.ru/mercenary_guild.php*
// @include        https://www.lordswm.com/group_wars.php*
// @include        https://www.lordswm.com/plstats_hunters.php*
// @include        https://www.lordswm.com/home.php*
// @include        https://www.lordswm.com/map.php*
// @include        https://www.lordswm.com/mercenary_guild.php*
// @require https://update.greasyfork.org/scripts/490927/1360667/Tamozhnya1Lib.js
// @grant          GM_getValue
// @grant          GM_setValue
// @grant          GM_deleteValue
// @grant          GM_listValues
// @grant 		   GM.xmlHttpRequest
// @license        MIT
// ==/UserScript==

// Update by CheckT
// небольшая доработка скрипта hwm_GO_exp от ElMarado (Based on script Mantens)
//    - хранение настроек независимо по игрокам
//    - кнопка "пометить всех птиц"
// Оригинал https://greasyfork.org/ru/scripts/11692-hwm-go-exp

_NABEG=2;_GN_OTRYAD=5;_GN_MONSTER=7;_GN_NABEGI=8;_GN_ZASHITA=10;_GN_ARMY=12;_MAL_TOUR=14;_THIEF_WAR=16;_SURVIVAL=20;_NEWGROUP=21;
_ELEMENTALS=22;_GNOMES=23;_NEWKZS=24;NEWKZS=24;_NEWKZS_T=25;NEWKZS_T=25;_NEWTHIEF=26;_NEWCARAVAN=27;_NEWGNCARAVAN=29;_SURVIVALGN=28;
_TUNNEL=30;_SEA=32;_HELL=33;_CASTLEWALLS=35;_UNIWAR=36;_DIFFTUR=37;_UNIWARCARAVAN=38;_PVPGUILDTEST=39;_PVPGUILD=40;_BALANCED_EVENT=41;
_NECR_EVENT=42;_NECR_EVENT2=43;_HELLOWEEN=44;_SURVIVAL_GNOM=45;_DEMON_EVENT=46;_DEMON_EVENT2=47;_DEMON_EVENT3=48;_DEMON_EVENT4=49;_PVEDUEL=50;_DEMONVALENTIN=51;
_QUICKTOUR=52;_BARBTE_ATTACK=53;_BARBTE_DEEP=54;_BARBTE_BOSS=55;_TRANSEVENT=56;_STEPEVENT=57;_STEPEVENT2=58;_KZS_PVE=59;_2TUR=60;_RANGER=61;
_PRAET=62;_RANGER_TEST=63;_SUN_EVENT1=64;_SUN_EVENT2=65;_NEWCARAVAN2=66;_23ATTACK=67;_2TU_FAST=68;_SV_ATTACK=69;_KILLER_BOT=70;_SV_DUEL=71;
_SV_WAR=72;_FAST_TEST=73;_TRUE_EVENT=74;_TIKVA_BOT=75;_TIKVA_ATTACK=76;_ELKA_DEFENSE=77;_PPE_EVENT=78;_ALTNECR_EVENT=79;_CLAN_SUR_DEF=80;_CLAN_SUR_ATT=81;
_QUESTWAR=82;_BARBNEW_DEEP=83;_BARBNEW_BOSS=84;_ELKA_RESCUE=85;_REGWAR1=86;_REGWAR2=87;_CLAN_SUR_CAPT=88;_CLAN_SUR_DEF_PVP=89;_TRUE_TOUR=90;_NOOB_DUEL=91;
_ALTMAG_EVENT=92;_ALTELF_EVENT=93;_NEWPORTAL_EVENT=94;_UNIGUILD=95;_PIRATE_EVENT=96;_TOUR_EVENT=97;_PAST_EVENT=98;_GOLD_EVENT=99;_FAST_TEST2=100;_OHOTA_EVENT=101;
_BUNT_EVENT=102;_ZASADA_EVENT=103;_CLAN_NEW_PVP=104;_SURV_DEEP=105;_SURV_DEEP_BOSS=106;_2AND3_EVENT=107;_CASTLE_EVENT=108;_CARAVAN_EVENT=109;_CAMPAIGN_WAR=110;_NY2016=111;
_ALTTE_EVENT=112;_PVP_EVENT=113;_ALTTE2_EVENT=114;_PIRATE_NEW_EVENT=115;_PVP_KR_EVENT=116;_CATCH_EVENT=117;_PVP_DIAGONAL_EVENT=118;_VILLAGE_EVENT=119;_TRAVEL_EVENT=120;_CASTLE_BATTLE2X2=121;
_PVP_BOT=122;_PIRATE_SELF_EVENT=123;_2ZASADA_EVENT=124;_NEWCARAVAN3=125;_ONEDAY_EVENT=126;_CRE_EVENT=127;_GL_EVENT=128;_1ZASADA_EVENT=129;_NYGL2018_EVENT=130;_EGYPT_EVENT=131;
_GL_DWARF_EVENT=132;_NAIM_MAP_EVENT=133;_2BOT_TUR=134;_CRE_SPEC=135;_CRE_INSERT=136;_CRE_TOUR=137;_GNOM_EVENT=138;_MAPHERO_EVENT=138;_NEWCRE_EVENT=139;_NEWOHOTA_EVENT=140;
_2SURVIVAL=141;_ADVENTURE_EVENT=142;_AMBUSHHERO_EVENT=143;_FRACTION_EVENT=144;_PVP_KZS=145;_REAPING_MAP_EVENT=147;


if(!PlayerId) {
    return;
}
if(location.pathname == "/home.php" || location.pathname == "/pl_info.php" && getUrlParamValue(location.href, "id") == PlayerId) {
    if(isNewPersonPage) {
        const levelInfoCell = Array.from(document.querySelectorAll("div.home_pers_info")).find(x => x.innerHTML.includes(isEn ? "Combat level" : "Боевой уровень"));
        if(levelInfoCell) {
            console.log(levelInfoCell.querySelector("div[id=bartext] > span").innerText)
            setPlayerValue("PlayerLevel", parseInt(levelInfoCell.querySelector("div[id=bartext] > span").innerText));
        }
    } else {
        const levelExec = new RegExp(`<b>${isEn ? "Combat level" : "Боевой уровень"}: (\\d+?)<\\/b>`).exec(document.documentElement.innerHTML);
        if(levelExec) {
            setPlayerValue("PlayerLevel", parseInt(levelExec[1]) || 1);
        }
    }
}
const PlayerLevel = parseInt(getPlayerValue("PlayerLevel", 1));
const sectors = {
    "cx=50&cy=50": 1, //Empire Capital
    "cx=51&cy=50": 2, //East River
    "cx=50&cy=49": 3, //Tiger Lake
    "cx=51&cy=49": 4, //Rogues' Wood
    "cx=50&cy=51": 5, //Wolf Dale
    "cx=50&cy=48": 6, //Peaceful Camp
    "cx=49&cy=51": 7, //Lizard Lowland
    "cx=49&cy=50": 8, //Green Wood
    "cx=49&cy=48": 9, //Eagle Nest
    "cx=50&cy=52": 10, //Portal Ruins
    "cx=51&cy=51": 11, //Dragon Caves
    "cx=49&cy=49": 12, //Shining Spring
    "cx=48&cy=49": 13, //Sunny Sity
    "cx=52&cy=50": 14, //Magma Mines
    "cx=52&cy=49": 15, //Bear Mountain
    "cx=52&cy=48": 16, //Fairy Trees
    "cx=53&cy=50": 17, //Harbour City (Port City)
    "cx=53&cy=49": 18, //Mithril Coast
    "cx=51&cy=52": 19, //GreatWall
    "cx=51&cy=53": 20, //Titans' Valley
    "cx=52&cy=53": 21, //Fishing Village
    "cx=52&cy=54": 22, //Kingdom Capital
    "cx=48&cy=48": 23, //Ungovernable Steppe
    "cx=51&cy=48": 24, //Crystal Garden
    "cx=53&cy=52": 25, //East Island
    "cx=49&cy=52": 26, //The Wilderness
    "cx=48&cy=50": 27 //Sublime Arbor
}
//deleteValue("monstersVersion");
//console.log(`monstersVersion: ${getValue("monstersVersion", "")}, ${getValue("monstersVersion", "") < "6.5"}`);
if(getValue("monstersVersion", "") < "9.6") {
    var oldMonsters = JSON.parse(getValue("monsters", "[]"));
    deleteValue("monsters");
}
if(!getValue("monsters")) {
    const monstersTemplate = [{"name":"bpirate","title":"Абордажники","experience":30,"health":16,"canFly":false,"newYear":false,"enTitle":"Pirate Fighters"},{"name":"zealot","title":"Адепты","experience":121,"health":80,"canFly":false,"newYear":false,"enTitle":"Exorcists"},{"name":"hellcharger","title":"Адские жеребцы","experience":136,"health":50,"canFly":false,"newYear":false,"imageName":"nightmare","enTitle":"Hell horses"},{"name":"zhryak","title":"Адские жнецы","experience":250,"health":99,"canFly":false,"newYear":false,"enTitle":"Hell reapers"},{"name":"hellhound","title":"Адские псы","experience":33,"health":15,"canFly":false,"newYear":false,"imageName":"demondog","enTitle":"Wolfhounds"},{"name":"reanimatorup","title":"Адские реаниматоры","experience":43,"health":27,"canFly":false,"newYear":false,"enTitle":"Infernal reanimators"},{"name":"troglodyteup","title":"Адские троглодиты","experience":7,"health":6,"canFly":false,"newYear":false,"enTitle":"Infernal Troglodytes"},{"name":"iceelb","title":"Айсберговые элементали","experience":50,"health":90,"canFly":true,"newYear":false,"enTitle":"Iceberg elementals"},{"name":"diamondgolem","title":"Алмазные големы","experience":110,"health":60,"canFly":false,"newYear":false,"enTitle":"Diamond golems"},{"name":"yetiup","title":"Алмасты","experience":400,"health":290,"canFly":false,"newYear":false,"enTitle":"Almases"},{"name":"angel","title":"Ангелы","experience":330,"health":180,"canFly":true,"newYear":false,"enTitle":"Angels"},{"name":"marksman","title":"Арбалетчики","experience":19,"health":10,"canFly":false,"newYear":false,"enTitle":"Crossbowmen"},{"name":"archangel","title":"Архангелы","experience":390,"health":220,"canFly":true,"newYear":false,"enTitle":"Archangels"},{"name":"archdemon","title":"Архидемоны","experience":312,"health":211,"canFly":false,"newYear":false,"enTitle":"Antichrists"},{"name":"archdevil","title":"Архидьяволы","experience":311,"health":199,"canFly":false,"newYear":false,"enTitle":"Archdevils"},{"name":"archlich","title":"Архиличи","experience":110,"health":55,"canFly":false,"newYear":false,"enTitle":"Archliches"},{"name":"archmage","title":"Архимаги","experience":70,"health":30,"canFly":false,"newYear":false,"enTitle":"Lorekeepers"},{"name":"assassin","title":"Ассасины","experience":33,"health":14,"canFly":false,"newYear":false,"imageName":"assasin","enTitle":"Poisoners"},{"name":"assida","title":"Ассиды","experience":53,"health":30,"canFly":true,"newYear":false,"enTitle":"Ayssids"},{"name":"ghostdragon","title":"Астральные драконы","experience":310,"health":150,"canFly":true,"newYear":false,"enTitle":"Mirage dragons"},{"name":"banshee","title":"Баньши","experience":205,"health":110,"canFly":false,"newYear":false,"enTitle":"Death proclaimers"},{"name":"behemoth","title":"Бегемоты","experience":350,"health":210,"canFly":false,"newYear":false,"enTitle":"Behemoths"},{"name":"berserker","title":"Берсерки","experience":42,"health":25,"canFly":false,"newYear":false,"enTitle":"Berserkers"},{"name":"maiden","title":"Бестии","experience":30,"health":16,"canFly":false,"newYear":false,"enTitle":"Rogues"},{"name":"imp","title":"Бесы","experience":6,"health":4,"canFly":false,"newYear":false,"enTitle":"Imps"},{"name":"beholder","title":"Бехолдеры","experience":33,"health":22,"canFly":false,"newYear":false,"enTitle":"Beholders"},{"name":"wisp","title":"Блуждающие огни","experience":7,"health":10,"canFly":true,"newYear":false,"enTitle":"Will-O-Wisps"},{"name":"battlegriffin","title":"Боевые грифоны","experience":45,"health":35,"canFly":true,"newYear":false,"enTitle":"Frenzied griffins"},{"name":"silverunicorn","title":"Боевые единороги","experience":135,"health":77,"canFly":false,"newYear":false,"enTitle":"Brilliant unicorns"},{"name":"mcentaur","title":"Боевые кентавры","experience":21,"health":10,"canFly":false,"newYear":false,"enTitle":"Tempered centaurs"},{"name":"battlemage","title":"Боевые маги","experience":72,"health":29,"canFly":false,"newYear":false,"enTitle":"Battlemagi"},{"name":"slon","title":"Боевые слоны","experience":120,"health":100,"canFly":false,"newYear":false,"enTitle":"Fighting elephants"},{"name":"vampire","title":"Вампиры","experience":68,"health":30,"canFly":false,"newYear":false,"enTitle":"Vampires"},{"name":"warmong","title":"Вармонгеры","experience":36,"health":20,"canFly":false,"newYear":false,"enTitle":"Protectors"},{"name":"cursed","title":"Ведьмы-призраки","experience":30,"health":20,"canFly":true,"newYear":false,"imageName":"cursed_","enTitle":"Cursed witches"},{"name":"priestessup","title":"Ведьмы моря","experience":70,"health":35,"canFly":false,"newYear":false,"enTitle":"Sea witches"},{"name":"giant","title":"Великаны","experience":160,"health":100,"canFly":false,"newYear":false,"enTitle":"Trashers"},{"name":"giantarch","title":"Великаны-лучники","experience":130,"health":100,"canFly":false,"newYear":false,"enTitle":"Giant archers"},{"name":"upleviathan","title":"Великие левиафаны","experience":300,"health":250,"canFly":false,"newYear":false,"enTitle":"Great leviathans"},{"name":"wendigo","title":"Вендиго","experience":20,"health":25,"canFly":false,"newYear":false,"enTitle":"Wendigos"},{"name":"druideld","title":"Верховные друиды","experience":101,"health":38,"canFly":false,"newYear":false,"imageName":"ddeld","enTitle":"Anchorites"},{"name":"wraith","title":"Вестники смерти","experience":205,"health":100,"canFly":false,"newYear":false,"enTitle":"Death heralds"},{"name":"wyvern","title":"Виверны","experience":170,"health":90,"canFly":true,"newYear":false,"enTitle":"Tamed wyverns"},{"name":"djinn_vizier","title":"Визири джиннов","experience":110,"health":50,"canFly":true,"newYear":false,"enTitle":"Fortune genies"},{"name":"matriarch","title":"Владычицы тени","experience":185,"health":90,"canFly":false,"newYear":false,"enTitle":"Dark sibyls"},{"name":"water","title":"Водные элементали","experience":57,"health":43,"canFly":false,"newYear":false,"enTitle":"Water elementals"},{"name":"chieftain","title":"Вожаки","experience":100,"health":48,"canFly":false,"newYear":false,"enTitle":"Chieftains"},{"name":"air","title":"Воздушные элементали","experience":59,"health":30,"canFly":true,"newYear":false,"enTitle":"Air elementals"},{"name":"anubisup","title":"Воины Анубиса","experience":420,"health":200,"canFly":false,"newYear":false,"enTitle":"Anubis warriors"},{"name":"battlerager","title":"Воины ярости","experience":42,"health":30,"canFly":false,"newYear":false,"enTitle":"Beastslayers"},{"name":"mercfootman","title":"Воины-наёмники","experience":25,"health":24,"canFly":false,"newYear":false,"enTitle":"Mercenary warriors"},{"name":"shieldguard","title":"Воители","experience":12,"health":12,"canFly":false,"newYear":false,"enTitle":"Veterans"},{"name":"faeriedragon","title":"Волшебные драконы","experience":800,"health":500,"canFly":true,"newYear":false,"enTitle":"Faerie dragons"},{"name":"thiefmage","title":"Воры-колдуны","experience":35,"health":30,"canFly":false,"newYear":false,"enTitle":"Renegade magicians"},{"name":"thiefwarrior","title":"Воры-разведчики","experience":35,"health":45,"canFly":false,"newYear":false,"enTitle":"Renegade scouts"},{"name":"thiefarcher","title":"Воры-убийцы","experience":35,"health":40,"canFly":false,"newYear":false,"enTitle":"Renegade thugs"},{"name":"seraph2","title":"Высшие ангелы","experience":390,"health":220,"canFly":true,"newYear":false,"enTitle":"Thrones"},{"name":"vampirelord","title":"Высшие вампиры","experience":70,"health":35,"canFly":false,"newYear":false,"enTitle":"Vampire counts"},{"name":"masterlich","title":"Высшие личи","experience":100,"health":55,"canFly":false,"newYear":false,"enTitle":"Demiliches"},{"name":"highwayman","title":"Вышибалы","experience":30,"health":24,"canFly":false,"newYear":false,"enTitle":"Bruisers"},{"name":"harpy","title":"Гарпии","experience":29,"health":15,"canFly":true,"newYear":false,"enTitle":"Harpies"},{"name":"harpyhag","title":"Гарпии-ведьмы","experience":45,"health":15,"canFly":true,"newYear":false,"enTitle":"Raiding harpies"},{"name":"harpooner","title":"Гарпунеры","experience":18,"health":10,"canFly":false,"newYear":false,"enTitle":"Harpooners"},{"name":"bigspider","title":"Гигантские пауки","experience":50,"health":55,"canFly":false,"newYear":false,"enTitle":"Giant Spiders"},{"name":"lizard","title":"Гигантские ящеры","experience":25,"health":25,"canFly":false,"newYear":false,"imageName":"lizard_","enTitle":"Giant lizards"},{"name":"hydra","title":"Гидры","experience":108,"health":80,"canFly":false,"newYear":false,"enTitle":"Hydras"},{"name":"darkeye","title":"Глаза тьмы","experience":33,"health":26,"canFly":false,"newYear":false,"enTitle":"Shadow eyes"},{"name":"upseamonster","title":"Глубоководные черти","experience":140,"health":105,"canFly":false,"newYear":false,"enTitle":"Voracious anglerfish"},{"name":"rotzombie","title":"Гниющие зомби","experience":17,"health":23,"canFly":false,"newYear":false,"enTitle":"Ghouls"},{"name":"goblin","title":"Гоблины","experience":5,"health":3,"canFly":false,"newYear":false,"enTitle":"Goblins"},{"name":"goblinarcher","title":"Гоблины-лучники","experience":9,"health":3,"canFly":false,"newYear":false,"enTitle":"Goblin archers"},{"name":"goblinmag","title":"Гоблины-маги","experience":9,"health":3,"canFly":false,"newYear":false,"enTitle":"Goblin warlocks"},{"name":"trapper","title":"Гоблины-трапперы","experience":15,"health":7,"canFly":false,"newYear":false,"enTitle":"Goblin trappers"},{"name":"gogachi","title":"Гоги","experience":13,"health":13,"canFly":false,"newYear":false,"imageName":"gog","enTitle":"Gogs"},{"name":"dgolem","title":"Големы смерти","experience":329,"health":350,"canFly":false,"newYear":false,"enTitle":"Death golems"},{"name":"brute","title":"Головорезы","experience":6,"health":8,"canFly":false,"newYear":false,"enTitle":"Brutes"},{"name":"mountaingr","title":"Горные стражи","experience":24,"health":12,"canFly":false,"newYear":false,"enTitle":"Mountain sentries"},{"name":"gremlin","title":"Гремлины","experience":5,"health":5,"canFly":false,"newYear":false,"enTitle":"Gremlins"},{"name":"saboteurgremlin","title":"Гремлины-вредители","experience":9,"health":6,"canFly":false,"newYear":false,"enTitle":"Gremlin wreckers"},{"name":"griffon","title":"Грифоны","experience":59,"health":30,"canFly":true,"newYear":false,"enTitle":"Griffins"},{"name":"thunderlord","title":"Громовержцы","experience":162,"health":120,"canFly":false,"newYear":false,"enTitle":"Invokers"},{"name":"axegnom","title":"Громоглавы","experience":14,"health":10,"canFly":false,"newYear":false,"enTitle":"Thunderheads"},{"name":"nomadup","title":"Гунны","experience":60,"health":33,"canFly":false,"newYear":false,"enTitle":"Huns"},{"name":"deserter","title":"Дезертиры","experience":40,"health":25,"canFly":false,"newYear":false,"enTitle":"Deserters"},{"name":"succubusmis","title":"Демонессы","experience":67,"health":30,"canFly":false,"newYear":false,"imageName":"succubusm","enTitle":"Mistresses"},{"name":"smalllizard","title":"Детёныши ящера","experience":13,"health":13,"canFly":false,"newYear":false,"imageName":"smalllizard_","enTitle":"Lizard cubs"},{"name":"djinn","title":"Джинны","experience":103,"health":40,"canFly":true,"newYear":false,"enTitle":"Genies"},{"name":"djinn_sultan","title":"Джинны-султаны","experience":110,"health":45,"canFly":true,"newYear":false,"enTitle":"Senior genies"},{"name":"savageent","title":"Дикие энты","experience":210,"health":175,"canFly":false,"newYear":false,"enTitle":"Savage Treant"},{"name":"robber","title":"Дозорные","experience":7,"health":5,"canFly":false,"newYear":false,"enTitle":"Outriders"},{"name":"eadaughter","title":"Дочери земли","experience":72,"health":35,"canFly":false,"newYear":false,"enTitle":"Earth shamans"},{"name":"sdaughter","title":"Дочери неба","experience":75,"health":35,"canFly":false,"newYear":false,"enTitle":"Sky shamans"},{"name":"ancientbehemoth","title":"Древние бегемоты","experience":390,"health":250,"canFly":false,"newYear":false,"imageName":"abehemoth","enTitle":"Ancient Behemoths"},{"name":"ancientpig","title":"Древние кабаны","experience":12,"health":15,"canFly":false,"newYear":false,"enTitle":"Ancient boars"},{"name":"amummy","title":"Древние мумии","experience":135,"health":80,"canFly":false,"newYear":false,"enTitle":"Ancient mummies"},{"name":"ancienent","title":"Древние энты","experience":210,"health":181,"canFly":false,"newYear":false,"enTitle":"Ironroot treefolk"},{"name":"sprite","title":"Дриады","experience":20,"health":6,"canFly":true,"newYear":false,"enTitle":"Sprites"},{"name":"druid","title":"Друиды","experience":74,"health":34,"canFly":false,"newYear":false,"imageName":"dd_","enTitle":"Druids"},{"name":"poltergeist","title":"Духи","experience":27,"health":20,"canFly":true,"newYear":false,"enTitle":"Poltergeists"},{"name":"forestspirit","title":"Духи леса","experience":90,"health":50,"canFly":true,"newYear":false,"enTitle":"Spirits of forest","imageName":"spirit"},{"name":"ocean","title":"Духи океана","experience":53,"health":30,"canFly":true,"newYear":false,"enTitle":"Ocean spirits"},{"name":"devil","title":"Дьяволы","experience":245,"health":166,"canFly":false,"newYear":false,"enTitle":"Devils"},{"name":"vermin","title":"Дьяволята","experience":10,"health":6,"canFly":false,"newYear":false,"enTitle":"Vermins"},{"name":"unicorn","title":"Единороги","experience":124,"health":57,"canFly":false,"newYear":false,"enTitle":"Unicorns"},{"name":"iron_golem","title":"Железные големы","experience":33,"health":18,"canFly":false,"newYear":false,"imageName":"golem","enTitle":"Golems"},{"name":"runepriest","title":"Жрецы рун","experience":59,"health":60,"canFly":false,"newYear":false,"enTitle":"Priests"},{"name":"priestmoon","title":"Жрицы луны","experience":60,"health":50,"canFly":false,"newYear":false,"enTitle":"Moon Priestesses","imageName":"zhrica"},{"name":"priestess","title":"Жрицы моря","experience":70,"health":35,"canFly":false,"newYear":false,"enTitle":"Sea priestesses"},{"name":"priestsun","title":"Жрицы солнца","experience":70,"health":55,"canFly":false,"newYear":false,"enTitle":"Sun Priestesses","imageName":"zhricaup"},{"name":"vindicator","title":"Защитники веры","experience":20,"health":23,"canFly":false,"newYear":false,"enTitle":"Crusaders"},{"name":"defender","title":"Защитники гор","experience":7,"health":7,"canFly":false,"newYear":false,"enTitle":"Sentries"},{"name":"greendragon","title":"Зелёные драконы","experience":350,"health":200,"canFly":true,"newYear":false,"enTitle":"Green dragons"},{"name":"earth","title":"Земные элементали","experience":63,"health":75,"canFly":false,"newYear":false,"enTitle":"Earth elementals"},{"name":"evileye","title":"Злобные глаза","experience":33,"health":22,"canFly":false,"newYear":false,"enTitle":"Evil eyes"},{"name":"zombie","title":"Зомби","experience":11,"health":17,"canFly":false,"newYear":false,"enTitle":"Zombies"},{"name":"emeralddragon","title":"Изумрудные драконы","experience":400,"health":200,"canFly":true,"newYear":false,"enTitle":"Jade dragons"},{"name":"impergriffin","title":"Имперские грифоны","experience":62,"health":35,"canFly":true,"newYear":false,"enTitle":"Royal griffins"},{"name":"inquisitor","title":"Инквизиторы","experience":121,"health":80,"canFly":false,"newYear":false,"enTitle":"Clerics"},{"name":"seducer","title":"Искусительницы","experience":65,"health":26,"canFly":false,"newYear":false,"enTitle":"Temptresses"},{"name":"efreeti","title":"Ифриты","experience":200,"health":90,"canFly":true,"newYear":false,"enTitle":"Efreeti"},{"name":"efreetisultan","title":"Ифриты султаны","experience":250,"health":100,"canFly":true,"newYear":false,"enTitle":"Efreeti sultans"},{"name":"yeti","title":"Йети","experience":400,"health":280,"canFly":false,"newYear":false,"enTitle":"Yeties"},{"name":"boar","title":"Кабаны","experience":12,"health":17,"canFly":false,"newYear":false,"enTitle":"Boars"},{"name":"stone_gargoyle","title":"Каменные горгульи","experience":16,"health":15,"canFly":true,"newYear":false,"imageName":"gargoly","enTitle":"Gargoyles"},{"name":"kammon","title":"Каменные монстры","experience":20,"health":28,"canFly":false,"newYear":false,"enTitle":"Stone monsters"},{"name":"kamnegryz","title":"Камнегрызы","experience":67,"health":55,"canFly":false,"newYear":false,"enTitle":"Stonegnawers"},{"name":"kamneed","title":"Камнееды","experience":56,"health":45,"canFly":false,"newYear":false,"enTitle":"Stoneeaters"},{"name":"fcentaur","title":"Кентавры","experience":13,"health":6,"canFly":false,"newYear":false,"enTitle":"Centaurs"},{"name":"vampireprince","title":"Князья вампиров","experience":70,"health":40,"canFly":false,"newYear":false,"enTitle":"Dreadlords"},{"name":"outlaw","title":"Колдуны-ренегаты","experience":6,"health":6,"canFly":false,"newYear":false,"enTitle":"Turncoat Mages"},{"name":"colossus","title":"Колоссы","experience":350,"health":175,"canFly":false,"newYear":false,"enTitle":"Giants"},{"name":"hellkon","title":"Кони преисподней","experience":138,"health":66,"canFly":false,"newYear":false,"imageName":"hellstallion","enTitle":"Searing horses"},{"name":"piratkaup","title":"Корсарки","experience":32,"health":12,"canFly":false,"newYear":false,"enTitle":"Women corsairs"},{"name":"apirate","title":"Корсары","experience":16,"health":13,"canFly":false,"newYear":false,"enTitle":"Corsairs"},{"name":"brawler","title":"Костоломы","experience":27,"health":20,"canFly":false,"newYear":false,"enTitle":"Brawlers"},{"name":"bonedragon","title":"Костяные драконы","experience":280,"health":150,"canFly":true,"newYear":false,"enTitle":"Skeletal dragons"},{"name":"nomad","title":"Кочевники","experience":50,"health":30,"canFly":false,"newYear":false,"enTitle":"Nomads"},{"name":"ncentaur","title":"Кочевые кентавры","experience":20,"health":9,"canFly":false,"newYear":false,"enTitle":"Centaur outriders"},{"name":"nightmare","title":"Кошмары","experience":140,"health":66,"canFly":false,"newYear":false,"imageName":"stallion","enTitle":"Nightmares"},{"name":"reddragon","title":"Красные драконы","experience":400,"health":235,"canFly":true,"newYear":false,"enTitle":"Red dragons"},{"name":"peasant","title":"Крестьяне","experience":5,"health":4,"canFly":false,"newYear":false,"imageName":"paesant","enTitle":"Farmers"},{"name":"crusader","title":"Крестоносцы","experience":27,"health":30,"canFly":false,"newYear":false,"enTitle":"Templars"},{"name":"crystaldragon","title":"Кристальные драконы","experience":400,"health":200,"canFly":true,"newYear":false,"enTitle":"Crystal Dragons"},{"name":"redlizard","title":"Кровавые ящеры","experience":30,"health":35,"canFly":false,"newYear":false,"imageName":"redlizard_","enTitle":"Vampiric lizards"},{"name":"bloodeyecyc","title":"Кровоглазые циклопы","experience":500,"health":235,"canFly":false,"newYear":false,"enTitle":"Tribal beholders"},{"name":"rakshasa_kshatra","title":"Кшатрии ракшасы","experience":162,"health":135,"canFly":false,"newYear":false,"enTitle":"Sphynx immortals"},{"name":"lavadragon","title":"Лавовые драконы","experience":329,"health":275,"canFly":false,"newYear":false,"enTitle":"Core dragons"},{"name":"scout","title":"Лазутчики","experience":20,"health":10,"canFly":false,"newYear":false,"enTitle":"Bandits"},{"name":"banditka","title":"Лазутчицы","experience":12,"health":8,"canFly":false,"newYear":false,"enTitle":"Infiltrators"},{"name":"squire","title":"Латники","experience":21,"health":26,"canFly":false,"newYear":false,"imageName":"swordman","enTitle":"Guardians"},{"name":"leviathan","title":"Левиафаны","experience":250,"health":200,"canFly":false,"newYear":false,"enTitle":"Leviathans"},{"name":"iceddragon","title":"Ледяные драконы","experience":250,"health":220,"canFly":true,"newYear":false,"enTitle":"Iced dragons","imageName":"icedragon"},{"name":"iceel","title":"Ледяные элементали","experience":50,"health":45,"canFly":true,"newYear":false,"enTitle":"Ice elementals"},{"name":"leprekon","title":"Лепреконы","experience":11,"health":7,"canFly":false,"newYear":false,"imageName":"lepr","enTitle":"Leprechauns"},{"name":"arcaneelf","title":"Лесные снайперы","experience":42,"health":12,"canFly":false,"newYear":false,"enTitle":"Sharpshooters"},{"name":"bobbit","title":"Лесные хоббиты","experience":9,"health":6,"canFly":false,"newYear":false,"enTitle":"Forest hobbits"},{"name":"shaman","title":"Лесные шаманы","experience":200,"health":110,"canFly":false,"newYear":false,"enTitle":"Forest shamans"},{"name":"lich","title":"Личи","experience":87,"health":50,"canFly":false,"newYear":false,"enTitle":"Liches"},{"name":"stalker","title":"Ловчие","experience":34,"health":15,"canFly":false,"newYear":false,"enTitle":"Stalkers"},{"name":"archer","title":"Лучники","experience":15,"health":7,"canFly":false,"newYear":false,"enTitle":"Bowmen"},{"name":"mage","title":"Маги","experience":63,"health":18,"canFly":false,"newYear":false,"enTitle":"Magi"},{"name":"magicel","title":"Магические элементали","experience":200,"health":80,"canFly":false,"newYear":false,"enTitle":"Magic elementals"},{"name":"magmadragon","title":"Магма драконы","experience":329,"health":280,"canFly":false,"newYear":false,"enTitle":"Magma dragons"},{"name":"magneticgolem","title":"Магнитные големы","experience":57,"health":28,"canFly":false,"newYear":false,"enTitle":"Lodestone golems"},{"name":"megogachi","title":"Магоги","experience":16,"health":13,"canFly":false,"newYear":false,"imageName":"magog","enTitle":"Magogs"},{"name":"raremamont","title":"Мамонты","experience":160,"health":110,"canFly":false,"newYear":false,"enTitle":"Mammoths","imageName":"mamont"},{"name":"manticore","title":"Мантикоры","experience":130,"health":80,"canFly":true,"newYear":false,"enTitle":"Manticores"},{"name":"skirmesher","title":"Мастера копья","experience":17,"health":12,"canFly":false,"newYear":false,"enTitle":"Master spearmen"},{"name":"masterhunter","title":"Мастера лука","experience":42,"health":14,"canFly":false,"newYear":false,"imageName":"hunterelf","enTitle":"Grandmaster bowmen"},{"name":"negro","title":"Матросы-чужеземцы","experience":24,"health":17,"canFly":false,"newYear":false,"enTitle":"Sailors-strangers"},{"name":"bloodsister","title":"Мегеры","experience":49,"health":24,"canFly":false,"newYear":false,"enTitle":"Termagants"},{"name":"bear","title":"Медведи","experience":22,"health":22,"canFly":false,"newYear":false,"enTitle":"Bears"},{"name":"medusa","title":"Медузы","experience":45,"health":25,"canFly":false,"newYear":false,"enTitle":"Medusas"},{"name":"medusaup","title":"Медузы королевы","experience":55,"health":30,"canFly":false,"newYear":false,"enTitle":"Medusas Queens"},{"name":"spearwielder","title":"Метатели копья","experience":11,"health":10,"canFly":false,"newYear":false,"enTitle":"Spearmen"},{"name":"minotaur","title":"Минотавры","experience":39,"health":31,"canFly":false,"newYear":false,"enTitle":"Tamed minotaurs"},{"name":"minotaurguard","title":"Минотавры-стражи","experience":56,"health":35,"canFly":false,"newYear":false,"imageName":"minotaurguard_","enTitle":"Minotaur soldiers"},{"name":"taskmaster","title":"Минотавры-надсмотрщики","experience":56,"health":40,"canFly":false,"newYear":false,"enTitle":"Minotaur gladiators"},{"name":"dgolemup","title":"Могильные големы","experience":400,"health":400,"canFly":false,"newYear":false,"enTitle":"Sepulcher golems"},{"name":"cbal","title":"Мобильные баллисты","experience":100,"health":65,"canFly":false,"newYear":false,"enTitle":"Mobile ballista"},{"name":"gnomon","title":"Молотобойцы","experience":12,"health":9,"canFly":false,"newYear":false,"enTitle":"Warhammerers"},{"name":"priest","title":"Монахи","experience":101,"health":54,"canFly":false,"newYear":false,"enTitle":"Monks"},{"name":"piratemonster","title":"Морские дьяволы","experience":300,"health":190,"canFly":false,"newYear":false,"enTitle":"Sailors` devil"},{"name":"seamonster","title":"Морские черти","experience":120,"health":90,"canFly":false,"newYear":false,"enTitle":"Anglerfish"},{"name":"mummy","title":"Мумии","experience":115,"health":50,"canFly":false,"newYear":false,"enTitle":"Mummies"},{"name":"pharaoh","title":"Мумии фараонов","experience":135,"health":70,"canFly":false,"newYear":false,"enTitle":"Sphynx mummies"},{"name":"enforcer","title":"Мятежники","experience":10,"health":7,"canFly":false,"newYear":false,"enTitle":"Rebels"},{"name":"naga","title":"Наги","experience":160,"health":110,"canFly":false,"newYear":false,"enTitle":"Nagas"},{"name":"dromad","title":"Наездники на верблюдах","experience":60,"health":40,"canFly":false,"newYear":false,"enTitle":"Camel riders"},{"name":"wolfrider","title":"Наездники на волках","experience":20,"health":10,"canFly":false,"newYear":false,"enTitle":"Wolf Riders"},{"name":"hyenarider","title":"Наездники на гиенах","experience":31,"health":13,"canFly":false,"newYear":false,"enTitle":"Hyena riders"},{"name":"boarrider","title":"Наездники на кабанах","experience":31,"health":14,"canFly":false,"newYear":false,"enTitle":"Boar riders"},{"name":"bearrider","title":"Наездники на медведях","experience":24,"health":25,"canFly":false,"newYear":false,"enTitle":"Dwarven ursary"},{"name":"darkrider","title":"Наездники на ящерах","experience":65,"health":40,"canFly":false,"newYear":false,"imageName":"lizardrider","enTitle":"Lizard cavalry"},{"name":"dromadup","title":"Налетчики на верблюдах","experience":70,"health":45,"canFly":false,"newYear":false,"enTitle":"Camel raiders"},{"name":"wolfraider","title":"Налётчики на волках","experience":31,"health":12,"canFly":false,"newYear":false,"imageName":"hobwolfrider","enTitle":"Wolf Raiders"},{"name":"reptiloid","title":"Никсы","experience":110,"health":80,"canFly":false,"newYear":false,"enTitle":"Nixes"},{"name":"reptiloidup","title":"Никсы-воины","experience":180,"health":90,"canFly":false,"newYear":false,"enTitle":"Nix warriors"},{"name":"dryad","title":"Нимфы","experience":20,"health":6,"canFly":true,"newYear":false,"imageName":"dryad_","enTitle":"Dryads"},{"name":"obsgargoyle","title":"Обсидиановые горгульи","experience":26,"health":20,"canFly":true,"newYear":false,"imageName":"obsgargoly","enTitle":"Enchanted gargoyles"},{"name":"hotdog","title":"Огненные гончие","experience":36,"health":15,"canFly":false,"newYear":false,"imageName":"firehound","enTitle":"Blazing hounds"},{"name":"hornedoverseer","title":"Огненные демоны","experience":23,"health":13,"canFly":false,"newYear":false,"imageName":"fdemon","enTitle":"Incendiaries"},{"name":"firedragon","title":"Огненные драконы","experience":255,"health":230,"canFly":false,"newYear":false,"enTitle":"Lava dragons"},{"name":"firebird","title":"Огненные птицы","experience":117,"health":65,"canFly":true,"newYear":false,"imageName":"firebird_","enTitle":"Firebirds"},{"name":"fire","title":"Огненные элементали","experience":60,"health":43,"canFly":false,"newYear":false,"enTitle":"Fire elementals"},{"name":"ogre","title":"Огры","experience":60,"health":50,"canFly":false,"newYear":false,"enTitle":"Ogres"},{"name":"ogrebrutal","title":"Огры-ветераны","experience":75,"health":70,"canFly":false,"newYear":false,"enTitle":"Ogre trophy-hunters"},{"name":"ogremagi","title":"Огры-маги","experience":74,"health":65,"canFly":false,"newYear":false,"enTitle":"Ogre magi"},{"name":"ogreshaman","title":"Огры-шаманы","experience":74,"health":55,"canFly":false,"newYear":false,"enTitle":"Ogre shamans"},{"name":"fatpirateup","title":"Одноглазые пираты","experience":190,"health":120,"canFly":false,"newYear":false,"enTitle":"One-eyed pirates"},{"name":"conscript","title":"Ополченцы","experience":7,"health":6,"canFly":false,"newYear":false,"enTitle":"Recruits"},{"name":"orc","title":"Орки","experience":29,"health":12,"canFly":false,"newYear":false,"enTitle":"Orcs"},{"name":"orcchief","title":"Орки-вожди","experience":38,"health":18,"canFly":false,"newYear":false,"enTitle":"Orc chiefs"},{"name":"orcrubak","title":"Орки-тираны","experience":38,"health":20,"canFly":false,"newYear":false,"enTitle":"Orc tyrants"},{"name":"orcshaman","title":"Орки-шаманы","experience":33,"health":13,"canFly":false,"newYear":false,"enTitle":"Orc shamans"},{"name":"paladin","title":"Паладины","experience":262,"health":100,"canFly":false,"newYear":false,"enTitle":"Paladins"},{"name":"executioner","title":"Палачи","experience":83,"health":40,"canFly":false,"newYear":false,"enTitle":"Warlords"},{"name":"spider","title":"Пауки","experience":15,"health":9,"canFly":false,"newYear":false,"enTitle":"Spiders"},{"name":"footman","title":"Пехотинцы","experience":17,"health":16,"canFly":false,"newYear":false,"enTitle":"Swordsmen"},{"name":"pitlord","title":"Пещерные владыки","experience":195,"health":120,"canFly":false,"newYear":false,"imageName":"pitlord_","enTitle":"Pit demons"},{"name":"deephydra","title":"Пещерные гидры","experience":115,"health":125,"canFly":false,"newYear":false,"enTitle":"Ladons"},{"name":"pitfiend","title":"Пещерные демоны","experience":157,"health":110,"canFly":false,"newYear":false,"imageName":"pitfiend_","enTitle":"Cave demons"},{"name":"pity","title":"Пещерные отродья","experience":165,"health":140,"canFly":false,"newYear":false,"imageName":"pitspawn","enTitle":"Abyss demons"},{"name":"piratka","title":"Пиратки","experience":20,"health":10,"canFly":false,"newYear":false,"enTitle":"Women pirates"},{"name":"zpirate","title":"Пираты зомби","experience":200,"health":150,"canFly":false,"newYear":false,"enTitle":"Zombie pirates"},{"name":"piratemonsterup","title":"Пираты Ктулху","experience":350,"health":200,"canFly":false,"newYear":false,"enTitle":"Pirates of Cthulhu"},{"name":"piroman","title":"Пироманьяки","experience":10,"health":20,"canFly":false,"newYear":false,"enTitle":"Pyromaniacs"},{"name":"hungerplant","title":"Пожиратели плоти","experience":130,"health":70,"canFly":false,"newYear":false,"enTitle":"Flesh-eating trees"},{"name":"ghost","title":"Привидения","experience":26,"health":8,"canFly":true,"newYear":false,"enTitle":"Ghosts"},{"name":"spearthrower","title":"Прибрежные налётчики","experience":10,"health":19,"canFly":false,"newYear":false,"enTitle":"Coastal raiders","imageName":"jpirate"},{"name":"spectre","title":"Призраки","experience":27,"health":19,"canFly":true,"newYear":false,"enTitle":"Apparitions"},{"name":"gpiratka","title":"Призраки пираток","experience":17,"health":8,"canFly":true,"newYear":false,"enTitle":"Ghosts of pirates"},{"name":"spectraldragon","title":"Призрачные драконы","experience":310,"health":160,"canFly":true,"newYear":false,"enTitle":"Shadow dragons"},{"name":"rakshasa_rani","title":"Принцессы ракшас","experience":155,"health":120,"canFly":false,"newYear":false,"imageName":"rakshas","enTitle":"Sphynx guardians"},{"name":"briskrider","title":"Проворные наездники","experience":94,"health":50,"canFly":false,"newYear":false,"enTitle":"Lizard chargers"},{"name":"cursedbehemoth","title":"Проклятые бегемоты","experience":400,"health":250,"canFly":false,"newYear":false,"imageName":"dbehemoth","enTitle":"Cursed behemoths"},{"name":"predator","title":"Проклятые горгульи","experience":25,"health":35,"canFly":true,"newYear":false,"imageName":"hgarg","enTitle":"Cursed Gargoyles"},{"name":"cursedent","title":"Проклятые энты","experience":250,"health":215,"canFly":false,"newYear":false,"enTitle":"Cursed treefolk"},{"name":"thunderbird","title":"Птицы грома","experience":115,"health":65,"canFly":true,"newYear":false,"enTitle":"Thunderbirds"},{"name":"darkbird","title":"Птицы тьмы","experience":120,"health":60,"canFly":true,"newYear":false,"enTitle":"Dark rocs"},{"name":"vulture","title":"Пустынные налетчики","experience":50,"health":40,"canFly":true,"newYear":false,"enTitle":"Desert Raiders"},{"name":"duneraider","title":"Пустынные рейдеры","experience":22,"health":12,"canFly":false,"newYear":false,"enTitle":"Dune raiders"},{"name":"duneraiderup","title":"Пустынные убийцы","experience":24,"health":12,"canFly":false,"newYear":false,"enTitle":"Dune assassins"},{"name":"rakshasa_raja","title":"Раджи ракшас","experience":160,"health":140,"canFly":false,"newYear":false,"enTitle":"Sphynx warriors"},{"name":"tombraider","title":"Расхитители могил","experience":14,"health":10,"canFly":false,"newYear":false,"enTitle":"Grave raiders"},{"name":"gladiator","title":"Ретиарии","experience":12,"health":25,"canFly":false,"newYear":false,"enTitle":"Retiarius"},{"name":"horneddemon","title":"Рогатые демоны","experience":14,"health":13,"canFly":false,"newYear":false,"imageName":"hdemon","enTitle":"Demons"},{"name":"rapukk","title":"Рогатые жнецы","experience":200,"health":99,"canFly":false,"newYear":false,"enTitle":"Horned reapers"},{"name":"rocbird","title":"Роки","experience":104,"health":55,"canFly":true,"newYear":false,"imageName":"roc","enTitle":"Rocs"},{"name":"brigand","title":"Рубаки","experience":6,"health":5,"canFly":false,"newYear":false,"enTitle":"Vagabonds"},{"name":"cavalier","title":"Рыцари","experience":232,"health":90,"canFly":false,"newYear":false,"imageName":"knight","enTitle":"Cavalry"},{"name":"deadknight","title":"Рыцари смерти","experience":190,"health":100,"canFly":false,"newYear":false,"enTitle":"Unholy knights"},{"name":"blackknight","title":"Рыцари тьмы","experience":160,"health":90,"canFly":false,"newYear":false,"enTitle":"Black knights"},{"name":"pristineunicorn","title":"Светлые единороги","experience":135,"health":80,"canFly":false,"newYear":false,"enTitle":"Pristine Unicorns"},{"name":"dbehemoth","title":"Свирепые бегемоты","experience":410,"health":280,"canFly":false,"newYear":false,"enTitle":"Infuriated behemoths"},{"name":"untamedcyc","title":"Свободные циклопы","experience":700,"health":225,"canFly":false,"newYear":false,"enTitle":"Unfettered cyclops"},{"name":"scarabup","title":"Священные скарабеи","experience":11,"health":6,"canFly":true,"newYear":false,"enTitle":"Sacred scarabs"},{"name":"whitebearrider","title":"Северные наездники","experience":36,"health":30,"canFly":false,"newYear":false,"enTitle":"Rearguard ursary"},{"name":"spegasus","title":"Серебряные пегасы","experience":50,"health":30,"canFly":true,"newYear":false,"enTitle":"Silver pegasus"},{"name":"kachok","title":"Силачи","enTitle":"Strongmen","experience":20,"health":50,"canFly":false,"newYear":false},{"name":"siren","title":"Сирены","experience":60,"health":20,"canFly":false,"newYear":false,"enTitle":"Sirens"},{"name":"upsiren","title":"Сирены-искусительницы","experience":70,"health":24,"canFly":false,"newYear":false,"enTitle":"Seducing sirens"},{"name":"scarab","title":"Скарабеи","experience":10,"health":6,"canFly":true,"newYear":false,"enTitle":"Scarabs"},{"name":"skeleton","title":"Скелеты","experience":6,"health":4,"canFly":false,"newYear":false,"imageName":"sceleton","enTitle":"Skeletons"},{"name":"skmarksman","title":"Скелеты-арбалетчики","experience":12,"health":6,"canFly":false,"newYear":false,"enTitle":"Skeletal crossbowmen"},{"name":"sceletonwar","title":"Скелеты-воины","experience":10,"health":5,"canFly":false,"newYear":false,"enTitle":"Skeletal legionnaires"},{"name":"skeletonpirateup","title":"Скелеты-корсары","experience":10,"health":4,"canFly":false,"newYear":false,"enTitle":"Skeletal corsairs","imageName":"dpirateup"},{"name":"cpirate","title":"Скелеты-моряки","experience":6,"health":4,"canFly":false,"newYear":false,"enTitle":"Skeleton sailor"},{"name":"skeletonarcher","title":"Скелеты-лучники","experience":10,"health":4,"canFly":false,"newYear":false,"imageName":"sceletonarcher","enTitle":"Skeletal bowmen"},{"name":"skeletonpirate","title":"Скелеты-пираты","experience":7,"health":4,"canFly":false,"newYear":false,"enTitle":"Skeletal pirates","imageName":"dpirate"},{"name":"manticoreup","title":"Скорпикоры","experience":140,"health":80,"canFly":true,"newYear":false,"enTitle":"Scorpicores"},{"name":"scorp","title":"Скорпионы","experience":6,"health":4,"canFly":false,"newYear":false,"enTitle":"Scorpions"},{"name":"anubis","title":"Слуги Анубиса","experience":350,"health":160,"canFly":false,"newYear":false,"enTitle":"Anubis avatars"},{"name":"krokodil","title":"Служители оазисов","experience":110,"health":70,"canFly":false,"newYear":false,"enTitle":"Oasis acolytes"},{"name":"chuvak","title":"Снежные воины","experience":35,"health":27,"canFly":false,"newYear":false,"enTitle":"Snow warriors"},{"name":"snowwolf","title":"Снежные волки","experience":70,"health":50,"canFly":false,"newYear":false,"enTitle":"Snow wolves"},{"name":"steelgolem","title":"Стальные големы","experience":54,"health":24,"canFly":false,"newYear":false,"enTitle":"Modern golems"},{"name":"runepatriarch","title":"Старейшины рун","experience":100,"health":70,"canFly":false,"newYear":false,"enTitle":"Patriarchs"},{"name":"mastergremlin","title":"Старшие гремлины","experience":9,"health":6,"canFly":false,"newYear":false,"enTitle":"Gremlin engineers"},{"name":"jdemon","title":"Старшие демоны","experience":20,"health":13,"canFly":false,"newYear":false,"enTitle":"Fiends"},{"name":"ddhigh","title":"Старшие друиды","experience":101,"health":34,"canFly":false,"newYear":false,"enTitle":"High Druids"},{"name":"mauler","title":"Степные бойцы","experience":23,"health":12,"canFly":false,"newYear":false,"enTitle":"Enforcers"},{"name":"warrior","title":"Степные воины","experience":21,"health":12,"canFly":false,"newYear":false,"enTitle":"Invaders"},{"name":"swolf","title":"Степные волки","experience":20,"health":25,"canFly":false,"newYear":false,"enTitle":"Plains wolves"},{"name":"goblinus","title":"Степные гоблины","experience":5,"health":3,"canFly":false,"newYear":false,"enTitle":"Tribal goblins"},{"name":"cyclopus","title":"Степные циклопы","experience":390,"health":220,"canFly":false,"newYear":false,"enTitle":"Tribal cyclops"},{"name":"elgargoly","title":"Стихийные горгульи","experience":25,"health":16,"canFly":true,"newYear":false,"enTitle":"Grotesques"},{"name":"crossman","title":"Стрелки","experience":16,"health":8,"canFly":false,"newYear":false,"imageName":"crossbowman","enTitle":"Wardens"},{"name":"mercarcher","title":"Стрелки-наёмники","experience":15,"health":8,"canFly":false,"newYear":false,"enTitle":"Mercenary archers"},{"name":"succubus","title":"Суккубы","experience":61,"health":20,"canFly":false,"newYear":false,"imageName":"succub","enTitle":"Succubi"},{"name":"shadow_witch","title":"Сумеречные ведьмы","experience":157,"health":80,"canFly":false,"newYear":false,"imageName":"witch","enTitle":"Dark witches"},{"name":"shadowdragon","title":"Сумеречные драконы","experience":350,"health":200,"canFly":true,"newYear":false,"enTitle":"Twilight dragons"},{"name":"wdancer","title":"Танцующие с ветром","experience":33,"health":14,"canFly":false,"newYear":false,"imageName":"winddancer","enTitle":"Forest brethren"},{"name":"dancer","title":"Танцующие с клинками","experience":20,"health":12,"canFly":false,"newYear":false,"enTitle":"Forest keepers"},{"name":"wardancer","title":"Танцующие со смертью","experience":33,"health":12,"canFly":false,"newYear":false,"imageName":"bladedancer","enTitle":"Elite forest keepers"},{"name":"thane","title":"Таны","experience":131,"health":100,"canFly":false,"newYear":false,"enTitle":"Dreadbanes"},{"name":"foulwyvern","title":"Тёмные виверны","experience":195,"health":105,"canFly":true,"newYear":false,"enTitle":"Venomous wyverns"},{"name":"grimrider","title":"Тёмные всадники","experience":94,"health":50,"canFly":false,"newYear":false,"enTitle":"Lizard assailants"},{"name":"foulhydra","title":"Тёмные гидры","experience":115,"health":125,"canFly":false,"newYear":false,"enTitle":"Foul hydras"},{"name":"burbuly","title":"Тёмные горгульи","experience":21,"health":30,"canFly":true,"newYear":false,"enTitle":"Dark Gargoyles"},{"name":"titan","title":"Титаны","experience":400,"health":190,"canFly":false,"newYear":false,"enTitle":"Titans"},{"name":"stormtitan","title":"Титаны шторма","experience":400,"health":190,"canFly":false,"newYear":false,"enTitle":"Stormcallers"},{"name":"fatpirate","title":"Толстяки","experience":180,"health":100,"canFly":false,"newYear":false,"enTitle":"Fatso"},{"name":"troglodyte","title":"Троглодиты","experience":5,"health":5,"canFly":false,"newYear":false,"enTitle":"Troglodytes"},{"name":"troll","title":"Тролли","experience":150,"health":150,"canFly":false,"newYear":false,"enTitle":"Trolls"},{"name":"tengu","title":"Тэнгу","experience":100,"health":45,"canFly":true,"newYear":false,"enTitle":"Tengu"},{"name":"slayer","title":"Убийцы","experience":70,"health":34,"canFly":false,"newYear":false,"enTitle":"Commanders"},{"name":"verblud","title":"Угонщики верблюдов","experience":55,"health":35,"canFly":false,"newYear":false,"enTitle":"Camel thieves"},{"name":"wight","title":"Умертвия","experience":165,"health":95,"canFly":false,"newYear":false,"enTitle":"Death envoys"},{"name":"pixel","title":"Феи","experience":12,"health":5,"canFly":true,"newYear":false,"imageName":"pp","enTitle":"Faeries"},{"name":"phoenix","title":"Фениксы","experience":600,"health":777,"canFly":true,"newYear":false,"enTitle":"Phoenixes"},{"name":"shootpirateup","title":"Флибустьеры","experience":75,"health":18,"canFly":false,"newYear":false,"enTitle":"Flibustiers"},{"name":"fury","title":"Фурии","experience":49,"health":16,"canFly":false,"newYear":false,"enTitle":"Shrews"},{"name":"plant","title":"Хищные растения","experience":92,"health":60,"canFly":false,"newYear":false,"enTitle":"Waspworts"},{"name":"hobbit","title":"Хоббиты","experience":8,"health":4,"canFly":false,"newYear":false,"enTitle":"Hobbits"},{"name":"hobgoblin","title":"Хобгоблины","experience":9,"health":4,"canFly":false,"newYear":false,"enTitle":"Hobgoblins"},{"name":"blackbearrider","title":"Хозяева медведей","experience":36,"health":30,"canFly":false,"newYear":false,"enTitle":"Frontier ursary"},{"name":"mistress","title":"Хозяйки ночи","experience":185,"health":100,"canFly":false,"newYear":false,"enTitle":"Shadow mistresses"},{"name":"cerberus","title":"Церберы","experience":41,"health":15,"canFly":false,"newYear":false,"enTitle":"Cerberi"},{"name":"cyclop","title":"Циклопы","experience":172,"health":85,"canFly":false,"newYear":false,"enTitle":"Cyclops"},{"name":"cyclopod","title":"Циклопы-генералы","experience":187,"health":100,"canFly":false,"newYear":false,"imageName":"cyclopod_","enTitle":"Cyclop generals"},{"name":"cyclopking","title":"Циклопы-короли","experience":182,"health":95,"canFly":false,"newYear":false,"enTitle":"Cyclop kings"},{"name":"shamancyclop","title":"Циклопы-шаманы","experience":190,"health":105,"canFly":false,"newYear":false,"imageName":"cyclopshaman","enTitle":"Cyclops shamans"},{"name":"mercwizard","title":"Чародеи-наёмники","experience":35,"health":36,"canFly":false,"newYear":false,"enTitle":"Mercenary sorcerers"},{"name":"champion","title":"Чемпионы","experience":252,"health":100,"canFly":false,"newYear":false,"enTitle":"Chargers"},{"name":"blackwidow","title":"Черные вдовы","experience":40,"health":14,"canFly":false,"newYear":false,"enTitle":"Black widows"},{"name":"scorpup","title":"Черные скорпионы","experience":9,"health":5,"canFly":false,"newYear":false,"enTitle":"Black scorpions"},{"name":"blacktroll","title":"Черные тролли","experience":180,"health":180,"canFly":false,"newYear":false,"enTitle":"Crazed trolls"},{"name":"familiar","title":"Черти","experience":10,"health":6,"canFly":false,"newYear":false,"enTitle":"Spawns"},{"name":"blackdragon","title":"Чёрные драконы","experience":400,"health":240,"canFly":true,"newYear":false,"enTitle":"Black dragons"},{"name":"plaguezombie","title":"Чумные зомби","experience":15,"health":17,"canFly":false,"newYear":false,"enTitle":"Infected zombies"},{"name":"shakal","title":"Шакалы","experience":30,"health":24,"canFly":false,"newYear":false,"enTitle":"Jackals"},{"name":"shakalup","title":"Шакалы-воины","experience":45,"health":30,"canFly":false,"newYear":false,"enTitle":"Jackals-warriors"},{"name":"shamaness","title":"Шаманки","experience":66,"health":30,"canFly":false,"newYear":false,"enTitle":"Shamans"},{"name":"banditkaup","title":"Шпионки","experience":14,"health":9,"canFly":false,"newYear":false,"enTitle":"Spies"},{"name":"battlegriffon","title":"Штурмовые грифоны","experience":62,"health":52,"canFly":true,"newYear":false,"enTitle":"Wild griffins"},{"name":"slonup","title":"Штурмовые слоны","experience":150,"health":110,"canFly":false,"newYear":false,"enTitle":"Assault elephants"},{"name":"elf","title":"Эльфийские лучники","experience":38,"health":10,"canFly":false,"newYear":false,"enTitle":"Elven bowmen"},{"name":"treant","title":"Энты","experience":187,"health":175,"canFly":false,"newYear":false,"enTitle":"Treefolk","imageName":"ent"},{"name":"spiderpois","title":"Ядовитые пауки","experience":30,"health":14,"canFly":false,"newYear":false,"enTitle":"Venomous spiders"},{"name":"tenguup","title":"Ямабуси Тэнгу","experience":100,"health":60,"canFly":true,"newYear":false,"enTitle":"Yamabushi Tengu"},{"name":"flamelord","title":"Ярлы","experience":162,"health":120,"canFly":false,"newYear":false,"enTitle":"Punishers"},{"name":"evilbunny2023","title":"Злой кроля 2023","experience":130,"health":123,"canFly":false,"newYear":true,"enTitle":"Evil rabbit 2023"},{"name":"evilcat2023","title":"Злой котик 2023","experience":45,"health":23,"canFly":false,"newYear":true,"enTitle":"Evil cat 2023"},{"name":"eviltiger2022","title":"Злой тигр 2022","experience":100,"health":122,"canFly":false,"newYear":true,"enTitle":"Furious Tiger 2022"},{"name":"bull2021","title":"Злой бык 2021","experience":69,"health":71,"canFly":false,"newYear":true,"enTitle":"Ox 2021","imageName":"byk2"},{"name":"rat2020","title":"Злая крыса 2020","experience":20,"health":20,"canFly":false,"newYear":true,"enTitle":"Rat 2020"},{"name":"pig2019","title":"Свин 2019","experience":16,"health":19,"canFly":false,"newYear":true,"enTitle":"Pig 2019","imageName":"evilpig"},{"name":"evildog","title":"Злой пёс 2018","experience":100,"health":88,"canFly":false,"newYear":true,"enTitle":"Evil Dog 2018"},{"name":"rooster","title":"Злой Петушок 2017","experience":60,"health":77,"canFly":true,"newYear":true,"enTitle":"Evil Rooster 2017"},{"name":"gorilla","title":"Злая Обезьяна 2016","experience":40,"health":66,"canFly":false,"newYear":true,"enTitle":"Evil Monkey 2016"},{"name":"kozel","title":"Злой Козел 2015","experience":35,"health":55,"canFly":false,"newYear":true,"enTitle":"Evil Goat 2015"},{"name":"evilhorse","title":"Злая Лошадь 2014","experience":45,"health":84,"canFly":false,"newYear":true,"enTitle":"Mad horse 2014"},{"name":"evilsnake","title":"Злая Змея 2013","experience":45,"health":73,"canFly":false,"newYear":true,"enTitle":"Mad snake 2013"},{"name":"ppirateup","title":"Одноногие пираты","experience":55,"health":30,"canFly":false,"newYear":false,"enTitle":"One-legged pirates"}
    ,{"name":"pikeman","title":"Копейщики","experience":15,"health":15,"canFly":false,"newYear":false,"enTitle":"Pikemen"}
    ,{"name":"snowmonster","title":"Снежные монстры","experience":400,"health":350,"canFly":false,"newYear":false,"enTitle":"Snow monsters"}
    ,{"name":"drowned","title":"Утопленники","experience":20,"health":16,"canFly":false,"newYear":false,"enTitle":"Drowned men"}
    ,{"name":"reanimator","title":"Реаниматоры","experience":40,"health":27,"canFly":false,"newYear":false,"enTitle":"Reanimators"}
    ,{"name":"pushkarup","title":"Обречённые бомбардиры","experience":208,"health":76,"canFly":false,"newYear":false,"enTitle":"Doomed bombers",imageFullName:"pushkarupanip40"}
    ,{"name":"poacher","title":"Браконьеры","experience":33,"health":16,"canFly":false,"newYear":false,"enTitle":"Poachers"}
    ,{"name":"gnomka","title":"Жрицы огня","experience":70,"health":40,"canFly":false,"newYear":false,"enTitle":"Priestesses of fire"}
    ,{"name":"maroder","title":"Мародёры","experience":10,"health":7,"canFly":false,"newYear":false,"enTitle":"Marauders"}
    ,{"name":"ppirate","title":"Морские волки","experience":45,"health":25,"canFly":false,"newYear":false,"enTitle":"Sea wolves"}
    ];
    // let monsterData = Object.keys(mob_rus_exp).reduce((t, x, i) => [...t, `{ id: ${i + 1}, name: '${mob_rus_exp[x][2]}', title: isEn ? '${x}' : '${x}', experience: ${mob_rus_exp[x][0]}, health: ${mob_rus_exp[x][1]}, canFly: ${mob_rus_exp[x][3] == 1 ? 'true' : 'false'} }`], []);
    // let monsterData = monstersTemplate.reduce((t, x, i) => [...t, `{ name: '${x.name}', title: "${x.title}", experience: ${x.experience}, health: ${x.health}, canFly: ${x.canFly}, newYear: false }`], []);
    // console.log(`[${monsterData.join(", ")}]`);
    if(oldMonsters) {
        //console.log(oldMonsters)
        oldMonsters.forEach(x => { let found = monstersTemplate.find(y => y.name == x.name); if(found) { found.wanted = x.wanted ? true : false; } })
    }
    setValue("monsters", JSON.stringify(monstersTemplate));
    setValue("monstersVersion", GM_info.script.version);
}
const monsters = JSON.parse(getValue("monsters"));
monsters.sort(sortBy(isEn ? "enTitle" : "title"));
var warlogProcessing = false;
var terminateProcess = false;

main();
function main() {
    if(location.pathname == "/mercenary_guild.php") {
        const tasksPanel = document.querySelector("body > center > table table td[rowspan='2']");

        const warStatistics = JSON.parse(getValue(`WarStatistics${PlayerId}`, "{}"));
        const warlogScanned = warStatistics.minWarId > 0 && warStatistics.firstWarId == warStatistics.minWarId;

        //const refreshRef = Array.from(document.querySelectorAll("a[href='/mercenary_guild.php']")).find(x => x.innerText == (isEn ? "Refresh" : "Обновить"));
        const getWarsStatisticsName = warlogScanned ? (isEn ? "Append war statistics" : "Пополнить боевую статистику") : (isEn ? "Get war statistics" : "Получить боевую статистику");
        const getWarsStatistics = addElement("input", { id: "getWarsStatistics", style: "border: none; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: #592c08; font-family: verdana,geneva,arial cyr; position: relative; text-align: center; font-weight: 700; background: url(../i/homeico/art_btn_bg_gold.png) #dab761; background-size: auto; background-size: 100% 100%; border-radius: 5px; box-shadow: inset 0 0 0 1px #fce6b0,inset 0 0 0 2px #a78750,0 0 0 1px rgba(0,0,0,.13); line-height: 25px; cursor: pointer; transition: -webkit-filter .15s; transition: filter .15s;", type: "button", value: getWarsStatisticsName }, tasksPanel);
        getWarsStatistics.addEventListener("click", function(e) { readWarlog(e); });
        const clearWarsStatisticsButton = addElement("input", { id: "clearWarsStatisticsButton", style: "border: none; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: #592c08; font-family: verdana,geneva,arial cyr; position: relative; text-align: center; font-weight: 700; background: url(../i/homeico/art_btn_bg_gold.png) #dab761; background-size: auto; background-size: 100% 100%; border-radius: 5px; box-shadow: inset 0 0 0 1px #fce6b0,inset 0 0 0 2px #a78750,0 0 0 1px rgba(0,0,0,.13); line-height: 25px; cursor: pointer; transition: -webkit-filter .15s; transition: filter .15s;", type: "button", value: isEn ? "Clear statistics" : "Очистить статистику" }, tasksPanel);
        clearWarsStatisticsButton.addEventListener("click", clearWarsStatistics);
        
        if(tasksPanel) {
            const enemies = tasksPanel.querySelectorAll("b");
            for(const enemy of enemies) {
                const enemyExec = /(.+) {(\d+)}/.exec(enemy.innerText);
                if(enemyExec) {
                    const enemyName = enemyExec[1];
                    const enemyLevel = enemyExec[2];
                    // История
                    const historyContainer = addElement("div", { id: `historyContainer${enemyName}`, style: "display: none;" }, enemy, "afterend");
                    const wars = restoreWars(enemyName, PlayerId); // JSON.parse(getPlayerValue(enemyName, "[]")).map(x => JSON.parse(x));
                    //console.log(wars);
                    if(wars.length > 0) {
                        //console.log(getPlayerValue(enemyName, "[]"));
                        for(const war of wars) {
                            historyContainer.insertAdjacentHTML("beforeend", `<div><a href="/warlog.php?warid=${war.id}" target="_blank">${war.isWin ? "<b>" : ""}${war.date.substr(0, 16).replace("T", " ")} <span title="${isEn ? "Player level" : "Уровень игрока"}">(${war.playerLevel})</span> {${war.enemyLevel}}${war.isWin ? "</b>" : ""}</a></div>`);
                        }
                        const historyToggler = addElement("div", { title: isEn ? "History" : "История", style: "display: inline-block; cursor: pointer;", innerHTML: `<img spoiled="true" src="https://dcdn.heroeswm.ru/i/inv_im/btn_expand.svg" style="vertical-align: middle;">` }, enemy, "afterend");
                        historyToggler.addEventListener("click", function(e) {
                            const historyContainer = document.getElementById(`historyContainer${enemyName}`);
                            historyContainer.style.display = (historyContainer.style.display == "none" ? "block" : "none");
                            e.target.setAttribute("spoiled", !(e.target.getAttribute("spoiled") == "true"));
                            e.target.style.transform = e.target.getAttribute("spoiled") == "true" ? 'rotate(0deg)' : 'rotate(90deg)';
                        });
                    }
                }
            }
        }
    }
    createSettingsCaller();
    const settingsButtonContainer = document.querySelector("div#hwm_map_objects_and_buttons");
    observe(settingsButtonContainer, createSettingsCaller);
    applyGreenPeace();
    if(!getPlayerBool("hideHunts")) {
        Array.from(document.querySelectorAll("tr > td[colspan*='2']")).filter(x => x.innerHTML == (isEn ? "You are already in a challenge!" : "Вы уже в заявке!")).forEach(x => { x.align = 'right'; x.innerHTML = `<a href="map.php?action=skip">${isEn ? "Skip" : "Пройти мимо"}</a>`; }); //добавить ссылку на пропуск охот, если стоишь в заявке на бой или карточную игру
        if(getPlayerBool("show_archive")) {
            for(const ref of document.querySelectorAll("div > a[href*='mid=']")) {
                const s = ref.href.split('&mid');
                ref.insertAdjacentHTML("afterEnd", `<br><a href="${s[0]}&show_archive=1&mid${s[1]}" target=_blanc><img border="0" title="${isEn ? "Archive record before 2015-03-01" : "Рекорд из архива (до 01.03.2015"}" src="http://dcdn.heroeswm.ru/i/s_knowledge.gif"></a>`); //добавить ссылку на рекорд из архива
            }
        }
        transformMapHunts();
    }
    huntHelpers();
    Array.from(document.querySelectorAll("a[href*='group_wars.php']")).forEach(x => x.href = x.href.replace("group_wars.php", "group_wars.php?filter=hunt")); //заменяет ссылку в групповые бои на такую же с выделением свободных охот
    if(location.pathname == "/plstats_hunters.php") {
        // const monstersInfo = Array.from(document.querySelectorAll("a[href^='army_info.php?name=']")).map(x => ({ name: getUrlParamValue(x.href, "name"), title: x.innerText }));
        // console.log(monstersInfo.filter(x => !monsters.map(y => y.name).includes(x.name)));
        
        // monsters.forEach(x => {
            // const monsterInfo = monstersInfo.find(y => y.name == x.name);
            // if(isEn && monsterInfo) {
                // x.enTitle = monsterInfo.title;
            // }
        // })
        // monsters.forEach(x => {
            // const monsterInfo = monstersInfo.find(y => y.title == x.title);
            // if(x.name != monsterInfo.name) {
                // x.imageName = x.name;
                // x.name = monsterInfo.name;
            // }
        // })
        //console.log(JSON.stringify(monsters));
        //console.log(monstersInfo.filter(x => !monsters.map(y => y.title).includes(x.title)));
        add_archive();
    }
}
function transformMapHunts() {
    if(location.pathname != '/map.php') {
        return;
    }
    const map_hunt_block_div = document.querySelector("div#map_hunt_block_div");
    if(map_hunt_block_div) {
        const lastChild = map_hunt_block_div.lastChild;
        if(lastChild.tagName?.toLowerCase() == "br") {
            lastChild.remove();
        }
    }
    const koef = parseFloat(getPlayerValue("koef_dop_exp", 1));
    const hunts = Array.from(document.querySelectorAll("div[id^=neut_right_block] > div:first-child > div:first-child")).map(x => {
        const armyRef = x.querySelector("a[href^='army_info.php?name=']");
        const name = getUrlParamValue(armyRef.href, "name");
        const amount = parseInt(x.querySelector("b").innerText.match(/(\d+)/)[1]);
        const title = armyRef.innerText;
        let gold = 0;
        const goldMatch = x.innerHTML.match(new RegExp(`(\\d+) ${isEn ? "gold" : "золота"}`));
        if(goldMatch) {
            gold = parseInt(goldMatch[1]);
        }
        let monster = monsters.find(x => x.name == name);
        if(!monster) {
            monster = { name: name, title: isEn ? "" : title, enTitle: isEn ? title : "", experience: 0, health: 0 };
            monsters.push(monster);
            setValue("monsters", JSON.stringify(monsters));
        } else {
            if(isEn) {
                if(!monster.enTitle) {
                    setMonsterProperty(name, "enTitle", title);
                }
            } else {
                if(!monster.title) {
                    setMonsterProperty(name, "title", title);
                }
            }
        }
        const fullExperience = Math.round(amount * monster.experience / 5);
        let experience = Math.min(fullExperience, PlayerLevel * 500);
        if(PlayerLevel > 2) { //Если опыт меньше нижней отсечки по уровню (3+ уровни)
            experience = Math.max(experience, PlayerLevel * 100);
        }
        experience = Math.round(experience * koef); // total_exp - опыт с учетом коэф. перекача

        const isHalfAmount = x.innerHTML.includes("[1/2]");
        let diamonds = x.innerHTML.includes("diamonds.png") ? 0.1 : 0;
        const diamondsMatch = new RegExp(isEn ? "([\\d\\.]+) diamond" : "([\\d\\.]+) бриллиант").exec(x.innerHTML);
        if(diamondsMatch) {
            diamonds = parseFloat(diamondsMatch[1]);
        }
        let guildPoints = 1;
        const guildPointsMacth = x.innerText.match(/\+([2,3,5])/);
        if(guildPointsMacth) {
            guildPoints = parseInt(guildPointsMacth[1]);
        }
        return { name: name, title: title, amount: amount, title: title, gold: gold, monster: monster, huntDescriptionPanel: x, fullExperience: fullExperience, experience: experience, isHalfAmount: isHalfAmount, diamonds: diamonds, guildPoints: guildPoints };
    });
    if(hunts.length == 0) {
        return;
    }
    console.log(hunts);
    document.title = isEn ? "Hunt found" : "Охота найдена";
    // Если находимся в режиме поиска, то пропускаем охоты, не отвечающие критериям поиска. В режиме поиска мы находимся, если включен хоть один критериев поиска.
    const isLookingFor = getPlayerBool("lookingForMarkedInList") && monsters.find(x => x.wanted) || Number(getPlayerValue("experienceLimit")) > 0 || getPlayerBool("lookingForHalfAmount") || getPlayerBool("lookingForDiamond") || getPlayerBool("lookingForFlying") || getPlayerBool("lookingForAdvancedGuildPoints");
    if(isLookingFor) {
        const found = hunts.find(isHuntMatch) ? true : false;
        if(!found) {
            const skipButton = document.querySelector(`div#map_hunt_block_div div[hint^='${isEn ? "Pass" : "Пройти"}']`);
            if(skipButton) {
                document.title = isEn ? "Hunt skipped" : "Охота пропущена";
                if(getPlayerBool("skipUnmatchedHunts")) {
                    skipButton.dispatchEvent(new MouseEvent('click')); //setTimeout(function() { window.location.href = location.protocol+'//'+location.hostname+'/'+'map.php?action=skip'; }, 2000);
                }
            }
        }
    }
    for(const hunt of hunts) {
        if(getPlayerBool("isShortHuntDescription")) {
            hunt.huntDescriptionPanel.innerHTML = `<a href="army_info.php?name=${hunt.name}">${hunt.title}</a> (${hunt.amount}${hunt.isHalfAmount ? "[1/2]" : ""}) ${isEn ? "guard" : "стерегут"}${hunt.gold > 0 ? ` ${hunt.gold} ${isEn ? "g." : "з."}`: ""}${hunt.diamonds > 0 ? ` ${hunt.diamonds} <img style="width: 16px; height: 16px; border: 0; vertical-align: middle;" title="${isEn ? "Diamonds" : "Бриллианты"}" src="https://dcdn.heroeswm.ru/i/r/48/diamonds.png">`: ""}`;
            hunt.huntDescriptionPanel.style.fontSize = "11px";
            if(hunt.guildPoints > 1) {
                hunt.huntDescriptionPanel.insertAdjacentHTML("beforeend", `<b>(+${hunt.guildPoints})</b>`);
            }
        }
        // История
        //correctWars(hunt.title); // Нужна только мне из-за первоначальных кривых данных
        const wars = restoreWars(hunt.title, PlayerId);//        const wars = JSON.parse(getPlayerValue(hunt.title, "[]")).map(x => JSON.parse(x));
        if(wars.length > 0) {
            const historyContainer = addElement("div", { id: `historyContainer${hunt.name}`, style: "display: none;" }, hunt.huntDescriptionPanel);
            //console.log(wars);
            for(const war of wars) {
                historyContainer.insertAdjacentHTML("beforeend", `<div><a href="/warlog.php?warid=${war.id}" target="_blank">${war.isWin ? "<b>" : ""}${war.date.substr(0, 16).replace("T", " ")} <span title="${isEn ? "Player level" : "Уровень игрока"}">(${war.playerLevel})</span> (${war.enemyLevel})${war.isWin ? "</b>" : ""}</a></div>`);
            }

            addElement("br", {}, hunt.huntDescriptionPanel.nextSibling);
            const historyToggler = addElement("div", { title: isEn ? "History" : "История", style: "display: inline-block; cursor: pointer;", innerHTML: `<img spoiled="true" src="https://dcdn.heroeswm.ru/i/inv_im/btn_expand.svg" style="vertical-align: middle;">` }, hunt.huntDescriptionPanel.nextSibling);
            historyToggler.addEventListener("click", function(e) {
                const historyContainer = document.getElementById(`historyContainer${hunt.name}`);
                historyContainer.style.display = (historyContainer.style.display == "none" ? "block" : "none");
                e.target.setAttribute("spoiled", !(e.target.getAttribute("spoiled") == "true"));
                e.target.style.transform = e.target.getAttribute("spoiled") == "true" ? 'rotate(0deg)' : 'rotate(90deg)';
            });
        }
        //

        const hp = getPlayerBool("showTotalMonstersHealth", true) ? ` <font style="font-size: 9px;color:#CD00CD">HP:<b>${hunt.monster.health * hunt.amount}</b></font>` : "";
        if(getPlayerBool("showTotalMonstersHealth", true)) {
            const amountEndIndex = hunt.huntDescriptionPanel.innerHTML.indexOf(")");
            hunt.huntDescriptionPanel.innerHTML = hunt.huntDescriptionPanel.innerHTML.substring(0, amountEndIndex) + hp + hunt.huntDescriptionPanel.innerHTML.substring(amountEndIndex);
        }
        const min_count = Math.round(hunt.amount / 5 - 0.5); //Для минимального 5% прироста, чтобы получить минимальную умелку 0.2 (20% от 1) убиваем 20% существ
        let exp_min_count = Math.min(Math.floor(hunt.monster.experience * min_count / 5), PlayerLevel * 500); //Опыт при минимальном приросте
        let exp_with_helper = Math.min(Math.round(hunt.fullExperience / 2), PlayerLevel * 500); //Опыт с помощником (50/50)
        if(PlayerLevel > 2) { //Если опыт меньше нижней отсечки по уровню (3+ уровни)
            exp_with_helper = Math.max(exp_with_helper, PlayerLevel * 35);
            exp_min_count = Math.max(exp_min_count, PlayerLevel * 14);
        }
        exp_with_helper = (exp_with_helper * koef).toFixed(0);
        exp_min_count = (exp_min_count * koef).toFixed(0);

        if(isLookingFor && isHuntMatch(hunt)) {
            hunt.huntDescriptionPanel.closest("div[id^=neut_show]").style.background = "#D1FFD1";
        }
        const fullExperienceText = hunt.experience != hunt.fullExperience ? ` (${isEn ? "from" : "из"} ${hunt.fullExperience})` : "";
        hunt.huntDescriptionPanel.insertAdjacentHTML("beforeend", `
<style>
.huntVariants {
    border-collapse: collapse;
}
.huntVariants td,
.huntVariants th {
    font-size: 7pt;
    border: 1px solid #b94a48 !important;
}
</style>
<table class="huntVariants">
    <tr><th>${isEn ? "Hunt" : "Варианты охоты"}</th><th>${isEn ? "Exp" : "Опыт"}</th><th>${isEn ? "Next amount" : "След. кол-во"}</th></tr>
    <tr><td>${isEn ? "by oneself" : "в одиночку"} 100%</td><td>${hunt.experience}${fullExperienceText}</td><td>${(hunt.amount * 1.3).toFixed(0)}</td></tr>
    <tr${getPlayerBool("enable_Exp_Half") ? "" : " style='display: none;'"}><td>${isEn ? "with a partner" : "с напарником"} 50%</td><td>${exp_with_helper}</td><td>${(hunt.amount * Math.pow(1.3, 0.5)).toFixed(0)}</td></tr>
    <tr${getPlayerBool("enable_5_procent") ? "" : " style='display: none;'"}><td title="${isEn ? "with a partner for min growth 5.6%" : "с напарником для минимального прироста в 5.6%"}">${isEn ? "with a partner" : "с напарником"} 20% (${min_count})</td><td>${exp_min_count}</td><td>${(hunt.amount * Math.pow(1.3, 0.2)).toFixed(0)}</td></tr>
</table>
`);
        if(hunt.experience < (PlayerLevel + 1) * 100 && PlayerLevel > 1) {
            hunt.huntDescriptionPanel.insertAdjacentHTML("beforeend", `<br><font style="color:#0000CD">${isEn ? "Kill it now! On level" : "Убей сейчас! На"} ${PlayerLevel + 1} ${isEn ? " you gain" : "уровне за них дадут"} <b>${(PlayerLevel + 1) * 100}</b> ${isEn ? "exp" : "опыта"}.</font>`);
        }
    }
}
function correctWars(name, playerId = PlayerId) {
    const wars = JSON.parse(getValue(`${name}${playerId}`, "[]")).map(x => JSON.parse(x));
    for(const war of wars) {
        if(war.warDate) {
            war.date = war.warDate;
            delete war.warDate;
        }
        if(war.warId) {
            war.id = war.warId;
            delete war.warId;
        }
        if(!war.enemyName) {
            war.enemyName = name;
        }
        if(!war.type) {
            war.type = 0;
        }
    }
    setValue(`${name}${playerId}`, JSON.stringify(wars.map(x => JSON.stringify(x))));
}
function createTraceMonstersPanelCaller(monstersListContainer) {
    const monstersListActivator = addElement('div', { id: "get_list_go", class: "job_fl_btn show_hint", style: "width: 20px; height: 20px; vertical-align: middle; display: inline-block;", innerHTML: `<img src="//dcdn.heroeswm.ru/i/mobile_view/icons_add/pismo.png" style="width: 16px; height: 16px;">` }, monstersListContainer);
    monstersListActivator.addEventListener("click", showMonstersPanel);
}
function showMonstersPanel() {
    const panelName = "Monsters";
    let bg = document.getElementById(`bg${panelName}Overlay`);
    let bgc = document.getElementById(`bg${panelName}Center`);
    if(bg) {
        bg.style.display = "block";
        bgc.style.display = "block";
        return;
    }
    bg = addElement('div', { id: `bg${panelName}Overlay`, style: "position: fixed; left: 0px; width: 100%; top: 0px; height: 100%; background: #000000; opacity: 0.5; z-index: 1120;" }, document.body);
    bgc = addElement('div', { id: `bg${panelName}Center`, style: `position: fixed; left: ${(document.body.offsetWidth - 650) / 2}px; width: 650px; top: 150px; height: 475px; overflow: auto; background: #F6F3EA; z-index: 1121;` }, document.body);
    bg.addEventListener("click", function() { hidePanel(panelName); }); //клик вне окна
    let monstersTableHtml = "";
    for(const monster of monsters) {
        const imageName = monster.imageFullName || `${monster.imageName || monster.name}anip33`;
        const imageSource = `https://dcdn.heroeswm.ru/i/portraits/${imageName}.png`;
        monstersTableHtml += `
<tr name="${monster.name}">
    <td style="text-align: center;"><img name=monsterPicture style="height: 25px; width: 30px; border: 0; display: ${getPlayerBool("viewMonsterPictures") ? "" : "none"};" src="${imageSource}"></td>
    <td style="text-align: center;"><input name=title type=text value="${isEn && monster.enTitle ? monster.enTitle : monster.title}"></td>
    <td style="text-align: center;"><input name=experience type=number value="${monster.experience}" style="width: 70px;"></td>
    <td style="text-align: center;"><input name=health type=number value="${monster.health}" style="width: 70px;"></td>
    <td style="text-align: center;"><input name=canFly type=checkbox ${monster.canFly ? "checked" : ""}></td>
    <td style="text-align: center;"><input name=wanted type=checkbox ${monster.wanted ? "checked" : ""}></td>
    <td style="text-align: center;"><input name=newYear type=checkbox ${monster.newYear ? "checked" : ""}></td>
</tr>`;
    }
    bgc.innerHTML = `
<style>
    .grid {
        border-collapse: collapse;
    }
    .grid th, .grid td {
        border: 1px solid black;
    }
    .grid-header td {
        text-align: center;
        font-weight: bold;
    }
</style>
<div style="border: 1px solid #abc; padding: 5px; margin: 2px;">
    <div>
        <b>${isEn ? "Select creatures for hunt. Total" : "Выберите существ для охоты. Всего"} <font style="color: #FF0000;">${monsters.length}</font></b>
        <input type="button" id="lookForAllButton" value="${isEn ? "Look for all" : "Искать всех"}">
        <input type="button" id="dontLookForAnyoneButton" value="${isEn ? "Don't look for anyone" : "Не искать никого"}">
        <button id="closeMonstersListButton" type="button" style="float: right; cursor: pointer; font-size: 20px;" title="${isEn ? "Close" : "Закрыть"}">&times;</button>
        <hr/>
    </div>
    <table class=grid cellspacing="0">
        <tr class="grid-header">
            <td><input type=checkbox id=viewMonsterPicturesCheckbox title="${isEn ? "Show pictures" : "Показать картинки"}"></td>
            <td>${isEn ? "Title" : "Заголовок"}</td>
            <td>${isEn ? "Experience" : "Опыт"}</td>
            <td>${isEn ? "Health" : "Здоровье"}</td>
            <td>${isEn ? "Can fly" : "Летает"}</td>
            <td>${isEn ? "Wanted" : "Разыски<br>вается"}</td>
            <td>${isEn ? "New year" : "Ново<br>годний"}</td>
        </tr>
        ${monstersTableHtml}
    </table>
</div>`;
    document.getElementById("viewMonsterPicturesCheckbox").addEventListener("click", function() { setPlayerValue("viewMonsterPictures", this.checked); toggleMonsterPictures(); });
    document.getElementById("viewMonsterPicturesCheckbox").checked = getPlayerBool("viewMonsterPictures");

    document.getElementById('lookForAllButton').addEventListener("click", wantedAll);
    document.getElementById('dontLookForAnyoneButton').addEventListener("click", unwantAll);
    document.getElementById("closeMonstersListButton").addEventListener("click", function() { hidePanel(panelName); }); //крестик в углу
    Array.from(bgc.querySelectorAll("input[name=title]")).forEach(x => x.addEventListener("change", function() { setMonsterProperty(this.closest("tr").getAttribute("name"), isEn ? "enTitle" : "title", this.value); }));
    Array.from(bgc.querySelectorAll("input[name=experience]")).forEach(x => x.addEventListener("change", function() { setMonsterProperty(this.closest("tr").getAttribute("name"), this.name, this.value); }));
    Array.from(bgc.querySelectorAll("input[name=health]")).forEach(x => x.addEventListener("change", function() { setMonsterProperty(this.closest("tr").getAttribute("name"), this.name, this.value); }));
    Array.from(bgc.querySelectorAll("input[name=wanted]")).forEach(x => x.addEventListener("change", function() { setMonsterProperty(this.closest("tr").getAttribute("name"), this.name, this.checked); }));
    Array.from(bgc.querySelectorAll("input[name=newYear]")).forEach(x => x.addEventListener("change", function() { setMonsterProperty(this.closest("tr").getAttribute("name"), this.name, this.checked); }));
}
function toggleMonsterPictures() {
    Array.from(document.querySelectorAll("img[name=monsterPicture]")).forEach(x => x.style.display = getPlayerBool("viewMonsterPictures") ? "" : "none");
}
function setMonsterProperty(monsterName, propertyName, propertyValue) {
    //console.log(`monsterName: ${monsterName}, propertyName: ${propertyName}, propertyValue: ${propertyValue}`);
    const monster = monsters.find(x => x.name == monsterName);
    monster[propertyName] = propertyValue;
    setValue("monsters", JSON.stringify(monsters));
}
function wantedAll() {
    monsters.forEach(x => { x.wanted = true; });
    setValue("monsters", JSON.stringify(monsters));
    bindWanted();
}
function unwantAll() {
    monsters.forEach(x => { x.wanted = false; });
    setValue("monsters", JSON.stringify(monsters));
    bindWanted();
}
function bindWanted() {
    const monstersPanel = document.querySelector(`#bgMonstersCenter`);
    Array.from(monstersPanel.querySelectorAll("input[name=wanted]")).forEach(x => {
        const monster = monsters.find(y => y.name == x.closest("tr").getAttribute("name"));
        x.checked = monster?.wanted || false;
    });
}
function createSettingsCaller() {
    const settingsButtonContainer = document.querySelector("div#hwm_map_objects_and_buttons > div.job_fl_btns_block");
    if(settingsButtonContainer) {
        let huntHelperSettingsButton = document.querySelector("#huntHelperSettingsButton"); // console.log(huntHelperSettingsButton); - всегда нул
        if(!huntHelperSettingsButton) {
            settingsButtonContainer.insertAdjacentHTML("beforeend", `
    <a id=huntHelperSettingsButton href="javascript:void(0);" class="map_sel_obj_t" style="width: 200px;">
        <div class="job_fl_btn show_hint" hint="${isEn ? "HuntHelper script settings" : "Настройки скрипта HuntHelper"}">
            <img src="https://dcdn.heroeswm.ru/i/btns/job_fl_btn_hunters.png">
        </div>
    </a>`);
            huntHelperSettingsButton = document.querySelector("#huntHelperSettingsButton");
            huntHelperSettingsButton.addEventListener("click", showSettingsPanel);
            if(typeof win.hwm_hints_init === 'function') win.hwm_hints_init();
        }
    }
}
function showSettingsPanel() {
    const panelName = "hwmHuntHelperSettings";
    if(showPupupPanel(panelName)) {
        return;
    }
    const innerHtml = `
    <label><input type=checkbox id=isShortHuntDescriptionCheckbox> ${isEn ? "Brief hunt description" : "Краткое сообщение об охоте"}</label>
    <br>
    <label><input type=checkbox id=showTotalMonstersHealthCheckBox> ${isEn ? "Show total monsters health" : "Показать суммарное здоровье монстров"}</label>
    <br>
    <label><input type=checkbox id=set_enable_Exp_Half> ${isEn ? "Show <b>exp with helper</b>, if kill 50% each" : "Отображать <b>опыт с помощником</b>, если убьёте по 50%"}</label>
    <br>
    <label><input type=checkbox id=set_enable_5_procent> ${isEn ? "Display how many creatures to kill <b>for the minimum increase</b> of creatures" : "Отображать сколько убить существ <b>для минимального прироста</b> существ"}</label>
    <hr/>
    <label><input type=checkbox id=set_show_archive> ${isEn ? "Show <b>archive records links</b>" : "Отображать <b>ссылки на рекорды</b> из архива"}</label> <img src="https://dcdn.heroeswm.ru/i/icons/attr_knowledge.png" width="18">
    <br>
    <label><input type=checkbox id=hideHuntsCheckbox> ${isEn ? "Hide hunts" : "Скрыть охоты"} (<b><font color=green size=3>GreenPeace</font></b>)</label>
    <br>
    ${isEn ? "Overexp rate" : "Коэффициент перекача"} <input id="set_koef" value="${getPlayerValue("koef_dop_exp", 1)}" style="width: 100px;" maxlength="6" type="number">
    <hr/>
    <label><input type=checkbox id=skipUnmatchedHuntsCheckbox> ${isEn ? "Skip unmatched hunts" : "Пропускать неподходящие охоты"}</label>
    <br>
    <b>${isEn ? "Looking for" : "Искать"}</b>
    <br>
    <label>1) <input type=checkbox id=lookingForMarkedInListCheckbox> ${isEn ? "creatures marked in the list" : "существ отмеченных в списке"}</label><span id=monstersListContainer></span>
    <br>
    2) ${isEn ? "experience less then" : "опыт меньше, чем"}: <input id="experienceLimitInput" type="number" value="${getPlayerValue("experienceLimit", "0")}" style="width: 70px;">
    <br>
    <label>3) <input type=checkbox id=lookingForHalfAmountCheckbox> ${isEn ? "half amount ([1/2])" : "половинки ([1/2])"}</label>
    <br>
    <label>4) <input type=checkbox id=lookingForDiamondCheckbox> <img width="16" height="16" border="0" title="${isEn ? "Diamonds" : "Бриллианты"}" src="https://dcdn.heroeswm.ru/i/r/48/diamonds.png"></label>
    <br>
    <label>5) <input type=checkbox id=lookingForFlyingCheckbox> ${isEn ? "flying" : "летающих"}</label>
    <br>
    <span><label>6) <input type=checkbox id=lookingForAdvancedGuildPointsCheckbox> ${isEn ? "advanced guild points" : "увеличенные очки гильдии"}</label> <form style="display: inline-block;" oninput="minAdvancedPointsOutput.value = minAdvancedPointsInput.value"><input id=minAdvancedPointsInput type=range list=advancedGuildPointsDatalist min=2 max=5 style="width: 60px; vertical-align: middle;" onfocus="this.select();"/><output name=minAdvancedPointsOutput for="minAdvancedPointsInput"></output></form> ${isEn ? "and more" : "и более"}</span>
    <datalist id="advancedGuildPointsDatalist">
      <option value="2"></option>
      <option value="3"></option>
      <option value="5"></option>
    </datalist>`;
    const settingsDiv = addElement("div", { innerHTML: innerHtml });
    bindSettings(settingsDiv);
    bindSettingsHandlers(settingsDiv);

    createTraceMonstersPanelCaller(settingsDiv.querySelector("#monstersListContainer"));
    
    const fieldsMap = [];
    fieldsMap.push([settingsDiv]);
    const title = `${getScriptReferenceHtml()} ${getSendErrorMailReferenceHtml()} ${isEn ? "Creatures total" : "Всего существ"}: <font style="color:#FF0000;">${monsters.length}</font>`;
    createPupupPanel(panelName, title, fieldsMap);
}
function bindSettings(settingsDiv) {
    settingsDiv.querySelector("#isShortHuntDescriptionCheckbox").checked = getPlayerBool("isShortHuntDescription");
    settingsDiv.querySelector("#set_enable_Exp_Half").checked = getPlayerBool("enable_Exp_Half");
    settingsDiv.querySelector("#set_enable_5_procent").checked = getPlayerBool("enable_5_procent");
    settingsDiv.querySelector("#set_show_archive").checked = getPlayerBool("show_archive");
    settingsDiv.querySelector("#hideHuntsCheckbox").checked = getPlayerBool("hideHunts");

    settingsDiv.querySelector("#skipUnmatchedHuntsCheckbox").checked = getPlayerBool("skipUnmatchedHunts");
    settingsDiv.querySelector("#lookingForMarkedInListCheckbox").checked = getPlayerBool("lookingForMarkedInList");
    settingsDiv.querySelector("#experienceLimitInput").value = getPlayerValue("experienceLimit", "");
    settingsDiv.querySelector("#lookingForHalfAmountCheckbox").checked = getPlayerBool("lookingForHalfAmount");
    settingsDiv.querySelector("#lookingForDiamondCheckbox").checked = getPlayerBool("lookingForDiamond");
    settingsDiv.querySelector("#lookingForFlyingCheckbox").checked = getPlayerBool("lookingForFlying");
    settingsDiv.querySelector("#lookingForAdvancedGuildPointsCheckbox").checked = getPlayerBool("lookingForAdvancedGuildPoints");
    settingsDiv.querySelector("#minAdvancedPointsInput").value = getPlayerValue("minAdvancedPoints", "2");
    settingsDiv.querySelector("output[name=minAdvancedPointsOutput]").value = getPlayerValue("minAdvancedPoints", "2");

    settingsDiv.querySelector("#showTotalMonstersHealthCheckBox").checked = getPlayerBool("showTotalMonstersHealth", true);
}
function bindSettingsHandlers(settingsDiv) {
    settingsDiv.querySelector("#isShortHuntDescriptionCheckbox").addEventListener("click", function() { setPlayerValue("isShortHuntDescription", this.checked); });
    settingsDiv.querySelector("#set_enable_Exp_Half").addEventListener("click", function() { setPlayerValue("enable_Exp_Half", this.checked); });
    settingsDiv.querySelector("#set_enable_5_procent").addEventListener("click", function() { setPlayerValue("enable_5_procent", this.checked); });
    settingsDiv.querySelector("#set_show_archive").addEventListener("click", function() { setPlayerValue("show_archive", this.checked); });
    settingsDiv.querySelector("#hideHuntsCheckbox").addEventListener("click", function() { setPlayerValue("hideHunts", this.checked); applyGreenPeace(); });
    settingsDiv.querySelector("#set_koef").addEventListener("change", function() { setPlayerValue("koef_dop_exp", Number(this.value)); });

    settingsDiv.querySelector("#skipUnmatchedHuntsCheckbox").addEventListener("click", function() { setPlayerValue("skipUnmatchedHunts", this.checked); });
    settingsDiv.querySelector("#lookingForMarkedInListCheckbox").addEventListener("click", function() { setPlayerValue("lookingForMarkedInList", this.checked); });
    settingsDiv.querySelector("#experienceLimitInput").addEventListener("change", function() { setPlayerValue("experienceLimit", this.value); });
    settingsDiv.querySelector("#lookingForHalfAmountCheckbox").addEventListener("click", function() { setPlayerValue("lookingForHalfAmount", this.checked); });
    settingsDiv.querySelector("#lookingForDiamondCheckbox").addEventListener("click", function() { setPlayerValue("lookingForDiamond", this.checked); });
    settingsDiv.querySelector("#lookingForFlyingCheckbox").addEventListener("click", function() { setPlayerValue("lookingForFlying", this.checked); });
    settingsDiv.querySelector("#lookingForAdvancedGuildPointsCheckbox").addEventListener("click", function() { setPlayerValue("lookingForAdvancedGuildPoints", this.checked); });
    settingsDiv.querySelector("#minAdvancedPointsInput").addEventListener("change", function() { setPlayerValue("minAdvancedPoints", this.value); });

    settingsDiv.querySelector("#showTotalMonstersHealthCheckBox").addEventListener("click", function() { setPlayerValue("showTotalMonstersHealth", this.checked); });
}
function hidePanel(panelName) {
    document.getElementById(`bg${panelName}Overlay`).style.display = "none";
    document.getElementById(`bg${panelName}Center`).style.display = "none";
}
function isHuntMatch(hunt) {
    if(getPlayerBool("lookingForMarkedInList") && hunt.monster.wanted) {
        return true;
    }
    if(hunt.experience <= Number(getPlayerValue("experienceLimit"))) {
        return true;
    }
    if(getPlayerBool("lookingForHalfAmount") && hunt.isHalfAmount) {
        return true;
    }
    if(getPlayerBool("lookingForDiamond") && hunt.diamonds > 0) {
        return true;
    }
    if(getPlayerBool("lookingForFlying") && hunt.monster.canFly) {
        return true;
    }
    if(getPlayerBool("lookingForAdvancedGuildPoints") && hunt.guildPoints >= parseInt(getPlayerValue("minAdvancedPoints", "2"))) {
        return true;
    }
    return false;
}
function huntHelpers() {
    if(location.pathname != '/group_wars.php') {
        return;
    }
    const battleRows = Array.from(document.querySelectorAll("center table.wb > tbody > tr"));
    for(const titleRow of battleRows.slice(0, 1)) {
        titleRow.cells[3].innerHTML += `
<label style="font-size: 7pt;">${isEn ? "Hunter" : "Охотник"}<input type=checkbox id=set_find_Hunt title=""></label>`;
        titleRow.cells[6].innerHTML += `
<label style="font-size: 7pt;">${isEn ? "Show HP" : "Показать HP"}<input type=checkbox id=showTotalMonstersHealthCheckBox title=""></label>
<label style="font-size: 7pt;">${isEn ? "Signal" : "Сигнал"}<input type=checkbox id=set_beep_if_free title=""></label>`;
        document.querySelector("#set_find_Hunt").addEventListener("click", function() { setPlayerValue("find_Hunt", this.checked); location.reload(); });
        document.querySelector("#set_beep_if_free").addEventListener("click", function() { setPlayerValue("beep_if_free", this.checked); });
        document.querySelector("#showTotalMonstersHealthCheckBox").addEventListener("click", function() { setPlayerValue("showTotalMonstersHealth", this.checked); location.reload(); });
        document.querySelector("#set_find_Hunt").checked = getPlayerBool("find_Hunt");
        document.querySelector("#set_beep_if_free").checked = getPlayerBool("beep_if_free");
        document.querySelector("#showTotalMonstersHealthCheckBox").checked = getPlayerBool("showTotalMonstersHealth", true);
    }
    for(const row of battleRows.slice(1)) {
        const mapRef = row.querySelector("td > a[href*='map.php?cx']");
        if(!mapRef) {
            if(getPlayerBool("find_Hunt")) {
                row.style.display = "none";
            }
            continue;
        }
        const battleDescriptionCell = row.childNodes[6];
        const monstrRef = battleDescriptionCell.querySelector("a[href^='army_info.php?name=']");
        const monsterTitle = monstrRef.querySelector("i").innerText;
        const monstersAmount = parseInt(monstrRef.parentNode.innerHTML.match(/\((\d+)\)/)[1]);
        const monster = monsters.find(x => x.title == monsterTitle);
        if(!monster) {
            console.log(`Не найден monsterTitle: ${monsterTitle}, monstersAmount: ${monstersAmount}`)
            continue;
        }
        //console.log(mapRef.href.replace("/map.php", "/move_sector.php").replace(mapRef.search, `?id=${sectors[mapRef.search.slice(1)]}`));

        mapRef.href = mapRef.href.replace("/map.php", "/move_sector.php").replace(mapRef.search, `?id=${sectors[mapRef.search.slice(1)]}`);
        mapRef.title = isEn ? "Go" : "Перейти";

        const total_exp = Math.floor(monster.experience * monstersAmount / 5);
        const backgroundColor = total_exp < PlayerLevel * 133 ? "#cfd" : (total_exp < PlayerLevel * 100 ? "#0f0" : 'inherit');
        battleDescriptionCell.insertAdjacentHTML("beforeend", `<br><font style="font-size: 7pt; color: #013220; background-color: ${backgroundColor};"><b>${total_exp}</b></font>${isEn ? "&nbspexp." : "&nbspопыта."}`);
        if(getPlayerBool("showTotalMonstersHealth", true)) {
            battleDescriptionCell.insertAdjacentHTML("beforeend", ` <font style="font-size: 7pt; color: #CD00CD">HP:&nbsp;<b>${monster.health * monstersAmount}</b></font>`);
        }
        if(getPlayerBool("beep_if_free") && battleDescriptionCell.innerHTML.includes(isEn ? "Join" : "Вступить")) {
            new Audio("https://zvukogram.com/mp3/cats/1002/vyistrel-iz-vintovki-po-misheni.mp3").play();
        }
    }
}
function add_archive() {
    //добавить ссылку на архив рекордов на странице рекордов
    if(location.pathname != "/plstats_hunters.php") {
        return;
    }
    //const container = document.querySelector("body > center > table table")?.closest("div");
    const container = document.body;
    //console.log(container)
    if(!container) {
        return;
    }
    const show_archive = getUrlParamValue(location.href, "show_archive");
    let alterRecordsUrl;
    if(show_archive != "1") {
        const mid = getUrlParamValue(location.href, "mid");
        if(!mid) {
            alterRecordsUrl = location.href + '&show_archive=1';
        } else {
            alterRecordsUrl = location.href.replace("&mid", "&show_archive=1&mid");
        }
    } else {
        alterRecordsUrl = location.href.replace(/&?show_archive=1/, "");
    }
    const alterRecordsText = show_archive == "1" ? (isEn ? "Current records" : "Текущие рекорды") : (isEn ? "Records archive before 01.03.2015" : "Архив рекордов до 01.03.2015");
    container.insertAdjacentHTML("beforeend", `<br><center><a href="${alterRecordsUrl}"><b><font color="blue">${alterRecordsText}</font></b></a></center>`);
}
function applyGreenPeace() {
    const map_hunt_block_div = document.querySelector("#map_hunt_block_div");
    if(map_hunt_block_div) {
        map_hunt_block_div.style.display = getPlayerBool("hideHunts") ? "none" : "block";
    }
}
async function readWarlog(e = null, playerId = PlayerId, pages = 0) {
    if(warlogProcessing) {
        const terminateProcessConfirm = confirm(isEn ? "Stop?" : "Прервать?");
        if(terminateProcessConfirm) {
            terminateProcess = true;
        }
        return;
    }
    const warStatistics = JSON.parse(getValue(`WarStatistics${playerId}`, "{}"));
    let warlogScanned = warStatistics.minWarId > 0 && warStatistics.firstWarId == warStatistics.minWarId;
    if(!warlogScanned && !confirm(isEn ? "It takes about 20 minutes. Continue?" : "Это займет около 20-ти минут. Продолжить?")) {
        return;
    }
    warlogProcessing = true;
    terminateProcess = false;
    let { lastWarlogPageIndex, firstWarId } = await getLastWarlogPageIndex(playerId);   //console.log(`playerId: ${playerId}, pages: ${pages}, lastWarlogPageIndex: ${lastWarlogPageIndex}`);

    warStatistics.firstWarId = firstWarId;    console.log(warStatistics);
    warlogScanned = warStatistics.minWarId > 0 && warStatistics.firstWarId == warStatistics.minWarId;
    if(pages) {
        lastWarlogPageIndex = Math.min(lastWarlogPageIndex, pages - 1);
    }
    let totalWars = 0;
    let totalPages = 0;
    let minDate;
    let maxDate;
    let minWarId;
    let maxWarId;
    let currentPageIndex = 0;
    while(currentPageIndex <= lastWarlogPageIndex) {
        if(e) {
            e.target.value = `${isEn ? "Process page" : "Обработка страницы"} ${currentPageIndex + 1} ${isEn ? "from" : "из"} ${lastWarlogPageIndex + 1}. ${isEn ? "Break?" : "Остановить?"}`;
        }
        if(terminateProcess) {
            break;
        }
        //console.log(`currentPageIndex: ${currentPageIndex}`);
        const wars = await parseWarlogPage(playerId, currentPageIndex);
        //console.log(wars);
        wars.forEach(x => {
            minWarId = !minWarId ? x.id : Math.min(minWarId, x.id);
            maxWarId = !maxWarId ? x.id : Math.max(maxWarId, x.id);
            minDate = !minDate || x.date < minDate ? x.date : minDate;
            maxDate = !maxDate || x.date > maxDate ? x.date : maxDate;
        });
        totalPages++;
        totalWars += wars.length;
        for(const war of wars) {
            if(isMercBattle(war.type) || war.type == 0) {
                storeWar(war, playerId);
            }
            if(!terminateProcess &&  warlogScanned && war.id < warStatistics.maxWarId) {
                console.log(`Прерываю процесс warlogScanned: ${warlogScanned}, war.id: ${war.id}, warStatistics.maxWarId: ${warStatistics.maxWarId}`);
                terminateProcess = true; // Для дополнительных сканирований после основного. Читаем не все страницы, а только новые
            }
        }
        if(!pages && currentPageIndex == lastWarlogPageIndex && minWarId > warStatistics.firstWarId) {
            lastWarlogPageIndex++; // Если зачитываем всю статистику до конца, то количество страниц могло возрасти. Тогда зачитаем ещё страницу.
        }
        currentPageIndex++;
    }
    warStatistics.minWarId = !warStatistics.minWarId || minWarId < warStatistics.minWarId ? minWarId : warStatistics.minWarId;
    warStatistics.maxWarId = !warStatistics.maxWarId || maxWarId > warStatistics.maxWarId ? maxWarId : warStatistics.maxWarId;
    warStatistics.minDate = !warStatistics.minDate || minDate < new Date(warStatistics.minDate) ? minDate : new Date(warStatistics.minDate);
    warStatistics.maxDate = !warStatistics.maxDate || maxDate > new Date(warStatistics.maxDate) ? maxDate : new Date(warStatistics.maxDate);
    warlogScanned = warStatistics.minWarId > 0 && warStatistics.firstWarId == warStatistics.minWarId;
    setValue(`WarStatistics${playerId}`, JSON.stringify(warStatistics));
    warlogProcessing = false;
    if(e) {
        const getWarsStatisticsName = warlogScanned ? (isEn ? "Append war statistics" : "Пополнить боевую статистику") : (isEn ? "Get war statistics" : "Получить боевую статистику");
        e.target.value = getWarsStatisticsName;
    }
}
async function parseWarlogPage(playerId, pageIndex) {
    const doc = await getRequest(`/pl_warlog.php?id=${playerId}&page=${pageIndex}`);
    const warRefs = Array.from(doc.querySelectorAll("div.global_a_hover > a[href^='warlog.php?warid=']"));
    const wars = [];
    for(const warRef of warRefs) {
        const warId = parseInt(getUrlParamValue(warRef.href, "warid"));
        const warDate = parseDate(warRef.innerText, false, true);
        const leftSideNodes = [];
        const rightSideNodes = [];
        let currentSide = leftSideNodes;
        let node = warRef;
        while((node = node.nextSibling) && node.nodeType != Node.COMMENT_NODE) {
            //console.log(`node.nodeType: ${node.nodeType}`);
            if(node.nodeType == Node.TEXT_NODE) {
                if(node.textContent == " vs ") {
                    currentSide = rightSideNodes;
                }
                continue;
            }
            currentSide.push(node);
        }
        const warType = parseInt(node.textContent); // Нашли комментарий с кодом типа боя
        let playerNode = leftSideNodes.find(x => x.outerHTML.includes(`pl_info.php?id=${playerId}`));
        const enemyNodes = playerNode ? rightSideNodes : leftSideNodes;
        if(!playerNode) {
            playerNode = rightSideNodes.find(x => x.outerHTML.includes(`pl_info.php?id=${playerId}`));
        }
        const isWin = playerNode.nodeName.toLowerCase() == "b";
        const playerNameExec = />(.+)\[(\d+)\]</.exec(playerNode.innerHTML);
        const playerLevel = playerNameExec[2];
        //console.log(`warId: ${warId}, warType: ${warType}, warDate: ${warDate}, isWin: ${isWin}, playerLevel: ${playerLevel}, isMercBattle: ${isMercBattle(warType)}`);
        const war = { id: warId, date: warDate, type: warType, isWin: isWin, playerLevel: playerLevel, enemyName: "", enemyLevel: "" };
        if(isMercBattle(warType)) {
             let enemyNode = enemyNodes[0];
             const enemyExec = /(.+) {(\d+)}/.exec(enemyNode.firstChild.innerText || enemyNode.firstChild.textContent);
             if(enemyExec) {
                 war.enemyName = enemyExec[1];
                 war.enemyLevel = enemyExec[2];
             }
        }
        if(warType == 0) {
             let enemyNode = enemyNodes[0];
             const enemyExec = /(.+) \((\d+)\)/.exec(enemyNode.firstChild.innerText || enemyNode.firstChild.textContent);
             if(enemyExec) {
                 war.enemyName = enemyExec[1];
                 war.enemyLevel = enemyExec[2];
             }
        }
        wars.push(war);
    }
    return wars;
}
async function getLastWarlogPageIndex(playerId = PlayerId) {
  const responseText = await getRequestText(`/pl_warlog.php?id=${playerId}&page=999999`);
  const pageExec = /a class="active" href="#">(\d+?)</gmi.exec(responseText);
  const doc = (new DOMParser).parseFromString(responseText, "text/html");
  const warRefs = Array.from(doc.querySelectorAll("div.global_a_hover > a[href^='warlog.php?warid=']"));
  const firstWarId = warRefs.map(x => parseInt(getUrlParamValue(x.href, "warid"))).reduce((t, x) => { return t == 0 || x < t ? x : t }, 0);
  return { lastWarlogPageIndex: pageExec ? (parseInt(pageExec[1]) - 1) : 0, firstWarId: firstWarId };
}
function isMercBattle(btype = win.btype) { return btype == _GN_OTRYAD || btype == _GN_MONSTER || btype == _GN_NABEGI || btype == _GN_ZASHITA || btype == _GN_ARMY || btype == _SURVIVALGN || btype == _NEWGNCARAVAN; }
function storeWar(war, playerId) {
    const enemyHistory = restoreWars(war.enemyName, playerId); //JSON.parse(getValue(`${war.enemyName}${playerId}`, "[]")).map(x => JSON.parse(x));
    let exists = enemyHistory.find(x => x.id == war.id);
    if(!exists) {
        enemyHistory.push(war);
        enemyHistory.sort((a, b) => b.id - a.id); // Сортируем по убыванию id

        //console.log(enemyHistory);
        setValue(`${war.enemyName}${playerId}`, JSON.stringify(enemyHistory.map(x => [x.id, (x.date.getMonth === 'function') ? x.date.toISOString().substr(0, 16).replace("T", " ") : x.date, x.isWin, x.playerLevel, x.enemyLevel])));
    }
    //console.log(getValue(`${war.enemyName}${playerId}`));
    //console.log(restoreWars(war.enemyName, playerId));
}
function toWar(warArray, name) { return { id: warArray[0], date: warArray[1], isWin: warArray[2], playerLevel: warArray[3], enemyLevel: warArray[4], enemyName: name }; }
function restoreWars(name, playerId) { return JSON.parse(getValue(`${name}${playerId}`, "[]")).map(x => toWar(x, name)); }
function clearWarsStatistics() {
    if(!confirm(isEn ? "Clear?" : "Очистить?")) {
        return;
    }
    let counter = 0;
    for(const key of GM_listValues()) {
        const value = getValue(key);
        if(value && key.startsWith("WarStatistics")) {
            deleteValue(key);
            counter++;
        }
        if(value && value.startsWith("[[")) {
            //console.log(`${key}`);
            //console.log(value);
            try {
                const obj = JSON.parse(value);
                console.log(obj);
                if(obj[0]?.length == 5) {
                    deleteValue(key);
                    console.log(`Cleared ${key}`);
                    counter++;
                }
            } catch {
            }
        }
        if(value && value.startsWith("[\"{")) {
            //console.log(value);
            const obj = JSON.parse(value).map(x => {
                try {
                    return JSON.parse(x);
                } catch {
                    return null;
                }
            });
            if(obj[0]?.enemyName) {
                deleteValue(key);
                //console.log(`Cleared ${key}`);
                counter++;
            }
        }
    }
    console.log(`Total cleared ${counter}`);
}