您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Показывает урон всех стеков стороны 1 по одному выбранному стеку стороны 2. Выбор существа и стороны по кнопке. Весь урон корректен. Если нет, обращайтесь к автору. Кнопка "Свернуть" теперь сворачивает также большую часть находящегося в чате скрипта battleHelper от omne. коэф. урона -- отношение урон/хп (то есть у кого больше всех коэффициент, с того выгоднее начинать). При вычислении коэф используется в т.ч. атака выбранного существа.
当前为
// ==UserScript== // @name battle_damage_tooltip // @namespace http://tampermonkey.net/ // @version 0.8.1.1 // @description Показывает урон всех стеков стороны 1 по одному выбранному стеку стороны 2. Выбор существа и стороны по кнопке. Весь урон корректен. Если нет, обращайтесь к автору. Кнопка "Свернуть" теперь сворачивает также большую часть находящегося в чате скрипта battleHelper от omne. коэф. урона -- отношение урон/хп (то есть у кого больше всех коэффициент, с того выгоднее начинать). При вычислении коэф используется в т.ч. атака выбранного существа. // @author Something begins // @license None // @match https://www.heroeswm.ru/war* // @match https://my.lordswm.com/war* // @match https://www.lordswm.com/war* // @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw== // @grant none // ==/UserScript== // Странные способы в некоторых местах обусловлены конфликтом со скриптом battleHelper от omne let chosen = {side: 1, creature: "Высшие вампиры", afterSideSwitchCre: {"-1": "", "1": ""}} let log_dict = {} let outer_chat = document.getElementById("chat_format"); let coeff_on = true function set_Display(element_arr, displayProperty){ element_arr.forEach(element=>{ if (element == null) return element.style.display = displayProperty }) } function elStringToEl(qSelector, htmlString){ const parser = new DOMParser(); const doc = parser.parseFromString(htmlString, 'text/html'); return doc.querySelector(qSelector) } let newElements = { "#dmg_list_refresh" : `<button id = "dmg_list_refresh" style="background-color: #3d3d29; color: white; padding: 5px 10px; border: none; border-radius: 4px; font-size: 10px; cursor: pointer">Открыть</button>`, "#choose_cre" : `<select style = "display : none; background-color: #333; color: white; margin: 10px" id = "choose_cre"></select>`, "#change_side" : `<button id = "change_side" style="background-color: #6b6b47; color: white; padding: 5px 10px; border: none; border-radius: 4px; font-size: 10px; cursor: pointer; display: none">Сменить сторону</button>`, "#dmg_coeff_on" : `<button id = "dmg_coeff_on" style="background-color: #6b6b47; color: white; padding: 5px 10px; border: none; border-radius: 4px; font-size: 10px; cursor: pointer;margin:5px; display: none">Выкл. коэф.</button>`, "#collapse" : `<button id = "collapse" style="background-color: #000000; color: white; padding: 5px 10px; border: none; border-radius: 4px; font-size: 10px; cursor: pointer; display: none; margin:10px">Свернуть</button>` } for (const qSelector in newElements){ outer_chat.appendChild(elStringToEl(qSelector, newElements[qSelector])) } outer_chat.addEventListener('click', function(event) { let child = event.target switch(child.id){ case "dmg_list_refresh": readjust_elements() refresh() break case "change_side": chosen.afterSideSwitchCre[chosen.side] = chosen.creature chosen.side = - chosen.side chosen.creature = chosen.afterSideSwitchCre[chosen.side] refresh() break case "collapse": battleHelper_display(false); [...chat.children].forEach(child=>{ if (child.tagName == "P") child.remove() }); refresh_button.innerHTML = "Открыть"; set_Display([select, side_button, collapse_button, document.querySelector("#chosen_cre_heading"), coeff_button], "none") break case "dmg_coeff_on": coeff_on = !coeff_on refresh() coeff_button.innerHTML = coeff_on? "Выкл. коэф": "Вкл. коэф." break } }) outer_chat.addEventListener('change', function() { chosen.creature = select.value refresh() }); let chat = document.getElementById("chat_inside"); let select = document.getElementById("choose_cre") let refresh_button = document.getElementById("dmg_list_refresh") let side_button = document.getElementById("change_side") let collapse_button = document.getElementById("collapse") let coeff_button = document.getElementById("dmg_coeff_on") function readjust_elements(){ chat = document.getElementById("chat_inside"); select = document.getElementById("choose_cre") refresh_button = document.getElementById("dmg_list_refresh") side_button = document.getElementById("change_side") collapse_button = document.getElementById("collapse") coeff_button = document.getElementById("dmg_coeff_on") } // Бесстыдно укранная родная функция гвд с поправками на переменную l и модификаторами magic[] // а еще бесполезные `window.` перед каждой (почти) глобальной для страницы переменной, потому что es-lint в тамперманки ругается function attackmonster(attacker, ax, ay, x, y, defender, shootok, koef, inuse) { var mainattack = 1; var ax1 = ax; var ay1 = ay; if (defender == 1000) return 0; if (defender <= 0) return 0; if (!window.stage.pole.obj[defender]) return 0; if (window.stage.pole.obj[defender]['hero']) return 0; if (window.stage.pole.obj[defender]['rock']) return 0; if (shootok == undefined) shootok = 0; if (koef == undefined) koef = 1; if (inuse == undefined) inuse = ''; var len = window.wmap2[y * defxn + x]; if ((window.stage.pole.obj[attacker].x == x) && (window.stage.pole.obj[attacker].y == y)) len = spd; if (window.stage.pole.obj[attacker]['big']) { if (ax > x) { x++; }; if (ay > y) { y++; }; }; if (window.stage.pole.obj[attacker]['bigx']) { if (ax > x) { x++; }; }; if (window.stage.pole.obj[attacker]['bigy']) { if (ay > y) { y++; }; }; var spd = Math.max(0, Math.round((window.stage.pole.obj[attacker].speed + window.stage.pole.obj[attacker]['ragespeed'] + window.stage.pole.obj[attacker]['speedaddon']) * window.stage.pole.obj[attacker].speedmodifier)); if (window.magic[attacker]['ent']) { spd = 0; }; var movelen = spd - len; window.attacker_c = attacker; window.ax_c = ax; window.ay_c = ay; window.x_c = x; window.y_c = y; window.defender_c = defender; window.shootok_c = shootok; if ((x == 0) && (y == 0)) { x = window.stage.pole.obj[attacker]['x']; y = window.stage.pole.obj[attacker]['y']; }; if ((defender > 0) && (window.stage.pole.obj[defender]['big'])) { if ((x - ax > 1) && (ax < x) && (defender == mapobj[ay * defxn + ax + 1])) { ax++; }; if ((y - ay > 1) && (ay < y) && (defender == mapobj[(ay + 1) * defxn + ax])) { ay++; }; if ((ax - x > 1) && (ax > x) && (defender == mapobj[ay * defxn + ax - 1])) { ax--; }; if ((ay - y > 1) && (ay > y) && (defender == mapobj[(ay - 1) * defxn + ax])) { ay--; }; }; if ((defender > 0) && (window.stage.pole.obj[defender]['bigx'])) { if ((x - ax > 1) && (ax < x) && (defender == mapobj[ay * defxn + ax + 1])) { ax++; }; if ((ax - x > 1) && (ax > x) && (defender == mapobj[ay * defxn + ax - 1])) { ax--; }; }; if ((defender > 0) && (window.stage.pole.obj[defender]['bigy'])) { if ((y - ay > 1) && (ay < y) && (defender == mapobj[(ay + 1) * defxn + ax])) { ay++; }; if ((ay - y > 1) && (ay > y) && (defender == mapobj[(ay - 1) * defxn + ax])) { ay--; }; }; let dx = x - ax; let dy = y - ay; l = dx * dx + dy * dy; if (movelen == undefined) movelen = 0;; window.PhysicalModifiers = 1; window.PhysicalModifiers *= koef; if (window.stage.pole.obj[attacker]['shadowattack']) l = 0; var hera = 0; var herd = 0; len = window.stage.pole.obj_array.length; for (var k1 = 0; k1 < len; k1++) { window.k = window.stage.pole.obj_array[k1]; if ((window.stage.pole.obj[k].hero) && (window.stage.pole.obj[k].owner == window.stage.pole.obj[attacker].owner)) hera = window.k; if ((window.stage.pole.obj[k].hero) && (window.stage.pole.obj[k].owner == window.stage.pole.obj[defender].owner)) herd = window.k; }; if ((window.stage.pole.obj[defender]['pirate']) && ((window.magic[defender]['sea']) || (window.gtype == 125) || (window.gtype == 126) || (window.gtype == 133))) { window.PhysicalModifiers *= 0.85; }; if (window.stage.pole.obj[defender]['deadflesh']) { window.PhysicalModifiers *= 0.8; }; if (window.stage.pole.obj[defender]['immaterial']) { window.PhysicalModifiers *= 0.65; }; if ((window.stage.pole.obj[attacker]['oppressionofweak']) && (window.stage.pole.obj[defender]['level'] == 1)) { window.PhysicalModifiers *= 1.5; }; if ((window.stage.pole.obj[attacker]['fearofstrong']) && (window.stage.pole.obj[defender]['level'] == 7)) { window.PhysicalModifiers *= 0.5; }; if ((hera > 0) && (window.magic[hera]['bna'])) { window.PhysicalModifiers = window.PhysicalModifiers * (1 + window.magic[hera]['bna']['effect'] / 100); if ((window.stage.pole.obj[defender]['mechanical']) && (window.magic[hera]['MEC'])) { window.PhysicalModifiers *= 1 + window.magic[hera]['MEC']['effect'] / 100; }; if ((window.stage.pole.obj[attacker]['mechanical']) && (window.magic[hera]['mch'])) { window.PhysicalModifiers *= 1 + window.magic[hera]['mch']['effect'] / 100; }; }; if ((window.stage.pole.obj[defender]['building']) && (!window.stage.pole.obj[attacker]['siegewalls'])) { window.PhysicalModifiers *= 0.05; }; if ((defender > 0) && (window.stage.pole.obj[attacker]['cruelty']) && ((window.stage.pole.obj[defender]['nowhealth'] < window.stage.pole.obj[defender]['maxhealth']) || (window.stage.pole.obj[defender]['nownumber'] < window.stage.pole.obj[defender]['maxnumber']))) { window.PhysicalModifiers *= 1.15; }; if ((defender > 0) && (window.stage.pole.obj[attacker]['morecruelty']) && ((window.stage.pole.obj[defender]['nowhealth'] < window.stage.pole.obj[defender]['maxhealth']) || (window.stage.pole.obj[defender]['nownumber'] < window.stage.pole.obj[defender]['maxnumber']))) { window.PhysicalModifiers *= 1.3; }; if ((window.stage.pole.obj[attacker]['giantkiller']) && (window.stage.pole.obj[defender]['big'])) window.PhysicalModifiers *= 2; if ((window.stage.pole.obj[attacker]['pygmykiller']) && (!window.stage.pole.obj[defender]['big'])) window.PhysicalModifiers *= 1.33; if (window.stage.pole.obj[attacker]['stormstrike']) window.PhysicalModifiers *= 2; if ((window.stage.pole.obj[attacker]['undeadkiller']) && (window.stage.pole.obj[defender]['undead'])) window.PhysicalModifiers *= 1.5; if ((window.stage.pole.obj[attacker]['pirate']) && (window.magic[defender]['blb'])) window.PhysicalModifiers *= 1.5; if ((!window.stage.pole.obj[attacker]['hero']) && (window.magic[attacker]['zat'])) { window.PhysicalModifiers *= 1.15; }; if ((herd > 0) && (window.magic[herd]['bnd'])) { window.PhysicalModifiers = window.PhysicalModifiers / (1 + window.magic[herd]['bnd']['effect'] / 100); }; if ((herd > 0) && (window.magic[herd]['fld'])) { window.PhysicalModifiers = window.PhysicalModifiers * (1 - window.magic[herd]['fld']['effect'] / 100); }; if ((herd > 0) && (window.magic[herd]['rcd']) && (monster_race[window.stage.pole.obj[attacker]['id']] == window.magic[herd]['rcd']['effect'])) { window.PhysicalModifiers = window.PhysicalModifiers * 0.93; }; if (window.magic[attacker]['prp']) { window.PhysicalModifiers = window.PhysicalModifiers * (1 + window.magic[attacker]['prp']['effect'] / 100); }; if (window.magic[defender]['sta']) { window.PhysicalModifiers *= 0.5; }; if ((window.magic[attacker]['chd']) && (window.stage.pole.obj[window.magic[attacker]['chd']['effect']]['nownumber'] > 0) && (window.magic[attacker]['chd']['effect'] != defender)) { window.PhysicalModifiers *= 0.55; }; window.PhysicalModifiers *= window.stage.pole.checkmembrane(defender); if (!window.stage.pole.obj[attacker]['hero']) { if ((l <= 2) && (window.stage.pole.obj[attacker]['shooter']) && (!window.stage.pole.obj[attacker]['nopenalty']) && (!window.stage.pole.obj[attacker]['warmachine'])) { window.PhysicalModifiers = window.PhysicalModifiers * 0.5; }; if ((l > 2) && (window.stage.pole.obj[attacker]['rangepenalty'])) { window.PhysicalModifiers = window.PhysicalModifiers * 0.5; }; window.rangemod = 1; if ((l > 2) && (window.stage.pole.obj[attacker]['shooter']) && (((window.stage.pole.obj[attacker]['range'] < Math.sqrt(l)) && (!window.stage.pole.obj[attacker].shadowattack)) || ((iswalls) && (!window.stage.pole.obj[attacker]['hero']) && (window.checkwall(x, y, ax, ay))))) { window.PhysicalModifiers = window.PhysicalModifiers * 0.5; window.rangemod = 0.5; }; if ((l > 2) && (window.stage.pole.obj[attacker]['shooter']) && (iswalls2) && (!window.stage.pole.obj[attacker]['hero']) && (((!window.stage.pole.obj[attacker].siegewalls) || (btype == 118)) || (!window.stage.pole.obj[defender].stone)) && (window.checkwall2(x, y, ax, ay, attacker))) { window.PhysicalModifiers = window.PhysicalModifiers * 0.5; window.rangemod *= 0.5; }; }; var _PERK_ARCHERY = 11; var _PERK_EVASION = 22; if ((defender > 0) && (window.stage.pole.obj[defender]['dodge']) && (((l <= 2) && (!window.stage.pole.obj[attacker]['ballista']) && (inuse != 'ssh') && (inuse != 'mga') && (inuse != 'dcd') && (inuse != 'chs') && (!window.stage.pole.obj[attacker]['hero'])) || (inuse == 'brs') || (inuse == 'cpt'))) { window.PhysicalModifiers *= 0.5; }; if (((l > 2) || (shootok == 1)) && (!window.stage.pole.obj[attacker]['hero']) && (window.stage.pole.obj[attacker]['shooter'])) { if (window.isperk(attacker, _PERK_ARCHERY)) window.PhysicalModifiers *= 1.2; if (window.isperk(defender, _PERK_EVASION)) window.PhysicalModifiers *= 0.8; if ((!window.stage.pole.obj[defender]['lshield']) && (window.stage.pole.shieldother(defender))) { window.PhysicalModifiers = window.PhysicalModifiers * 0.75; }; if ((window.stage.pole.obj[defender]['lshield']) || (window.stage.pole.obj[defender]['hollowbones'])) { window.PhysicalModifiers = window.PhysicalModifiers * 0.5; }; if (window.stage.pole.obj[defender]['diamondarmor']) { window.PhysicalModifiers = window.PhysicalModifiers * 0.1; }; if (window.stage.pole.obj[defender]['shielded']) { window.PhysicalModifiers = window.PhysicalModifiers * 0.75; }; if (window.stage.pole.obj[defender]['unprotectedtarget']) { window.PhysicalModifiers = window.PhysicalModifiers * 1.25; }; if (window.magic[defender]['dfm']) { window.PhysicalModifiers = window.PhysicalModifiers * (1 - window.magic[defender]['dfm']['effect'] / 100); }; if (window.magic[attacker]['cnf']) { window.PhysicalModifiers = window.PhysicalModifiers * (1 - window.magic[attacker]['cnf']['effect'] / 100); }; if (hera > 0) { if (window.magic[hera]['sat']) { window.PhysicalModifiers = window.PhysicalModifiers * (100 + window.magic[hera]['sat']['effect']) / 100; }; }; }; if ((!window.stage.pole.obj[attacker]['hero']) && (window.isperk(attacker, _PERK_BLESS))) { window.PhysicalModifiers *= 1.04; }; let o = window.stage.pole.obj[attacker]['owner']; if (window.magic[defender]['mf' + o]) { window.PhysicalModifiers *= 1 + window.magic[defender]['mf' + o]['effect'] / 100; }; if ((!window.stage.pole.obj[attacker]['hero']) && (window.isperk(attacker, _PERK_FERVOR))) { window.PhysicalModifiers *= 1.03; }; if (hera > 0) { var h = hera; if ((window.magic[h]['nut']) && ((plid2 == -2) || (ohotnik_set_neutral()))) { window.PhysicalModifiers = window.PhysicalModifiers * (100 + window.magic[h]['nut']['effect']) / 100; }; if ((window.magic[h]['mle']) && ((window.stage.pole.obj[attacker].shooter && l<=2)||(window.stage.pole.obj[attacker].shooter!= 1) || window.stage.pole.obj[attacker].shots==0)) { window.PhysicalModifiers = window.PhysicalModifiers * (100 + window.magic[h]['mle']['effect']) / 100; }; if (window.magic[attacker]['fbd']) { window.PhysicalModifiers = window.PhysicalModifiers * (100 + Math.floor(window.magic[attacker]['fbd']['effect'] / 10)) / 100; }; }; window.monatt = window.stage.pole.obj[attacker]['attack'] + window.stage.pole.obj[attacker]['attackaddon'] + window.stage.pole.obj[attacker]['rageattack']; if ((defender > 0) && (window.stage.pole.obj[attacker]['giantslayer']) && (window.stage.pole.obj[defender]['big'])) window.monatt += 4; if ((!window.stage.pole.obj[attacker]['undead']) && (!window.stage.pole.obj[attacker]['hero']) && (!window.stage.pole.obj[attacker]['perseverance'])) { window.frig2 = false; window.i = attacker; var bigx = window.stage.pole.obj[i]['big']; var bigy = window.stage.pole.obj[i]['big']; if (window.stage.pole.obj[i]['bigx']) bigx = 1; if (window.stage.pole.obj[i]['bigy']) bigy = 1; window.xd = window.stage.pole.obj[i]['x']; window.yd = window.stage.pole.obj[i]['y']; for (var xz = window.xd - 1; xz <= window.xd + 1 + bigx; xz++) { for (var yz = window.yd - 1; yz <= window.yd + 1 + bigy; yz++) { if ((!window.frig2) && (mapobj[yz * defxn + xz] > 0) && (window.stage.pole.obj[mapobj[yz * defxn + xz]]['side'] != window.stage.pole.obj[i]['side']) && (window.stage.pole.obj[mapobj[yz * defxn + xz]]['festeringaura']) && (window.stage.pole.obj[mapobj[yz * defxn + xz]]['nownumber'] > 0)) { window.monatt -= 4; window.frig2 = true; }; }; }; }; if ((window.magic[attacker]['bsr']) || (window.magic[attacker]['rof'])) { window.monatt += Math.floor((window.stage.pole.obj[attacker]['defence'] + window.stage.pole.obj[attacker]['defenceaddon'] + window.stage.pole.obj[attacker]['ragedefence']) * window.stage.pole.obj[attacker]['defencemodifier']); }; if (herd > 0) { h = herd; if ((window.magic[h]['mld']) && ((window.stage.pole.obj[attacker].shooter && l<=2)||(window.stage.pole.obj[attacker].shooter!= 1) || window.stage.pole.obj[attacker].shots==0)) { window.PhysicalModifiers = window.PhysicalModifiers * (100 - window.magic[h]['mld']['effect']) / 100; }; if ((window.magic[h]['_ia']) && (!window.stage.pole.obj[attacker]['perseverance'])) { window.monatt *= (1 - window.magic[h]['_ia']['effect'] / 100); }; if ((!window.stage.pole.obj[attacker]['hero']) && (window.stage.pole.obj[attacker].shooter)&& (window.stage.pole.obj[attacker].shots!=0) && (window.magic[h]['msk']) && (l > 2)) { window.PhysicalModifiers = window.PhysicalModifiers * (100 - window.magic[h]['msk']['effect']) / 100; }; }; window.defadd = 0; if (window.stage.pole.obj[defender]['agility']) { if (!window.magic[defender]['agl']) window.defadd = window.stage.pole.obj[defender]['speed'] * 2; }; if ((window.stage.pole.obj[defender]['spirit']) && (!window.magic[defender]['spi'])) { window.PhysicalModifiers *= 0.5; }; if ((window.stage.pole.obj[attacker]['rageagainsttheliving']) && (window.stage.pole.obj[defender]['alive'])) { window.PhysicalModifiers *= 1.3; }; if ((window.stage.pole.obj[defender]['defensivestance']) && (!window.magic[defender]['mvd'])) { window.defadd += 5; }; if ((!window.stage.pole.obj[defender]['undead']) && (!window.stage.pole.obj[defender]['armoured']) && (!window.stage.pole.obj[defender]['organicarmor'])) { window.frig2 = false; window.i = defender; bigx = window.stage.pole.obj[i]['big']; bigy = window.stage.pole.obj[i]['big']; if (window.stage.pole.obj[i]['bigx']) bigx = 1; if (window.stage.pole.obj[i]['bigy']) bigy = 1; window.xd = window.stage.pole.obj[i]['x']; window.yd = window.stage.pole.obj[i]['y']; for (let xz = window.xd - 1; xz <= window.xd + 1 + bigx; xz++) { for (let yz = window.yd - 1; yz <= window.yd + 1 + bigy; yz++) { if ((!window.frig2) && (mapobj[yz * defxn + xz] > 0) && (window.stage.pole.obj[mapobj[yz * defxn + xz]]['side'] != window.stage.pole.obj[i]['side']) && (window.stage.pole.obj[mapobj[yz * defxn + xz]]['festeringaura']) && (window.stage.pole.obj[mapobj[yz * defxn + xz]]['nownumber'] > 0)) { window.defadd -= 4; window.frig2 = true; }; }; }; }; if ((attacker > 0) && (window.stage.pole.obj[defender]['giantslayer']) && (window.stage.pole.obj[attacker]['big'])) window.defadd += 4; window.mondef = Math.round((window.stage.pole.obj[defender]['defence'] + window.stage.pole.obj[defender]['defenceaddon'] + window.defadd + window.stage.pole.obj[defender]['ragedefence']) * window.stage.pole.obj[defender]['defencemodifier']); if (window.magic[defender]['bsr']) { window.mondef = 0; }; if ((window.stage.pole.obj[attacker]['preciseshot']) && (l > 2) && (l <= 9) && (window.rangemod >= 1)) { window.mondef = 0; }; if ((window.stage.pole.obj[attacker]['ignoredefence'])) { window.mondef *= (1 - window.stage.pole.obj[attacker]['ignoredefence'] / 100); }; if (window.stage.pole.obj[attacker]['crushingleadership']) { var morale_delta = window.stage.pole.getmorale(attacker) - window.stage.pole.getmorale(defender); if (morale_delta > 0) { window.mondef *= Math.max(0, 1 - morale_delta / 10); }; }; if (window.stage.pole.obj[attacker]['sacredweapon']) { var dark_count = get_dark_count(defender); if (dark_count > 0) { window.mondef *= Math.max(0, 1 - 0.15 * dark_count); }; }; if (window.isperk(attacker, _PERK_PIERCING_LUCK)) { window.mondef *= 1 - Math.max(0, 0.025 * (window.stage.pole.obj[attacker]['luck'] + window.stage.pole.obj[attacker]['luckaddon'])); }; if ((window.stage.pole.obj[defender]['ignoreattack'])) { window.monatt *= (1 - window.stage.pole.obj[defender]['ignoreattack'] / 100); }; if ((window.stage.pole.obj[attacker]['ridercharge']) && (movelen > 0)) { window.mondef = window.mondef * (5 - movelen) / 5; }; if ((window.stage.pole.obj[attacker]['forcearrow']) && (!window.stage.pole.obj[defender]['armoured']) && (!window.stage.pole.obj[defender]['organicarmor']) && (l > 2)) { window.mondef *= 0.8; }; if ((window.stage.pole.obj[attacker]['armorpiercing']) && (!window.stage.pole.obj[defender]['armoured']) && (!window.stage.pole.obj[defender]['organicarmor']) && (l > 2)) { window.mondef *= 0.5; }; if ((window.stage.pole.obj[attacker]['jousting']) && (movelen > 0)) { window.PhysicalModifiers = window.PhysicalModifiers * (1 + 0.05 * movelen); }; if (((window.stage.pole.obj[attacker]['blindingcharge']) || (window.stage.pole.obj[attacker]['charge'])) && (movelen > 0)) { window.PhysicalModifiers = window.PhysicalModifiers * (1 + 0.1 * movelen); }; if ((window.stage.pole.obj[defender]['shieldwall']) && (movelen > 0)) { window.PhysicalModifiers = window.PhysicalModifiers * Math.max(0.1, 1 - 0.1 * movelen); }; if ((window.magic[defender]['enc']) && (window.magic[defender]['enc']['effect'] == 1)) { window.PhysicalModifiers *= 0.5; }; if ((window.stage.pole.obj[attacker]['safeposition']) && (movelen == 0)) { window.PhysicalModifiers *= 1.5; }; if ((window.stage.pole.obj[attacker]['agilesteed']) && (movelen > 0)) { window.PhysicalModifiers *= 1 - 0.05 * movelen; }; if (window.mondef < 0) { window.mondef = 0; }; window.air = 0; window.fire = 0; window.water = 0; window.earth = 0; if ((hera > 0) && (!window.stage.pole.obj[attacker]['taran'])) { h = hera; if (window.magic[h]['_id']) { window.mondef *= (1 - window.magic[h]['_id']['effect'] / 100); }; if (window.magic[h]['_aa']) { window.air = window.magic[h]['_aa']['effect'] / 100; }; if (window.magic[h]['_af']) { window.fire = window.magic[h]['_af']['effect'] / 100; }; if (window.magic[h]['_aw']) { window.water = window.magic[h]['_aw']['effect'] / 100; }; if (window.magic[h]['_ae']) { window.earth = window.magic[h]['_ae']['effect'] / 100; }; }; if ((window.stage.pole.obj[defender]['armoured']) || (window.stage.pole.obj[defender]['organicarmor'])) { window.mondef = Math.round((window.stage.pole.obj[defender]['defence'] + window.stage.pole.obj[defender]['defenceaddon'] + window.stage.pole.obj[defender]['ragedefence']) * window.stage.pole.obj[defender]['defencemodifier']); }; if (window.monatt < 0) { window.monatt = 0; }; if (window.monatt > window.mondef) { window.AttackDefenseModifier = 1 + (window.monatt - window.mondef) * 0.05; } else { window.AttackDefenseModifier = 1 / (1 + (window.mondef - window.monatt) * 0.05); }; if (window.stage.pole.obj[attacker]['hero']) { window.AttackDefenseModifier = 1; }; var _PERK_ATTACK1 = 8; var _PERK_ATTACK2 = 9; var _PERK_ATTACK3 = 10; var _PERK_DEFENSE1 = 19; var _PERK_DEFENSE2 = 20; var _PERK_DEFENSE3 = 21; if ((!window.stage.pole.obj[attacker]['hero'])&& ((window.stage.pole.obj[attacker].shooter == 1 && l<=2)||(window.stage.pole.obj[attacker].shooter!= 1))) { if (window.isperk(attacker, _PERK_ATTACK3)) { window.PhysicalModifiers *= 1.3; } else { if (window.isperk(attacker, _PERK_ATTACK2)) { window.PhysicalModifiers *= 1.2; } else if (window.isperk(attacker, _PERK_ATTACK1)) window.PhysicalModifiers *= 1.1; }; if (window.isperk(defender, _PERK_DEFENSE3)) { window.PhysicalModifiers *= 0.7; } else { if (window.isperk(defender, _PERK_DEFENSE2)) { window.PhysicalModifiers *= 0.8; } else { if (window.isperk(defender, _PERK_DEFENSE1)) window.PhysicalModifiers *= 0.9; }; }; }; if ((window.stage.pole.obj[attacker]['siegewalls']) && (window.stage.pole.obj[defender]['stone'])) { window.PhysicalModifiers *= 10; }; var _PERK_COLD_STEEL = 14; var _PERK_FIERY_WRATH = 101; var _PERK_HELLFIRE_AURA = 123; var _PERK_RETRIBUTION = 16; if (window.isperk(attacker, _PERK_COLD_STEEL)) window.water = 1 - (1 - window.water) * (0.9); if (window.isperk(attacker, _PERK_FIERY_WRATH)) window.fire = 1 - (1 - window.fire) * (0.85); if (window.isperk(attacker, _PERK_HELLFIRE_AURA)) window.fire = 1 - (1 - window.fire) * (0.95); if (window.magic[attacker]['cre']) { window.air = 1 - (1 - window.air) * (1 - window.magic[attacker]['cre']['effect'] / 100); }; if (window.isperk(attacker, _PERK_RETRIBUTION)) window.PhysicalModifiers *= (1 + Math.min(Math.max(window.stage.pole.getmorale(attacker, x, y), 0), 5) / 20); if ((window.stage.pole.obj[attacker]['viciousstrike']) && (Math.max(0, Math.round((window.stage.pole.obj[defender]['speed'] + window.stage.pole.obj[defender]['ragespeed'] + window.stage.pole.obj[defender]['speedaddon']) * window.stage.pole.obj[defender]['speedmodifier'])) == 0)) window.PhysicalModifiers *= 1.5; window.PhysicalModifiers *= window.stage.pole.magicmod(attacker, defender, window.fire, window.air, window.water, window.earth, 0.1); if ((window.stage.pole.obj[attacker]['bloodfrenzy']) && (window.magic[defender]['fd1'])) { window.PhysicalModifiers *= 1.3; }; window.UmelkaModifiers = 1; if ((umelka[window.stage.pole.obj[attacker]['owner']][0] > 0) && (umelka[window.stage.pole.obj[defender]['owner']][0] > 0)) { window.k = umelka[window.stage.pole.obj[attacker]['owner']][0]; if ((window.k > 0) && (window.k < 11)) { let j = umelka[window.stage.pole.obj[defender]['owner']][k]; window.UmelkaModifiers = 1 - j * 0.03; }; }; window.NumCreatures = window.stage.pole.obj[attacker]['nownumber']; let tsc = 0; bigx = window.stage.pole.obj[defender]['big']; bigy = window.stage.pole.obj[defender]['big']; if (window.stage.pole.obj[defender]['bigx']) bigx = 1; if (window.stage.pole.obj[defender]['bigy']) bigy = 1; for (var xs = window.stage.pole.obj[defender]['x'] - 1; xs <= window.stage.pole.obj[defender]['x'] + 1 + bigx; xs++) { for (var ys = window.stage.pole.obj[defender]['y'] - 1; ys <= window.stage.pole.obj[defender]['y'] + 1 + bigy; ys++) { if ((mapobj[xs + ys * defxn] > 0) && (mapobj[xs + ys * defxn] != defender) && (window.stage.pole.obj[mapobj[xs + ys * defxn]]['shieldguard']) && (window.stage.pole.obj[defender]['side'] == window.stage.pole.obj[mapobj[xs + ys * defxn]]['side'])) { tsc++; }; }; }; window.PhysicalModifiers /= (tsc + 1); var minmag = 0; var maxmag = 0; if ((inuse == 'lep') && (window.stage.pole.obj[attacker]['crashingleap'])) { window.Totalmagicdamage = 0; window.stage.pole.obj[defender]['attacked'] = 1; window.stage.pole.attackmagic(attacker, defender, window.stage.pole.obj[attacker]['nownumber'] * 4, 'cold', '', 0, 0, 0); minmag = window.Totalmagicdamage; window.Totalmagicdamage = 0; window.stage.pole.obj[defender]['attacked'] = 1; window.stage.pole.attackmagic(attacker, defender, window.stage.pole.obj[attacker]['nownumber'] * 6, 'cold', '', 0, 0, 0); maxmag = window.Totalmagicdamage; }; window.mindam = window.stage.pole.obj[attacker]['mindam'] + window.stage.pole.obj[attacker]['damageaddon'] + (window.stage.pole.obj[attacker]['maxdam'] - window.stage.pole.obj[attacker]['mindam']) * (window.stage.pole.obj[attacker]['mindamaddon']) + window.stage.pole.obj[attacker]['ragedamage']; window.maxdam = window.stage.pole.obj[attacker]['maxdam'] + window.stage.pole.obj[attacker]['damageaddon'] - (window.stage.pole.obj[attacker]['maxdam'] - window.stage.pole.obj[attacker]['mindam']) * (window.stage.pole.obj[attacker]['maxdamaddon']) + window.stage.pole.obj[attacker]['ragedamage']; h = hera; if ((h > 0) && (window.magic[h]) && (window.magic[h]['BLS']) && (window.magic[h]['BLS']['effect'] > 0)) window.mindam = window.maxdam; if ((h > 0) && (window.magic[h]) && (window.magic[h]['CRS']) && (window.magic[h]['CRS']['effect'] > 0)) window.maxdam = window.mindam; if ((window.stage.pole.obj[attacker]['taran']) && (window.stage.pole.obj[defender]['stone'])) { h = hera; window.mindam = Math.floor(Math.pow(window.stage.pole.obj[h]['maxhealth'], 0.5) * 200 * window.stage.pole.obj[attacker]['mindam']); window.maxdam = Math.floor(Math.pow(window.stage.pole.obj[h]['maxhealth'], 0.5) * 400 * window.stage.pole.obj[attacker]['maxdam']); }; if (window.stage.pole.obj[attacker]['accuracy']) window.mindam = window.maxdam; window.BaseDamage = window.mindam; window.PhysicalDamage = window.NumCreatures * window.BaseDamage * window.AttackDefenseModifier * window.PhysicalModifiers * window.UmelkaModifiers + minmag; window.PhysicalDamage2 = window.NumCreatures * window.maxdam * window.AttackDefenseModifier * window.PhysicalModifiers * window.UmelkaModifiers + maxmag; if ((window.stage.pole.obj[attacker]['deathstrike']) && (window.stage.pole.obj[defender]['maxhealth'] < 400) && (!window.stage.pole.obj[defender]['stone'])) { if ((window.stage.pole.obj[defender]['nownumber'] - 1) * window.stage.pole.obj[defender]['maxhealth'] + window.stage.pole.obj[defender]['nowhealth'] > window.PhysicalDamage) { window.PhysicalDamage += window.stage.pole.obj[defender]['maxhealth'] - window.PhysicalDamage % window.stage.pole.obj[defender]['maxhealth']; }; if ((window.stage.pole.obj[defender]['nownumber'] - 1) * window.stage.pole.obj[defender]['maxhealth'] + window.stage.pole.obj[defender]['nowhealth'] > window.PhysicalDamage2) { window.PhysicalDamage2 += window.stage.pole.obj[defender]['maxhealth'] - window.PhysicalDamage2 % window.stage.pole.obj[defender]['maxhealth']; }; }; if (window.stage.pole.obj[attacker]['bladeofslaughter']) { window.PhysicalDamage += Math.min(500, window.stage.pole.obj[defender]['nownumber'] * 2); window.PhysicalDamage2 += Math.min(500, window.stage.pole.obj[defender]['nownumber'] * 2); }; if (window.magic[attacker]['brk']) { window.PhysicalDamage *= (1 + window.magic[attacker]['brk']['effect'] * 0.03); window.PhysicalDamage2 *= (1 + window.magic[attacker]['brk']['effect'] * 0.03); }; if (window.PhysicalDamage < 1) { window.PhysicalDamage = 1; }; if (window.PhysicalDamage2 < 1) { window.PhysicalDamage2 = 1; }; if ((window.stage.pole.obj[attacker]['magicattack']) && (window.l > 2) && (window.stage.pole.issomething(defender, 'dampenmagic'))) window.PhysicalDamage = 0; if (window.magic[defender]['rag']) { window.PhysicalDamage = window.stage.pole.ragedamage(defender, window.PhysicalDamage); window.PhysicalDamage2 = window.stage.pole.ragedamage(defender, window.PhysicalDamage2); }; if ((window.stage.pole.obj[attacker]['vorpalsword']) && (window.stage.pole.obj[defender]['maxhealth'] < 400) && (!window.stage.pole.obj[defender]['stone'])) { window.PhysicalDamage += window.stage.pole.obj[defender]['maxhealth']; window.PhysicalDamage2 += window.stage.pole.obj[defender]['maxhealth']; }; window.PhysicalDamage = Math.round(window.PhysicalDamage); window.PhysicalDamage2 = Math.round(window.PhysicalDamage2); if (window.stage.pole.obj[defender]['pleasureinpain']) { window.PhysicalDamage = Math.round(window.PhysicalDamage * 0.9); window.PhysicalDamage2 = Math.round(window.PhysicalDamage2 * 0.9); }; if (window.stage.pole.obj[defender]['raptureinagony']) { window.PhysicalDamage = Math.round(window.PhysicalDamage * 0.8); window.PhysicalDamage2 = Math.round(window.PhysicalDamage2 * 0.8); }; var totalh = (window.stage.pole.obj[defender]['nownumber'] - 1) * window.stage.pole.obj[defender]['maxhealth'] + window.stage.pole.obj[defender]['nowhealth']; window.Uronkills = Math.floor(Math.min(window.PhysicalDamage, totalh) / window.stage.pole.obj[defender]['maxhealth']); window.Uronkills2 = Math.floor(Math.min(window.PhysicalDamage2, totalh) / window.stage.pole.obj[defender]['maxhealth']); var nowhealth = window.stage.pole.obj[defender]['nowhealth'] - (Math.min(window.PhysicalDamage, totalh) - window.Uronkills * window.stage.pole.obj[defender]['maxhealth']); var nowhealth2 = window.stage.pole.obj[defender]['nowhealth'] - (Math.min(window.PhysicalDamage2, totalh) - window.Uronkills2 * window.stage.pole.obj[defender]['maxhealth']); if (nowhealth <= 0) window.Uronkills++; if (nowhealth2 <= 0) window.Uronkills2++; window.tUronkills += window.Uronkills; window.tUronkills2 += window.Uronkills2; window.tPhysicalDamage += window.PhysicalDamage; window.tPhysicalDamage2 += window.PhysicalDamage2; } function get_dmg_info(cre1_id, cre2_id){ let dmg_dict = attackmonster(cre1_id, window.stage.pole.obj[cre1_id].x, window.stage.pole.obj[cre1_id].y, window.stage.pole.obj[cre2_id].x, window.stage.pole.obj[cre2_id].y, cre2_id); return {min: window.PhysicalDamage, max: window.PhysicalDamage2, min_killed: window.Uronkills, max_killed: window.Uronkills2} } let defender_obj_id = 0 let selected_id = 0 function battleHelper_display(ifDisplay){ [...outer_chat.children].forEach(child=>{ if (["B","BR"].includes(child.tagName) || child.className == "cont"){ child.style.display = ifDisplay ? "inline" : "none" } }) } function refresh(){ battleHelper_display(true) set_Display([select, side_button, collapse_button, document.querySelector("#chosen_cre_heading"), coeff_button], "inline") refresh_button.innerHTML = "Обновить" let cre_list = Object.values(window.stage.pole.obj); cre_list.sort(function(a, b) { return a.obj_index - b.obj_index; }); [...chat.children].forEach(child=>{ if (child.tagName == "P") child.remove() }); [...select.children].forEach(child=>child.remove()) let found_defender = false cre_list.forEach(creature => { if (![0,-1].includes(creature.nownumber) && creature.nametxt!="" && creature.side == chosen.side && creature.hero == undefined){ let option_id = `cre_no${cre_list.indexOf(creature)}` select.appendChild(elStringToEl(`#${option_id}`, `<option id = "${option_id}" value = "${creature.obj_index}">${creature.nametxt} [${creature.nownumber}] </option>`)) if (!found_defender) { if (`${creature.obj_index}` == chosen.creature) found_defender = true defender_obj_id = creature.obj_index selected_id = [...select.children].indexOf(select.lastChild) } } }) let headingString = `<div id = "chosen_cre_heading" style="display:inline;"> <span>Урон по </span><span style="color:#ffffff; font-size: 110%; font-weight: bold;">${cre_list[defender_obj_id-1].nametxt} [${cre_list[defender_obj_id-1].nownumber}] :</span> </div>` let heading1 = document.querySelector("#chosen_cre_heading"); heading1 && heading1.remove() chat.appendChild(elStringToEl("#chosen_cre_heading", headingString)) cre_list.forEach(creature => { if (creature.side == -chosen.side) { if (creature.nownumber == 0 || creature.nametxt == "") return let dmg = get_dmg_info(creature.obj_index, defender_obj_id) let hp = cre_list[defender_obj_id-1].maxhealth let practical_overall_hp; if (cre_list[defender_obj_id-1].attack>creature.defence){ practical_overall_hp = creature.maxhealth*creature.nownumber/(1+0.05*Math.abs(cre_list[defender_obj_id-1].attack-creature.defence)) } else { practical_overall_hp = creature.maxhealth*creature.nownumber*(1+0.05*Math.abs(cre_list[defender_obj_id-1].attack-creature.defence)) } let koef = (((dmg.max + dmg.min)/2)/practical_overall_hp).toFixed(2) let row_id = `row_no${cre_list.indexOf(creature)}` let koef_string = `(коэф. урона <b>${koef}</b>)` let row_html = `<p id = "${row_id}"><span style = "text-decoration: underline;color:#bfbfbf" >${creature.nametxt}</span> [${creature.nownumber}] --> <b style = "color:#bfbfbf">${Math.floor(dmg.min/hp)}-${Math.floor(dmg.max/hp)}</b> существ (${dmg.min}-${dmg.max}) ${(creature.hero == undefined&&coeff_on) ? koef_string : ""} </p>`; chat.appendChild(elStringToEl(`#${row_id}`, row_html)) } }) select.options.item(selected_id).selected = true }