battle_damage_tooltip

Показывает урон всех стеков стороны 1 по одному выбранному стеку стороны 2. Выбор существа и стороны по кнопке, доп. настройки в настройках боя. Кнопка "Свернуть" сворачивает также скрипт battleHelper от omne. Коэф. урона -- отношение урон/хп (то есть у кого больше всех коэффициент, с того выгоднее начинать).

目前为 2023-04-15 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name battle_damage_tooltip
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.8.3
  5. // @description Показывает урон всех стеков стороны 1 по одному выбранному стеку стороны 2. Выбор существа и стороны по кнопке, доп. настройки в настройках боя. Кнопка "Свернуть" сворачивает также скрипт battleHelper от omne. Коэф. урона -- отношение урон/хп (то есть у кого больше всех коэффициент, с того выгоднее начинать).
  6. // @author Something begins
  7. // @license None
  8. // @match https://www.heroeswm.ru/war*
  9. // @match https://my.lordswm.com/war*
  10. // @match https://www.lordswm.com/war*
  11. // @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
  12. // @grant GM_setValue
  13. // @grant GM_getValue
  14. // @grant unsafeWindow
  15. // ==/UserScript==
  16. // Странные способы в некоторых местах обусловлены конфликтом со скриптом battleHelper от omne
  17. let chosen = {side: 1, creature: "Высшие вампиры", afterSideSwitchCre: {"-1": "", "1": ""}}
  18. let chat = document.getElementById("chat_inside");
  19. let select = document.getElementById("choose_cre")
  20. let refresh_button = document.getElementById("dmg_list_refresh")
  21. let side_button = document.getElementById("change_side")
  22. let collapse_button = document.getElementById("collapse")
  23. let coeff_button = document.getElementById("dmg_coeff_on")
  24. let outer_chat = document.getElementById("chat_format");
  25. const settings_panel = document.querySelector("#webgl_settings_whole")
  26.  
  27.  
  28. function GM_toggle_boolean(GM_key, boolean){
  29. boolean = !boolean
  30. GM_setValue(GM_key, boolean);
  31. return boolean
  32. }
  33. function set_Display(element_arr, displayProperty){
  34. element_arr.forEach(element=>{
  35. if (element == null) return
  36. element.style.display = displayProperty
  37. })
  38. }
  39. function readjust_elements(){
  40. chat = document.getElementById("chat_inside");
  41. select = document.getElementById("choose_cre")
  42. refresh_button = document.getElementById("dmg_list_refresh")
  43. side_button = document.getElementById("change_side")
  44. collapse_button = document.getElementById("collapse")
  45. coeff_button = document.getElementById("dmg_coeff_on")
  46. }
  47. // ========= Настройки ============
  48. let coeff_on;
  49. const GM_coeff_on = GM_getValue('coeff_on')
  50. coeff_on = GM_coeff_on!=undefined ? GM_coeff_on : false;
  51.  
  52. let battleHelper_on;
  53. const GM_battleHelper_on = GM_getValue('battleHelper_on')
  54. battleHelper_on = GM_battleHelper_on!=undefined ? GM_battleHelper_on: true ;
  55. let new_settings = `<div class="info_row">
  56. <label class="checkbox_container">Вкл/выкл коэф. урона <input type="checkbox" checked="true" id="coeff_on"><span class="checkbox_checkmark"></span>
  57. </label>
  58. </div>
  59. <div class="info_row">
  60. <label class="checkbox_container">Вкл/выкл. battleHelper в чате <input type="checkbox" checked="true" id="battleHelper_on"><span class="checkbox_checkmark"></span>
  61. </label>
  62. </div>
  63. `
  64. settings_panel.insertAdjacentHTML("afterend", new_settings)
  65.  
  66. let settings_interval = setInterval(()=>{
  67. let temp = document.querySelector("#coeff_on")
  68. if (temp){
  69. document.querySelector("#coeff_on").checked = coeff_on
  70. document.querySelector("#battleHelper_on").checked = battleHelper_on
  71. clearInterval(settings_interval)
  72. }
  73. },300)
  74.  
  75. document.querySelector("#win_Settings > div.fullLog_croppedArea.WinCroppedBlockHeight").addEventListener('change', function(event) {
  76. let child = event.target
  77. switch (child.id){
  78. case "coeff_on":
  79. coeff_on = GM_toggle_boolean("coeff_on", coeff_on)
  80. refresh()
  81. break;
  82. case "battleHelper_on":
  83. battleHelper_on = GM_toggle_boolean("battleHelper_on", battleHelper_on)
  84. refresh()
  85. break
  86. }
  87. });
  88.  
  89. // ========= battleHelper ============
  90.  
  91. function battleHelper_display(ifDisplay){
  92. if (ifDisplay){
  93. let br_list = [...outer_chat.children].filter(br_element =>"BR" == br_element.tagName);
  94. let team_no = 0
  95. br_list.forEach(br_element=>{
  96. if (br_list.indexOf(br_element)%2==0){
  97. team_no++;
  98. br_element.insertAdjacentHTML("afterend", `Команда ${team_no}`)
  99. }
  100. });
  101. }
  102. else {
  103. const childNodes = outer_chat.childNodes;
  104. for (let i = 0; i < childNodes.length; i++) {
  105. const childNode = childNodes[i];
  106. if (childNode.nodeType === Node.TEXT_NODE) {
  107. const text = childNode.textContent.trim();
  108. if (text !== '') {
  109. childNode.textContent = '';
  110. }
  111. }
  112. }
  113. }
  114. [...outer_chat.children].forEach(child=>{
  115. if (["B","BR"].includes(child.tagName) || child.className == "cont"){
  116. child.style.display = ifDisplay ? "inline" : "none"
  117. }
  118. })
  119. readjust_elements()
  120. }
  121. if (!battleHelper_on) {
  122. let cre_loaded = false;
  123. let intervalId = setInterval(function() {
  124. if (unsafeWindow.stage != undefined) {
  125. setTimeout(()=>{
  126. battleHelper_display(false);
  127. clearInterval(intervalId)
  128. }, 2000)
  129. }
  130. }, 10);
  131. }
  132. // -----------------------------------
  133.  
  134. outer_chat.insertAdjacentHTML("beforeend", `<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>
  135. <select style = "display : none; background-color: #333; color: white; margin: 10px" id = "choose_cre"></select>
  136. <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>
  137. <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>
  138. `)
  139. outer_chat.addEventListener('click', function(event) {
  140. let child = event.target
  141. switch(child.id){
  142. case "dmg_list_refresh":
  143. readjust_elements()
  144. refresh()
  145. break
  146. case "change_side":
  147. chosen.afterSideSwitchCre[chosen.side] = chosen.creature
  148. chosen.side = - chosen.side
  149. chosen.creature = chosen.afterSideSwitchCre[chosen.side]
  150. refresh()
  151. break
  152. case "collapse":
  153. battleHelper_display(false);
  154. [...chat.children].forEach(child=>{
  155. if (child.tagName == "P") child.remove()
  156. });
  157. refresh_button.innerHTML = "Открыть";
  158. set_Display([select, side_button, collapse_button, document.querySelector("#chosen_cre_heading"), coeff_button], "none")
  159. break
  160. case "dmg_coeff_on":
  161. coeff_on = GM_toggle_boolean("coeff_on", coeff_on)
  162. refresh()
  163. coeff_button.innerHTML = coeff_on? "Выкл. коэф": "Вкл. коэф."
  164. break
  165. }
  166. })
  167. outer_chat.addEventListener('change', function() {
  168. chosen.creature = select.value
  169. refresh()
  170. });
  171.  
  172.  
  173.  
  174. // Родная функция гвд с поправками на переменную l и модификаторами magic[]
  175. // а еще бесполезные `unsafeWindow.` перед каждой (почти) глобальной для страницы переменной, потому что es-lint в тамперманки ругается kek
  176. function attackmonster(attacker, ax, ay, x, y, defender, shootok, koef, inuse) {
  177.  
  178. var mainattack = 1;
  179. var ax1 = ax;
  180. var ay1 = ay;
  181. if (defender == 1000) return 0;
  182. if (defender <= 0) return 0;
  183. if (!unsafeWindow.stage.pole.obj[defender]) return 0;
  184. if (unsafeWindow.stage.pole.obj[defender]['hero']) return 0;
  185. if (unsafeWindow.stage.pole.obj[defender]['rock']) return 0;
  186. if (koef == undefined) koef = 1;
  187. if (inuse == undefined) inuse = '';
  188. var len = unsafeWindow.wmap2[y * defxn + x];
  189. if ((unsafeWindow.stage.pole.obj[attacker].x == x) && (unsafeWindow.stage.pole.obj[attacker].y == y)) len = spd;
  190. shootok = 1;
  191. function getAdjacentAndDiagonalCoords(x, y) {
  192. const adjacentAndDiagonalCoords = [];
  193. adjacentAndDiagonalCoords.push([x + 1, y]);
  194. adjacentAndDiagonalCoords.push([x - 1, y]);
  195. adjacentAndDiagonalCoords.push([x, y + 1]);
  196. adjacentAndDiagonalCoords.push([x, y - 1]);
  197. adjacentAndDiagonalCoords.push([x + 1, y + 1]);
  198. adjacentAndDiagonalCoords.push([x - 1, y + 1]);
  199. adjacentAndDiagonalCoords.push([x + 1, y - 1]);
  200. adjacentAndDiagonalCoords.push([x - 1, y - 1]);
  201. return adjacentAndDiagonalCoords;
  202. }
  203. let attacker_adjacent_coords = getAdjacentAndDiagonalCoords(stage.pole.obj[attacker].x, stage.pole.obj[attacker].y)
  204. let enemies_list = Object.values(stage.pole.obj).filter(creature=>creature.side!=stage.pole.obj[attacker].side)
  205. enemies_list.forEach(enemy=>{
  206. attacker_adjacent_coords.forEach(coord=>{
  207. if (coord[0] == enemy.x && coord[1] == enemy.y) shootok = 0
  208. })
  209. })
  210.  
  211. if (unsafeWindow.stage.pole.obj[attacker]['big']) {
  212. if (ax > x) {
  213. x++;
  214. };
  215. if (ay > y) {
  216. y++;
  217. };
  218. };
  219. if (unsafeWindow.stage.pole.obj[attacker]['bigx']) {
  220. if (ax > x) {
  221. x++;
  222. };
  223. };
  224. if (unsafeWindow.stage.pole.obj[attacker]['bigy']) {
  225. if (ay > y) {
  226. y++;
  227. };
  228. };
  229. var spd = Math.max(0, Math.round((unsafeWindow.stage.pole.obj[attacker].speed + unsafeWindow.stage.pole.obj[attacker]['ragespeed'] + unsafeWindow.stage.pole.obj[attacker]['speedaddon']) * unsafeWindow.stage.pole.obj[attacker].speedmodifier));
  230. if (unsafeWindow.magic[attacker]['ent']) {
  231. spd = 0;
  232. };
  233. var movelen = spd - len;
  234. unsafeWindow.attacker_c = attacker;
  235. unsafeWindow.ax_c = ax;
  236. unsafeWindow.ay_c = ay;
  237. unsafeWindow.x_c = x;
  238. unsafeWindow.y_c = y;
  239. unsafeWindow.defender_c = defender;
  240. unsafeWindow.shootok_c = shootok;
  241. if ((x == 0) && (y == 0)) {
  242. x = unsafeWindow.stage.pole.obj[attacker]['x'];
  243. y = unsafeWindow.stage.pole.obj[attacker]['y'];
  244. };
  245. if ((defender > 0) && (unsafeWindow.stage.pole.obj[defender]['big'])) {
  246. if ((x - ax > 1) && (ax < x) && (defender == mapobj[ay * defxn + ax + 1])) {
  247. ax++;
  248. };
  249. if ((y - ay > 1) && (ay < y) && (defender == mapobj[(ay + 1) * defxn + ax])) {
  250. ay++;
  251. };
  252. if ((ax - x > 1) && (ax > x) && (defender == mapobj[ay * defxn + ax - 1])) {
  253. ax--;
  254. };
  255. if ((ay - y > 1) && (ay > y) && (defender == mapobj[(ay - 1) * defxn + ax])) {
  256. ay--;
  257. };
  258. };
  259. if ((defender > 0) && (unsafeWindow.stage.pole.obj[defender]['bigx'])) {
  260. if ((x - ax > 1) && (ax < x) && (defender == mapobj[ay * defxn + ax + 1])) {
  261. ax++;
  262. };
  263. if ((ax - x > 1) && (ax > x) && (defender == mapobj[ay * defxn + ax - 1])) {
  264. ax--;
  265. };
  266. };
  267. if ((defender > 0) && (unsafeWindow.stage.pole.obj[defender]['bigy'])) {
  268. if ((y - ay > 1) && (ay < y) && (defender == mapobj[(ay + 1) * defxn + ax])) {
  269. ay++;
  270. };
  271. if ((ay - y > 1) && (ay > y) && (defender == mapobj[(ay - 1) * defxn + ax])) {
  272. ay--;
  273. };
  274. };
  275. let dx = x - ax;
  276. let dy = y - ay;
  277. l = dx * dx + dy * dy;
  278.  
  279. if (movelen == undefined) movelen = 0;;
  280. unsafeWindow.PhysicalModifiers = 1;
  281. unsafeWindow.PhysicalModifiers *= koef;
  282. if (unsafeWindow.stage.pole.obj[attacker]['shadowattack']) l = 0;
  283.  
  284. var hera = 0;
  285. var herd = 0;
  286. len = unsafeWindow.stage.pole.obj_array.length;
  287. for (var k1 = 0; k1 < len; k1++) {
  288. unsafeWindow.k = unsafeWindow.stage.pole.obj_array[k1];
  289.  
  290. if ((unsafeWindow.stage.pole.obj[k].hero) && (unsafeWindow.stage.pole.obj[k].owner == unsafeWindow.stage.pole.obj[attacker].owner)) hera = unsafeWindow.k;
  291. if ((unsafeWindow.stage.pole.obj[k].hero) && (unsafeWindow.stage.pole.obj[k].owner == unsafeWindow.stage.pole.obj[defender].owner)) herd = unsafeWindow.k;
  292. };
  293. if ((unsafeWindow.stage.pole.obj[defender]['pirate']) && ((unsafeWindow.magic[defender]['sea']) || (unsafeWindow.gtype == 125) || (unsafeWindow.gtype == 126) || (unsafeWindow.gtype == 133))) {
  294. unsafeWindow.PhysicalModifiers *= 0.85;
  295. };
  296. if (unsafeWindow.stage.pole.obj[defender]['deadflesh']) {
  297. unsafeWindow.PhysicalModifiers *= 0.8;
  298. };
  299. if (unsafeWindow.stage.pole.obj[defender]['immaterial']) {
  300. unsafeWindow.PhysicalModifiers *= 0.65;
  301. };
  302. if ((unsafeWindow.stage.pole.obj[attacker]['oppressionofweak']) && (unsafeWindow.stage.pole.obj[defender]['level'] == 1)) {
  303. unsafeWindow.PhysicalModifiers *= 1.5;
  304. };
  305. if ((unsafeWindow.stage.pole.obj[attacker]['fearofstrong']) && (unsafeWindow.stage.pole.obj[defender]['level'] == 7)) {
  306. unsafeWindow.PhysicalModifiers *= 0.5;
  307. };
  308. if ((hera > 0) && (unsafeWindow.magic[hera]['bna'])) {
  309. unsafeWindow.PhysicalModifiers = unsafeWindow.PhysicalModifiers * (1 + unsafeWindow.magic[hera]['bna']['effect'] / 100);
  310. if ((unsafeWindow.stage.pole.obj[defender]['mechanical']) && (unsafeWindow.magic[hera]['MEC'])) {
  311. unsafeWindow.PhysicalModifiers *= 1 + unsafeWindow.magic[hera]['MEC']['effect'] / 100;
  312. };
  313. if ((unsafeWindow.stage.pole.obj[attacker]['mechanical']) && (unsafeWindow.magic[hera]['mch'])) {
  314. unsafeWindow.PhysicalModifiers *= 1 + unsafeWindow.magic[hera]['mch']['effect'] / 100;
  315. };
  316. };
  317. if ((unsafeWindow.stage.pole.obj[defender]['building']) && (!unsafeWindow.stage.pole.obj[attacker]['siegewalls'])) {
  318. unsafeWindow.PhysicalModifiers *= 0.05;
  319. };
  320. if ((defender > 0) && (unsafeWindow.stage.pole.obj[attacker]['cruelty']) && ((unsafeWindow.stage.pole.obj[defender]['nowhealth'] < unsafeWindow.stage.pole.obj[defender]['maxhealth']) || (unsafeWindow.stage.pole.obj[defender]['nownumber'] < unsafeWindow.stage.pole.obj[defender]['maxnumber']))) {
  321. unsafeWindow.PhysicalModifiers *= 1.15;
  322. };
  323. if ((defender > 0) && (unsafeWindow.stage.pole.obj[attacker]['morecruelty']) && ((unsafeWindow.stage.pole.obj[defender]['nowhealth'] < unsafeWindow.stage.pole.obj[defender]['maxhealth']) || (unsafeWindow.stage.pole.obj[defender]['nownumber'] < unsafeWindow.stage.pole.obj[defender]['maxnumber']))) {
  324. unsafeWindow.PhysicalModifiers *= 1.3;
  325. };
  326. if ((unsafeWindow.stage.pole.obj[attacker]['giantkiller']) && (unsafeWindow.stage.pole.obj[defender]['big'])) unsafeWindow.PhysicalModifiers *= 2;
  327. if ((unsafeWindow.stage.pole.obj[attacker]['pygmykiller']) && (!unsafeWindow.stage.pole.obj[defender]['big'])) unsafeWindow.PhysicalModifiers *= 1.33;
  328. if (unsafeWindow.stage.pole.obj[attacker]['stormstrike']) unsafeWindow.PhysicalModifiers *= 2;
  329. if ((unsafeWindow.stage.pole.obj[attacker]['undeadkiller']) && (unsafeWindow.stage.pole.obj[defender]['undead'])) unsafeWindow.PhysicalModifiers *= 1.5;
  330. if ((unsafeWindow.stage.pole.obj[attacker]['pirate']) && (unsafeWindow.magic[defender]['blb'])) unsafeWindow.PhysicalModifiers *= 1.5;
  331. if ((!unsafeWindow.stage.pole.obj[attacker]['hero']) && (unsafeWindow.magic[attacker]['zat'])) {
  332. unsafeWindow.PhysicalModifiers *= 1.15;
  333. };
  334. if ((herd > 0) && (unsafeWindow.magic[herd]['bnd'])) {
  335. unsafeWindow.PhysicalModifiers = unsafeWindow.PhysicalModifiers / (1 + unsafeWindow.magic[herd]['bnd']['effect'] / 100);
  336. };
  337. if ((herd > 0) && (unsafeWindow.magic[herd]['fld'])) {
  338. unsafeWindow.PhysicalModifiers = unsafeWindow.PhysicalModifiers * (1 - unsafeWindow.magic[herd]['fld']['effect'] / 100);
  339. };
  340. if ((herd > 0) && (unsafeWindow.magic[herd]['rcd']) && (monster_race[unsafeWindow.stage.pole.obj[attacker]['id']] == unsafeWindow.magic[herd]['rcd']['effect'])) {
  341. unsafeWindow.PhysicalModifiers = unsafeWindow.PhysicalModifiers * 0.93;
  342. };
  343. if (unsafeWindow.magic[attacker]['prp']) {
  344. unsafeWindow.PhysicalModifiers = unsafeWindow.PhysicalModifiers * (1 + unsafeWindow.magic[attacker]['prp']['effect'] / 100);
  345. };
  346. if (unsafeWindow.magic[defender]['sta']) {
  347. unsafeWindow.PhysicalModifiers *= 0.5;
  348. };
  349. if ((unsafeWindow.magic[attacker]['chd']) && (unsafeWindow.stage.pole.obj[unsafeWindow.magic[attacker]['chd']['effect']]['nownumber'] > 0) && (unsafeWindow.magic[attacker]['chd']['effect'] != defender)) {
  350. unsafeWindow.PhysicalModifiers *= 0.55;
  351. };
  352. unsafeWindow.PhysicalModifiers *= unsafeWindow.stage.pole.checkmembrane(defender);
  353. if (!unsafeWindow.stage.pole.obj[attacker]['hero']) {
  354. if ((l <= 2) && (unsafeWindow.stage.pole.obj[attacker]['shooter']) && (!unsafeWindow.stage.pole.obj[attacker]['nopenalty']) && (!unsafeWindow.stage.pole.obj[attacker]['warmachine'])) {
  355. unsafeWindow.PhysicalModifiers = unsafeWindow.PhysicalModifiers * 0.5;
  356. };
  357. if ((l > 2) && (unsafeWindow.stage.pole.obj[attacker]['rangepenalty'])) {
  358. unsafeWindow.PhysicalModifiers = unsafeWindow.PhysicalModifiers * 0.5;
  359. };
  360. unsafeWindow.rangemod = 1;
  361. if ((l > 2) && (unsafeWindow.stage.pole.obj[attacker]['shooter']) && (((unsafeWindow.stage.pole.obj[attacker]['range'] < Math.sqrt(l)) && (!unsafeWindow.stage.pole.obj[attacker].shadowattack)) || ((iswalls) && (!unsafeWindow.stage.pole.obj[attacker]['hero']) && (unsafeWindow.checkwall(x, y, ax, ay))))) {
  362. unsafeWindow.PhysicalModifiers = unsafeWindow.PhysicalModifiers * 0.5;
  363. unsafeWindow.rangemod = 0.5;
  364. };
  365. if ((l > 2) && (unsafeWindow.stage.pole.obj[attacker]['shooter']) && (iswalls2) && (!unsafeWindow.stage.pole.obj[attacker]['hero']) && (((!unsafeWindow.stage.pole.obj[attacker].siegewalls) || (btype == 118)) || (!unsafeWindow.stage.pole.obj[defender].stone)) && (unsafeWindow.checkwall2(x, y, ax, ay, attacker))) {
  366. unsafeWindow.PhysicalModifiers = unsafeWindow.PhysicalModifiers * 0.5;
  367. unsafeWindow.rangemod *= 0.5;
  368. };
  369. };
  370. var _PERK_ARCHERY = 11;
  371. var _PERK_EVASION = 22;
  372. if ((defender > 0) && (unsafeWindow.stage.pole.obj[defender]['dodge']) && (((l <= 2) && (!unsafeWindow.stage.pole.obj[attacker]['ballista']) && (inuse != 'ssh') && (inuse != 'mga') && (inuse != 'dcd') && (inuse != 'chs') && (!unsafeWindow.stage.pole.obj[attacker]['hero'])) || (inuse == 'brs') || (inuse == 'cpt'))) {
  373. unsafeWindow.PhysicalModifiers *= 0.5;
  374. };
  375. if (((l > 2) || (shootok == 1)) && (!unsafeWindow.stage.pole.obj[attacker]['hero']) && (unsafeWindow.stage.pole.obj[attacker]['shooter'])) {
  376. if (unsafeWindow.isperk(attacker, _PERK_ARCHERY)) unsafeWindow.PhysicalModifiers *= 1.2;
  377. if (unsafeWindow.isperk(defender, _PERK_EVASION)) unsafeWindow.PhysicalModifiers *= 0.8;
  378. if ((!unsafeWindow.stage.pole.obj[defender]['lshield']) && (unsafeWindow.stage.pole.shieldother(defender))) {
  379. unsafeWindow.PhysicalModifiers = unsafeWindow.PhysicalModifiers * 0.75;
  380. };
  381. if ((unsafeWindow.stage.pole.obj[defender]['lshield']) || (unsafeWindow.stage.pole.obj[defender]['hollowbones'])) {
  382. unsafeWindow.PhysicalModifiers = unsafeWindow.PhysicalModifiers * 0.5;
  383. };
  384. if (unsafeWindow.stage.pole.obj[defender]['diamondarmor']) {
  385. unsafeWindow.PhysicalModifiers = unsafeWindow.PhysicalModifiers * 0.1;
  386. };
  387. if (unsafeWindow.stage.pole.obj[defender]['shielded']) {
  388. unsafeWindow.PhysicalModifiers = unsafeWindow.PhysicalModifiers * 0.75;
  389. };
  390. if (unsafeWindow.stage.pole.obj[defender]['unprotectedtarget']) {
  391. unsafeWindow.PhysicalModifiers = unsafeWindow.PhysicalModifiers * 1.25;
  392. };
  393. if (unsafeWindow.magic[defender]['dfm']) {
  394. unsafeWindow.PhysicalModifiers = unsafeWindow.PhysicalModifiers * (1 - unsafeWindow.magic[defender]['dfm']['effect'] / 100);
  395. };
  396. if (unsafeWindow.magic[attacker]['cnf']) {
  397. unsafeWindow.PhysicalModifiers = unsafeWindow.PhysicalModifiers * (1 - unsafeWindow.magic[attacker]['cnf']['effect'] / 100);
  398. };
  399.  
  400. if (hera > 0) {
  401. if (unsafeWindow.magic[hera]['sat']) {
  402. unsafeWindow.PhysicalModifiers = unsafeWindow.PhysicalModifiers * (100 + unsafeWindow.magic[hera]['sat']['effect']) / 100;
  403. };
  404. };
  405. };
  406. if ((!unsafeWindow.stage.pole.obj[attacker]['hero']) && (unsafeWindow.isperk(attacker, _PERK_BLESS))) {
  407. unsafeWindow.PhysicalModifiers *= 1.04;
  408. };
  409. let o = unsafeWindow.stage.pole.obj[attacker]['owner'];
  410. if (unsafeWindow.magic[defender]['mf' + o]) {
  411. unsafeWindow.PhysicalModifiers *= 1 + unsafeWindow.magic[defender]['mf' + o]['effect'] / 100;
  412. };
  413. if ((!unsafeWindow.stage.pole.obj[attacker]['hero']) && (unsafeWindow.isperk(attacker, _PERK_FERVOR))) {
  414. unsafeWindow.PhysicalModifiers *= 1.03;
  415. };
  416. if (hera > 0) {
  417. var h = hera;
  418. if ((unsafeWindow.magic[h]['nut']) && ((plid2 == -2) || (ohotnik_set_neutral()))) {
  419. unsafeWindow.PhysicalModifiers = unsafeWindow.PhysicalModifiers * (100 + unsafeWindow.magic[h]['nut']['effect']) / 100;
  420. };
  421. if ((unsafeWindow.magic[h]['mle']) && ((unsafeWindow.stage.pole.obj[attacker].shooter && shootok==0)||(unsafeWindow.stage.pole.obj[attacker].shooter!= 1) || unsafeWindow.stage.pole.obj[attacker].shots==0)) {
  422. unsafeWindow.PhysicalModifiers = unsafeWindow.PhysicalModifiers * (100 + unsafeWindow.magic[h]['mle']['effect']) / 100;
  423. };
  424. if (unsafeWindow.magic[attacker]['fbd']) {
  425. unsafeWindow.PhysicalModifiers = unsafeWindow.PhysicalModifiers * (100 + Math.floor(unsafeWindow.magic[attacker]['fbd']['effect'] / 10)) / 100;
  426. };
  427. };
  428. unsafeWindow.monatt = unsafeWindow.stage.pole.obj[attacker]['attack'] + unsafeWindow.stage.pole.obj[attacker]['attackaddon'] + unsafeWindow.stage.pole.obj[attacker]['rageattack'];
  429. if ((defender > 0) && (unsafeWindow.stage.pole.obj[attacker]['giantslayer']) && (unsafeWindow.stage.pole.obj[defender]['big'])) unsafeWindow.monatt += 4;
  430. if ((!unsafeWindow.stage.pole.obj[attacker]['undead']) && (!unsafeWindow.stage.pole.obj[attacker]['hero']) && (!unsafeWindow.stage.pole.obj[attacker]['perseverance'])) {
  431. unsafeWindow.frig2 = false;
  432. unsafeWindow.i = attacker;
  433. var bigx = unsafeWindow.stage.pole.obj[i]['big'];
  434. var bigy = unsafeWindow.stage.pole.obj[i]['big'];
  435. if (unsafeWindow.stage.pole.obj[i]['bigx']) bigx = 1;
  436. if (unsafeWindow.stage.pole.obj[i]['bigy']) bigy = 1;
  437. unsafeWindow.xd = unsafeWindow.stage.pole.obj[i]['x'];
  438. unsafeWindow.yd = unsafeWindow.stage.pole.obj[i]['y'];
  439. for (var xz = unsafeWindow.xd - 1; xz <= unsafeWindow.xd + 1 + bigx; xz++) {
  440. for (var yz = unsafeWindow.yd - 1; yz <= unsafeWindow.yd + 1 + bigy; yz++) {
  441. if ((!unsafeWindow.frig2) && (mapobj[yz * defxn + xz] > 0) && (unsafeWindow.stage.pole.obj[mapobj[yz * defxn + xz]]['side'] != unsafeWindow.stage.pole.obj[i]['side']) && (unsafeWindow.stage.pole.obj[mapobj[yz * defxn + xz]]['festeringaura']) && (unsafeWindow.stage.pole.obj[mapobj[yz * defxn + xz]]['nownumber'] > 0)) {
  442. unsafeWindow.monatt -= 4;
  443. unsafeWindow.frig2 = true;
  444. };
  445. };
  446. };
  447. };
  448.  
  449. if ((unsafeWindow.magic[attacker]['bsr']) || (unsafeWindow.magic[attacker]['rof'])) {
  450. unsafeWindow.monatt += Math.floor((unsafeWindow.stage.pole.obj[attacker]['defence'] + unsafeWindow.stage.pole.obj[attacker]['defenceaddon'] + unsafeWindow.stage.pole.obj[attacker]['ragedefence']) * unsafeWindow.stage.pole.obj[attacker]['defencemodifier']);
  451. };
  452. if (herd > 0) {
  453. h = herd;
  454. if ((unsafeWindow.magic[h]['mld']) && ((unsafeWindow.stage.pole.obj[attacker].shooter && shootok==0)||(unsafeWindow.stage.pole.obj[attacker].shooter!= 1) || unsafeWindow.stage.pole.obj[attacker].shots==0)) {
  455. unsafeWindow.PhysicalModifiers = unsafeWindow.PhysicalModifiers * (100 - unsafeWindow.magic[h]['mld']['effect']) / 100;
  456. };
  457. if ((unsafeWindow.magic[h]['_ia']) && (!unsafeWindow.stage.pole.obj[attacker]['perseverance'])) {
  458. unsafeWindow.monatt *= (1 - unsafeWindow.magic[h]['_ia']['effect'] / 100);
  459. };
  460. if ((!unsafeWindow.stage.pole.obj[attacker]['hero']) && (unsafeWindow.stage.pole.obj[attacker].shooter)&& (unsafeWindow.stage.pole.obj[attacker].shots!=0) && (unsafeWindow.magic[h]['msk']) && shootok == 1) {
  461. unsafeWindow.PhysicalModifiers = unsafeWindow.PhysicalModifiers * (100 - unsafeWindow.magic[h]['msk']['effect']) / 100;
  462. };
  463. };
  464. unsafeWindow.defadd = 0;
  465. if (unsafeWindow.stage.pole.obj[defender]['agility']) {
  466. if (!unsafeWindow.magic[defender]['agl']) unsafeWindow.defadd = unsafeWindow.stage.pole.obj[defender]['speed'] * 2;
  467. };
  468. if ((unsafeWindow.stage.pole.obj[defender]['spirit']) && (!unsafeWindow.magic[defender]['spi'])) {
  469. unsafeWindow.PhysicalModifiers *= 0.5;
  470. };
  471. if ((unsafeWindow.stage.pole.obj[attacker]['rageagainsttheliving']) && (unsafeWindow.stage.pole.obj[defender]['alive'])) {
  472. unsafeWindow.PhysicalModifiers *= 1.3;
  473. };
  474. if ((unsafeWindow.stage.pole.obj[defender]['defensivestance']) && (!unsafeWindow.magic[defender]['mvd'])) {
  475. unsafeWindow.defadd += 5;
  476. };
  477. if ((!unsafeWindow.stage.pole.obj[defender]['undead']) && (!unsafeWindow.stage.pole.obj[defender]['armoured']) && (!unsafeWindow.stage.pole.obj[defender]['organicarmor'])) {
  478. unsafeWindow.frig2 = false;
  479. unsafeWindow.i = defender;
  480. bigx = unsafeWindow.stage.pole.obj[i]['big'];
  481. bigy = unsafeWindow.stage.pole.obj[i]['big'];
  482. if (unsafeWindow.stage.pole.obj[i]['bigx']) bigx = 1;
  483. if (unsafeWindow.stage.pole.obj[i]['bigy']) bigy = 1;
  484. unsafeWindow.xd = unsafeWindow.stage.pole.obj[i]['x'];
  485. unsafeWindow.yd = unsafeWindow.stage.pole.obj[i]['y'];
  486. for (let xz = unsafeWindow.xd - 1; xz <= unsafeWindow.xd + 1 + bigx; xz++) {
  487. for (let yz = unsafeWindow.yd - 1; yz <= unsafeWindow.yd + 1 + bigy; yz++) {
  488. if ((!unsafeWindow.frig2) && (mapobj[yz * defxn + xz] > 0) && (unsafeWindow.stage.pole.obj[mapobj[yz * defxn + xz]]['side'] != unsafeWindow.stage.pole.obj[i]['side']) && (unsafeWindow.stage.pole.obj[mapobj[yz * defxn + xz]]['festeringaura']) && (unsafeWindow.stage.pole.obj[mapobj[yz * defxn + xz]]['nownumber'] > 0)) {
  489. unsafeWindow.defadd -= 4;
  490. unsafeWindow.frig2 = true;
  491. };
  492. };
  493. };
  494. };
  495. if ((attacker > 0) && (unsafeWindow.stage.pole.obj[defender]['giantslayer']) && (unsafeWindow.stage.pole.obj[attacker]['big'])) unsafeWindow.defadd += 4;
  496. unsafeWindow.mondef = Math.round((unsafeWindow.stage.pole.obj[defender]['defence'] + unsafeWindow.stage.pole.obj[defender]['defenceaddon'] + unsafeWindow.defadd + unsafeWindow.stage.pole.obj[defender]['ragedefence']) * unsafeWindow.stage.pole.obj[defender]['defencemodifier']);
  497. if (unsafeWindow.magic[defender]['bsr']) {
  498. unsafeWindow.mondef = 0;
  499. };
  500.  
  501. if ((unsafeWindow.stage.pole.obj[attacker]['preciseshot']) && (l > 2) && (l <= 9) && (unsafeWindow.rangemod >= 1)) {
  502. unsafeWindow.mondef = 0;
  503. };
  504. if ((unsafeWindow.stage.pole.obj[attacker]['ignoredefence'])) {
  505. unsafeWindow.mondef *= (1 - unsafeWindow.stage.pole.obj[attacker]['ignoredefence'] / 100);
  506. };
  507. if (unsafeWindow.stage.pole.obj[attacker]['crushingleadership']) {
  508. var morale_delta = unsafeWindow.stage.pole.getmorale(attacker) - unsafeWindow.stage.pole.getmorale(defender);
  509. if (morale_delta > 0) {
  510. unsafeWindow.mondef *= Math.max(0, 1 - morale_delta / 10);
  511. };
  512. };
  513. if (unsafeWindow.stage.pole.obj[attacker]['sacredweapon']) {
  514. var dark_count = get_dark_count(defender);
  515. if (dark_count > 0) {
  516. unsafeWindow.mondef *= Math.max(0, 1 - 0.15 * dark_count);
  517. };
  518. };
  519. if (unsafeWindow.isperk(attacker, _PERK_PIERCING_LUCK)) {
  520. unsafeWindow.mondef *= 1 - Math.max(0, 0.025 * (unsafeWindow.stage.pole.obj[attacker]['luck'] + unsafeWindow.stage.pole.obj[attacker]['luckaddon']));
  521. };
  522. if ((unsafeWindow.stage.pole.obj[defender]['ignoreattack'])) {
  523. unsafeWindow.monatt *= (1 - unsafeWindow.stage.pole.obj[defender]['ignoreattack'] / 100);
  524. };
  525. if ((unsafeWindow.stage.pole.obj[attacker]['ridercharge']) && (movelen > 0)) {
  526. unsafeWindow.mondef = unsafeWindow.mondef * (5 - movelen) / 5;
  527. };
  528. if ((unsafeWindow.stage.pole.obj[attacker]['forcearrow']) && (!unsafeWindow.stage.pole.obj[defender]['armoured']) && (!unsafeWindow.stage.pole.obj[defender]['organicarmor']) && (l > 2)) {
  529. unsafeWindow.mondef *= 0.8;
  530. };
  531. if ((unsafeWindow.stage.pole.obj[attacker]['armorpiercing']) && (!unsafeWindow.stage.pole.obj[defender]['armoured']) && (!unsafeWindow.stage.pole.obj[defender]['organicarmor']) && (l > 2)) {
  532. unsafeWindow.mondef *= 0.5;
  533. };
  534. if ((unsafeWindow.stage.pole.obj[attacker]['jousting']) && (movelen > 0)) {
  535. unsafeWindow.PhysicalModifiers = unsafeWindow.PhysicalModifiers * (1 + 0.05 * movelen);
  536. };
  537. if (((unsafeWindow.stage.pole.obj[attacker]['blindingcharge']) || (unsafeWindow.stage.pole.obj[attacker]['charge'])) && (movelen > 0)) {
  538. unsafeWindow.PhysicalModifiers = unsafeWindow.PhysicalModifiers * (1 + 0.1 * movelen);
  539. };
  540. if ((unsafeWindow.stage.pole.obj[defender]['shieldwall']) && (movelen > 0)) {
  541. unsafeWindow.PhysicalModifiers = unsafeWindow.PhysicalModifiers * Math.max(0.1, 1 - 0.1 * movelen);
  542. };
  543. if ((unsafeWindow.magic[defender]['enc']) && (unsafeWindow.magic[defender]['enc']['effect'] == 1)) {
  544. unsafeWindow.PhysicalModifiers *= 0.5;
  545. };
  546. if ((unsafeWindow.stage.pole.obj[attacker]['safeposition']) && (movelen == 0)) {
  547. unsafeWindow.PhysicalModifiers *= 1.5;
  548. };
  549. if ((unsafeWindow.stage.pole.obj[attacker]['agilesteed']) && (movelen > 0)) {
  550. unsafeWindow.PhysicalModifiers *= 1 - 0.05 * movelen;
  551. };
  552. if (unsafeWindow.mondef < 0) {
  553. unsafeWindow.mondef = 0;
  554. };
  555.  
  556. unsafeWindow.air = 0;
  557. unsafeWindow.fire = 0;
  558. unsafeWindow.water = 0;
  559. unsafeWindow.earth = 0;
  560. if ((hera > 0) && (!unsafeWindow.stage.pole.obj[attacker]['taran'])) {
  561. h = hera;
  562. if (unsafeWindow.magic[h]['_id']) {
  563. unsafeWindow.mondef *= (1 - unsafeWindow.magic[h]['_id']['effect'] / 100);
  564. };
  565. if (unsafeWindow.magic[h]['_aa']) {
  566. unsafeWindow.air = unsafeWindow.magic[h]['_aa']['effect'] / 100;
  567. };
  568. if (unsafeWindow.magic[h]['_af']) {
  569. unsafeWindow.fire = unsafeWindow.magic[h]['_af']['effect'] / 100;
  570. };
  571. if (unsafeWindow.magic[h]['_aw']) {
  572. unsafeWindow.water = unsafeWindow.magic[h]['_aw']['effect'] / 100;
  573. };
  574. if (unsafeWindow.magic[h]['_ae']) {
  575. unsafeWindow.earth = unsafeWindow.magic[h]['_ae']['effect'] / 100;
  576. };
  577. };
  578. if ((unsafeWindow.stage.pole.obj[defender]['armoured']) || (unsafeWindow.stage.pole.obj[defender]['organicarmor'])) {
  579. unsafeWindow.mondef = Math.round((unsafeWindow.stage.pole.obj[defender]['defence'] + unsafeWindow.stage.pole.obj[defender]['defenceaddon'] + unsafeWindow.stage.pole.obj[defender]['ragedefence']) * unsafeWindow.stage.pole.obj[defender]['defencemodifier']);
  580. };
  581. if (unsafeWindow.monatt < 0) {
  582. unsafeWindow.monatt = 0;
  583. };
  584. if (unsafeWindow.monatt > unsafeWindow.mondef) {
  585. unsafeWindow.AttackDefenseModifier = 1 + (unsafeWindow.monatt - unsafeWindow.mondef) * 0.05;
  586. } else {
  587. unsafeWindow.AttackDefenseModifier = 1 / (1 + (unsafeWindow.mondef - unsafeWindow.monatt) * 0.05);
  588. };
  589. if (unsafeWindow.stage.pole.obj[attacker]['hero']) {
  590. unsafeWindow.AttackDefenseModifier = 1;
  591. };
  592. var _PERK_ATTACK1 = 8;
  593. var _PERK_ATTACK2 = 9;
  594. var _PERK_ATTACK3 = 10;
  595. var _PERK_DEFENSE1 = 19;
  596. var _PERK_DEFENSE2 = 20;
  597. var _PERK_DEFENSE3 = 21;
  598.  
  599. if ((!unsafeWindow.stage.pole.obj[attacker]['hero'])&& ((unsafeWindow.stage.pole.obj[attacker].shooter && shootok == 0)||(unsafeWindow.stage.pole.obj[attacker].shooter!= 1))) {
  600. if (unsafeWindow.isperk(attacker, _PERK_ATTACK3)) {
  601. unsafeWindow.PhysicalModifiers *= 1.3;
  602. } else {
  603. if (unsafeWindow.isperk(attacker, _PERK_ATTACK2)) {
  604. unsafeWindow.PhysicalModifiers *= 1.2;
  605. } else
  606. if (unsafeWindow.isperk(attacker, _PERK_ATTACK1)) unsafeWindow.PhysicalModifiers *= 1.1;
  607. };
  608. if (unsafeWindow.isperk(defender, _PERK_DEFENSE3)) {
  609. unsafeWindow.PhysicalModifiers *= 0.7;
  610. } else {
  611. if (unsafeWindow.isperk(defender, _PERK_DEFENSE2)) {
  612. unsafeWindow.PhysicalModifiers *= 0.8;
  613. } else {
  614. if (unsafeWindow.isperk(defender, _PERK_DEFENSE1)) unsafeWindow.PhysicalModifiers *= 0.9;
  615. };
  616. };
  617. };
  618. if ((unsafeWindow.stage.pole.obj[attacker]['siegewalls']) && (unsafeWindow.stage.pole.obj[defender]['stone'])) {
  619. unsafeWindow.PhysicalModifiers *= 10;
  620. };
  621. var _PERK_COLD_STEEL = 14;
  622. var _PERK_FIERY_WRATH = 101;
  623. var _PERK_HELLFIRE_AURA = 123;
  624. var _PERK_RETRIBUTION = 16;
  625.  
  626. if (unsafeWindow.isperk(attacker, _PERK_COLD_STEEL)) unsafeWindow.water = 1 - (1 - unsafeWindow.water) * (0.9);
  627. if (unsafeWindow.isperk(attacker, _PERK_FIERY_WRATH)) unsafeWindow.fire = 1 - (1 - unsafeWindow.fire) * (0.85);
  628. if (unsafeWindow.isperk(attacker, _PERK_HELLFIRE_AURA)) unsafeWindow.fire = 1 - (1 - unsafeWindow.fire) * (0.95);
  629.  
  630. if (unsafeWindow.magic[attacker]['cre']) {
  631. unsafeWindow.air = 1 - (1 - unsafeWindow.air) * (1 - unsafeWindow.magic[attacker]['cre']['effect'] / 100);
  632. };
  633.  
  634. if (unsafeWindow.isperk(attacker, _PERK_RETRIBUTION)) unsafeWindow.PhysicalModifiers *= (1 + Math.min(Math.max(unsafeWindow.stage.pole.getmorale(attacker, x, y), 0), 5) / 20);
  635. if ((unsafeWindow.stage.pole.obj[attacker]['viciousstrike']) && (Math.max(0, Math.round((unsafeWindow.stage.pole.obj[defender]['speed'] + unsafeWindow.stage.pole.obj[defender]['ragespeed'] + unsafeWindow.stage.pole.obj[defender]['speedaddon']) * unsafeWindow.stage.pole.obj[defender]['speedmodifier'])) == 0)) unsafeWindow.PhysicalModifiers *= 1.5;
  636. unsafeWindow.PhysicalModifiers *= unsafeWindow.stage.pole.magicmod(attacker, defender, unsafeWindow.fire, unsafeWindow.air, unsafeWindow.water, unsafeWindow.earth, 0.1);
  637. if ((unsafeWindow.stage.pole.obj[attacker]['bloodfrenzy']) && (unsafeWindow.magic[defender]['fd1'])) {
  638. unsafeWindow.PhysicalModifiers *= 1.3;
  639. };
  640. unsafeWindow.UmelkaModifiers = 1;
  641.  
  642. if ((umelka[unsafeWindow.stage.pole.obj[attacker]['owner']][0] > 0) && (umelka[unsafeWindow.stage.pole.obj[defender]['owner']][0] > 0)) {
  643. unsafeWindow.k = umelka[unsafeWindow.stage.pole.obj[attacker]['owner']][0];
  644. if ((unsafeWindow.k > 0) && (unsafeWindow.k < 11)) {
  645. let j = umelka[unsafeWindow.stage.pole.obj[defender]['owner']][k];
  646. unsafeWindow.UmelkaModifiers = 1 - j * 0.03;
  647. };
  648. };
  649. unsafeWindow.NumCreatures = unsafeWindow.stage.pole.obj[attacker]['nownumber'];
  650. let tsc = 0;
  651.  
  652. bigx = unsafeWindow.stage.pole.obj[defender]['big'];
  653. bigy = unsafeWindow.stage.pole.obj[defender]['big'];
  654. if (unsafeWindow.stage.pole.obj[defender]['bigx']) bigx = 1;
  655. if (unsafeWindow.stage.pole.obj[defender]['bigy']) bigy = 1;
  656. for (var xs = unsafeWindow.stage.pole.obj[defender]['x'] - 1; xs <= unsafeWindow.stage.pole.obj[defender]['x'] + 1 + bigx; xs++) {
  657. for (var ys = unsafeWindow.stage.pole.obj[defender]['y'] - 1; ys <= unsafeWindow.stage.pole.obj[defender]['y'] + 1 + bigy; ys++) {
  658. if ((mapobj[xs + ys * defxn] > 0) && (mapobj[xs + ys * defxn] != defender) && (unsafeWindow.stage.pole.obj[mapobj[xs + ys * defxn]]['shieldguard']) && (unsafeWindow.stage.pole.obj[defender]['side'] == unsafeWindow.stage.pole.obj[mapobj[xs + ys * defxn]]['side'])) {
  659. tsc++;
  660. };
  661. };
  662. };
  663.  
  664.  
  665. unsafeWindow.PhysicalModifiers /= (tsc + 1);
  666.  
  667. var minmag = 0;
  668. var maxmag = 0;
  669. if ((inuse == 'lep') && (unsafeWindow.stage.pole.obj[attacker]['crashingleap'])) {
  670. unsafeWindow.Totalmagicdamage = 0;
  671. unsafeWindow.stage.pole.obj[defender]['attacked'] = 1;
  672. unsafeWindow.stage.pole.attackmagic(attacker, defender, unsafeWindow.stage.pole.obj[attacker]['nownumber'] * 4, 'cold', '', 0, 0, 0);
  673. minmag = unsafeWindow.Totalmagicdamage;
  674. unsafeWindow.Totalmagicdamage = 0;
  675. unsafeWindow.stage.pole.obj[defender]['attacked'] = 1;
  676. unsafeWindow.stage.pole.attackmagic(attacker, defender, unsafeWindow.stage.pole.obj[attacker]['nownumber'] * 6, 'cold', '', 0, 0, 0);
  677. maxmag = unsafeWindow.Totalmagicdamage;
  678. };
  679.  
  680. unsafeWindow.mindam = unsafeWindow.stage.pole.obj[attacker]['mindam'] + unsafeWindow.stage.pole.obj[attacker]['damageaddon'] + (unsafeWindow.stage.pole.obj[attacker]['maxdam'] - unsafeWindow.stage.pole.obj[attacker]['mindam']) * (unsafeWindow.stage.pole.obj[attacker]['mindamaddon']) + unsafeWindow.stage.pole.obj[attacker]['ragedamage'];
  681. unsafeWindow.maxdam = unsafeWindow.stage.pole.obj[attacker]['maxdam'] + unsafeWindow.stage.pole.obj[attacker]['damageaddon'] - (unsafeWindow.stage.pole.obj[attacker]['maxdam'] - unsafeWindow.stage.pole.obj[attacker]['mindam']) * (unsafeWindow.stage.pole.obj[attacker]['maxdamaddon']) + unsafeWindow.stage.pole.obj[attacker]['ragedamage'];
  682. h = hera;
  683. if ((h > 0) && (unsafeWindow.magic[h]) && (unsafeWindow.magic[h]['BLS']) && (unsafeWindow.magic[h]['BLS']['effect'] > 0)) unsafeWindow.mindam = unsafeWindow.maxdam;
  684. if ((h > 0) && (unsafeWindow.magic[h]) && (unsafeWindow.magic[h]['CRS']) && (unsafeWindow.magic[h]['CRS']['effect'] > 0)) unsafeWindow.maxdam = unsafeWindow.mindam;
  685. if ((unsafeWindow.stage.pole.obj[attacker]['taran']) && (unsafeWindow.stage.pole.obj[defender]['stone'])) {
  686. h = hera;
  687. unsafeWindow.mindam = Math.floor(Math.pow(unsafeWindow.stage.pole.obj[h]['maxhealth'], 0.5) * 200 * unsafeWindow.stage.pole.obj[attacker]['mindam']);
  688. unsafeWindow.maxdam = Math.floor(Math.pow(unsafeWindow.stage.pole.obj[h]['maxhealth'], 0.5) * 400 * unsafeWindow.stage.pole.obj[attacker]['maxdam']);
  689. };
  690. if (unsafeWindow.stage.pole.obj[attacker]['accuracy']) unsafeWindow.mindam = unsafeWindow.maxdam;
  691. unsafeWindow.BaseDamage = unsafeWindow.mindam;
  692. unsafeWindow.PhysicalDamage = unsafeWindow.NumCreatures * unsafeWindow.BaseDamage * unsafeWindow.AttackDefenseModifier * unsafeWindow.PhysicalModifiers * unsafeWindow.UmelkaModifiers + minmag;
  693. unsafeWindow.PhysicalDamage2 = unsafeWindow.NumCreatures * unsafeWindow.maxdam * unsafeWindow.AttackDefenseModifier * unsafeWindow.PhysicalModifiers * unsafeWindow.UmelkaModifiers + maxmag;
  694. if ((unsafeWindow.stage.pole.obj[attacker]['deathstrike']) && (unsafeWindow.stage.pole.obj[defender]['maxhealth'] < 400) && (!unsafeWindow.stage.pole.obj[defender]['stone'])) {
  695. if ((unsafeWindow.stage.pole.obj[defender]['nownumber'] - 1) * unsafeWindow.stage.pole.obj[defender]['maxhealth'] + unsafeWindow.stage.pole.obj[defender]['nowhealth'] > unsafeWindow.PhysicalDamage) {
  696. unsafeWindow.PhysicalDamage += unsafeWindow.stage.pole.obj[defender]['maxhealth'] - unsafeWindow.PhysicalDamage % unsafeWindow.stage.pole.obj[defender]['maxhealth'];
  697. };
  698. if ((unsafeWindow.stage.pole.obj[defender]['nownumber'] - 1) * unsafeWindow.stage.pole.obj[defender]['maxhealth'] + unsafeWindow.stage.pole.obj[defender]['nowhealth'] > unsafeWindow.PhysicalDamage2) {
  699. unsafeWindow.PhysicalDamage2 += unsafeWindow.stage.pole.obj[defender]['maxhealth'] - unsafeWindow.PhysicalDamage2 % unsafeWindow.stage.pole.obj[defender]['maxhealth'];
  700. };
  701. };
  702.  
  703. if (unsafeWindow.stage.pole.obj[attacker]['bladeofslaughter']) {
  704. unsafeWindow.PhysicalDamage += Math.min(500, unsafeWindow.stage.pole.obj[defender]['nownumber'] * 2);
  705. unsafeWindow.PhysicalDamage2 += Math.min(500, unsafeWindow.stage.pole.obj[defender]['nownumber'] * 2);
  706. };
  707. if (unsafeWindow.magic[attacker]['brk']) {
  708. unsafeWindow.PhysicalDamage *= (1 + unsafeWindow.magic[attacker]['brk']['effect'] * 0.03);
  709. unsafeWindow.PhysicalDamage2 *= (1 + unsafeWindow.magic[attacker]['brk']['effect'] * 0.03);
  710. };
  711. if (unsafeWindow.PhysicalDamage < 1) {
  712. unsafeWindow.PhysicalDamage = 1;
  713. };
  714. if (unsafeWindow.PhysicalDamage2 < 1) {
  715. unsafeWindow.PhysicalDamage2 = 1;
  716. };
  717. if ((unsafeWindow.stage.pole.obj[attacker]['magicattack']) && (unsafeWindow.l > 2) && (unsafeWindow.stage.pole.issomething(defender, 'dampenmagic'))) unsafeWindow.PhysicalDamage = 0;
  718. if (unsafeWindow.magic[defender]['rag']) {
  719. unsafeWindow.PhysicalDamage = unsafeWindow.stage.pole.ragedamage(defender, unsafeWindow.PhysicalDamage);
  720. unsafeWindow.PhysicalDamage2 = unsafeWindow.stage.pole.ragedamage(defender, unsafeWindow.PhysicalDamage2);
  721. };
  722. if ((unsafeWindow.stage.pole.obj[attacker]['vorpalsword']) && (unsafeWindow.stage.pole.obj[defender]['maxhealth'] < 400) && (!unsafeWindow.stage.pole.obj[defender]['stone'])) {
  723. unsafeWindow.PhysicalDamage += unsafeWindow.stage.pole.obj[defender]['maxhealth'];
  724. unsafeWindow.PhysicalDamage2 += unsafeWindow.stage.pole.obj[defender]['maxhealth'];
  725. };
  726.  
  727. unsafeWindow.PhysicalDamage = Math.round(unsafeWindow.PhysicalDamage);
  728. unsafeWindow.PhysicalDamage2 = Math.round(unsafeWindow.PhysicalDamage2);
  729. if (unsafeWindow.stage.pole.obj[defender]['pleasureinpain']) {
  730. unsafeWindow.PhysicalDamage = Math.round(unsafeWindow.PhysicalDamage * 0.9);
  731. unsafeWindow.PhysicalDamage2 = Math.round(unsafeWindow.PhysicalDamage2 * 0.9);
  732. };
  733. if (unsafeWindow.stage.pole.obj[defender]['raptureinagony']) {
  734. unsafeWindow.PhysicalDamage = Math.round(unsafeWindow.PhysicalDamage * 0.8);
  735. unsafeWindow.PhysicalDamage2 = Math.round(unsafeWindow.PhysicalDamage2 * 0.8);
  736. };
  737. var totalh = (unsafeWindow.stage.pole.obj[defender]['nownumber'] - 1) * unsafeWindow.stage.pole.obj[defender]['maxhealth'] + unsafeWindow.stage.pole.obj[defender]['nowhealth'];
  738. unsafeWindow.Uronkills = Math.floor(Math.min(unsafeWindow.PhysicalDamage, totalh) / unsafeWindow.stage.pole.obj[defender]['maxhealth']);
  739. unsafeWindow.Uronkills2 = Math.floor(Math.min(unsafeWindow.PhysicalDamage2, totalh) / unsafeWindow.stage.pole.obj[defender]['maxhealth']);
  740. var nowhealth = unsafeWindow.stage.pole.obj[defender]['nowhealth'] - (Math.min(unsafeWindow.PhysicalDamage, totalh) - unsafeWindow.Uronkills * unsafeWindow.stage.pole.obj[defender]['maxhealth']);
  741. var nowhealth2 = unsafeWindow.stage.pole.obj[defender]['nowhealth'] - (Math.min(unsafeWindow.PhysicalDamage2, totalh) - unsafeWindow.Uronkills2 * unsafeWindow.stage.pole.obj[defender]['maxhealth']);
  742. if (nowhealth <= 0) unsafeWindow.Uronkills++;
  743. if (nowhealth2 <= 0) unsafeWindow.Uronkills2++;
  744. unsafeWindow.tUronkills += unsafeWindow.Uronkills;
  745. unsafeWindow.tUronkills2 += unsafeWindow.Uronkills2;
  746. unsafeWindow.tPhysicalDamage += unsafeWindow.PhysicalDamage;
  747. unsafeWindow.tPhysicalDamage2 += unsafeWindow.PhysicalDamage2;
  748. }
  749. function get_dmg_info(cre1_id, cre2_id){
  750. let dmg_dict = attackmonster(cre1_id, unsafeWindow.stage.pole.obj[cre1_id].x, unsafeWindow.stage.pole.obj[cre1_id].y, unsafeWindow.stage.pole.obj[cre2_id].x, unsafeWindow.stage.pole.obj[cre2_id].y, cre2_id);
  751. return {min: unsafeWindow.PhysicalDamage, max: unsafeWindow.PhysicalDamage2, min_killed: unsafeWindow.Uronkills, max_killed: unsafeWindow.Uronkills2}
  752.  
  753. }
  754.  
  755. let defender_obj_id = 0
  756. let selected_id = 0
  757. function refresh(){
  758. battleHelper_display(true&&battleHelper_on)
  759. set_Display([select, side_button, collapse_button, document.querySelector("#chosen_cre_heading"), coeff_button], "inline")
  760. refresh_button.innerHTML = "Обновить"
  761. let cre_list = Object.values(unsafeWindow.stage.pole.obj);
  762. cre_list.sort(function(a, b) {
  763. return a.obj_index - b.obj_index;
  764. });
  765. [...chat.children].forEach(child=>{
  766. if (child.tagName == "P") child.remove()
  767. });
  768. [...select.children].forEach(child=>child.remove())
  769. let found_defender = false
  770. cre_list.forEach(creature => {
  771. if (![0,-1].includes(creature.nownumber) && creature.nametxt!="" && creature.side == chosen.side && creature.hero == undefined){
  772. let option_id = `cre_no${cre_list.indexOf(creature)}`
  773. select.insertAdjacentHTML("beforeend", `<option id = "${option_id}" value = "${creature.obj_index}">${creature.nametxt} [${creature.nownumber}] </option>`)
  774. if (!found_defender) {
  775. if (`${creature.obj_index}` == chosen.creature) found_defender = true
  776. defender_obj_id = creature.obj_index
  777. selected_id = [...select.children].indexOf(select.lastChild)
  778. }
  779. }
  780. })
  781. let heading1 = document.querySelector("#chosen_cre_heading");
  782. heading1 && heading1.remove()
  783. chat.insertAdjacentHTML("beforeend", `<div id = "chosen_cre_heading" style="display:inline;">
  784. <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>
  785. </div>`)
  786. cre_list.forEach(creature => {
  787. if (creature.side == -chosen.side) {
  788. if (creature.nownumber == 0 || creature.nametxt == "") return
  789. let dmg = get_dmg_info(creature.obj_index, defender_obj_id)
  790. let hp = cre_list[defender_obj_id-1].maxhealth
  791. let practical_overall_hp;
  792. if (cre_list[defender_obj_id-1].attack>creature.defence){
  793. practical_overall_hp = creature.maxhealth*creature.nownumber/(1+0.05*Math.abs(cre_list[defender_obj_id-1].attack-creature.defence))
  794. }
  795. else {
  796. practical_overall_hp = creature.maxhealth*creature.nownumber*(1+0.05*Math.abs(cre_list[defender_obj_id-1].attack-creature.defence))
  797. }
  798. let koef = (((dmg.max + dmg.min)/2)/practical_overall_hp).toFixed(2)
  799. let row_id = `row_no${cre_list.indexOf(creature)}`
  800. let koef_string = `(коэф. урона <b>${koef}</b>)`
  801. chat.insertAdjacentHTML("beforeend", `<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>`)
  802. }
  803. })
  804. select.options.item(selected_id).selected = true
  805. }