// ==UserScript==
// @name hwmHuntHelper
// @namespace Tamozhnya1
// @description Помощник ГО
// @author Mantens, ElMarado, CheckT, Pagan of Dark, Tamozhnya1
// @version 9.8
// @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.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() {
console.log(JSON.parse(getValue(`WarStatistics${PlayerId}`, "{}")))
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); });
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 = JSON.parse(getPlayerValue(enemyName, "[]")).map(x => JSON.parse(x));
//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>`);
}
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>`); //добавить ссылку на рекорд из архива
}
}
showExperience();
}
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 showExperience() {
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>`);
}
}
// История
const historyContainer = addElement("div", { id: `historyContainer${hunt.name}`, style: "display: none;" }, hunt.huntDescriptionPanel);
correctWars(hunt.title);
const wars = JSON.parse(getPlayerValue(hunt.title, "[]")).map(x => JSON.parse(x));
//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" : "Закрыть"}">×</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 ? " exp." : " опыта."}`);
if(getPlayerBool("showTotalMonstersHealth", true)) {
battleDescriptionCell.insertAdjacentHTML("beforeend", ` <font style="font-size: 7pt; color: #CD00CD">HP: <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) {
const enemyHistory = 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);
//console.log(enemyHistory);
setValue(`${war.enemyName}${playerId}`, JSON.stringify(enemyHistory.map(x => JSON.stringify(x))));
}
}
if(warlogScanned && war.id < 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;
}