Greasy Fork is available in English.

battleHelper (fixed)

Исправленный и рабочий battleHelper

// ==UserScript==
// @name           battleHelper (fixed)
// @author         Neleus
// @namespace      Neleus
// @description    Исправленный и рабочий battleHelper
// @version        0.42
// @include        /^https{0,1}:\/\/((www|qrator|my)\.(heroeswm|lordswm)\.(ru|com)|178\.248\.235\.15)\/(war|warlog|leader_guild|leader_army|inventory).php(?!.?setkamarmy)/
// @grant          GM_xmlhttpRequest
// @grant          unsafeWindow
// @license        GNU GPLv3
// ==/UserScript==
 
;(function () {
  if (location.pathname.indexOf("leader_guild.php") >= 0) {
    var turnId = {
      amummy: { id: 933, hp: 80 },
      acrossbowman: { id: 1021, hp: 24 },
      air: { id: 153, hp: 30 },
      ancienent: { id: 238, hp: 181 },
      ancientpig: { id: 691, hp: 15 },
      angel: { id: 132, hp: 180 },
      anubis: { id: 917, hp: 160 },
      arcaneelf: { id: 261, hp: 12 },
      archer: { id: 2, hp: 7 },
      archlich: { id: 146, hp: 55 },
      archmage: { id: 104, hp: 30 },
      armorgnom: { id: 982, hp: 55 },
      assassin: { id: 56, hp: 14 },
      assida: { id: 847, hp: 30 },
      axegnom: { id: 985, hp: 10 },
      banditka: { id: 729, hp: 8 },
      banshee: { id: 515, hp: 110 },
      battlegriffin: { id: 36, hp: 35 },
      battlegriffon: { id: 493, hp: 52 },
      battlemage: { id: 578, hp: 29 },
      battlerager: { id: 960, hp: 30 },
      bear: { id: 172, hp: 22 },
      bearrider: { id: 161, hp: 25 },
      behemoth: { id: 131, hp: 210 },
      berserker: { id: 163, hp: 25 },
      bigspider: { id: 724, hp: 55 },
      blackbearrider: { id: 162, hp: 30 },
      blackknight: { id: 272, hp: 90 },
      blackwidow: { id: 661, hp: 14 },
      bloodsister: { id: 315, hp: 24 },
      boar: { id: 690, hp: 17 },
      boarrider: { id: 318, hp: 14 },
      bobbit: { id: 895, hp: 6 },
      bonedragon: { id: 133, hp: 150 },
      brawler: { id: 114, hp: 20 },
      brigand: { id: 725, hp: 5 },
      briskrider: { id: 316, hp: 50 },
      brute: { id: 254, hp: 8 },
      cavalier: { id: 90, hp: 90 },
      cbal: { id: 791, hp: 65 },
      cerberus: { id: 75, hp: 15 },
      champion: { id: 495, hp: 100 },
      chieftain: { id: 436, hp: 48 },
      colossus: { id: 106, hp: 175 },
      conscript: { id: 34, hp: 6 },
      cpirate: { id: 677, hp: 4 },
      crossman: { id: 257, hp: 8 },
      crusader: { id: 672, hp: 30 },
      cursed: { id: 522, hp: 20 },
      cursedent: { id: 664, hp: 215 },
      cyclop: { id: 89, hp: 85 },
      cyclopking: { id: 237, hp: 95 },
      cyclopod: { id: 537, hp: 100 },
      dancer: { id: 25, hp: 12 },
      darkbird: { id: 544, hp: 60 },
      darkrider: { id: 51, hp: 40 },
      ddhigh: { id: 587, hp: 34 },
      deephydra: { id: 149, hp: 125 },
      defender: { id: 157, hp: 7 },
      devil: { id: 82, hp: 166 },
      dgolem: { id: 520, hp: 350 },
      diamondgolem: { id: 660, hp: 60 },
      djinn: { id: 39, hp: 40 },
      djinn_sultan: { id: 105, hp: 45 },
      djinn_vizier: { id: 579, hp: 50 },
      druid: { id: 26, hp: 34 },
      druideld: { id: 120, hp: 38 },
      dryad: { id: 255, hp: 6 },
      eadaughter: { id: 333, hp: 35 },
      earth: { id: 154, hp: 75 },
      efreeti: { id: 280, hp: 90 },
      elf: { id: 19, hp: 10 },
      elgargoly: { id: 256, hp: 16 },
      enforcer: { id: 35, hp: 7 },
      executioner: { id: 335, hp: 40 },
      familiar: { id: 80, hp: 6 },
      fatpirate: { id: 651, hp: 100 },
      fatpirateup: { id: 652, hp: 120 },
      fcentaur: { id: 310, hp: 6 },
      fire: { id: 155, hp: 43 },
      firebird: { id: 536, hp: 65 },
      firedragon: { id: 168, hp: 230 },
      flamelord: { id: 958, hp: 120 },
      footman: { id: 10, hp: 16 },
      foulhydra: { id: 746, hp: 125 },
      foulwyvern: { id: 337, hp: 105 },
      fury: { id: 53, hp: 16 },
      ghost: { id: 11, hp: 8 },
      giant: { id: 792, hp: 100 },
      giantarch: { id: 817, hp: 100 },
      gnomon: { id: 728, hp: 9 },
      goblin: { id: 14, hp: 3 },
      goblinarcher: { id: 314, hp: 3 },
      goblinmag: { id: 545, hp: 3 },
      goblinus: { id: 329, hp: 3 },
      gogachi: { id: 285, hp: 13 },
      greendragon: { id: 103, hp: 200 },
      gremlin: { id: 9, hp: 5 },
      griffon: { id: 3, hp: 30 },
      grimrider: { id: 121, hp: 50 },
      harpooner: { id: 378, hp: 10 },
      harpy: { id: 200, hp: 15 },
      harpyhag: { id: 201, hp: 15 },
      hellcharger: { id: 76, hp: 50 },
      hellhound: { id: 74, hp: 15 },
      hellkon: { id: 290, hp: 66 },
      highwayman: { id: 730, hp: 24 },
      hobgoblin: { id: 33, hp: 4 },
      horneddemon: { id: 77, hp: 13 },
      hornedoverseer: { id: 79, hp: 13 },
      hotdog: { id: 288, hp: 15 },
      hydra: { id: 50, hp: 80 },
      hyenarider: { id: 859, hp: 14 },
      imp: { id: 78, hp: 4 },
      impergriffin: { id: 117, hp: 35 },
      inquisitor: { id: 145, hp: 80 },
      iron_golem: { id: 12, hp: 18 },
      jdemon: { id: 289, hp: 13 },
      kachok: { id: 601, hp: 50 },
      kamneed: { id: 202, hp: 45 },
      kamnegryz: { id: 203, hp: 55 },
      leprekon: { id: 610, hp: 7 },
      lich: { id: 29, hp: 50 },
      mage: { id: 16, hp: 18 },
      magneticgolem: { id: 259, hp: 28 },
      maiden: { id: 49, hp: 16 },
      manticore: { id: 754, hp: 80 },
      marksman: { id: 42, hp: 10 },
      mastergremlin: { id: 32, hp: 6 },
      masterhunter: { id: 72, hp: 14 },
      masterlich: { id: 341, hp: 55 },
      matriarch: { id: 239, hp: 90 },
      mauler: { id: 320, hp: 12 },
      mcentaur: { id: 309, hp: 10 },
      medusa: { id: 752, hp: 25 },
      medusaup: { id: 753, hp: 30 },
      megogachi: { id: 287, hp: 13 },
      mercarcher: { id: 20, hp: 8 },
      mercfootman: { id: 21, hp: 24 },
      minotaur: { id: 55, hp: 31 },
      minotaurguard: { id: 70, hp: 35 },
      mistress: { id: 745, hp: 100 },
      mountaingr: { id: 339, hp: 12 },
      mummy: { id: 268, hp: 50 },
      ncentaur: { id: 311, hp: 9 },
      negro: { id: 849, hp: 17 },
      nightmare: { id: 150, hp: 66 },
      nomad: { id: 897, hp: 30 },
      obsgargoyle: { id: 44, hp: 20 },
      ocean: { id: 848, hp: 30 },
      ogre: { id: 24, hp: 50 },
      ogrebrutal: { id: 535, hp: 70 },
      ogremagi: { id: 119, hp: 65 },
      ogreshaman: { id: 855, hp: 55 },
      orc: { id: 23, hp: 12 },
      orcchief: { id: 73, hp: 18 },
      orcrubak: { id: 534, hp: 20 },
      orcshaman: { id: 546, hp: 13 },
      outlaw: { id: 727, hp: 6 },
      outlawup: { id: 896, hp: 8 },
      peasant: { id: 4, hp: 4 },
      pegasus: { id: 625, hp: 30 },
      pikeman: { id: 1004, hp: 15 },
      piratemonster: { id: 644, hp: 190 },
      piratka: { id: 649, hp: 10 },
      piratkaup: { id: 650, hp: 12 },
      pitfiend: { id: 83, hp: 110 },
      pitlord: { id: 236, hp: 120 },
      pity: { id: 291, hp: 140 },
      pixel: { id: 17, hp: 5 },
      plaguezombie: { id: 40, hp: 17 },
      plant: { id: 624, hp: 60 },
      poltergeist: { id: 512, hp: 20 },
      priest: { id: 37, hp: 54 },
      priestess: { id: 852, hp: 35 },
      priestessup: { id: 853, hp: 35 },
      pristineunicorn: { id: 588, hp: 80 },
      rakshasa_kshatra: { id: 580, hp: 135 },
      rakshasa_raja: { id: 108, hp: 140 },
      rakshasa_rani: { id: 93, hp: 120 },
      rapukk: { id: 283, hp: 99 },
      reptiloid: { id: 850, hp: 80 },
      reptiloidup: { id: 851, hp: 90 },
      robber: { id: 726, hp: 5 },
      rocbird: { id: 30, hp: 55 },
      rotzombie: { id: 270, hp: 23 },
      runekeeper: { id: 961, hp: 65 },
      runepatriarch: { id: 165, hp: 70 },
      runepriest: { id: 164, hp: 60 },
      saboteurgremlin: { id: 253, hp: 6 },
      satyr: { id: 626, hp: 36 },
      savageent: { id: 589, hp: 175 },
      sceletonwar: { id: 267, hp: 5 },
      scout: { id: 52, hp: 10 },
      sdaughter: { id: 332, hp: 35 },
      seducer: { id: 485, hp: 26 },
      shadowdragon: { id: 102, hp: 200 },
      shadow_witch: { id: 94, hp: 80 },
      shamancyclop: { id: 860, hp: 105 },
      shamaness: { id: 331, hp: 30 },
      shieldguard: { id: 158, hp: 12 },
      shootpirate: { id: 646, hp: 15 },
      shootpirateup: { id: 647, hp: 18 },
      silverunicorn: { id: 147, hp: 77 },
      skeleton: { id: 1, hp: 4 },
      skeletonarcher: { id: 28, hp: 4 },
      skeletonpirate: { id: 604, hp: 4 },
      skeletonpirateup: { id: 606, hp: 4 },
      skirmesher: { id: 160, hp: 12 },
      skmarksman: { id: 340, hp: 6 },
      slayer: { id: 334, hp: 34 },
      snowwolf: { id: 942, hp: 50 },
      spearwielder: { id: 159, hp: 10 },
      spectre: { id: 68, hp: 19 },
      spegasus: { id: 629, hp: 30 },
      spider: { id: 198, hp: 9 },
      spiderpois: { id: 199, hp: 11 },
      sprite: { id: 31, hp: 6 },
      squire: { id: 71, hp: 26 },
      stalker: { id: 696, hp: 15 },
      steelgolem: { id: 69, hp: 24 },
      stone_gargoyle: { id: 8, hp: 15 },
      succubus: { id: 81, hp: 20 },
      succubusmis: { id: 122, hp: 30 },
      taskmaster: { id: 317, hp: 40 },
      tengu: { id: 793, hp: 45 },
      thane: { id: 166, hp: 100 },
      thiefarcher: { id: 124, hp: 40 },
      thiefmage: { id: 125, hp: 30 },
      thiefwarrior: { id: 123, hp: 45 },
      throwgnom: { id: 993, hp: 24 },
      thunderbird: { id: 148, hp: 65 },
      thunderlord: { id: 167, hp: 120 },
      trapper: { id: 386, hp: 7 },
      treant: { id: 92, hp: 175 },
      troglodyte: { id: 750, hp: 5 },
      troglodyteup: { id: 751, hp: 6 },
      troll: { id: 204, hp: 150 },
      unicorn: { id: 38, hp: 57 },
      vampire: { id: 15, hp: 30 },
      vampirelord: { id: 118, hp: 35 },
      vampireprince: { id: 513, hp: 40 },
      vermin: { id: 281, hp: 6 },
      vindicator: { id: 260, hp: 23 },
      vulture: { id: 731, hp: 40 },
      wardancer: { id: 41, hp: 12 },
      warmong: { id: 330, hp: 20 },
      warrior: { id: 319, hp: 12 },
      water: { id: 156, hp: 43 },
      wdancer: { id: 258, hp: 14 },
      whitebearrider: { id: 959, hp: 30 },
      wight: { id: 91, hp: 95 },
      wolfraider: { id: 43, hp: 12 },
      wolfrider: { id: 18, hp: 10 },
      wraith: { id: 235, hp: 100 },
      wyvern: { id: 336, hp: 90 },
      zealot: { id: 494, hp: 80 },
      zombie: { id: 5, hp: 17 },
      zpirate: { id: 679, hp: 150 },
      archangel: { id: 249, hp: 220 },
      seraph2: { id: 496, hp: 220 },
      spectraldragon: { id: 300, hp: 160 },
      ghostdragon: { id: 514, hp: 150 },
      titan: { id: 107, hp: 190 },
      stormtitan: { id: 581, hp: 190 },
      emeralddragon: { id: 100, hp: 200 },
      crystaldragon: { id: 590, hp: 200 },
      ancientbehemoth: { id: 301, hp: 250 },
      dbehemoth: { id: 538, hp: 280 },
      cursedbehemoth: { id: 861, hp: 250 },
      blackdragon: { id: 101, hp: 240 },
      reddragon: { id: 747, hp: 235 },
      archdevil: { id: 292, hp: 199 },
      archdemon: { id: 293, hp: 211 },
      magmadragon: { id: 169, hp: 280 },
      lavadragon: { id: 962, hp: 275 },
      untamedcyc: { id: 433, hp: 225 },
      bloodeyecyc: { id: 399, hp: 235 },
      cyclopus: { id: 397, hp: 220 },
      paladin: { id: 234, hp: 100 },
      efreetisultan: { id: 282, hp: 100 },
      naga: { id: 673, hp: 110 },
      golddragon: { id: 609, hp: 169 },
      pharaoh: { id: 269, hp: 70 },
      deadknight: { id: 273, hp: 100 },
      zhryak: { id: 284, hp: 99 },
      ballista: { id: 85, hp: 200 },
      tent: { id: 0, hp: 0 },
      piratemonsterup: { id: 645, hp: 200 },
      blacktroll: { id: 205, hp: 180 },
      zasad: { id: 1047, hp: 70 },
      magicel: { id: 662, hp: 80 },
      scorp: { id: 923, hp: 4 },
      duneraider: { id: 921, hp: 12 },
      scorpup: { id: 924, hp: 5 },
      dromad: { id: 919, hp: 40 },
      duneraiderup: { id: 922, hp: 12 },
      shakal: { id: 925, hp: 24 },
      slon: { id: 931, hp: 100 },
      priestmoon: { id: 929, hp: 50 },
      slonup: { id: 932, hp: 110 },
      shakalup: { id: 926, hp: 30 },
      dromadup: { id: 920, hp: 45 },
      priestsun: { id: 930, hp: 55 },
      anubisup: { id: 918, hp: 200 },
      scarab: { id: 927, hp: 6 },
      scarabup: { id: 928, hp: 6 },
      tenguup: { id: 937, hp: 60 },
      gnoll: { id: 1041, hp: 6 },
      brigandup: { id: 1038, hp: 6 },
      verblud: { id: 1060, hp: 35 },
      gnollum: { id: 1042, hp: 6 },
      krokodil: { id: 1067, hp: 70 },
      krokodilup: { id: 1068, hp: 80 },
      gnollsh: { id: 1089, hp: 6 },
      smaster: { id: 1095, hp: 84 },
      manticoreup: { id: 755, hp: 80 },
      apirate: { id: 612, hp: 13 },
      bpirate: { id: 611, hp: 16 },
      wendigoup: { id: 945, hp: 35 },
      whitetiger: { id: 631, hp: 35 },
      dgolemup: { id: 521, hp: 400 },
      exile: { id: 1040, hp: 28 },
      banditkaup: { id: 936, hp: 9 },
      nomadup: { id: 938, hp: 33 },
      spearthrower: { id: 1114, hp: 19 },
      gatekeeper: { id: 1132, hp: 120 },
      gnollup: { id: 1138, hp: 9 },
      gnollka: { id: 1139, hp: 6 },
      gnollboss: { id: 1140, hp: 36 },
      pushkar: { id: 1055, hp: 64 },
      robberup: { id: 1044, hp: 6 },
      sekhmet: { id: 1062, hp: 50 },
      valkyrie: { id: 1185, hp: 61 },
      goblinshaman: { id: 1193, hp: 5 },
      poukai: { id: 1194, hp: 120 },
      monk: { id: 1221, hp: 20 },
      warden: { id: 1223, hp: 39 },
      snowwolfup: { id: 1165, hp: 53 },
      necrodogup: { id: 1325, hp: 9 },
      necrodog: { id: 1324, hp: 8 },
      blackarcher: { id: 1311, hp: 13 },
      deadarcher: { id: 1312, hp: 16 },
      ork: { id: 1346, hp: 24 },
      grib: { id: 1187, hp: 20 },
      gribok: { id: 1188, hp: 16 },
    }
    var imgId = {
      mundus: "acrossbowman",
      assasin: "assassin",
      ocean: "assida",
      knight: "cavalier",
      crossbowman: "crossman",
      cursed_: "cursed",
      cyclopod_: "cyclopod",
      lizardrider: "darkrider",
      dd_: "druid",
      ddeld: "druideld",
      dryad_: "dryad",
      firebird_: "firebird",
      gog: "gogachi",
      nightmare: "hellcharger",
      demondog: "hellhound",
      hellstallion: "hellkon",
      hdemon: "horneddemon",
      fdemon: "hornedoverseer",
      firehound: "hotdog",
      golem: "iron_golem",
      lepr: "leprekon",
      hunterelf: "masterhunter",
      magog: "megogachi",
      minotaurguard_: "minotaurguard",
      stallion: "nightmare",
      obsgargoly: "obsgargoyle",
      assida: "ocean",
      paesant: "peasant",
      pitfiend_: "pitfiend",
      pitlord_: "pitlord",
      pitspawn: "pity",
      pp: "pixel",
      rakshas: "rakshasa_rani",
      roc: "rocbird",
      witch: "shadow_witch",
      cyclopshaman: "shamancyclop",
      sceleton: "skeleton",
      sceletonarcher: "skeletonarcher",
      dpirate: "skeletonpirate",
      dpirateup: "skeletonpirateup",
      swordman: "squire",
      gargoly: "stone_gargoyle",
      succub: "succubus",
      succubusm: "succubusmis",
      ent: "treant",
      bladedancer: "wardancer",
      winddancer: "wdancer",
      hobwolfrider: "wolfraider",
      abehemoth: "ancientbehemoth",
      bbehemoth: "cursedbehemoth",
      zhrica: "priestmoon",
      zhricaup: "priestsun",
      mmaster: "smaster",
      jpirate: "spearthrower",
      witchdoctor: "goblinshaman",
      paokai: "poukai",
      deaddog: "necrodogup",
      blackdog: "necrodog",
    }
    let tr = document.getElementById("gl_tasks").getElementsByTagName("tr")
    for (let i = 0; i < tr.length; i++) {
      if (tr[i].childNodes.length != 1) {
        continue
      }
      let cre = tr[i].getElementsByClassName("cre_creature")
      let checkSum = 0
      let hp = 0
      let f = true
      for (let j = 0; j < cre.length; j++) {
        let id = cre[j].innerHTML.match(/name=([^\"]+)/)[1]
        let count = cre[j].querySelector("#add_now_count").innerHTML
        checkSum += turnId[id].id * count
        hp += turnId[id].hp * count
      }
      if (checkSum > 0 && hp > 0) {
        // tr[i].querySelector("td").innerHTML += "<div style = 'margin-left:10px'><a href = 'https://daily.heroeswm.ru/leader/bandits.php?hp=" + hp + "&sum=" + checkSum + "'>Поиск боя на Daily</a></div>";
      }
    }
  }
  if (
    (location.pathname.indexOf("war.php") >= 0 ||
      location.pathname.indexOf("warlog.php") >= 0) &&
    location.href.indexOf("show_enemy") == -1
  ) {
    var timerIdn = setInterval(check, 100)
  }
  function check() {
    if (document.getElementById("play_button").style.display == "none") {
      unsafeWindow.gpause = false
    }
    if (
      typeof unsafeWindow.stage !== "undefined" &&
      typeof unsafeWindow.stage.pole !== "undefined" &&
      typeof unsafeWindow.stage.pole.onMouseMoveFlash === "function"
    ) {
      clearInterval(timerIdn)
      if (typeof unsafeWindow.setshadAbs !== "undefined") {
        return 0
      }
      unsafeWindow.spell_type = {
        raisedead: "1",
        magicfist: "1",
        lighting: "2",
        magicarrow: "2",
        slow: "4",
        fast: "3",
        swarm: "1",
        curse: "4",
        bless: "3",
        stoneskin: "3",
        stonespikes: "2",
        poison: "4",
        mfast: "3",
        mbless: "3",
        mstoneskin: "3",
        dispel: "3",
        dray: "4",
        icebolt: "2",
        fireball: "2",
        mdispel: "3",
        righteous_might: "3",
        deflect_missile: "3",
        suffering: "4",
        confusion: "4",
        circle_of_winter: "2",
        phantom_forces: "1",
        mslow: "4",
        mcurse: "4",
        mpoison: "4",
        mdray: "4",
        msuffering: "4",
        mconfusion: "4",
        mrighteous_might: "3",
        mdeflect_missile: "3",
        armageddon: "2",
        blind: "4",
        frenzy: "4",
        teleport: "3",
        meteor: "2",
        chainlighting: "2",
        summonel: "1",
        antimagic: "3",
        firewall: "1",
        earthquake: "1",
        summonphoenix: "1",
        arcanearmor: "1",
        resurrection2: "3",
        divinevengeance: "3",
        divinev: "3",
        summonel_f: "1",
        summonel_a: "1",
        summonel_w: "1",
        summonel_e: "1",
      }
      unsafeWindow.magicbookspells_new = []
      for (let i = 0; i <= 4; i++) {
        for (let j in magicbookspells) {
          let type = 0
          if (spell_type[magicbookspells[j]]) {
            type = spell_type[magicbookspells[j]]
          }
          if (type == i) {
            magicbookspells_new.push(magicbookspells[j])
          }
        }
      }
      stage.pole.showmagicbook = function (page, iszak, check_spell) {
        let actMiniSpells = hwm_set["miniSpells"]
        spell_per_page = actMiniSpells ? 16 : 6
        var cm = magicbookspells_new.length
        let count = 0
        for (i = 0; i < cm; i++) {
          if (hwm_set["spellsOrder"]) {
            s = magicbookspells_new[i]
          } else {
            s = magicbookspells[i]
          }
          if (
            this.obj[activeobj][s] == 1 ||
            (s == "gating" &&
              magic[activeobj]["dem"] &&
              magic[activeobj]["dem"]["effect"] == 1)
          ) {
            if (s == "gating" && this.obj[activeobj].alreadysummon) {
              continue
            }
            if (s == "firstblood") {
              continue
            }
            if (s == "explosion" && this.obj[activeobj].nowmanna == 0) {
              continue
            }
            if (s == "teleport" && this.obj[activeobj].demonic) {
              continue
            }
            if (s == "summonpitlords" && magic[activeobj]["pit"]) {
              continue
            }
            if (
              s == "invisibility" &&
              magic[activeobj]["2in"] &&
              magic[activeobj]["2in"]["effect"] == 1
            ) {
              continue
            }
            if (s == "seduction" && magic[activeobj]["usd"]) {
              continue
            }
            if (s == "manafeed" && this.obj[activeobj].nowmanna == 0) {
              continue
            }
            count++
          }
          if (
            this.obj[activeobj].darkpower &&
            this.obj[activeobj][s] == 1 &&
            magicbookchaos[magicbookspells.indexOf(s)] &&
            k >= page &&
            k < page + spell_per_page
          ) {
            count++
          }
          if (this.check_mass_day_or_night(activeobj, s)) {
            if (k >= page && k < page + spell_per_page) {
              var scut = s.substr(1)
              count++
            }
          }
        }
        actMiniSpells = count > 6 ? actMiniSpells : 0
        if (!android) {
          spell_per_page = actMiniSpells ? 16 : 6
        } else {
          spell_per_page = 4
        }
        var k = 0,
          j = 0,
          s = "",
          so = "",
          book_txt = "",
          was_spell = 0
        lastpage = page
        if (iszak != 1) zakarrow = false
 
        function proccedinbook(so, powered, showed_cnt) {
          if (
            so == "zakarrow" &&
            (zakarrow == true ||
              (magic[activeobj]["za2"] &&
                magic[activeobj]["za2"]["effect"] > 0))
          )
            return 0
          j = k % spell_per_page
          var cost = stage[war_scr].obj[activeobj][s + "cost"]
          if (powered) {
            cost *= 2
          }
          kz = 1
          var kz2 = 1
          if (isperk(activeobj, 110) && stage[war_scr].obj[activeobj].hero) {
            kz *= 0.8
          }
          if (isperk(activeobj, 87) && !stage[war_scr].obj[activeobj].hero) {
            kz = 0.5
          }
          if (isperk(activeobj, 111) && stage[war_scr].obj[activeobj].hero) {
            kz *= 0.8
          }
          if (magic[activeobj]["dnn"]) {
            var sp_bonus =
              1.03 + umelka[stage[war_scr].obj[activeobj]["owner"]][10] * 0.03
            if (is_day_or_night(activeobj, s)) {
              kz2 /= sp_bonus
            }
          }
          cost = Math.round(cost * kz)
          cost = Math.round(cost * eco * kz2)
          if (s == "manafeed") {
            cost = Math.min(
              stage[war_scr].obj[activeobj].nowmanna,
              stage[war_scr].obj[activeobj].nownumber
            )
          }
          if (s == "explosion") {
            cost = ""
          }
          if (s == "invisibility") {
            cost = ""
          }
          if (s == "channeling") {
            cost = ""
          }
          if (s == "siphonmana") {
            cost = ""
          }
          if (s == "leap") {
            cost = ""
          }
          if (s == "leap6") {
            cost = ""
          }
          if (s == "sacrificegoblin") {
            cost = ""
          }
          if (s == "gating") {
            cost = ""
          }
          if (s == "summonpitlords") {
            cost = ""
          }
          if (s == "seduction") {
            cost = ""
          }
          if (s == "teleportother") {
            cost = ""
          }
          if (s == "consumecorpse" || s == "benediction") {
            cost = ""
          }
          if (
            cost > stage[war_scr].obj[activeobj].nowmanna ||
            (cost == 0 && s == "manafeed")
          ) {
            var disabled = true
          } else {
            var disabled = false
            was_spell = 1
          }
          if (check_spell) {
            return 0
          }
          var s_name = ""
          if (magicbooknames[magicbookspells.indexOf(s)].includes("Mass ")) {
            s_name += "Mass"
          }
          if (magicbooknames[magicbookspells.indexOf(s)].includes("Массов")) {
            s_name += "Массовое"
          }
          var nametxt = magicbooknames[magicbookspells.indexOf(s)]
          if (powered || is_day_or_night(activeobj, s)) {
            switch (lang) {
              case 0:
                nametxt += " (усиленное)"
                s_name += " Усиленное"
                break
              case 1:
                nametxt += " (empowered)"
                s_name += "(emp)"
                break
            }
          }
          if (s == "angerofhorde") {
            eff = 0
            var len = stage[war_scr].obj_array.length
            for (var k1 = 0; k1 < len; k1++) {
              var k = stage[war_scr].obj_array[k1]
              if (
                stage[war_scr].obj[k]["owner"] ==
                  stage[war_scr].obj[activeobj]["owner"] &&
                !stage[war_scr].obj[k]["hero"] &&
                !stage[war_scr].obj[k]["warmachine"]
              ) {
                eff += stage[war_scr].obj[k]["nownumber"]
              }
            }
            stage[war_scr].obj[activeobj][s + "effmain"] = eff
          }
          if (stage[war_scr].obj[activeobj][s + "effmain"] > 0) {
            if (stage[war_scr].obj[activeobj].hero) {
              var s1 = 0
              if (
                isperk(activeobj, 93) &&
                (s == "magicfist" || s == "raisedead")
              ) {
                s1 = 4
              }
              if (isperk(activeobj, 78) && (s == "poison" || s == "mpoison")) {
                s1 += 5
              }
              if (isperk(activeobj, 89) && (s == "poison" || s == "mpoison")) {
                s1 += 3
              }
              eff =
                stage[war_scr].obj[activeobj][s + "effmain"] +
                stage[war_scr].obj[activeobj][s + "effmult"] *
                  (stage[war_scr].getspellpower(activeobj, s) + s1)
              if (stage[war_scr].obj[activeobj][s + "effmult"] == 1.5) {
                eff = Math.round(eff)
              }
              var teff = eff
              if (powered) {
                eff = Math.round(eff * 1.5)
              }
            } else {
              eff = Math.round(
                stage[war_scr].obj[activeobj][s + "effmain"] +
                  stage[war_scr].obj[activeobj][s + "effmult"] *
                    Math.pow(stage[war_scr].obj[activeobj]["nownumber"], 0.7)
              )
              if (s == "blind") {
                eff = Math.round(
                  stage[war_scr].obj[activeobj][s + "effmain"] +
                    stage[war_scr].obj[activeobj][s + "effmult"] *
                      stage[war_scr].obj[activeobj]["nownumber"]
                )
              }
              var teff = eff
            }
            if (!powered) stage[war_scr].obj[activeobj][s + "_magiceff"] = eff
            if (
              stage[war_scr].obj[activeobj][s + "time"] > 0 &&
              stage[war_scr].obj[activeobj][s + "effmain"] > 15 &&
              s != "antimagic"
            ) {
              eff = stage[war_scr].obj[activeobj][s + "effmain"] + "%"
            }
            if (s.substr(0, s.length - 1) == "summoncreature") {
              if (magic[activeobj]["suc"]) {
                eff = Math.floor(
                  eff * Math.pow(0.9, magic[activeobj]["suc"]["effect"])
                )
              }
            }
            efftxt = eff
          } else {
            efftxt = ""
            if (s == "explosion") {
              eff = Math.round(
                9 +
                  9 * Math.pow(stage[war_scr].obj[activeobj]["nownumber"], 0.7)
              )
              efftxt = eff
            }
            if (s == "channeling") {
              eff = Math.max(
                1,
                Math.floor(stage[war_scr].obj[activeobj]["nownumber"] * 0.5)
              )
              efftxt = eff
            }
          }
          if (stage[war_scr].obj[activeobj][s + "time"] > 0) {
            if (stage[war_scr].obj[activeobj].hero || magic[activeobj]["her"]) {
              eff = stage[war_scr].getspellpower(activeobj, s)
              if (isperk(activeobj, 89)) {
                eff += 3
              }
              if (isperk(activeobj, 78) && checkdark(s)) {
                eff += 5
              }
            } else {
              eff = stage[war_scr].obj[activeobj]["nownumber"]
              if (magic[activeobj]["bhr"]) {
                eff = Math.max(
                  eff,
                  Math.floor(stage[war_scr].obj[activeobj]["maxmanna"] / 5)
                )
              }
            }
            if (eff == 0) {
              eff = 0.5
            }
            durationtxt = eff
          } else {
            durationtxt = ""
          }
          var add_desktop = ""
          if (!android) add_desktop = "_Desktop"
          book_txt +=
            "<div" +
            (actMiniSpells ? "" : " title = '" + nametxt + "'") +
            ' class="book_skill_block' +
            add_desktop +
            '" id="spell_block' +
            showed_cnt +
            '" style="background-image:url(' +
            stage[war_scr].subpath +
            "combat/magicbook/" +
            so +
            ".png?v=" +
            image_ver +
            ");"
          if (disabled == false) {
            book_txt +=
              '"><div class="spell_btn' +
              add_desktop +
              '" id="spell' +
              showed_cnt +
              '" attr_disabled="0" style="cursor: pointer;" '
          } else {
            book_txt +=
              'opacity: 0.3;"><div attr_disabled="1" style="cursor: auto;"'
          }
          spell_id[showed_cnt] = so
          spell_powered[showed_cnt] = powered
          let style = actMiniSpells ? "font-size: 0.8rem;line-height: 1;" : ""
          book_txt +=
            '></div><div class="book_skill_block_container"><div class="book_skill_block_amounts book_skill_block_name" style = "' +
            style +
            '">' +
            (actMiniSpells ? s_name : nametxt) +
            "</div>"
          if (cost != "")
            book_txt +=
              '<div class="book_skill_block_amounts book_skill_block_effects">' +
              cost +
              "</div>"
          if (efftxt != "")
            book_txt +=
              '<div class="book_skill_block_amounts book_skill_block_cost">' +
              efftxt +
              "</div>"
          if (durationtxt != "")
            book_txt +=
              '<div class="book_skill_block_amounts book_skill_block_durt">' +
              durationtxt +
              "</div>"
          book_txt += "</div></div>"
        }
        page = page * spell_per_page
        var eco = 1
        if (this.obj[activeobj]["hero"]) {
          var len = this.obj_array.length
          for (var k1 = 0; k1 < len; k1++) {
            i = this.obj_array[k1]
            if (
              this.obj[i]["energychannel"] &&
              this.obj[i]["nownumber"] > 0 &&
              this.obj[i]["owner"] == this.obj[activeobj]["owner"]
            ) {
              eco = 0.75
            }
          }
          for (var k1 = 0; k1 < len; k1++) {
            i = this.obj_array[k1]
            if (
              this.obj[i]["manaeater"] &&
              this.obj[i]["nownumber"] > 0 &&
              this.obj[i]["side"] != this.obj[activeobj]["side"]
            ) {
              eco = 1.3
            }
          }
        } else {
          var len = this.obj_array.length
          var max = 0
          for (var k1 = 0; k1 < len; k1++) {
            i = this.obj_array[k1]
            if (
              this.obj[i]["manacurser"] &&
              this.obj[i]["nownumber"] > 0 &&
              this.obj[i]["side"] != this.obj[activeobj]["side"]
            ) {
              max = Math.max(max, this.obj[i]["nownumber"])
            }
          }
          max = Math.min(40, max)
          eco *= 1 + max / 100
        }
        var cm = magicbookspells_new.length
        for (zz = 0; zz <= 1; zz++) {
          var showed_cnt = 0
          k = 0
          for (i = 0; i < cm; i++) {
            if (hwm_set["spellsOrder"]) {
              s = magicbookspells_new[i]
            } else {
              s = magicbookspells[i]
            }
            if (
              (this.obj[activeobj][s] == 1 ||
                (s == "gating" &&
                  magic[activeobj]["dem"] &&
                  magic[activeobj]["dem"]["effect"] == 1)) &&
              ((k >= page && k < page + spell_per_page) || check_spell)
            ) {
              if (s == "gating" && this.obj[activeobj].alreadysummon) {
                continue
              }
              if (s == "firstblood") {
                continue
              }
              if (s == "explosion" && this.obj[activeobj].nowmanna == 0) {
                continue
              }
              if (s == "teleport" && this.obj[activeobj].demonic) {
                continue
              }
              if (s == "summonpitlords" && magic[activeobj]["pit"]) {
                continue
              }
              if (
                s == "invisibility" &&
                magic[activeobj]["2in"] &&
                magic[activeobj]["2in"]["effect"] == 1
              ) {
                continue
              }
              if (s == "seduction" && magic[activeobj]["usd"]) {
                continue
              }
              if (s == "manafeed" && this.obj[activeobj].nowmanna == 0) {
                continue
              }
              showed_cnt++
              proccedinbook(s, 0, showed_cnt)
            }
            if (
              this.obj[activeobj][s] == 1 ||
              (s == "gating" &&
                magic[activeobj]["dem"] &&
                magic[activeobj]["dem"]["effect"] == 1)
            ) {
              k++
            }
            if (
              this.obj[activeobj].darkpower &&
              this.obj[activeobj][s] == 1 &&
              magicbookchaos[magicbookspells.indexOf(s)] &&
              k >= page &&
              k < page + spell_per_page
            ) {
              showed_cnt++
              proccedinbook(s, 1, showed_cnt)
            }
            if (
              this.obj[activeobj].darkpower &&
              this.obj[activeobj][s] == 1 &&
              magicbookchaos[magicbookspells.indexOf(s)]
            ) {
              k++
            }
            if (this.check_mass_day_or_night(activeobj, s)) {
              if (k >= page && k < page + spell_per_page) {
                var scut = s.substr(1)
                showed_cnt++
                this.obj[activeobj][s + "cost"] =
                  this.obj[activeobj][scut + "cost"] * 2
                this.obj[activeobj][s + "effmain"] =
                  this.obj[activeobj][scut + "effmain"]
                this.obj[activeobj][s + "effmult"] =
                  this.obj[activeobj][scut + "effmult"]
                this.obj[activeobj][s + "time"] =
                  this.obj[activeobj][scut + "time"]
                proccedinbook(s, 0, showed_cnt)
              }
              k++
            }
          }
          if (k > page || k == 0) break
          else {
            page = 0
            bookpage = 0
          }
        }
        if (check_spell) {
          return was_spell
        }
        if (actMiniSpells) {
          book_txt +=
            "<style>.book_skill_block_amounts {font-weight:bold;}.book_skill_block_Desktop{width:25% !important;height: 17vh !important;} .book_skills_container_Desktop{margin-left: 5%;margin-right: 5%;}</style>"
        }
        document.getElementById("magic_book_page").innerHTML = book_txt
        document.getElementById("book_mana").innerHTML =
          "<div>" +
          this.obj[activeobj].nowmanna +
          " / " +
          this.obj[activeobj].maxmanna +
          "</div>"
        for (i = 1; i <= spell_per_page; i++) {
          if (document.getElementById("spell" + i)) {
            if (magic_book_hints) {
              var disabled = tointeger(
                document
                  .getElementById("spell" + i)
                  .getAttribute("attr_disabled")
              )
              if (disabled != 1) {
                show_div_arrow(
                  "spell_block" + i,
                  "",
                  "position: absolute;   left: calc(50% - 25px);   top: 90%;   width: 50px;   height: 50px;   pointer-events: none;   display: block;  transform: rotate(270deg);"
                )
              } else {
                hide_div_arrow("spell_block" + i)
              }
            }
            document
              .getElementById("spell" + i)
              .addEventListener("mouseup", spell_button_release.bind(null, i))
          }
        }
      }
 
      //
 
      unsafeWindow.hwm_set = {
        miniSpells: false,
        atbStartDisplay: false,
        spellsOrder: false,
      }
      for (i in hwm_set) {
        hwm_set[i] = localStorage.getItem(i)
        if (
          hwm_set[i] === null ||
          hwm_set[i] === undefined ||
          hwm_set[i] === "1" ||
          hwm_set[i] === "0" ||
          hwm_set[i] === 1 ||
          hwm_set[i] === 0
        ) {
          hwm_set[i] = false
        }
      }
      unsafeWindow.checkTrue = function (name) {
        return hwm_set[name] === true || hwm_set[name] === "true"
      }
      unsafeWindow.setAtbStyle = function () {
        let elems = document.getElementsByClassName("atb-info")
        for (let i = 0; i < elems.length; i++) {
          elems[i].style.display = checkTrue("atbStartDisplay")
            ? "block"
            : "none"
        }
      }
      setAtbStyle()
      unsafeWindow.checkSet = function (name) {
        document.getElementById(name + "_checkbox").checked = checkTrue(name)
          ? true
          : false
        localStorage.setItem(name, checkTrue(name) ? false : true)
        hwm_set[name] = checkTrue(name) ? false : true
        if (name == "atbStartDisplay") {
          setAtbStyle()
        }
      }
      unsafeWindow.chatMode = function () {
        return chat.className.substring(chat.className.length - 1)
      }
 
      let divs = [],
        divc = [],
        divt = []
      let backgroundColors = [
        "",
        "#991515",
        "#4b66ff",
        "#25C953",
        "#BD8500",
        "#B000FF",
        "#005C13",
      ]
      for (let i = btype == 145 ? 6 : 2; i >= 1; i--) {
        divs[i] = document.createElement("div")
        divs[i].setAttribute("id", "hp" + i)
        divs[i].classList.add("hp")
 
        divc[i] = document.createElement("div")
        divc[i].style.backgroundColor = backgroundColors[i]
        divc[i].setAttribute("id", "hp" + i + "c")
        divc[i].classList.add("hpc")
 
        divt[i] = document.createElement("div")
        divt[i].setAttribute("id", "hp" + i + "t")
        divt[i].classList.add("hpt")
 
        if (i > 1) {
          divs[i].style.marginTop = "3px"
        }
        document.querySelector("#chat_format").prepend(divs[i])
        divs[i].prepend(divc[i])
        divs[i].prepend(divt[i])
      }
      div = document.createElement("div")
      div.innerHTML =
        "<div class='info_row' id='atb-start-bonus' onmouseup = 'checkSet(\"atbStartDisplay\")'><label class='checkbox_container'>Стартовый бонус АТБ<input type='checkbox'" +
        (checkTrue("atbStartDisplay") ? " checked " : "") +
        "id='atbStartDisplay_checkbox'><span class='checkbox_checkmark'></span></label></div><br>"
      document
        .getElementById("win_Settings")
        .getElementsByTagName("form")[0]
        .querySelector("#webgl_settings_whole")
        .after(div)
      global_init = 0
      unsafeWindow.firsTurnShow =
        tointeger(command.substr(1, command.indexOf(":") - 1)) <= 1
          ? true
          : false
      unsafeWindow.btime = false
      unsafeWindow.fireInfo = false
      unsafeWindow.skillProbability = ""
      unsafeWindow.luckProbability = 0
      unsafeWindow.curAbil = ""
      unsafeWindow.last_line3 = ""
      unsafeWindow.phm = {}
      unsafeWindow.psc = {}
      unsafeWindow.psa = {}
      unsafeWindow.sHP = [0, 0]
      unsafeWindow.nHP = [0, 0]
      //unsafeWindow.gate = {};
      unsafeWindow.lastChain = 0
      unsafeWindow.damageTable = ""
      unsafeWindow.damage = [[], []]
      unsafeWindow.targetMagicdamage = 0
      unsafeWindow.targetMagickills = 0
      unsafeWindow.test_temp = 0
      unsafeWindow.addSpeedLastTurn = 0
      unsafeWindow.addIniLastTurn = 0
      unsafeWindow.lastRaidsCount = 0
      unsafeWindow.raidsCurrentWave = 0
      damageTableStyle = document.createElement("style")
      damageTableStyle.innerHTML =
        "#win_BattleResult{max-height:90%} #damageTable td {vertical-align: baseline; font-size:90%} #damageTable {max-height: 30vh;overflow: auto;}"
      damageTableStyle.innerHTML +=
        "#test table {width:100%;margin-left:3px;} #test {padding-left:5px;font-weight:bold;height:100%;width:100%;position: absolute;top:0;right: 0;background: #151313;font-size: 0.9em;z-index:101;}"
      damageTableStyle.innerHTML +=
        "#effectsDisplay:hover{filter: brightness(1500%) drop-shadow(0 0 10px #fff);} #effectsDisplay {display: inline-block;float: right;height: 26px;cursor: pointer;line-height: 26px;color:#979797;font-size:12px}"
      damageTableStyle.innerHTML +=
        "#dop-info img {filter: drop-shadow(#000 0px 0px 0.1em);margin-left:-2px;vertical-align: baseline;} #dop-info {position:absolute;font-family: Arial;position: absolute;text-align: right;text-shadow: -0   -0.03em 0.03em #000, 0   -0.03em 0.03em #000,-0    0.03em 0.03em #000, 0    0.03em 0.03em #000,-0.03em -0   0.03em #000, 0.03em -0   0.03em #000,-0.03em  0   0.03em #000, 0.03em  0   0.03em #000,-0.03em -0.03em 0.03em #000, 0.03em -0.03em 0.03em #000,-0.03em  0.03em 0.03em #000, 0.03em  0.03em 0.03em #000,-0.03em -0.03em 0.03em #000, 0.03em -0.03em 0.03em #000,-0.03em  0.03em 0.03em #000, 0.03em  0.03em 0.03em #000;color: #fff;font-size:130%}"
      damageTableStyle.innerHTML +=
        ".hp {width:100%; height:15px; border: 1px solid #fff; border-radius: 5px; color:#fff; position:relative;}"
      damageTableStyle.innerHTML +=
        ".hpt {width:100%; height:100%; text-align:center; line-height:15px; font-size:13px; font-weight:bold; color:#fff; position:absolute; z-index:1;}"
      damageTableStyle.innerHTML +=
        ".hpc {width:100%; height:100%; border-radius: 5px; position:absolute;}"
 
      document.head.appendChild(damageTableStyle)
      effectsDisplay = document.createElement("div")
      effectsDisplay.setAttribute("id", "effectsDisplay")
      effectsDisplay.innerHTML = "Эффекты"
      effectsDisplay.setAttribute(
        "title",
        "Отображать в окне чата бафы и дебафы существ при наведении курсора"
      )
      effectsDisplay.setAttribute("onclick", "setEffectDisplay()")
      document.getElementById("chat_panelPosition_btn1").before(effectsDisplay)
      dopInfoPanel = document.createElement("div")
      dopInfoPanel.setAttribute("id", "dop-info")
      unsafeWindow.lastFire = 0
      document.getElementById("timer").after(dopInfoPanel)
      unsafeWindow.testBlock = function (i = 0, firewall = false) {
        if (chatMode() == "V") {
          return 0
        }
        let div = document.getElementById("test")
        if (firewall == true && i != lastFire && i > 0) {
          div.style.height = "100%"
          div.innerHTML = "<center>Огнестенка " + i + " ход.</center>"
          lastFire = i
          fireInfo = true
        } else if (firewall == false) {
          fireInfo = false
          if (
            i == 0 ||
            stage.pole.showmagicinfo(i, 1).indexOf("Эффекты отсутствуют") != -1
          ) {
            div.innerHTML = ""
            div.style.height = "0"
            lastFire = 0
            return 0
          }
          div.style.height = "100%"
          if (lastFire == 0) {
            div.innerHTML = ""
          }
          div.innerHTML +=
            "<center>" + stage.pole.get_name_html(i) + "</center>"
          let str = stage.pole.showmagicinfo(i, 1)
          div.innerHTML += str
        }
      }
      unsafeWindow.updateBar = function (ch = 2) {
        sHP = [0, 0, 0, 0, 0, 0]
        nHP = [0, 0, 0, 0, 0, 0]
        for (k in stage.pole.obj) {
          let ow =
            ch == 2
              ? (stage.pole.obj[k].owner % 2) * -1 + 1
              : +stage.pole.obj[k].owner - 1
          if (
            stage.pole.obj[k].hero != undefined ||
            stage.pole.obj[k].warmachine != undefined ||
            stage.pole.obj[k].building != undefined
          )
            continue
          sHP[ow] += stage.pole.obj[k].maxnumber * stage.pole.obj[k].maxhealth
          nHP[ow] +=
            Math.max(stage.pole.obj[k].nownumber - 1, 0) *
              stage.pole.obj[k].maxhealth +
            stage.pole.obj[k].nowhealth
        }
        for (let i = 1; i <= ch; i++) {
          document.getElementById("hp" + i + "t").innerHTML =
            "" +
            nHP[i - 1] +
            "/" +
            sHP[i - 1] +
            " (" +
            Math.round((nHP[i - 1] / sHP[i - 1]) * 100) +
            "%)"
          document.getElementById("hp" + i + "c").style.width =
            "" + Math.round((nHP[i - 1] / sHP[i - 1]) * 100) + "%"
        }
      }
      unsafeWindow.infoBlock = function (i = 0) {
        let div = document.getElementById("dop-info")
        if (i == 0) {
          div.innerHTML = ""
          return 0
        }
        let str = ""
        let h = Math.round(
          (atb_scaling *
            atb_height *
            stage.pole.scaling *
            (1 / MainPixelRatio)) /
            3
        )
        if (stage.pole.luckMoraleProbability(i, "morale") > 0) {
          str +=
            "<div style = 'line-height:" +
            (h - 2) +
            "px;height:" +
            h +
            "px;'><img align='absmiddle' height = '" +
            (h - 4) +
            "px' src = 'https://dcdn.heroeswm.ru/i/icons/attr_morale.png'>&#8201;" +
            stage.pole.luckMoralePerc(i, "morale") +
            "</div>"
        }
        if (stage.pole.luckMoraleProbability(i, "luck") > 0) {
          str +=
            "<div style = 'line-height:" +
            (h - 2) +
            "px;height:" +
            h +
            "px;'><img align='absmiddle' height = '" +
            (h - 4) +
            "px' src = 'https://dcdn.heroeswm.ru/i/icons/attr_fortune.png'>&#8201;" +
            stage.pole.luckMoralePerc(i, "luck") +
            "</div>"
        }
        if (str != "" && time > 0) {
          str += "<style>#timer {opacity:0.3}</style>"
        }
        div.innerHTML = str
      }
      let damageTableDisplay = localStorage.getItem("damage-table-display")
      if (damageTableDisplay === null || damageTableDisplay === undefined) {
        damageTableDisplay = "table"
      }
      let spanHTML = damageTableDisplay == "table" ? "(скрыть)" : "(показать)"
      let effectDisplay = localStorage.getItem("effect-display")
      if (effectDisplay === null || effectDisplay === undefined) {
        effectDisplay = "block"
      }
      div = document.createElement("div")
      div.setAttribute("id", "test")
      div.style.height = "0"
      div.style.display = effectDisplay
      document.getElementById("effectsDisplay").style.textDecoration =
        effectDisplay == "none" ? "line-through" : "none"
      document.getElementById("chat_format").prepend(div)
      unsafeWindow.setEffectDisplay = function () {
        effectDisplay = effectDisplay == "none" ? "block" : "none"
        localStorage.setItem("effect-display", effectDisplay)
        document.getElementById("test").style.display = effectDisplay
        document.getElementById("effectsDisplay").style.textDecoration =
          effectDisplay == "none" ? "line-through" : "none"
      }
      unsafeWindow.setDamageTableDisplay = function () {
        damageTableDisplay = damageTableDisplay == "table" ? "none" : "table"
        localStorage.setItem("damage-table-display", damageTableDisplay)
        document
          .getElementById("win_BattleResult")
          .querySelector("table").style.display = damageTableDisplay
        spanHTML = damageTableDisplay == "table" ? "(скрыть)" : "(показать)"
        updateDamageData()
      }
      unsafeWindow.updateDamageData = function () {
        if (damageTable == "") {
          damageTable = document.createElement("div")
          damageTable.setAttribute("id", "damageTable")
          document
            .getElementById("win_BattleResult")
            .querySelector("#btn_watch_WatchBattle")
            .before(damageTable)
        }
        let txt =
          "<B>Нанесённый урон</B> <span onclick = 'setDamageTableDisplay()' title 'скрыть/показать' style = 'font-size:80%;cursor:pointer'>" +
          spanHTML +
          "</span><table width = 100% style = 'display:" +
          damageTableDisplay +
          "'><tbody><tr>"
        for (let i = 0; i < 2; i++) {
          if (damage[i].length == 0) {
            continue
          }
          txt += "<td width = 50%><table width = 95%><tbody>"
          damage[i].sort((a, b) => (a.s < b.s ? 1 : -1))
          for (let j = 0; j < damage[i].length; j++) {
            txt +=
              "<tr><td align = left>" +
              stage.pole.html("name", damage[i][j]["id"]) +
              "</td><td align = right>" +
              damage[i][j]["s"] +
              "</td></tr>"
          }
          txt += "</tbody></table></td>"
        }
        txt += "</tr></tbody></table>"
        document.getElementById("damageTable").innerHTML = txt
      }
      stage.pole.procceddamage = unsafeWindow.procceddamage = function (i) {
        realDamage = Math.min(
          this.obj[i].damage,
          (this.obj[i].nownumber - 1) * this.obj[i].maxhealth +
            this.obj[i].nowhealth
        )
        if (
          this.obj[this.obj[i].damaged] !== undefined ||
          this.obj[i].damaged == -2 ||
          this.obj[i].damaged == -1 ||
          this.obj[i].damaged == -9
        ) {
          let id = 0
          if (this.obj[i].damaged == -9 && psa[i] !== "undefined") {
            // id = psa[i];
          } else if (this.obj[i].damaged == -1 && psc[i] !== "undefined") {
            id = psc[i]
          } else if (this.obj[i].damaged == -2) {
            let x = tointeger(tmp.substr(6, 2))
            let y = tointeger(tmp.substr(8, 2))
            id = Math.floor(firewalls[x + y * defxn] / 100)
          } else {
            id = this.obj[i].damaged
          }
          if (id > 0 && this.obj[id] && this.obj[id].owner) {
            let owner = this.obj[id].owner
            let side = (this.obj[id].owner % 2) * -1 + 1
            let name = this.obj[id].nametxt
            let f = false
            for (let j = 0; j < damage[side].length; j++) {
              if (
                damage[side][j]["name"] == name &&
                damage[side][j]["owner"] == owner
              ) {
                f = true
                damage[side][j]["s"] += realDamage
              }
            }
            if (f == false) {
              let o = {
                id: id,
                s: realDamage,
                name: name,
                owner: owner,
              }
              damage[side].push(o)
            }
            updateDamageData()
          }
        }
        if (this.obj[this.obj[i].damaged] !== undefined) {
          if (
            this.obj[this.obj[i].damaged].separhsum === null ||
            this.obj[this.obj[i].damaged].separhsum === undefined
          ) {
            this.obj[this.obj[i].damaged].separhsum = 0
          }
          let s = 0
          if (realDamage >= this.obj[i].nowhealth) {
            s += this.obj[i].level
            if (realDamage - this.obj[i].nowhealth > 0) {
              s *=
                Math.floor(
                  (realDamage - this.obj[i].nowhealth) / this.obj[i].maxhealth
                ) + 1
            }
            this.obj[this.obj[i].damaged].separhsum += s
          }
          if (stage.pole.obj[this.obj[i].damaged]["hitcount"] === undefined) {
            stage.pole.obj[this.obj[i].damaged]["hitcount"] = 0
            stage.pole.obj[this.obj[i].damaged]["luckcount"] = 0
          }
          if (
            this["nowhit"] != this.obj[i].damaged &&
            !this.obj[i].magicdamage
          ) {
            let curName = curAbil.substr(0, 3)
            if (
              curAbil == "" ||
              parseInt(curAbil.substr(3, 3)) != this.obj[i].damaged ||
              (curName != "stb" &&
                curName != "htc" &&
                curName != "blh" &&
                curName != "dwl" &&
                curName != "ltn" &&
                curName != "clt" &&
                curName != "lep" &&
                curName != "spk" &&
                curName != "bdd" &&
                curName != "rs2" &&
                curName != "ooc" &&
                curName != "fls")
            ) {
              if (
                magic[this.obj[i].damaged] &&
                magic[this.obj[i].damaged]["hyp"] &&
                magic[this.obj[i].damaged]["hyp"]["nowinit"] > 0
              ) {
              } else {
                this.obj[this.obj[i].damaged]["hitcount"] += 1
              }
              this["nowhit"] = this.obj[i].damaged
            }
            curAbil = ""
          }
        }
        curshowmagic = ""
        if (this.obj[i].damaged > 0) {
          this.obj[this.obj[i].damaged].att = true
        }
        if (this.obj[i].damage != 0 || !this.obj[i].runaway) {
          this.obj[i].donow = "b"
          if (this.obj[i].incorporeal) {
            if (
              this.obj[i].magicdamage &&
              this.obj[i].magicdamage != "Магический кулак"
            ) {
              this.obj[i].misscount = 0
            } else {
              if (this.obj[i].damage == 0) {
                if (
                  this.obj[i].misscount === undefined ||
                  this.obj[i].misscount == 0
                ) {
                  this.obj[i].misscount = -1
                } else {
                  if (this.obj[i].misscount == -1) {
                    this.obj[i].misscount = -2
                  } else {
                    this.obj[i].misscount = -1
                  }
                }
              } else {
                if (
                  this.obj[i].misscount === undefined ||
                  this.obj[i].misscount == 0
                ) {
                  this.obj[i].misscount = 1
                } else {
                  if (this.obj[i].misscount == 1) {
                    this.obj[i].misscount = 2
                  } else {
                    this.obj[i].misscount = 1
                  }
                }
              }
            }
          }
          if (this.obj[i].damage == 0 && magic[i]["phm"]) {
            this.obj[i].donow = ""
          } else {
            if (this.obj[i].damaged > 0) {
              this.obj[i].destx = this.obj[this.obj[i].damaged].x
            }
            if (this.obj[i].damaged > 0) {
              this.obj[i].desty = this.obj[this.obj[i].damaged].y
            }
            this.obj[i].active = true
            someactive = true
          }
        }
        this.obj[i]["needSetNumber"] = 0
        this.calcdamage(i)
      }
      stage.pole.process_luck = unsafeWindow.process_luck = function (current) {
        var lucky = command.substring(4, command.indexOf("^"))
        playsound(current, lucky, 70)
        if (lucky == "badmorale") {
          switch (lang) {
            case 0:
              htmllog +=
                "" +
                this.html("name", current) +
                " ожидают в страхе" +
                this.html("end")
              break
            case 1:
              htmllog +=
                "" +
                this.html("name", current) +
                " freeze in fear." +
                this.html("end")
              break
          }
          showtext()
          showdefwait(current, "unmorale")
        }
        if (lucky == "morale") {
          this.incrementParam(current, "moraleCount")
          switch (lang) {
            case 0:
              htmllog +=
                "" +
                this.html("name", current) +
                " рвутся в бой!" +
                this.html("end")
              break
            case 1:
              htmllog +=
                "" +
                this.html("name", current) +
                " are bursting for more action!" +
                this.html("end")
              break
          }
          showtext()
          showdefwait(current, "morale")
        }
        if (lucky == "luck") {
          if (stage.pole.obj[current]["hitcount"] === undefined) {
            stage.pole.obj[current]["hitcount"] = 0
            stage.pole.obj[current]["luckcount"] = 0
          }
          stage.pole.obj[current]["luckcount"] += 1
          switch (lang) {
            case 0:
              htmllog +=
                "" +
                this.html("name", current) +
                " посетила удача!" +
                this.html("end")
              break
            case 1:
              htmllog +=
                "Luck befalls " +
                this.html("name", current) +
                "!" +
                this.html("end")
              break
          }
          showtext()
          showdefwait(current, "luck")
        }
        if (lucky == "unluck") {
          switch (lang) {
            case 0:
              htmllog +=
                "" +
                this.html("name", current) +
                " посетила неудача." +
                this.html("end")
              break
            case 1:
              htmllog +=
                "Bad luck befalls " +
                this.html("name", current) +
                "." +
                this.html("end")
              break
          }
          showtext()
          showdefwait(current, "unluck")
        }
        if (lucky == "critical") {
          switch (lang) {
            case 0:
              htmllog +=
                "" +
                this.html("name", current) +
                " - критический удар по заклятому врагу." +
                this.html("end")
              break
            case 1:
              htmllog +=
                "" +
                this.html("name", current) +
                " deal critical damage to favoured enemy." +
                this.html("end")
              break
          }
          showtext()
          showdefwait(current, "crit")
        }
        if (lucky == "drunk") {
          switch (lang) {
            case 0:
              htmllog +=
                "" +
                this.html("name", current) +
                " - самоуправство." +
                this.html("end")
              break
            case 1:
              htmllog +=
                "" +
                this.html("name", current) +
                " - independence." +
                this.html("end")
              break
          }
          showtext()
          showdefwait(current, "rage", 0)
        }
        command = command.substr(command.indexOf("^") + 1)
      }
      stage.pole.luckMoraleProbability = function (i, name) {
        let probability = 0
        if (!firsTurnShow) {
          return 0
        }
        let cre = stage.pole.obj[i]
        if (cre === undefined) {
          return 0
        }
        let allCount = ""
        let yesCount = ""
        let lastValue = ""
        let luck = 0
        if (name == "morale") {
          allCount = "turnCount"
          yesCount = "moraleCount"
          lastValue = "lastMorale"
          luck = stage.pole.getMoraleN(i)
        } else if (name == "luck") {
          allCount = "hitcount"
          yesCount = "luckcount"
          lastValue = "lastluck"
          luck = cre["luck"] + cre["luckaddon"]
        }
        if (cre[allCount] === undefined) {
          cre[allCount] = 0
        }
        if (cre[yesCount] === undefined) {
          cre[yesCount] = 0
        }
 
        if (cre["checkMrl"] !== undefined && cre["checkMrl"] == 1) {
          if (magic[i]["mrl"] === 0) {
            stage.pole.clearPar(i, "morale")
            cre["checkMrl"] = 0
          }
        }
        if (cre[lastValue] !== undefined && luck != cre[lastValue]) {
          stage.pole.clearPar(i, name)
        }
        cre[lastValue] = luck
        luck = Math.max(0, Math.min(luck * 0.1, 0.5))
        if (cre["hero"] != 1) {
          probability = Math.min(
            Math.pow(
              luck,
              1 +
                cre[yesCount] -
                ((cre[allCount] - cre[yesCount]) * luck) / (1 - luck)
            ),
            1
          )
        }
        if (probability >= 0.1) {
          return probability.toFixed(2)
        } else {
          return probability.toFixed(3)
        }
      }
      stage.pole.luckMoralePerc = function (i, name) {
        let prob = this.luckMoraleProbability(i, name)
        if (prob >= 0.1) {
          return (prob * 100).toFixed(0) + "%"
        } else {
          return (prob * 100).toFixed(1) + "%"
        }
      }
      stage.pole.snaresPossible = unsafeWindow.snaresPossible = function (
        attacker,
        defender
      ) {
        let n =
          Math.floor(attacker.nownumber / 25) -
          (defender.level +
            Math.floor(
              (defender.nownumber * defender.maxhealth) /
                (80 + defender.level * 20)
            ))
        let possible = [25, 25, 25, 25]
        let b = n
        if (n > 0) {
          for (let i = 3; i >= 1; i--) {
            while (possible[i] > 5 && n > 0) {
              possible[0] += 5
              possible[i] -= 5
              n -= 1
            }
          }
        }
        if (n < 0) {
          for (let i = 0; i <= 2; i++) {
            while (possible[i] > 5 && n < 0) {
              possible[3] += 5
              possible[i] -= 5
              n += 1
            }
          }
        }
        return possible[0] + possible[1] + possible[2] + "%"
      }
      stage.pole.checkProbabilitySkill = unsafeWindow.checkProbabilitySkill =
        function (attacker, attackx, attacky, ax, ay, range = 0) {
          unsafeWindow.skillProbability = ""
          if (
            !this.obj[attacker] ||
            !this.obj[attacker].hasOwnProperty("nownumber")
          ) {
            return false
          }
          var defender = mapobj[ax + ay * defxn]
          if (
            !this.obj[defender] ||
            !this.obj[defender].hasOwnProperty("nownumber")
          ) {
            return false
          }
          let hpa =
            (this.obj[attacker].nownumber - 1) * this.obj[attacker].maxhealth +
            this.obj[attacker].nowhealth
          let hpd =
            (this.obj[defender].nownumber - 1) * this.obj[defender].maxhealth +
            this.obj[defender].nowhealth
          let soldiersLuck = 0
          if (heroes[this.obj[activeobj]["owner"]] > 0) {
            let h = heroes[this.obj[activeobj]["owner"]]
            if (isperk(activeobj, 33)) {
              soldiersLuck = 1
            }
          }
          if (
            this.obj[attacker]["blinding_attack"] &&
            this.obj[defender]["alive"] &&
            !this.obj[defender]["warmachine"] &&
            !this.obj[defender]["iblind"] &&
            !this.obj[defender]["imind"] &&
            !this.obj[defender]["twistedmind"] &&
            !this.obj[defender]["absolutepurity"] &&
            !this.obj[defender]["enchantedarmor"]
          ) {
            skillProbability = getSkillProbability(
              hpa,
              Math.max(1, hpd - tPhysicalDamage)
            )
            if (
              skillProbability !=
              getSkillProbability(hpa, Math.max(1, hpd - tPhysicalDamage2))
            ) {
              skillProbability =
                skillProbability +
                "% - " +
                getSkillProbability(hpa, Math.max(1, hpd - tPhysicalDamage2))
            }
          }
          if (
            this.obj[attacker]["fearattack"] &&
            this.obj[defender]["alive"] &&
            !this.obj[defender]["imind"] &&
            !this.obj[defender]["twistedmind"] &&
            !this.obj[defender]["absolutepurity"]
          ) {
            skillProbability = getSkillProbability(
              hpa,
              Math.max(1, hpd - tPhysicalDamage)
            )
            if (
              skillProbability !=
              getSkillProbability(hpa, Math.max(1, hpd - tPhysicalDamage2))
            ) {
              skillProbability =
                skillProbability +
                "% - " +
                getSkillProbability(hpa, Math.max(1, hpd - tPhysicalDamage2))
            }
          }
          if (
            this.obj[attacker]["flamewave"] ||
            (this.obj[attacker]["shootbash"] && range == 1) ||
            this.obj[attacker]["shieldbash"] ||
            this.obj[attacker]["deathattack"] ||
            (this.obj[attacker]["wardingarrows"] &&
              !this.obj[defender]["warmachine"] &&
              !this.obj[defender]["mechanical"])
          ) {
            skillProbability = getSkillProbability(hpa, hpd)
          }
          if (
            this.obj[attacker]["torpor"] &&
            this.obj[defender]["alive"] &&
            !this.obj[defender]["warmachine"] &&
            !this.obj[defender]["absolutepurity"]
          ) {
            skillProbability = getSkillProbability(hpa, hpd)
          }
          if (this.obj[attacker]["pawstrike"]) {
            let len = wmap2[attacky * defxn + attackx]
            let spd = Math.max(
              0,
              Math.round(
                (this.obj[attacker].speed +
                  this.obj[attacker]["ragespeed"] +
                  this.obj[attacker]["speedaddon"]) *
                  this.obj[attacker].speedmodifier
              )
            )
            if (
              magic[attacker]["ent"] &&
              magic[attacker]["ent"]["nowinit"] > 0
            ) {
              spd = 0
            }
            if (
              this.obj[attacker].x == attackx &&
              this.obj[attacker].y == attacky
            ) {
              len = spd
            }
            let movelen = spd - len
            skillProbability = getSkillProbability(
              hpa,
              hpd,
              Math.floor(movelen)
            )
          }
          if (
            (this.obj[attacker]["bindshot"] && range == 1) ||
            (this.obj[attacker]["bindingstrike"] && range == 0)
          ) {
            skillProbability = getSkillProbability(
              hpa,
              Math.max(1, hpd - tPhysicalDamage),
              2
            )
            if (
              skillProbability !=
              getSkillProbability(hpa, Math.max(1, hpd - tPhysicalDamage2), 2)
            ) {
              skillProbability =
                skillProbability +
                "% - " +
                getSkillProbability(hpa, Math.max(1, hpd - tPhysicalDamage2), 2)
            }
          }
          if (
            this.obj[attacker]["purge"] ||
            this.obj[attacker]["cripplingwound"] ||
            this.obj[attacker]["assault"] ||
            (this.obj[attacker]["markoffire"] && range == 1) ||
            (this.obj[attacker]["powerstrike"] && !this.obj[defender]["big"]) ||
            this.obj[attacker]["lighting_attack"] ||
            (this.obj[attacker]["whipstrike"] && range == 0) ||
            (this.obj[attacker]["forcearrow"] && range == 1) ||
            (this.obj[attacker]["stoning"] && range == 0) ||
            this.obj[attacker]["paralyzing"] ||
            this.obj[attacker]["hexingattack"]
          ) {
            skillProbability = getSkillProbability(
              hpa,
              Math.max(1, hpd - tPhysicalDamage)
            )
            if (
              skillProbability !=
              getSkillProbability(hpa, Math.max(1, hpd - tPhysicalDamage2))
            ) {
              skillProbability =
                skillProbability +
                "% - " +
                getSkillProbability(hpa, Math.max(1, hpd - tPhysicalDamage2))
            }
          }
          function getSkillProbability(hpa, hpd, attempt = 1) {
            let skillProbability = 0
            if (hpa > hpd) {
              skillProbability = 25 + 3 * (hpa / hpd)
            } else {
              skillProbability = 25 - 3 * (hpd / hpa)
            }
            skillProbability = Math.min(75, Math.max(5, skillProbability))
            skillProbability = Math.round(
              (1 -
                Math.pow(
                  1 - skillProbability / 100,
                  attempt * (soldiersLuck + 1)
                )) *
                100
            )
            return skillProbability
          }
        }
      unsafeWindow.showuron = function (mag, effect = "") {
        if (myuron.line3 === undefined) {
          var ttext = Make_Text("", uron_data)
          set_X(ttext, uron_data.x)
          set_Y(ttext, uron_data.y + 69)
          myuron.line3 = ttext
          Make_addChild(myuron2, ttext)
          option = {
            offsetX: -razmetka["war_images"][24][mqc["sdx"]],
            offsetY:
              -razmetka["war_images"][24][mqc["sdy"]] -
              (razmetka["war_images"][19][mqc["ys"]] +
                razmetka["war_images"][24][mqc["y"]]),
            image: stage.pole.ground["war_images"],
            width: razmetka["war_images"][24][mqc["xs"]],
            height: razmetka["war_images"][24][mqc["ys"]],
            crop: {
              x: razmetka["war_images"][24][mqc["x"]],
              y: razmetka["war_images"][24][mqc["y"]],
              width: razmetka["war_images"][24][mqc["xs"]],
              height: razmetka["war_images"][24][mqc["ys"]],
              visible: 1,
            },
            listening: false,
          }
          var img_temp = My_Image(option)
          img_temp.option = option
          set_visible(img_temp, 1)
          Make_addChild(myuron2, img_temp)
          set_scaleX(img_temp, sub_scale * 0.4)
          set_scaleY(img_temp, sub_scale * 0.4)
        }
        var line1 = 0
        var line2 = 0
        var line3 = stage.pole.luckMoraleProbability(activeobj, "luck")
        if (umelka[1][0] == undefined) {
          return 0
        }
        if (effect != "") {
          line1 = ""
          line2 = effect
        } else if (mag == 1) {
          if (ctrldown && targetMagicdamage > 0) {
            line2 = targetMagicdamage
            line1 = targetMagickills
          } else {
            line2 = Totalmagicdamage
            line1 = Totalmagickills
          }
        } else {
          if (ctrldown) {
            line1 = Uronkills
            if (Uronkills != Uronkills2) line1 += " - " + Uronkills2
            line2 = PhysicalDamage
            if (PhysicalDamage != PhysicalDamage2)
              line2 += " - " + PhysicalDamage2
          } else {
            line1 = tUronkills
            if (tUronkills != tUronkills2) {
              line1 += " - " + tUronkills2
            }
            line2 = tPhysicalDamage
            if (tPhysicalDamage != tPhysicalDamage2) {
              line2 += " - " + tPhysicalDamage2
            }
            if (skillProbability != "") {
              line2 += " (" + skillProbability + "%)"
            }
          }
        }
        var scale =
          Math.max(min_uron_scale, stage[war_scr].scaling_ratio) *
          MainPixelRatio
        set_scaleX(myuron2, scale)
        set_scaleY(myuron2, scale)
        if (last_line1 != line1 || last_line2 != line2 || last_line3 != line3) {
          last_line1 = line1
          last_line2 = line2
          last_line3 = line3
          set_cache(myuron, false)
          set_text(myuron.line1, line1 + " ")
          set_text(myuron.line2, line2 + " ")
          luckProbability = stage.pole.luckMoraleProbability(activeobj, "luck")
          if (
            mag == 1 ||
            luckProbability == 0 ||
            magicuse == "leap" ||
            magicuse == "leap6"
          ) {
            myuron2.children[4].visible = 0
            myuron.line3.visible = 0
          } else {
            myuron2.children[4].visible = 1
            myuron.line3.visible = 1
            set_text(myuron.line3, stage.pole.luckMoralePerc(activeobj, "luck"))
          }
          set_visible(myuron, 1)
          set_strokeThickness(
            myuron.line1,
            Math.round(uron_stroke_width * Math.min(1, scale))
          )
          set_strokeThickness(
            myuron.line2,
            Math.round(uron_stroke_width * Math.min(1, scale))
          )
          set_strokeThickness(
            myuron.line3,
            Math.round(uron_stroke_width * Math.min(1, scale))
          )
          //		myuron.cacheAsBitmap = true;
        }
        set_visible(myuron, 1)
        //	set_cache(myuron, true);
        var sc = 1
        var ratio = getDevicePixelRatio()
        //	if (android)
        //	{
        var sc = stage[war_scr].scaling * ratio
        //	}
        var rect = get_clientRect(myuron)
        if (currentTip == 1) {
          rect.width *= scale
          rect.height *= scale
        }
        if (
          currentTip == 1 &&
          (rect.x > 6000 || rect.width > 2000 || rect.height > 200)
        ) {
          rect.width =
            Math.min(
              300,
              Math.max(myuron.line1.width, myuron.line2.width) + 20
            ) * stage[war_scr].scaling
          rect.height =
            Math.min(100, myuron.line1.height * 2 + 5) * stage[war_scr].scaling
        }
        var gscaling = stage[war_scr].scaling
        var xx2 = scr_xmouse
        var max_x = original_width
        if (android && stage_width > stage_height) {
          max_x = original_width - pole_left - pole_right
        }
        if (xx2 + get_width(myuron) > max_x * gscaling) {
          xx2 = max_x * gscaling - get_width(myuron)
        }
        var xx = xx2
        var yy = scr_ymouse
        if (!android) {
          xx -= cursor_width * scale
          yy += cursor_height * 1.5 * scale
        } else {
          xx -= cursor_width * scale
          yy -= cursor_height * 4 * scale
          if (yy < 3) yy = 3
        }
        if (yy + get_height(rect) * 1.2 > atby) {
          yy = atby - get_height(rect) * 1.2
        }
        if (xx + get_width(rect) * 1.1 > stage_width) {
          xx = stage_width - get_width(rect) * 1.1
        }
        set_X(myuron, Math.round(xx))
        set_Y(myuron, Math.round(yy))
      }
      stage.pole.onMouseMoveFlash = unsafeWindow.onMouseMoveFlash = function (
        from_event,
        xmouse,
        ymouse,
        force,
        reset,
        lastcoords
      ) {
        attack_xr = 0
        attack_yr = 0
        targetMagicdamage = 0
        targetMagickills = 0
        if (buttons_visible["win_dialog"]) return 0
        if (buttons_visible["scroll_runes"]) return 0
        if (buttons_visible["magic_book"]) return 0
        if (buttons_visible["win_SeparateArmy"]) return 0
        if (buttons_visible["win_Mission"]) return 0
        if (buttons_visible["win_Settings"]) return 0
        if (total_delta > 20) return 0
        if (typeof unsafeWindow.csword === "undefined") return 0
        shiftdown = false
        ctrldown = false
        if (!android) {
          var isRightMB = false
          var e = 0
          if ((typeof event !== "undefined" && event) || from_event) {
            var e = from_event
            if (typeof event !== "undefined" && event) e = event
            if (e.which) {
              if (e.which == 2 || e.which == 3) {
                isRightMB = 1
              }
            } else if (e.button) isRightMB = e.button >= 2
          }
          if (KeyisDown(16)) shiftdown = true
          else shiftdown = false
          if (KeyisDown(17) || isRightMB) ctrldown = true
          else ctrldown = false
        }
        shiftdown = (shiftdown || shift_button) && shift_ok
        ctrldown = ctrldown || info_button
        if (activeobj > 0 && this.obj[activeobj]) {
          if (this.obj[activeobj]["was_atb"] > 0) {
            this.reset_temp_magic()
            this.showatb()
            this.obj[activeobj]["was_atb"] = 0
          }
          if (
            magicuse != "" &&
            this.obj[activeobj][magicuse + "elem"] == "air" &&
            ((this.obj[activeobj]["hero"] && isperk(activeobj, 100)) ||
              this.obj[activeobj]["master_of_storms"])
          ) {
            this.reset_temp_magic()
            this.showatb()
          }
          if (
            magicuse != "" &&
            (magicuse == "circle_of_winter" || magicuse == "icebolt") &&
            ((this.obj[activeobj]["hero"] && isperk(activeobj, 99)) ||
              this.obj[activeobj]["master_of_ice"])
          ) {
            this.reset_temp_magic()
            this.showatb()
          }
        }
        movecounter++
        var i = 0,
          bigok = false,
          len = 0,
          xk = 0,
          yk = 0,
          range = 0,
          xaa = 0,
          yaa = 0,
          x = 0,
          y = 0,
          xr = 0,
          yr = 0,
          a = 0,
          ab = 0,
          ac = 0,
          xb = 0,
          yb = 0,
          res = 0,
          ok = false
        if (onrune) {
          if (lastshad > 0) {
            set_visible(shado[lastshad], 0)
            set_visible(shado[lastshad + 1], 0)
            set_visible(shado[lastshad + 1 + defxn], 0)
            set_visible(shado[lastshad + defxn], 0)
          }
          lastshad = 0
          return 0
        }
        if (itrunepanel()) {
          return 0
        }
        attackx = 0
        attacky = 0
        movex = 0
        movey = 0
        magicx = -1
        magicy = 0
        scr_ymouse = ymouse
        scr_xmouse = xmouse
        if (lastcoords == true) {
          scr_ymouse = scr_ymouselast
          scr_xmouse = scr_xmouselast
        }
        scr_ymouselast = scr_ymouse
        scr_xmouselast = scr_xmouse
        var r = getxa_from(scr_xmouse, scr_ymouse)
        x = r.x + 1
        y = r.y + 1
        xr = Math.ceil(r.x)
        yr = Math.ceil(r.y)
        if (interactive_obj > 0) {
          if (
            xr > 0 &&
            yr > 0 &&
            xr <= defxn - 2 &&
            yr <= defyn &&
            mapobj[yr * defxn + xr] == interactive_obj
          ) {
          } else {
            xr = this.obj[interactive_obj].x
            yr = this.obj[interactive_obj].y
          }
        }
        xr_last = xr
        yr_last = yr
 
        xr_z = scr_xmouse
        yr_z = scr_ymouse
        if (reset) {
          xr_z = -100
          yr_z = -100
          xr = -5
          yr = -5
        }
        if (buttons_visible["win_InfoCreatureEffect"]) return 0
        if (buttons_visible["win_InfoHero"]) return 0
        if (buttons_visible["win_InfoHero2"]) return 0
        if (buttons_visible["win_InfoCreature"]) return 0
        if (xr > 0 && yr > 0 && xr <= defxn - 2 && yr <= defyn) {
          show_coords(xr, yr)
          if (firewalls[yr * defxn + xr] > 0) {
            let lifeTime = (
              magic[Math.floor(firewalls[yr * defxn + xr] / 100)][
                "F" + ((firewalls[yr * defxn + xr] % 100) + "").padStart(2, "0")
              ]["nowinit"] / 100
            ).toFixed(2)
            testBlock(lifeTime, true)
          } else if (fireInfo) {
            testBlock()
          }
        } else {
          show_coords(0, 0)
        }
        if (
          loader.loading ||
          ((someactive || command != "") && !gpause) ||
          buttons_visible["magic_book"] ||
          buttons_visible["scroll_runes"]
        ) {
          return 0
        }
        if (!inserted && inssubmit) {
          return 0
        }
 
        if (!inserted && !inssubmit) {
          if (reset) {
            xr = -5
            yr = -5
          }
          if (activestek <= 0) {
            lastshad = -1
          }
          if (xr + yr * defxn != lastshad) {
            if (shado[lastshad]) set_visible(shado[lastshad], 0)
            if (shado[lastshad + 1]) set_visible(shado[lastshad + 1], 0)
            if (shado[lastshad + 1 + defxn])
              set_visible(shado[lastshad + 1 + defxn], 0)
            if (shado[lastshad + defxn]) set_visible(shado[lastshad + defxn], 0)
            lastshad = xr + yr * defxn
            if (activestek > 0) {
              if (stekx[activestek] > 0) {
                set_visible(
                  shado[stekx[activestek] + steky[activestek] * defxn],
                  1
                )
                if (this.obj[activestek].big) {
                  set_visible(
                    shado[stekx[activestek] + steky[activestek] * defxn + 1],
                    1
                  )
                  set_visible(
                    shado[
                      stekx[activestek] + steky[activestek] * defxn + 1 + defxn
                    ],
                    1
                  )
                  set_visible(
                    shado[
                      stekx[activestek] + steky[activestek] * defxn + defxn
                    ],
                    1
                  )
                }
                if (this.obj[activestek].bigx) {
                  set_visible(
                    shado[stekx[activestek] + steky[activestek] * defxn + 1],
                    1
                  )
                }
                if (this.obj[activestek].bigy) {
                  set_visible(
                    shado[
                      stekx[activestek] + steky[activestek] * defxn + defxn
                    ],
                    1
                  )
                }
              }
              po = Math.floor((playero - 1) / 2)
              if (getbtype(btype) == 1 || getbtype(btype) == 3) {
                if (playero > 2) {
                  playero1 = playero + 1
                } else {
                  playero1 = playero
                }
                t1 = 0
                t2 = 0
                t11 = 0
                t21 = 0
                k = playero
                k1 = playero1
                if (isperk(0, 12, k)) {
                  if (k % 2 == 0) {
                    t1 = -1
                  } else {
                    t2 = 1
                  }
                  if (k1 % 2 == 0) {
                    t11 = -1
                  } else {
                    t21 = 1
                  }
                }
                for (
                  x = 9 - (playero % 2) * 8 + t1;
                  x <= 9 - (playero % 2) * 8 + 3 + t2;
                  x++
                ) {
                  for (
                    y = (defyn - 4) * ((playero1 + 1) % 2) + 1 + t11;
                    y <= (defyn - 4) * ((playero1 + 1) % 2) + 4 + t21;
                    y++
                  ) {
                    setmap(x, y, 250)
                  }
                }
              } else {
                if (
                  getbtype(btype) == NEWKZS ||
                  btype == _PIRATE_NEW_EVENT ||
                  winter == "arena8" ||
                  btype == _VILLAGE_EVENT
                ) {
                  setpole(btype, 250, playero, yourside, defxn - 2, defyn)
                } else if (
                  getbtype(btype) == 4 ||
                  getbtype(btype, defxn - 2, defyn) == _NEWTHIEF ||
                  getbtype(btype) == _NECR_EVENT2 ||
                  btype == _ELKA_DEFENSE
                ) {
                  setpole(btype, 250, playero, yourside, defxn - 2, defyn, po)
                } else {
                  t1 = 0
                  t2 = 0
                  k = playero
                  if (isperk(0, 12, k)) {
                    if ((k + camp_mirror) % 2 == 0) {
                      t1 = -1
                    } else {
                      t2 = 1
                    }
                  }
                  y1 = Math.floor((po * defyn) / yourside + 1)
                  y2 = Math.floor(((po + 1) * defyn) / yourside)
                  if (fullinsert) {
                    y1 = 1
                    y2 = defyn
                  }
                  for (
                    x =
                      defxn -
                      3 -
                      ((playero + camp_mirror) % 2) * (defxn - 4) +
                      t1;
                    x <=
                    defxn -
                      3 -
                      ((playero + camp_mirror) % 2) * (defxn - 4) +
                      1 +
                      t2;
                    x++
                  ) {
                    for (y = y1; y <= y2; y++) {
                      setmap(x, y, 250)
                    }
                  }
                }
              }
              this.setotherobjs()
              for (k = 1; k <= Math.max(7, stackcount); k++) {
                if (k != activestek) {
                  setmap(stekx[k], steky[k], 210)
                  if (this.obj[k]) {
                    if (this.obj[k].big) {
                      setmap(stekx[k] + 1, steky[k], 210)
                      setmap(stekx[k] + 1, steky[k] + 1, 210)
                      setmap(stekx[k], steky[k] + 1, 210)
                    }
                    if (this.obj[k].bigx) {
                      setmap(stekx[k] + 1, steky[k], 210)
                    }
                    if (this.obj[k].bigy) {
                      setmap(stekx[k], steky[k] + 1, 210)
                    }
                  }
                }
              }
              var bigx = this.obj[activestek]["big"]
              var bigy = this.obj[activestek]["big"]
              if (this.obj[activestek]["bigx"]) bigx = 1
              if (this.obj[activestek]["bigy"]) bigy = 1
              var cnt = 0
              var xp = Array(0, -1, 0, -1)
              var yp = Array(0, 0, -1, -1)
              var xro = xr,
                yro = yr
              if (this.obj[activestek]["big"]) cnt = 3
              for (k = 0; k <= cnt; k++) {
                ok = true
                xr = xro + xp[k]
                yr = yro + yp[k]
                xr_last = xr
                yr_last = yr
                for (x = 0; x <= bigx; x++) {
                  for (y = 0; y <= bigy; y++) {
                    if (getmap(x + xr, y + yr) != 250) {
                      ok = false
                    }
                  }
                }
                if (ok) break
              }
              if (ok && (xr != stekx[activestek] || yr != steky[activestek])) {
                lastshad = xr + yr * defxn
                setstekx = xr
                setsteky = yr
                set_visible(shado[xr + yr * defxn], 1)
                if (this.obj[activestek].big) {
                  set_visible(shado[xr + yr * defxn + 1], 1)
                  set_visible(shado[xr + yr * defxn + 1 + defxn], 1)
                  set_visible(shado[xr + yr * defxn + defxn], 1)
                }
                if (this.obj[activestek].bigx) {
                  set_visible(shado[xr + yr * defxn + 1], 1)
                }
                if (this.obj[activestek].bigy) {
                  set_visible(shado[xr + yr * defxn + defxn], 1)
                }
              } else {
                setstekx = -1
                setsteky = -1
              }
            }
          }
          var i = mapobj[yr * defxn + xr]
          if (i > 0) {
            if (
              (activeobj > 0 || someactive == false || gpause) &&
              this.obj[i].doing != "walk" &&
              (activeobj != i || gpause) &&
              !this.obj[i].hero &&
              showway
            ) {
              this.showposway(i, 0, activeobj)
              if (!gpause) this.checkthrower(activeobj)
            }
          } else {
            var was = 0,
              m = 0
            lastpole = 0
            if (this.shadows)
              for (x = 0; x <= defxn + 1; x++) {
                if (!this.shadows.shad1[x]) continue
                for (y = 1; y <= defyn; y++) {
                  if (!this.shadows.shad1[x][y]) continue
                  m = getmap(x, y)
                  if (m == 210) {
                    m = 250
                  }
                  if (m == 200 || m == 250 || mapzz[y * defxn + x] == 240) {
                    if (!was) set_visible(this.shadows.shadow1, 1)
                    was = 1
                  }
                  if (this.shadows.shad1[x][y].shadowed == 1) {
                    set_Alpha(this.shadows.shad1[x][y], 0.3)
                  }
                  if (mapzz[y * defxn + x] == 240) {
                    set_Alpha(this.shadows.shad1[x][y], 0.5)
                    this.shadows.shad1[x][y].shadowed = 1
                  }
                  if (m == 200 && gpause) continue
                  if (m == 200 || m == 250 || mapzz[y * defxn + x] == 240) {
                    set_visible(this.shadows.shad1[x][y], 1)
                  } else {
                    set_visible(this.shadows.shad1[x][y], 0)
                  }
                }
              }
            this.shadows.shadow1.no_filter = true
            if (shadow_cache) set_cache(this.shadows.shadow1, true, 1)
          }
          return 0
        }
        var cur_atb = this.get_cur_atb(scr_xmouse, scr_ymouse)
        if (cur_atb > 0 && zoomed == false) {
          if (combat_zoom_timeout > 0) {
            clearTimeout(combat_zoom_timeout)
            combat_zoom_timeout = 0
          }
          k = cur_atb - 1
          for (var kk = 0; kk <= atb_cnt; kk++) {
            if (kk != k) {
              if (
                typeof this.p_array === "undefined" ||
                !this.portraits[this.p_array[kk]]
              )
                continue
              showshadow(this.portraits[this.p_array[kk]].under, false)
            }
          }
          if (
            this.obj[atb[k + atbsd]] &&
            !this.obj[atb[k + atbsd]].shadowed &&
            !someactive
          ) {
            this.showmi(atb[k + atbsd])
            var i = atb[k + atbsd]
            showshadow(this.obj[atb[k + atbsd]], true)
            lasti = atb[k + atbsd]
            showshadow(this.portraits[this.p_array[k]].under, true)
            if (
              this.obj[atb[k + atbsd]].nownumber > 0 &&
              !this.obj[atb[k + atbsd]].stone &&
              !this.obj[atb[k + atbsd]].portal
            ) {
              this.obj[atb[k + atbsd]].ontop = 1
              this.obj[atb[k + atbsd]].get_obj_z(this.obj[atb[k + atbsd]].y)
              if (this.obj[atb[k + atbsd]].hero) {
                set_visible(this.obj[atb[k + atbsd]].number, 1)
              }
              showshadow(this.obj[atb[k + atbsd]], true)
              need_sort = true
            }
            var len = this.obj_array.length
            for (var k1 = 0; k1 < len; k1++) {
              i = this.obj_array[k1]
              if (i != atb[k + atbsd] && this.obj[i].shadowed) {
                clearpole2()
                if (
                  this.obj[i].nownumber > 0 &&
                  !this.obj[i].stone &&
                  !this.obj[i].portal
                ) {
                  this.obj[i].ontop = 0
                  this.obj[i].get_obj_z(this.obj[i].y)
                  if (this.obj[i].hero) {
                    set_visible(this.obj[i].number, 0)
                  }
                  need_sort = true
                }
                showshadow(this.obj[i], false)
              }
            }
          }
          if (lastk != k) re_cache_atb()
          lastk = k
          if (inserted) {
            set_cursor(0)
            if (myuron) set_visible(myuron, 0)
            if (csword) set_visible(csword, 0)
            clearshado()
            clearshadway()
          }
          return 0
        }
        lastk = -1
        if (reset) {
          xr = -5
          yr = -5
        }
        mishowed = false
        var i = mapobj[yr * defxn + xr]
        var nowi = 0
        if (lasti > 0 && lasti != i && this.obj[lasti].shadowed) {
          i = lasti
          lasti = 0
          for (k = 0; k <= atb_cnt; k++) {
            if (atb[k + atbsd] == i) {
              showshadow(this.portraits[this.p_array[k]].under, false)
            }
          }
          if (!mishowed) {
            set_visible(mini_info_panel, 0)
            this.showmi(-1)
            if (btype == 20 || btype == _SURVIVAL_GNOM || btype == _2SURVIVAL) {
              this.showmitnv()
            }
            if (btype == 8) {
              this.showmitnv(1)
            }
            if (btype == 119) {
              // this.showmitnv(2);
            }
            clearpole2()
          }
          if (
            this.obj[i].nownumber > 0 &&
            !this.obj[i].stone &&
            !this.obj[i].portal
          ) {
            this.obj[i].ontop = 0
            this.obj[i].get_obj_z(this.obj[i].y)
            if (this.obj[i].hero) {
              set_visible(this.obj[i].number, 0)
            }
            need_sort = true
          }
          showshadow(this.obj[i], false)
          if (!(mapobj[yr * defxn + xr] > 0)) re_cache_atb()
        }
        if (gpause) this.fill_mapobj()
        if (i > 0) {
          bigok = false
          if (this.obj[i].big) {
            if (
              this.obj[i].x <= xr &&
              this.obj[i].x + 1 >= xr &&
              this.obj[i].y <= yr &&
              this.obj[i].y + 1 >= yr
            ) {
              bigok = true
            }
          }
          if (this.obj[i].bigx) {
            if (
              this.obj[i].x <= xr &&
              this.obj[i].x + 1 >= xr &&
              this.obj[i].y == yr
            ) {
              bigok = true
            }
          }
          if (this.obj[i].bigy) {
            if (
              this.obj[i].y <= yr &&
              this.obj[i].y + 1 >= yr &&
              this.obj[i].x == xr
            ) {
              bigok = true
            }
          }
          if (
            !this.obj[i].rock &&
            this.obj[i].nownumber > 0 &&
            (!someactive || gpause) &&
            ((this.obj[i].x == xr && this.obj[i].y == yr) || bigok)
          ) {
            nowi = i
            if (!this.obj[i].shadowed && this.obj[i].inited_show) {
              if (!this.obj[i].stone && !this.obj[i].portal) {
                this.obj[i].ontop = 1
                this.obj[i].get_obj_z(this.obj[i].y)
                if (this.obj[i].hero) {
                  set_visible(this.obj[i].number, 1)
                }
                need_sort = true
              }
              mishowed = true
              this.showmi(i)
              showshadow(this.obj[i], true)
              if (
                (activeobj > 0 || someactive == false || gpause) &&
                this.obj[i].doing != "walk" &&
                (activeobj != i || gpause) &&
                !this.obj[i].hero &&
                showway
              ) {
                this.showposway(i, 0, activeobj)
                if (!gpause) this.checkthrower(activeobj)
              }
              for (k = 0; k <= atb_cnt; k++) {
                if (atb[k + atbsd] == i) {
                  showshadow(this.portraits[this.p_array[k]].under, true)
                }
              }
            }
          }
          if (lasti != i) re_cache_atb()
        }
        if (i > 0) lasti = i
        else lasti = 0
        crun_visible2 = true
        if (typeof unsafeWindow.myuron !== "undefined") set_visible(myuron, 0)
        k = getmap(xr, yr)
        clearshado()
        if (k == 200) {
          k = 250
        }
        if (xr > defxn - 1 || xr < 0) {
          k = 0
        }
        if (
          magicuse != "" &&
          magicuse != "layhands" &&
          magicuse != "orderofchief" &&
          magicuse != "harmtouch" &&
          magicuse != "hailstorm" &&
          magicuse != "allaroundslash" &&
          magicuse != "feralcharge" &&
          magicuse != "slam" &&
          magicuse != "unstoppablecharge" &&
          magicuse != "mightyslam" &&
          magicuse != "incinerate" &&
          magicuse != "leap" &&
          magicuse != "leap6" &&
          magicuse != "harpoonstrike"
        ) {
          k = magicuse
        }
        if (magicuse == "ssh") {
          if (
            xr >= 1 &&
            xr <= defxn - 2 &&
            yr >= 1 &&
            yr <= defyn &&
            (Math.abs(xr - this.obj[activeobj].x) > 1 ||
              Math.abs(yr - this.obj[activeobj].y) > 1)
          ) {
            k = "ssh"
          } else {
            k = 0
          }
        }
        if (
          k == "mdispel" ||
          k == "mstoneskin" ||
          k == "mbless" ||
          k == "mrighteous_might" ||
          k == "mdeflect_missile" ||
          k == "mskyandearth"
        ) {
          k = "mfast"
        }
        if (
          k == "mslow" ||
          k == "mcurse" ||
          k == "mdray" ||
          k == "msuffering" ||
          k == "mconfusion"
        ) {
          k = "mslow"
        }
        if (k == "knightmark" || k == "necr_soul") {
          k = "knightmark"
        }
        if (
          k == "righteous_might" ||
          k == "deflect_missile" ||
          k == "antimagic"
        ) {
          k = "fast"
        }
        if (k == "implosion") {
          k = "lighting"
        }
        if (k == "divinev") {
          k = "angerofhorde"
        }
        if (k == "suffering") {
          k = "curse"
        }
        var enemy = 210
        if (magicuse == "layhands") enemy = 211
        if (magicuse == "orderofchief") enemy = 211
        switch (k) {
          case "magicfist":
            set_cursor(6)
            if (xr + yr * defxn != lastshad) {
              if (lastshad > 0) {
                setshad(0, 0, 0, 0, false)
              }
            }
            if (getmap(xr, yr) != 210) {
              res = 0
              break
            }
            lastshad = xr + yr * defxn
            setshad(0, 0, 0, 0, true)
            res = "magicfist"
            magicx = xr
            magicy = yr
            this.calcmagic(activeobj, xr, yr, magicuse)
            break
          case "lighting":
            set_cursor(6)
            if (xr + yr * defxn != lastshad) {
              if (lastshad > 0) {
                setshad(0, 0, 0, 0, false)
              }
            }
            if (getmap(xr, yr) != 210) {
              res = 0
              break
            }
            lastshad = xr + yr * defxn
            setshad(0, 0, 0, 0, true)
            res = "lighting"
            magicx = xr
            magicy = yr
            this.calcmagic(activeobj, xr, yr, magicuse)
            break
          case "chainlighting":
            set_cursor(6)
            if (xr + yr * defxn != lastshad) {
              if (lastshad > 0) {
                setshad(0, 0, 0, 0, false)
                lastshad = -2
                clearshado()
                var len = this.obj_array.length
                for (var k = 0; k < len; k++) {
                  i = this.obj_array[k]
                  if (
                    this.obj[i].inited_image == true &&
                    this.obj[i].inited_show
                  ) {
                    this.obj[i].set_number()
                  }
                }
              }
            }
            if (getmap(xr, yr) != 210) {
              res = 0
              break
            }
            lastshad = xr + yr * defxn
            setshad(0, 0, 0, 0, true)
            res = "chainlighting"
            magicx = xr
            magicy = yr
            this.calcchainlighting(activeobj, xr, yr, magicuse)
            lastChain = activeobj
            break
          case "knightmark":
            set_cursor(6)
            if (xr + yr * defxn != lastshad) {
              if (lastshad > 0) {
                setshad(0, 0, 0, 0, false)
              }
            }
            ok = false
            var len = this.obj_array.length
            for (var k1 = 0; k1 < len; k1++) {
              i = this.obj_array[k1]
              if (
                !this.obj[i].warmachine &&
                !this.obj[i].hero &&
                i == mapobj[xr + yr * defxn] &&
                this.obj[i].owner == this.obj[activeobj].owner &&
                this.obj[i].nownumber > 0 &&
                !magic[i]["sum"]
              ) {
                ok = true
                break
              }
            }
            if (!ok) {
              res = 0
              break
            }
            lastshad = xr + yr * defxn
            setshad(0, 0, 0, 0, true)
            res = "fast"
            magicx = xr
            magicy = yr
            break
          case "dispel":
            set_cursor(6)
            if (xr + yr * defxn != lastshad) {
              if (lastshad > 0) {
                setshad(0, 0, 0, 0, false)
              }
            }
            ok = false
            var len = this.obj_array.length
            for (var k1 = 0; k1 < len; k1++) {
              i = this.obj_array[k1]
              if (
                i == mapobj[xr + yr * defxn] &&
                this.obj[i].nownumber > 0 &&
                !this.obj[i].hero
              ) {
                ok = true
                break
              }
            }
            if (!ok) {
              res = 0
              break
            }
            lastshad = xr + yr * defxn
            setshad(0, 0, 0, 0, true)
            res = "fast"
            magicx = xr
            magicy = yr
            break
          case "mfast":
            set_cursor(6)
            var p = 2
            if (xr + yr * defxn != lastshad) {
              if (lastshad > 0) {
                setshad(-1, -1, p, p, false)
              }
            }
            if (magicuse == "mfast") {
              this.reset_temp_magic()
              this.showatb()
            }
            if (xr > 0 && xr <= defxn - 2 && yr > 0 && yr <= defyn) {
            } else {
              return 0
            }
            lastshad = xr + yr * defxn
            setshad(-1, -1, p, p, true)
            if (magicuse == "mfast") {
              this.reset_temp_magic()
              for (var xrr = xr - 1; xrr <= xr + p; xrr++)
                for (var yrr = yr - 1; yrr <= yr + p; yrr++) {
                  var i = mapobj[xrr + yrr * defxn]
                  if (
                    i > 0 &&
                    i < 1000 &&
                    !this.obj[i].warmachine &&
                    !this.obj[i].immunity &&
                    !this.obj[i].enchantedarmor &&
                    !this.obj[i].hero &&
                    this.obj[i].side == this.obj[activeobj].getside() &&
                    this.obj[i].nownumber > 0
                  ) {
                    setn_temp_magic(i, "fst")
                  }
                }
              this.showatb()
            }
            res = "mfast"
            magicx = xr
            magicy = yr
            break
          case "mslow":
            set_cursor(6)
            var p = 2
            if (xr + yr * defxn != lastshad) {
              if (lastshad > 0) {
                setshad(-2, -2, p, p, false)
              }
            }
            if (magicuse == "mslow") {
              this.reset_temp_magic()
              this.showatb()
            }
            if (xr > 0 && xr <= defxn - 2 && yr > 0 && yr <= defyn) {
            } else {
              return 0
            }
            lastshad = xr + yr * defxn
            setshad(-2, -2, p, p, true)
            if (magicuse == "mslow") {
              this.reset_temp_magic()
              for (var xrr = xr - 2; xrr <= xr + p; xrr++)
                for (var yrr = yr - 2; yrr <= yr + p; yrr++) {
                  var i = mapobj[xrr + yrr * defxn]
                  if (
                    i > 0 &&
                    !this.obj[i].warmachine &&
                    !this.obj[i].islow &&
                    !this.obj[i].immunity &&
                    !this.obj[i].absolutepurity &&
                    !this.obj[i].enchantedarmor &&
                    !this.obj[i].hero &&
                    this.obj[i].side != this.obj[activeobj].getside() &&
                    this.obj[i].nownumber > 0
                  ) {
                    setn_temp_magic(i, "slw")
                  }
                }
              this.showatb()
            }
            res = "mslow"
            magicx = xr
            magicy = yr
            break
          case "mpoison":
            set_cursor(6)
            var p = 1
            if (xr + yr * defxn != lastshad) {
              if (lastshad > 0) {
                setshad(-1, -1, p, p, false)
              }
            }
            if (xr > 0 && xr <= defxn - 2 && yr > 0 && yr <= defyn) {
            } else {
              return 0
            }
            lastshad = xr + yr * defxn
            setshad(-1, -1, p, p, true)
            res = "mfast"
            magicx = xr
            magicy = yr
            this.calcmagic(activeobj, xr, yr, magicuse)
            break
          case "phantom_forces":
            set_cursor(6)
            if (xr + yr * defxn != lastshad) {
              if (lastshad > 0) {
                setshad(0, 0, 0, 0, false)
              }
            }
            ok = false
            var len = this.obj_array.length
            for (var k1 = 0; k1 < len; k1++) {
              i = this.obj_array[k1]
              if (
                !this.obj[i].hero &&
                !this.obj[i].warmachine &&
                i == mapobj[xr + yr * defxn] &&
                this.obj[i].owner == this.obj[activeobj].owner &&
                this.obj[i].nownumber > 0 &&
                !magic[i]["sum"] &&
                !magic[i]["phm"] &&
                !magic[i]["whp"] &&
                this.obj[i].level <=
                  this.obj[activeobj]["phantom_forceseffmain"]
              ) {
                j = i
                ok = true
                break
              }
            }
            if (!ok) {
              res = 0
              break
            }
            xo = this.obj[j].x
            yo = this.obj[j].y
            b = 0
            var bigx = this.obj[j]["big"]
            var bigy = this.obj[j]["big"]
            if (this.obj[j]["bigx"]) bigx = 1
            if (this.obj[j]["bigy"]) bigy = 1
            ok = false
            i = activeobj
            setmap(this.obj[i].x, this.obj[i].y, 210, i)
            if (this.obj[i].big) {
              setmap(this.obj[i].x, this.obj[i].y + 1, 210, i)
              setmap(this.obj[i].x + 1, this.obj[i].y + 1, 210, i)
              setmap(this.obj[i].x + 1, this.obj[i].y, 210, i)
            }
            if (this.obj[i].bigx) {
              setmap(this.obj[i].x + 1, this.obj[i].y, 210, i)
            }
            if (this.obj[i].bigy) {
              setmap(this.obj[i].x, this.obj[i].y + 1, 210, i)
            }
            for (x = xo - 1 - bigx; x <= xo + 1 + bigx; x++) {
              for (y = yo - 1 - bigy; y <= yo + 1 + bigy; y++) {
                ok2 = true
                for (xz = x; xz <= x + bigx; xz++) {
                  for (yz = y; yz <= y + bigy; yz++) {
                    if (
                      xz < 1 ||
                      yz < 1 ||
                      yz > defyn ||
                      xz > defxn - 2 ||
                      getmap(xz, yz) == 210 ||
                      getmap(xz, yz) == 211
                    ) {
                      ok2 = false
                    }
                  }
                }
                if (ok2) {
                  ok = true
                }
              }
            }
            i = activeobj
            setmap(this.obj[i].x, this.obj[i].y, 0, i)
            if (this.obj[i].big) {
              setmap(this.obj[i].x, this.obj[i].y + 1, 0, i)
              setmap(this.obj[i].x + 1, this.obj[i].y + 1, 0, i)
              setmap(this.obj[i].x + 1, this.obj[i].y, 0, i)
            }
            if (this.obj[i].bigx) {
              setmap(this.obj[i].x + 1, this.obj[i].y, 0, i)
            }
            if (this.obj[i].bigy) {
              setmap(this.obj[i].x, this.obj[i].y + 1, 0, i)
            }
            if (!ok) {
              res = 0
              break
            }
            lastshad = xr + yr * defxn
            setshad(0, 0, 0, 0, true)
            res = "phantom_forces"
            magicx = xr
            magicy = yr
            break
          case "bless":
            set_cursor(6)
            if (xr + yr * defxn != lastshad) {
              if (lastshad > 0) {
                setshad(0, 0, 0, 0, false)
              }
            }
            ok = false
            var len = this.obj_array.length
            for (var k1 = 0; k1 < len; k1++) {
              i = this.obj_array[k1]
              if (
                !this.obj[i].hero &&
                !this.obj[i].warmachine &&
                i == mapobj[xr + yr * defxn] &&
                this.obj[i].side == this.obj[activeobj].getside() &&
                this.obj[i].nownumber > 0
              ) {
                ok = true
                break
              }
            }
            if (!ok) {
              res = 0
              break
            }
            lastshad = xr + yr * defxn
            setshad(0, 0, 0, 0, true)
            res = "bless"
            magicx = xr
            magicy = yr
            break
          case "divine_guidance":
            set_cursor(6)
            if (xr + yr * defxn != lastshad) {
              if (lastshad > 0) {
                setshad(0, 0, 0, 0, false)
              }
            }
            ok = false
            var len = this.obj_array.length
            for (var k1 = 0; k1 < len; k1++) {
              i = this.obj_array[k1]
              if (
                !this.obj[i].hero &&
                !this.obj[i].warmachine &&
                i == mapobj[xr + yr * defxn] &&
                this.obj[i].side == this.obj[activeobj].getside() &&
                this.obj[i].nownumber > 0
              ) {
                ok = true
                objset = i
                break
              }
            }
            if (!ok) {
              res = 0
              this.reset_temp_magic()
              this.showatb()
              break
            }
            lastshad = xr + yr * defxn
            setshad(0, 0, 0, 0, true)
            res = "divine_guidance"
            magicx = xr
            magicy = yr
            this.reset_temp_magic()
            var init = this.obj[activeobj]["divine_guidanceeffmain"]
            var init = 33
            var j = mapobj[yr * defxn + xr]
            if (
              this.obj[j]["nowinit"] - init <
              this.obj[activeobj]["nowinit"]
            ) {
              init = Math.floor(
                this.obj[j]["nowinit"] - this.obj[activeobj]["nowinit"]
              )
            }
            this.obj[j]["reset_init"] = -init
            this.showatb()
            break
          case "stoneskin":
            set_cursor(6)
            if (xr + yr * defxn != lastshad) {
              if (lastshad > 0) {
                setshad(0, 0, 0, 0, false)
              }
            }
            ok = false
            var len = this.obj_array.length
            for (var k1 = 0; k1 < len; k1++) {
              i = this.obj_array[k1]
              if (
                !this.obj[i].warmachine &&
                !this.obj[i].hero &&
                i == mapobj[xr + yr * defxn] &&
                this.obj[i].side == this.obj[activeobj].getside() &&
                this.obj[i].nownumber > 0
              ) {
                ok = true
                break
              }
            }
            if (!ok) {
              res = 0
              break
            }
            lastshad = xr + yr * defxn
            setshad(0, 0, 0, 0, true)
            res = "stoneskin"
            magicx = xr
            magicy = yr
            break
          case "blind":
            set_cursor(6)
            if (xr + yr * defxn != lastshad) {
              if (lastshad > 0) {
                setshad(0, 0, 0, 0, false)
              }
            }
            this.reset_temp_magic()
            this.showatb()
            if (getmap(xr, yr) != 210) {
              res = 0
              break
            }
            ok = true
            var len = this.obj_array.length
            for (var k1 = 0; k1 < len; k1++) {
              i = this.obj_array[k1]
              if (
                (this.obj[i].hero ||
                  this.obj[i].warmachine ||
                  !this.obj[i].alive ||
                  this.obj[i].iblind ||
                  this.obj[i].imind ||
                  this.obj[i].twistedmind ||
                  (magic[i]["wfr"] && magic[i]["wfr"]["effect"] == 1) ||
                  this.obj[i].absolutepurity ||
                  this.obj[i].immunity ||
                  this.obj[i].enchantedarmor) &&
                i == mapobj[xr + yr * defxn] &&
                this.obj[i].nownumber > 0
              ) {
                ok = false
                break
              }
            }
            if (
              ok &&
              btype == _PVP_DIAGONAL_EVENT &&
              checkwall2(
                this.obj[activeobj]["x"],
                this.obj[activeobj]["y"],
                xr,
                yr,
                activeobj
              )
            ) {
              ok = false
              break
            }
            if (!ok) {
              res = 0
              break
            }
            this.reset_temp_magic()
            var uo = mapobj[lastshad]
            setn_temp_magic(uo, "bld")
            this.showatb()
            lastshad = xr + yr * defxn
            setshad(0, 0, 0, 0, true)
            res = "blind"
            magicx = xr
            magicy = yr
            break
          case "seduction":
            set_cursor(6)
            if (xr + yr * defxn != lastshad) {
              if (lastshad > 0) {
                setshad(0, 0, 0, 0, false)
              }
            }
            if (getmap(xr, yr) != 210) {
              res = 0
              break
            }
            ok = true
            if (
              (this.obj[mapobj[yr * defxn + xr]].hero ||
                this.obj[mapobj[yr * defxn + xr]].immunetohypnos ||
                this.obj[mapobj[yr * defxn + xr]].immunity ||
                this.obj[mapobj[yr * defxn + xr]].warmachine ||
                !this.obj[mapobj[yr * defxn + xr]].alive ||
                this.obj[mapobj[yr * defxn + xr]].imind ||
                this.obj[mapobj[yr * defxn + xr]].twistedmind ||
                (magic[mapobj[yr * defxn + xr]]["wfr"] &&
                  magic[mapobj[yr * defxn + xr]]["wfr"]["effect"] == 1) ||
                this.obj[mapobj[yr * defxn + xr]].absolutepurity) &&
              this.obj[mapobj[yr * defxn + xr]].nownumber > 0
            ) {
              ok = false
              break
            }
            var s = "seduction"
            hpa =
              ((this.obj[activeobj].nownumber - 1) *
                this.obj[activeobj].maxhealth +
                this.obj[activeobj].nowhealth) /
              ((this.obj[mapobj[yr * defxn + xr]].nownumber - 1) *
                this.obj[mapobj[yr * defxn + xr]].maxhealth +
                this.obj[mapobj[yr * defxn + xr]].nowhealth)
            if (
              hpa <= 0.25 ||
              Math.floor((2 + Math.log(hpa) / Math.log(2)) * 100) <= 0
            ) {
              ok = false
              break
            }
            if (
              ok &&
              btype == _PVP_DIAGONAL_EVENT &&
              checkwall2(
                this.obj[activeobj]["x"],
                this.obj[activeobj]["y"],
                xr,
                yr,
                activeobj
              )
            ) {
              ok = false
              break
            }
            if (!ok) {
              res = 0
              break
            }
            lastshad = xr + yr * defxn
            setshad(0, 0, 0, 0, true)
            res = "seduction"
            magicx = xr
            magicy = yr
            showuron(
              1,
              Math.min((2 + Math.log(hpa) / Math.log(2)).toFixed(2), 4)
            )
            break
          case "randl":
            set_cursor(6)
            if (xr + yr * defxn != lastshad) {
              if (lastshad > 0) {
                setshad(0, 0, 0, 0, false)
              }
            }
            ok = false
            var len = this.obj_array.length
            for (var k1 = 0; k1 < len; k1++) {
              i = this.obj_array[k1]
              if (
                !this.obj[i].hero &&
                !this.obj[i].warmachine &&
                !this.obj[i].rock &&
                i == mapobj[xr + yr * defxn] &&
                this.obj[i].nownumber > 0
              ) {
                ok = true
                break
              }
            }
            if (!ok) {
              res = 0
              break
            }
            lastshad = xr + yr * defxn
            setshad(0, 0, 0, 0, true)
            res = "randl"
            magicx = xr
            magicy = yr
            break
          case "flamestrike":
            set_cursor(6)
            if (xr + yr * defxn != lastshad) {
              if (lastshad > 0) {
                setshad(0, 0, 0, 0, false)
              }
            }
            if (getmap(xr, yr) != 210) {
              res = 0
              break
            }
            ok = true
            var len = this.obj_array.length
            for (var k1 = 0; k1 < len; k1++) {
              i = this.obj_array[k1]
              if (this.obj[i].hero && i == mapobj[xr + yr * defxn]) {
                ok = false
                break
              }
            }
            if (!ok) {
              res = 0
              break
            }
            lastshad = xr + yr * defxn
            setshad(0, 0, 0, 0, true)
            res = "stormbolt"
            magicx = xr
            magicy = yr
            this.calcflamestrike(activeobj, xr, yr, "flamestrike", 1.2)
            break
          case "stormbolt":
            set_cursor(6)
            if (xr + yr * defxn != lastshad) {
              if (lastshad > 0) {
                setshad(0, 0, 0, 0, false)
              }
            }
            if (getmap(xr, yr) != 210) {
              res = 0
              break
            }
            ok = true
            var len = this.obj_array.length
            for (var k1 = 0; k1 < len; k1++) {
              i = this.obj_array[k1]
              if (this.obj[i].hero && i == mapobj[xr + yr * defxn]) {
                ok = false
                break
              }
            }
            if (!ok) {
              res = 0
              break
            }
            lastshad = xr + yr * defxn
            setshad(0, 0, 0, 0, true)
            res = "stormbolt"
            magicx = xr
            magicy = yr
            this.calcflamestrike(activeobj, xr, yr, "stormbolt", 0.5)
            break
          case "randd":
            set_cursor(6)
            if (xr + yr * defxn != lastshad) {
              if (lastshad > 0) {
                setshad(0, 0, 0, 0, false)
              }
            }
            if (getmap(xr, yr) != 210) {
              res = 0
              break
            }
            ok = true
            var len = this.obj_array.length
            for (var k1 = 0; k1 < len; k1++) {
              i = this.obj_array[k1]
              if (
                (this.obj[i].hero ||
                  this.obj[i].warmachine ||
                  this.obj[i].absolutepurity) &&
                i == mapobj[xr + yr * defxn] &&
                this.obj[i].nownumber > 0
              ) {
                ok = false
                break
              }
            }
            if (!ok) {
              res = 0
              break
            }
            lastshad = xr + yr * defxn
            setshad(0, 0, 0, 0, true)
            res = "randd"
            magicx = xr
            magicy = yr
            break
          case "poison":
            set_cursor(6)
            if (xr + yr * defxn != lastshad) {
              if (lastshad > 0) {
                setshad(0, 0, 0, 0, false)
              }
            }
            if (getmap(xr, yr) != 210) {
              res = 0
              break
            }
            ok = true
            var len = this.obj_array.length
            for (var k1 = 0; k1 < len; k1++) {
              i = this.obj_array[k1]
              if (
                i == mapobj[xr + yr * defxn] &&
                this.obj[i].absolutepurity &&
                this.obj[i].nownumber > 0
              ) {
                ok = false
                break
              }
            }
            if (!ok) {
              res = 0
              break
            }
            lastshad = xr + yr * defxn
            setshad(0, 0, 0, 0, true)
            res = "poison"
            magicx = xr
            magicy = yr
            this.calcmagic(activeobj, xr, yr, magicuse)
            break
          case "magicarrow":
            set_cursor(6)
            if (xr + yr * defxn != lastshad) {
              if (lastshad > 0) {
                setshad(0, 0, 0, 0, false)
              }
            }
            if (getmap(xr, yr) != 210) {
              res = 0
              break
            }
            lastshad = xr + yr * defxn
            setshad(0, 0, 0, 0, true)
            res = "magicarrow"
            magicx = xr
            magicy = yr
            this.calcmagic(activeobj, xr, yr, magicuse)
            break
          case "firearrow":
            set_cursor(6)
            if (xr + yr * defxn != lastshad) {
              if (lastshad > 0) {
                setshad(0, 0, 0, 0, false)
              }
            }
            if (getmap(xr, yr) != 210) {
              res = 0
              break
            }
            lastshad = xr + yr * defxn
            setshad(0, 0, 0, 0, true)
            res = "firearrow"
            magicx = xr
            magicy = yr
            this.calcmagic(activeobj, xr, yr, magicuse)
            break
          case "icebolt":
            set_cursor(6)
            if (xr + yr * defxn != lastshad) {
              if (lastshad > 0) {
                setshad(0, 0, 0, 0, false)
              }
            }
            if (getmap(xr, yr) != 210) {
              res = 0
              break
            }
            lastshad = xr + yr * defxn
            setshad(0, 0, 0, 0, true)
            res = "icebolt"
            magicx = xr
            magicy = yr
            this.calcmagic(activeobj, xr, yr, magicuse)
            break
          case "dray":
            set_cursor(6)
            if (xr + yr * defxn != lastshad) {
              if (lastshad > 0) {
                setshad(0, 0, 0, 0, false)
              }
            }
            if (getmap(xr, yr) != 210) {
              res = 0
              break
            }
            ok = true
            var len = this.obj_array.length
            for (var k1 = 0; k1 < len; k1++) {
              i = this.obj_array[k1]
              if (
                (((this.obj[i].hero ||
                  this.obj[i].warmachine ||
                  this.obj[i].absolutepurity) &&
                  this.obj[i].nownumber > 0) ||
                  (mapobj[yr * defxn + xr] > 0 &&
                    (this.obj[mapobj[yr * defxn + xr]].armoured ||
                      this.obj[mapobj[yr * defxn + xr]].organicarmor))) &&
                i == mapobj[xr + yr * defxn]
              ) {
                ok = false
                break
              }
            }
            if (!ok) {
              res = 0
              break
            }
            lastshad = xr + yr * defxn
            setshad(0, 0, 0, 0, true)
            res = "dray"
            magicx = xr
            magicy = yr
            break
          case "raisedead":
            set_cursor(6)
            if (xr + yr * defxn != lastshad) {
              if (lastshad > 0) {
                setshad(0, 0, 0, 0, false)
              }
            }
            ok = false
            big = false
            bigf = false
            var len = this.obj_array.length
            for (var k1 = 0; k1 < len; k1++) {
              i = this.obj_array[k1]
              if (
                (this.obj[i].undead || this.obj[i].alive) &&
                !magic[i]["phm"] &&
                !magic[i]["sum"] &&
                xr >= this.obj[i].x &&
                xr <= this.obj[i].x + this.obj[i].big &&
                yr >= this.obj[i].y &&
                yr <= this.obj[i].y + this.obj[i].big &&
                this.obj[i].owner == this.obj[activeobj].owner &&
                !this.obj[i].hero &&
                (this.obj[i].nownumber < this.obj[i].maxnumber ||
                  this.obj[i].nowhealth < this.obj[i].maxhealth) &&
                getmap(xr, yr) != 210 &&
                (mapobj[yr * defxn + xr] == undefined ||
                  mapobj[yr * defxn + xr] <= 0 ||
                  this.obj[mapobj[yr * defxn + xr]].owner ==
                    this.obj[activeobj].owner)
              ) {
                big = false
                if (this.obj[i].big && this.obj[i].nownumber == 0) {
                  big = true
                }
                bigf = false
                if (this.obj[i].nownumber) {
                  bigf = true
                }
                ok2 = true
                if (big && !bigf) {
                  var x1 = this.obj[i].x
                  var y1 = this.obj[i].y
                  if (
                    (mapobj[x1 + y1 * defxn] > 0 &&
                      mapobj[x1 + y1 * defxn] != i) ||
                    (mapobj[x1 + y1 * defxn + 1] > 0 &&
                      mapobj[x1 + y1 * defxn + 1] != i) ||
                    (mapobj[x1 + (y1 + 1) * defxn + 1] > 0 &&
                      mapobj[x1 + (y1 + 1) * defxn + 1] != i) ||
                    (mapobj[x1 + (y1 + 1) * defxn] > 0 &&
                      mapobj[x1 + (y1 + 1) * defxn] != i)
                  ) {
                    ok2 = false
                  }
                }
                if (this.obj[i].bigx && this.obj[i].nownumber == 0 && !bigf) {
                  if (getmap(xr + 1, yr) == 211 || getmap(xr + 1, yr) == 210) {
                    ok2 = false
                  }
                }
                if (this.obj[i].bigy && this.obj[i].nownumber == 0 && !bigf) {
                  if (getmap(xr, yr + 1) == 211 || getmap(xr, yr + 1) == 210) {
                    ok2 = false
                  }
                }
                if (!ok) {
                  ok = ok2
                }
                big = false
                bigf = false
              }
            }
            if (!ok) {
              if (xr + yr * defxn != lastshad) this.showatb()
              res = 0
              break
            }
            lastshad = xr + yr * defxn
            this.show_atb_raisedead(xr, yr)
            setshad(0, 0, 0, 0, true)
            res = "raisedead"
            magicx = xr
            magicy = yr
            break
          case "heal":
            set_cursor(6)
            if (xr + yr * defxn != lastshad) {
              if (lastshad > 0) {
                setshad(0, 0, 0, 0, false)
              }
            }
            ok = false
            big = false
            bigf = false
            var len = this.obj_array.length
            for (var k1 = 0; k1 < len; k1++) {
              i = this.obj_array[k1]
              if (
                this.obj[i].alive &&
                !magic[i]["phm"] &&
                i == mapobj[xr + yr * defxn] &&
                this.obj[i].owner == this.obj[activeobj].owner &&
                !this.obj[i].hero &&
                this.obj[i].nownumber > 0 &&
                (this.obj[i].nownumber < this.obj[i].maxnumber ||
                  this.obj[i].nowhealth < this.obj[i].maxhealth) &&
                getmap(xr, yr) != 210 &&
                (mapobj[yr * defxn + xr] == undefined ||
                  mapobj[yr * defxn + xr] <= 0 ||
                  this.obj[mapobj[yr * defxn + xr]].owner ==
                    this.obj[activeobj].owner)
              ) {
                if (this.obj[i].big && this.obj[i].nownumber == 0) {
                  big = true
                }
                if (this.obj[i].nownumber) {
                  bigf = true
                }
                ok2 = true
                if (big && !bigf) {
                  if (
                    getmap(xr + 1, yr + 1) == 211 ||
                    getmap(xr + 1, yr + 1) == 210 ||
                    getmap(xr, yr + 1) == 211 ||
                    getmap(xr, yr + 1) == 210 ||
                    getmap(xr + 1, yr) == 211 ||
                    getmap(xr + 1, yr) == 210
                  ) {
                    ok2 = false
                  }
                }
                if (this.obj[i].bigx && this.obj[i].nownumber == 0 && !bigf) {
                  if (getmap(xr + 1, yr) == 211 || getmap(xr + 1, yr) == 210) {
                    ok2 = false
                  }
                }
                if (this.obj[i].bigy && this.obj[i].nownumber == 0 && !bigf) {
                  if (getmap(xr, yr + 1) == 211 || getmap(xr, yr + 1) == 210) {
                    ok2 = false
                  }
                }
                if (!ok) {
                  ok = ok2
                }
                big = false
                bigf = false
              }
            }
            if (!ok) {
              res = 0
              break
            }
            lastshad = xr + yr * defxn
            setshad(0, 0, 0, 0, true)
            res = "heal"
            magicx = xr
            magicy = yr
            break
          case "summonpit":
            set_cursor(6)
            if (xr + yr * defxn != lastshad) {
              if (lastshad > 0) {
                setshad(0, 0, 0, 0, false)
              }
            }
            ok = false
            big = false
            bigf = false
            var len = this.obj_array.length
            for (var k1 = 0; k1 < len; k1++) {
              i = this.obj_array[k1]
              if (
                this.obj[i].alive &&
                !magic[i]["phm"] &&
                !magic[i]["sum"] &&
                this.obj[i].x == xr &&
                this.obj[i].y == yr &&
                this.obj[i].owner == this.obj[activeobj].owner &&
                !this.obj[i].hero &&
                this.obj[i].nownumber <= 0 &&
                getmap(xr, yr) != 210 &&
                (mapobj[yr * defxn + xr] == undefined ||
                  mapobj[yr * defxn + xr] <= 0 ||
                  this.obj[mapobj[yr * defxn + xr]].owner ==
                    this.obj[activeobj].owner)
              ) {
                if (this.obj[i].big && this.obj[i].nownumber == 0) {
                  big = true
                }
                ok2 = true
                if (big && !bigf) {
                  if (
                    getmap(xr + 1, yr + 1) == 211 ||
                    getmap(xr + 1, yr + 1) == 210 ||
                    getmap(xr, yr + 1) == 211 ||
                    getmap(xr, yr + 1) == 210 ||
                    getmap(xr + 1, yr) == 211 ||
                    getmap(xr + 1, yr) == 210
                  ) {
                    ok2 = false
                  }
                }
                if (this.obj[i].bigx && this.obj[i].nownumber == 0 && !bigf) {
                  if (getmap(xr + 1, yr) == 211 || getmap(xr + 1, yr) == 210) {
                    ok2 = false
                  }
                }
                if (this.obj[i].bigy && this.obj[i].nownumber == 0 && !bigf) {
                  if (getmap(xr, yr + 1) == 211 || getmap(xr, yr + 1) == 210) {
                    ok2 = false
                  }
                }
                if (
                  Math.min(this.obj[i]["maxhealth"], 120) *
                    this.obj[i]["maxnumber"] <
                  120
                )
                  ok2 = false
                if (!ok) {
                  ok = ok2
                }
                big = false
                bigf = false
              }
            }
            if (!ok) {
              res = 0
              break
            }
            lastshad = xr + yr * defxn
            setshad(0, 0, 0, 0, true)
            res = "summonpit"
            magicx = xr
            magicy = yr
            break
          case "gating":
            set_cursor(6)
            var bigx = this.obj[activeobj]["big"]
            var bigy = this.obj[activeobj]["big"]
            if (this.obj[activeobj]["bigx"]) bigx = 1
            if (this.obj[activeobj]["bigy"]) bigy = 1
            if (xr + yr * defxn != lastshad) {
              if (lastshad > 0) {
                setshad(0, 0, bigx, bigy, false)
              }
            }
            ok = false
            ok = true
            for (x = 0; x <= bigx; x++) {
              for (y = 0; y <= bigy; y++) {
                if (mapg[xr + x + (yr + y) * defxn] != 0) {
                  ok = false
                }
              }
            }
            if (!ok) {
              res = 0
              break
            }
            lastshad = xr + yr * defxn
            setshad(0, 0, bigx, bigy, true)
            res = "gating"
            magicx = xr
            magicy = yr
            break
          case "repair":
            set_cursor(6)
            if (xr + yr * defxn != lastshad) {
              if (lastshad > 0) {
                setshad(0, 0, 0, 0, false)
              }
            }
            ok = false
            var len = this.obj_array.length
            for (var k1 = 0; k1 < len; k1++) {
              i = this.obj_array[k1]
              if (
                this.obj[i].mechanical &&
                this.obj[i].x == xr &&
                this.obj[i].y == yr &&
                this.obj[i].side == this.obj[activeobj].getside() &&
                !this.obj[i].hero &&
                (this.obj[i].nownumber < this.obj[i].maxnumber ||
                  this.obj[i].nowhealth < this.obj[i].maxhealth) &&
                getmap(xr, yr) != 210 &&
                ((this.obj[i].nownumber == 0 && getmap(xr, yr) != 211) ||
                  (this.obj[i].nownumber > 0 && getmap(xr, yr) == 211))
              ) {
                ok = true
              }
            }
            if (!ok) {
              res = 0
              break
            }
            lastshad = xr + yr * defxn
            setshad(0, 0, 0, 0, true)
            res = "repair"
            magicx = xr
            magicy = yr
            break
          case "firstaid":
            set_cursor(6)
            if (xr + yr * defxn != lastshad) {
              if (lastshad > 0) {
                setshad(0, 0, 0, 0, false)
              }
            }
            ok = false
            var len = this.obj_array.length
            for (var k1 = 0; k1 < len; k1++) {
              i = this.obj_array[k1]
              if (
                !this.obj[i].warmachine &&
                i == mapobj[xr + yr * defxn] &&
                this.obj[i].owner == this.obj[activeobj].owner &&
                !this.obj[i].hero &&
                (this.obj[i].nownumber < this.obj[i].maxnumber ||
                  this.obj[i].nowhealth < this.obj[i].maxhealth) &&
                getmap(xr, yr) != 210 &&
                this.obj[i].nownumber > 0 &&
                getmap(xr, yr) == 211
              ) {
                ok = true
              }
            }
            if (!ok) {
              res = 0
              break
            }
            lastshad = xr + yr * defxn
            setshad(0, 0, 0, 0, true)
            res = "firstaid"
            magicx = xr
            magicy = yr
            break
          case "teleport":
            if (carryo == -1) {
              var s = "teleport"
              if (xr <= 0 || yr <= 0 || xr > defxn - 2 || yr > defyn) {
                res = 0
                break
              }
              var len = this.obj_array.length
              for (var k1 = 0; k1 < len; k1++) {
                i = this.obj_array[k1]
                if (
                  !this.obj[i].warmachine &&
                  !magic[i]["ent"] &&
                  i == mapobj[xr + yr * defxn] &&
                  !this.obj[i].hero &&
                  this.obj[i]["nownumber"] > 0 &&
                  this.obj[i].side == this.obj[activeobj].getside() &&
                  Math.floor(
                    (10 *
                      (this.obj[activeobj][s + "effmain"] +
                        this.obj[activeobj].maxnumber *
                          this.obj[activeobj][s + "effmult"])) /
                      ((this.obj[i].nownumber - 1) * this.obj[i].maxhealth +
                        this.obj[i].nowhealth)
                  ) > 0
                ) {
                  set_cursor(6)
                  res = "teleport"
                }
              }
            } else {
              var b = 0
              if (carryo > 0) {
                if (this.obj[carryo].big) {
                  setmap(this.obj[carryo].x + 1, this.obj[carryo].y + 1, 0)
                  setmap(this.obj[carryo].x + 1, this.obj[carryo].y, 0)
                  setmap(this.obj[carryo].x, this.obj[carryo].y + 1, 0)
                }
                if (this.obj[carryo].bigx) {
                  setmap(this.obj[carryo].x + 1, this.obj[carryo].y, 0)
                }
                if (this.obj[carryo].bigy) {
                  setmap(this.obj[carryo].x, this.obj[carryo].y + 1, 0)
                }
              }
              var bigx = this.obj[carryo]["big"]
              var bigy = this.obj[carryo]["big"]
              if (this.obj[carryo]["bigx"]) bigx = 1
              if (this.obj[carryo]["bigy"]) bigy = 1
              ok = true
              for (var xrr = xr; xrr <= xr + bigx; xrr++) {
                for (var yrr = yr; yrr <= yr + bigy; yrr++) {
                  if (
                    carryo > 0 &&
                    (xr != this.obj[carryo].x || yr != this.obj[carryo].y) &&
                    getmap(xrr, yrr) != 200 &&
                    getmap(xrr, yrr) != 210 &&
                    (getmap(xrr, yrr) != 211 ||
                      mapobj[xrr + yrr * defxn] == carryo) &&
                    xr > 0 &&
                    yr > 0 &&
                    xr <= defxn - 2 - bigx &&
                    yr <= defyn - bigy
                  ) {
                  } else {
                    ok = false
                    break
                  }
                }
              }
              var s = "teleport"
              if (carryo <= 0) {
                var r = 0
                var r1 = 1
              } else {
                var r = Math.floor(
                  (10 *
                    (this.obj[activeobj][s + "effmain"] +
                      (this.getspellpower(activeobj, s) +
                        isperk(activeobj, 89) * 3) *
                        this.obj[activeobj][s + "effmult"])) /
                    ((this.obj[carryo].nownumber - 1) *
                      this.obj[carryo].maxhealth +
                      this.obj[carryo].nowhealth)
                )
                var r1 =
                  (xr - this.obj[carryo].x) * (xr - this.obj[carryo].x) +
                  (yr - this.obj[carryo].y) * (yr - this.obj[carryo].y)
              }
              if (r1 > r * r) {
                ok = false
              }
              if (ok) {
                set_cursor(6)
                if (xr + yr * defxn != lastshad) {
                  if (lastshad > 0) {
                    setshad(0, 0, bigx, bigy, false)
                  }
                  lastshad = xr + yr * defxn
                  setshad(0, 0, bigx, bigy, true)
                }
                magicx = xr
                magicy = yr
                res = "teleport"
              } else {
                res = 0
                if (lastshad > 0) {
                  setshad(0, 0, bigx, bigy, false)
                }
                lastshad = -1
              }
              var lastshadt = lastshad
              if (carryo > 0) {
                lastshad = this.obj[carryo].x + this.obj[carryo].y * defxn
                setshad(0, 0, bigx, bigy, true)
                lastshad = lastshadt
                if (bigx == 1 && bigy == 1) {
                  setmap(this.obj[carryo].x + 1, this.obj[carryo].y + 1, 211)
                  setmap(this.obj[carryo].x + 1, this.obj[carryo].y, 211)
                  setmap(this.obj[carryo].x, this.obj[carryo].y + 1, 211)
                }
                if (bigx == 1) {
                  setmap(this.obj[carryo].x + 1, this.obj[carryo].y, 211)
                }
                if (bigy == 1) {
                  setmap(this.obj[carryo].x, this.obj[carryo].y + 1, 211)
                }
              }
            }
            break
          case "carry":
            spd = Math.max(
              0,
              Math.round(
                (this.obj[activeobj].speed +
                  this.obj[activeobj]["ragespeed"] +
                  this.obj[activeobj]["speedaddon"]) *
                  this.obj[activeobj].speedmodifier
              )
            )
            if (magic[activeobj]["ent"]) {
              spd = 0
            }
            xr1 = xr
            yr1 = yr
            if (xr1 > this.obj[activeobj]["x"]) {
              xr1--
            }
            if (yr1 > this.obj[activeobj]["y"]) {
              yr1--
            }
            if (
              Math.abs(
                Math.abs(this.obj[activeobj]["x"] - xr1) -
                  Math.abs(this.obj[activeobj]["y"] - yr1)
              ) +
                1.5 *
                  (Math.max(
                    Math.abs(this.obj[activeobj]["x"] - xr1),
                    Math.abs(this.obj[activeobj]["y"] - yr1)
                  ) -
                    Math.abs(
                      Math.abs(this.obj[activeobj]["x"] - xr1) -
                        Math.abs(this.obj[activeobj]["y"] - yr1)
                    )) <=
              spd
            ) {
            } else {
              res = 0
              break
            }
            if (carryo == -1) {
              if (xr <= 0 || yr <= 0 || xr > defxn - 2 || yr > defyn) {
                res = 0
                break
              }
              var len = this.obj_array.length
              for (var k1 = 0; k1 < len; k1++) {
                i = this.obj_array[k1]
                if (
                  !this.obj[i].warmachine &&
                  (!magic[i]["inv"] || magic[i]["inv"]["effect"] != 1) &&
                  !magic[i]["ent"] &&
                  i == mapobj[xr + yr * defxn] &&
                  !this.obj[i].big &&
                  !this.obj[i].bigx &&
                  !this.obj[i].bigy &&
                  !this.obj[i].hero &&
                  this.obj[activeobj]["nownumber"] * 2 >=
                    this.obj[i]["nownumber"] &&
                  this.obj[i]["nownumber"] > 0 &&
                  this.obj[i].side == this.obj[activeobj].getside()
                ) {
                  set_cursor(6)
                  res = "carry"
                }
              }
            } else {
              if (
                getmap(xr, yr) != 200 &&
                getmap(xr, yr) != 210 &&
                getmap(xr, yr) != 211
              ) {
                set_cursor(6)
                if (xr + yr * defxn != lastshad) {
                  if (lastshad > 0) {
                    setshad(0, 0, 0, 0, false)
                  }
                  lastshad = xr + yr * defxn
                  setshad(0, 0, 0, 0, true)
                }
                magicx = xr
                magicy = yr
                res = "carry"
              }
            }
            break
          case "fireball":
            set_cursor(6)
            if (xr + yr * defxn != lastshad) {
              if (lastshad > 0) {
                setshad(-1, -1, 1, 1, false)
              }
              if (xr <= 0 || yr <= 0 || xr > defxn - 2 || yr > defyn) {
                res = 0
                break
              }
              lastshad = xr + yr * defxn
              setshad(-1, -1, 1, 1, true)
            }
            magicx = xr
            magicy = yr
            res = "fireball"
            this.calcmagic(activeobj, xr, yr, magicuse)
            break
        }
        if (k == 250) {
          ok = true
          if (
            activeobj > 0 &&
            this.obj[activeobj].x == xr &&
            this.obj[activeobj].y == yr &&
            (!android ||
              !android_submit ||
              this.obj[activeobj].hero ||
              this.obj[activeobj].warmachine)
          ) {
            ok = false
          } else {
            xrr = -1
            yrr = -1
            len = 100
            movex = xr
            movey = yr
            if (activeobj > 0 && this.obj[activeobj].big) {
              if (wmap2[xr + yr * defxn] >= 0 && !this.obj[activeobj].flyer) {
              } else {
                if (this.obj[activeobj].flyer) {
                  i = activeobj
                  setmap(this.obj[i].x, this.obj[i].y, 250)
                  setmap(this.obj[i].x, this.obj[i].y + 1, 250)
                  setmap(this.obj[i].x + 1, this.obj[i].y + 1, 250)
                  setmap(this.obj[i].x + 1, this.obj[i].y, 250)
                }
                for (xk = xr - 1; xk <= xr; xk++) {
                  for (yk = yr - 1; yk <= yr; yk++) {
                    if (wmap2[xk + yk * defxn] >= 0) {
                      if ((xr - xk) * (xr - xk) + (yr - yk) * (yr - yk) < len) {
                        xrr = xk
                        yrr = yk
                        len = (xr - xk) * (xr - xk) + (yr - yk) * (yr - yk)
                      }
                    }
                  }
                }
                if (xrr != -1) {
                  xr = xrr
                  yr = yrr
                  xr_last = xr
                  yr_last = yr
                  movex = xr
                  movey = yr
                  if (
                    this.obj[activeobj].x == xr &&
                    this.obj[activeobj].y == yr &&
                    !android
                  ) {
                    movex = 0
                    movey = 0
                    res = 0
                    ok = false
                  }
                } else {
                  movex = 0
                  movey = 0
                  res = 0
                  ok = false
                }
              }
            }
            if (activeobj > 0 && this.obj[activeobj].bigx && ok) {
              if (wmap2[xr + yr * defxn] >= 0 && !this.obj[activeobj].flyer) {
              } else {
                if (this.obj[activeobj].flyer) {
                  i = activeobj
                  setmap(this.obj[i].x, this.obj[i].y, 250)
                  setmap(this.obj[i].x + 1, this.obj[i].y, 250)
                }
                for (xk = xr - 1; xk <= xr + 1; xk++) {
                  for (yk = yr - 1; yk <= yr + 1; yk++) {
                    if (wmap2[xk + yk * defxn] >= 0) {
                      if ((xr - xk) * (xr - xk) + (yr - yk) * (yr - yk) < len) {
                        if (this.obj[activeobj].flyer) {
                          if (
                            getmap(xk, yk) != 250 ||
                            getmap(xk + 1, yk) != 250
                          ) {
                            continue
                          }
                          xrr = xk
                          yrr = yk
                          len = (xr - xk) * (xr - xk) + (yr - yk) * (yr - yk)
                        }
                      }
                    }
                  }
                }
                if (xrr != -1) {
                  xr = xrr
                  yr = yrr
                  xr_last = xr
                  yr_last = yr
                  movex = xr
                  movey = yr
                  if (
                    this.obj[activeobj].x == xr &&
                    this.obj[activeobj].y == yr
                  ) {
                    movex = 0
                    movey = 0
                    res = 0
                    ok = false
                  }
                } else {
                  movex = 0
                  movey = 0
                  res = 0
                  ok = false
                }
              }
            }
            if (activeobj > 0 && this.obj[activeobj].bigy && ok) {
              if (wmap2[xr + yr * defxn] >= 0 && !this.obj[activeobj].flyer) {
              } else {
                if (this.obj[activeobj].flyer) {
                  i = activeobj
                  setmap(this.obj[i].x, this.obj[i].y, 250)
                  setmap(this.obj[i].x, this.obj[i].y + 1, 250)
                }
                for (xk = xr - 1; xk <= xr + 1; xk++) {
                  for (yk = yr - 1; yk <= yr + 1; yk++) {
                    if (wmap2[xk + yk * defxn] >= 0) {
                      if ((xr - xk) * (xr - xk) + (yr - yk) * (yr - yk) < len) {
                        if (this.obj[activeobj].flyer) {
                          if (
                            getmap(xk, yk) != 250 ||
                            getmap(xk, yk + 1) != 250
                          ) {
                            continue
                          }
                          xrr = xk
                          yrr = yk
                          len = (xr - xk) * (xr - xk) + (yr - yk) * (yr - yk)
                        }
                      }
                    }
                  }
                }
                if (xrr != -1) {
                  xr = xrr
                  yr = yrr
                  xr_last = xr
                  yr_last = yr
                  movex = xr
                  movey = yr
                  if (
                    this.obj[activeobj].x == xr &&
                    this.obj[activeobj].y == yr
                  ) {
                    movex = 0
                    movey = 0
                    res = 0
                    ok = false
                  }
                } else {
                  movex = 0
                  movey = 0
                  res = 0
                  ok = false
                }
              }
            }
          }
          if (ok && activeobj > 0) {
            if (magicuse == "leap" || magicuse == "leap6") {
              res = 0
              ok = false
            }
            if (ok) {
              set_cursor(1)
              xr_go = xr
              yr_go = yr
              if (xr + yr * defxn != lastshad) {
                if (lastshad > 0 && shado[lastshad]) {
                  set_visible(shado[lastshad], 0)
                  if (this.obj[activeobj].big) {
                    if (shado[lastshad + 1 + defxn]) {
                      set_visible(shado[lastshad + 1], 0)
                      set_visible(shado[lastshad + 1 + defxn], 0)
                      set_visible(shado[lastshad + defxn], 0)
                    }
                  }
                  if (this.obj[activeobj].bigx) {
                    set_visible(shado[lastshad + 1], 0)
                  }
                  if (this.obj[activeobj].bigy) {
                    set_visible(shado[lastshad + defxn], 0)
                  }
                }
                lastshad = xr + yr * defxn
                set_visible(shado[xr + yr * defxn], 1)
                if (this.obj[activeobj].big) {
                  set_visible(shado[xr + yr * defxn + 1], 1)
                  set_visible(shado[xr + yr * defxn + 1 + defxn], 1)
                  set_visible(shado[xr + yr * defxn + defxn], 1)
                }
                if (this.obj[activeobj].bigx) {
                  set_visible(shado[xr + yr * defxn + 1], 1)
                }
                if (this.obj[activeobj].bigy) {
                  set_visible(shado[xr + yr * defxn + defxn], 1)
                }
              }
              res = 250
            }
          }
        }
        resa = this.in_mousemove(xr, yr, k, magicuse)
        if (resa["res"] != 0) {
          res = resa["res"]
          magicx = resa["magicx"]
          magicy = resa["magicy"]
        }
        if (k == "frenzy") {
          ok = true
          set_cursor(6)
          if (xr + yr * defxn != lastshad) {
            if (lastshad > 0) {
              setshad(0, 0, 0, 0, false)
            }
          }
          if (getmap(xr, yr) != 210) {
            res = 0
            ok = false
          }
          if (ok) {
            if (
              (this.obj[mapobj[yr * defxn + xr]].hero ||
                this.obj[mapobj[yr * defxn + xr]].warmachine ||
                !this.obj[mapobj[yr * defxn + xr]].alive ||
                this.obj[mapobj[yr * defxn + xr]].imind ||
                this.obj[mapobj[yr * defxn + xr]].twistedmind ||
                (magic[mapobj[yr * defxn + xr]]["wfr"] &&
                  magic[mapobj[yr * defxn + xr]]["wfr"]["effect"] == 1) ||
                this.obj[mapobj[yr * defxn + xr]].absolutepurity ||
                this.obj[mapobj[yr * defxn + xr]].ifrenzy) &&
              this.obj[mapobj[yr * defxn + xr]].nownumber > 0
            ) {
              ok = false
            }
            if (
              ok &&
              btype == _PVP_DIAGONAL_EVENT &&
              checkwall2(
                this.obj[activeobj]["x"],
                this.obj[activeobj]["y"],
                xr,
                yr,
                activeobj
              )
            ) {
              ok = false
            }
            if (ok) {
              var s = "frenzy"
              var addeff = 0
              if (this.obj[activeobj].hero) {
                if (isperk(activeobj, 78)) {
                  addeff += 5
                }
                if (isperk(activeobj, 89)) {
                  addeff += 3
                }
              }
              var th =
                (this.obj[mapobj[yr * defxn + xr]].nownumber - 1) *
                  this.obj[mapobj[yr * defxn + xr]].maxhealth +
                this.obj[mapobj[yr * defxn + xr]].nowhealth
              var pff =
                getimmune2(activeobj, mapobj[yr * defxn + xr]) *
                (this.obj[activeobj][s + "effmain"] +
                  (this.getspellpower(activeobj, magicuse) + addeff) *
                    this.obj[activeobj][s + "effmult"])
              if (th > pff) ok = false
              if (!ok) {
                res = 0
              } else {
                lastshad = xr + yr * defxn
                setshad(0, 0, 0, 0, true)
                res = "frenzy"
                magicx = xr
                magicy = yr
              }
            }
          }
          if (!ok) res = 0
        }
        if (k == "battledive") {
          set_cursor(8)
          ok = true
          if (xr + yr * defxn != lastshad) {
            if (lastshad > 0) {
              setshad(0, 0, 0, 0, false)
            }
            if (xr <= 0 || yr <= 0 || xr > defxn - 2 || yr > defyn) {
              res = 0
              ok = false
            }
            if (ok) {
              lastshad = xr + yr * defxn
              setshad(0, 0, 0, 0, true)
            }
          }
          if (ok) {
            magicx = xr
            magicy = yr
            res = "battledive"
            defender = mapobj[yr * defxn + xr]
            if (defender > 0 && defender < 1000)
              this.attackmonster(activeobj, xr, yr, xr, yr, defender)
          }
        }
        if (k == "circle_of_winter") {
          set_cursor(6)
          ok = true
          if (xr + yr * defxn != lastshad) {
            if (lastshad > 0) {
              setshad(-1, -1, 1, 1, false)
            }
            if (xr <= 0 || yr <= 0 || xr > defxn - 2 || yr > defyn) {
              res = 0
              ok = false
            }
            if (ok) {
              lastshad = xr + yr * defxn
              setshad(-1, -1, 1, 1, true)
              setshad(0, 0, 0, 0, false)
            }
          }
          if (ok) {
            magicx = xr
            magicy = yr
            res = "circle_of_winter"
            this.calcmagic(activeobj, xr, yr, magicuse)
          }
        }
        if (k == "stonespikes") {
          set_cursor(6)
          ok = true
          if (xr + yr * defxn != lastshad) {
            if (lastshad > 0) {
              setshad(0, 0, 0, 0, false)
              lastshad--
              setshad(0, 0, 0, 0, false)
              lastshad += 2
              setshad(0, 0, 0, 0, false)
              lastshad--
              lastshad -= defxn
              setshad(0, 0, 0, 0, false)
              lastshad += 2 * defxn
              setshad(0, 0, 0, 0, false)
              lastshad -= defxn
            }
            if (xr <= 0 || yr <= 0 || xr > defxn - 2 || yr > defyn) {
              res = 0
              ok = false
            }
            lastshad = xr + yr * defxn
            setshad(0, 0, 0, 0, true)
            lastshad--
            setshad(0, 0, 0, 0, true)
            lastshad += 2
            setshad(0, 0, 0, 0, true)
            lastshad--
            lastshad -= defxn
            setshad(0, 0, 0, 0, true)
            lastshad += 2 * defxn
            setshad(0, 0, 0, 0, true)
            lastshad -= defxn
          }
          if (ok) {
            magicx = xr
            magicy = yr
            res = "stonespikes"
            this.calcmagic(activeobj, xr, yr, magicuse)
          }
        }
        if (k == "wordofchief") {
          set_cursor(6)
          if (xr + yr * defxn != lastshad) {
            if (lastshad > 0) {
              setshad(0, 0, 0, 0, false)
            }
          }
          ok = false
          var len = this.obj_array.length
          for (var k1 = 0; k1 < len; k1++) {
            i = this.obj_array[k1]
            if (
              !this.obj[i].warmachine &&
              !this.obj[i].hero &&
              i == mapobj[xr + yr * defxn] &&
              this.obj[i].side == this.obj[activeobj].getside() &&
              this.obj[i].nownumber > 0
            ) {
              ok = true
              break
            }
          }
          if (!ok) {
            res = 0
            this.reset_temp_magic()
            this.showatb()
          } else {
            lastshad = xr + yr * defxn
            setshad(0, 0, 0, 0, true)
            res = "wordofchief"
            magicx = xr
            magicy = yr
            var eff = this.obj[activeobj][magicuse + "effmain"]
            var init = eff * 100
            var j = mapobj[lastshad]
            if (
              this.obj[j]["nowinit"] - init <
              this.obj[activeobj]["nowinit"]
            ) {
              init = Math.floor(
                this.obj[j]["nowinit"] - this.obj[activeobj]["nowinit"]
              )
            }
            this.reset_temp_magic()
            this.obj[mapobj[yr * defxn + xr]]["reset_init"] = -init
            this.showatb()
          }
        }
        if (k == "wheeloffortune") {
          set_cursor(6)
          if (xr + yr * defxn != lastshad) {
            if (lastshad > 0) {
              setshad(0, 0, 0, 0, false)
            }
          }
          ok = false
          var len = this.obj_array.length
          for (var k1 = 0; k1 < len; k1++) {
            i = this.obj_array[k1]
            if (
              i == mapobj[xr + yr * defxn] &&
              this.obj[i].nownumber > 0 &&
              !this.obj[i].hero &&
              i != activeobj
            ) {
              ok = true
            }
          }
          if (!ok) {
            res = 0
          } else {
            lastshad = xr + yr * defxn
            setshad(0, 0, 0, 0, true)
            res = "wheeloffortune"
            magicx = xr
            magicy = yr
          }
        }
        if (k == "corpseeater") {
          set_cursor(6)
          if (xr + yr * defxn != lastshad) {
            if (lastshad > 0) {
              setshad(0, 0, 0, 0, false)
            }
          }
          var maxh =
            this.obj[activeobj]["maxnumber"] * this.obj[activeobj]["maxhealth"]
          var nowh =
            (this.obj[activeobj]["nownumber"] - 1) *
              this.obj[activeobj]["maxhealth"] +
            this.obj[activeobj]["nowhealth"]
          big2 = 0
          if (this.obj[activeobj].big) big2 = 1
          var ok1 = false
          if (nowh < maxh) {
            var len = this.obj_array.length
            for (var k1 = 0; k1 < len; k1++) {
              var k = this.obj_array[k1]
              var big = 0
              if (this.obj[k]["big"]) big = 1
              if (
                this.obj[k]["nownumber"] == 0 &&
                this.obj[k]["alive"] &&
                !this.obj[k]["warmachine"] &&
                !this.obj[k]["hsm"] &&
                this.obj[k].x >= xr &&
                this.obj[k].x <= xr + big &&
                this.obj[k].y >= yr &&
                this.obj[k].y <= yr + big
              ) {
                var ok = false
                for (
                  var x1 = this.obj[k]["x"] - 1 - big2;
                  x1 <= this.obj[k]["x"] + 1 + big;
                  x1++
                ) {
                  for (
                    var y1 = this.obj[k]["y"] - 1 - big2;
                    y1 <= this.obj[k]["y"] + 1 + big;
                    y1++
                  ) {
                    if (wmap2[x1 + y1 * defxn] >= 0) {
                      ok = true
                      break
                    }
                  }
                  if (ok) break
                }
                if (!ok) continue
                var ok1 = true
                for (
                  var x1 = this.obj[k]["x"];
                  x1 <= this.obj[k]["x"] + big;
                  x1++
                ) {
                  for (
                    var y1 = this.obj[k]["y"];
                    y1 <= this.obj[k]["y"] + big;
                    y1++
                  ) {
                    if (mapobj[yr * defxn + xr] > 0) ok1 = false
                  }
                }
                if (ok1) break
              }
            }
          }
          if (!ok1) {
            res = 0
          } else {
            lastshad = xr + yr * defxn
            setshad(0, 0, 0, 0, true)
            res = "corpseeater"
            magicx = xr
            magicy = yr
          }
        }
        if (k == "wavesofrenewal") {
          set_cursor(6)
          if (xr + yr * defxn != lastshad) {
            if (lastshad > 0) {
              setshad(0, 0, 0, 0, false)
            }
          }
          ok = false
          var len = this.obj_array.length
          for (var k1 = 0; k1 < len; k1++) {
            i = this.obj_array[k1]
            if (
              i == mapobj[xr + yr * defxn] &&
              this.obj[i].nownumber > 0 &&
              !this.obj[i].hero &&
              this.obj[i].side == this.obj[activeobj].getside()
            ) {
              ok = true
            }
          }
          if (!ok) {
            res = 0
          } else {
            lastshad = xr + yr * defxn
            setshad(0, 0, 0, 0, true)
            res = "wavesofrenewal"
            magicx = xr
            magicy = yr
          }
        }
        if (k == "angerofhorde") {
          set_cursor(6)
          if (xr + yr * defxn != lastshad) {
            if (lastshad > 0) {
              setshad(0, 0, 0, 0, false)
            }
          }
          if (getmap(xr, yr) != 210) {
            res = 0
          } else {
            lastshad = xr + yr * defxn
            setshad(0, 0, 0, 0, true)
            res = "angerofhorde"
            magicx = xr
            magicy = yr
            if (stage.pole.obj[activeobj]["divinev"]) {
              this.calcdivinev(activeobj, xr, yr)
            } else {
              this.calcmagic(activeobj, xr, yr, magicuse)
            }
          }
        }
        if (k == "spiritlink") {
          set_cursor(6)
          if (xr + yr * defxn != lastshad) {
            if (lastshad > 0) {
              setshad(0, 0, 0, 0, false)
            }
          }
          ok = false
          var len = this.obj_array.length
          for (var k1 = 0; k1 < len; k1++) {
            i = this.obj_array[k1]
            if (
              !this.obj[i].warmachine &&
              !this.obj[i].immunity &&
              !this.obj[i].enchantedarmor &&
              !this.obj[i].hero &&
              i == mapobj[xr + yr * defxn] &&
              i != activeobj &&
              this.obj[i].side == this.obj[activeobj].getside() &&
              this.obj[i].nownumber > 0
            ) {
              ok = true
              break
            }
          }
          if (!ok) {
            res = 0
          } else {
            lastshad = xr + yr * defxn
            setshad(0, 0, 0, 0, true)
            res = "spiritlink"
            magicx = xr
            magicy = yr
          }
        }
        if (k == "setsnares") {
          set_cursor(6)
          ok = true
          if (xr + yr * defxn != lastshad) {
            if (lastshad > 0) {
              setshad(0, 0, 0, 0, false)
            }
            if (
              xr <= 0 ||
              yr <= 0 ||
              xr > defxn - 2 ||
              yr > defyn ||
              (getmap(xr, yr) != 250 && getmap(xr, yr) != 0)
            ) {
              res = 0
              ok = false
              if (getmap(xr, yr) == 210) {
                showuron(
                  1,
                  snaresPossible(
                    this.obj[activeobj],
                    this.obj[mapobj[yr * defxn + xr]]
                  )
                )
              }
            } else {
              lastshad = xr + yr * defxn
              setshad(0, 0, 0, 0, true)
            }
          }
          if (ok) {
            magicx = xr
            magicy = yr
            res = "setsnares"
          }
        }
        if (k == "setmagicmine") {
          set_cursor(6)
          ok = true
          if (xr + yr * defxn != lastshad) {
            if (lastshad > 0) {
              setshad(0, 0, 0, 0, false)
            }
            if (
              xr <= 0 ||
              yr <= 0 ||
              xr > defxn - 2 ||
              yr > defyn ||
              (getmap(xr, yr) != 250 && getmap(xr, yr) != 0)
            ) {
              res = 0
              ok = false
            } else {
              lastshad = xr + yr * defxn
              setshad(0, 0, 0, 0, true)
            }
          }
          if (ok) {
            magicx = xr
            magicy = yr
            res = "setmagicmine"
          }
        }
        if (k == "fearmyroar") {
          set_cursor(6)
          if (xr + yr * defxn != lastshad) {
            if (lastshad > 0) {
              setshad(0, 0, 0, 0, false)
            }
          }
          this.reset_temp_magic()
          this.showatb()
          if (getmap(xr, yr) != 210) {
            res = 0
          } else {
            ok = true
            var len = this.obj_array.length
            for (var k1 = 0; k1 < len; k1++) {
              i = this.obj_array[k1]
              if (
                (this.obj[i].hero ||
                  this.obj[i].warmachine ||
                  this.obj[i].absolutepurity ||
                  !this.obj[i].alive ||
                  this.obj[i].imind ||
                  this.obj[i].twistedmind ||
                  (magic[i]["wfr"] && magic[i]["wfr"]["effect"] == 1)) &&
                mapobj[yr * defxn + xr] == i &&
                this.obj[i].nownumber > 0
              ) {
                ok = false
                break
              }
              if (
                (this.obj[i].nownumber - 1) * this.obj[i].maxhealth +
                  this.obj[i].nowhealth >
                  this.obj[activeobj]["fearmyroar" + "effmain"] &&
                this.obj[i].nownumber > 0 &&
                mapobj[yr * defxn + xr] == i
              ) {
                ok = false
                break
              }
            }
            if (!ok) {
              res = 0
            } else {
              lastshad = xr + yr * defxn
              var defender = mapobj[lastshad]
              if (this.obj[defender]["nowinit"] < 100) {
                var init = 100
                if (
                  this.obj[defender]["nowinit"] -
                    this.obj[activeobj]["nowinit"] +
                    init >
                  100
                ) {
                  init = Math.max(
                    0,
                    Math.floor(
                      100 +
                        this.obj[activeobj]["nowinit"] -
                        this.obj[defender]["nowinit"]
                    )
                  )
                }
                this.reset_temp_magic()
                this.obj[defender]["reset_init"] = init
                this.showatb()
              }
              setshad(0, 0, 0, 0, true)
              res = "curse"
              magicx = xr
              magicy = yr
            }
          }
        }
        tUronkills = 0
        tUronkills2 = 0
        tPhysicalDamage = 0
        tPhysicalDamage2 = 0
        res = this.checkcast(k, res, xr, yr)
        if (
          magicuse != "" &&
          this.obj[activeobj]["hero"] &&
          magicuse != "raisedead" &&
          magicuse != "resurrection"
        ) {
          var plus = 100
          if (isperk(activeobj, 105)) plus = 90
          if (isperk(activeobj, 106)) plus = 80
          if (isperk(activeobj, 107)) plus = 70
          if (
            isperk(activeobj, 85) &&
            (magicuse == "mbless" || magicuse == "mdispel")
          ) {
            plus = 50
          }
          if (
            isperk(activeobj, 84) &&
            (magicuse == "mstoneskin" || magicuse == "mdeflect_missile")
          ) {
            plus = 50
          }
          if (
            isperk(activeobj, 86) &&
            (magicuse == "mfast" || magicuse == "mrighteous_might")
          ) {
            plus = 50
          }
          if (
            isperk(activeobj, 75) &&
            (magicuse == "mcurse" || magicuse == "msuffering")
          ) {
            plus = 50
          }
          if (
            isperk(activeobj, 76) &&
            (magicuse == "mslow" || magicuse == "mconfusion")
          ) {
            plus = 50
          }
          if (isperk(activeobj, 77) && magicuse == "mdray") {
            plus = 50
          }
          if (
            magicuse == "raisedead" &&
            umelka[this.obj[activeobj]["owner"]][0] == 2 &&
            !magic[activeobj]["nps"] &&
            this.obj[activeobj]["hero"] &&
            magic[activeobj]["cls"] &&
            magic[activeobj]["cls"]["effect"] == 1
          ) {
            kk = 1 - 0.03 * umelka[this.obj[activeobj]["owner"]][2]
            plus = Math.round(plus * kk)
          }
          if (plus != 100) {
            this.obj[activeobj]["reset_init"] = 0
            this.obj[activeobj]["plus_init"] = plus
            this.showatb(activeobj)
            this.obj[activeobj]["was_atb"] = 1
          }
        }
        var a = 1
        switch (a) {
          case 1:
            if (k == enemy) {
              if (
                activeobj > 0 &&
                magic[activeobj]["noa"] &&
                magic[activeobj]["noa"]["nowinit"] > 0
              ) {
                clearshadway()
                set_visible(csword, 0)
                set_cursor(5)
                res = 200
                return 0
              }
              if (
                activeobj > 0 &&
                this.obj[activeobj].shooter &&
                this.obj[activeobj].shots > 0 &&
                ((!shiftdown && likeshift <= shiftcount) ||
                  this.obj[activeobj].hero)
              ) {
                xaa = this.obj[activeobj].x
                yaa = this.obj[activeobj].y
                xaa1 = xaa
                yaa1 = yaa
                b = 0
                if (this.obj[activeobj].big) {
                  if (xaa < xr) {
                    xaa++
                  }
                  if (yaa < yr) {
                    yaa++
                  }
                }
                if (this.obj[activeobj].bigx) {
                  if (xaa < xr) {
                    xaa++
                  }
                }
                if (this.obj[activeobj].bigy) {
                  if (yaa < yr) {
                    yaa++
                  }
                }
                var bigx = this.obj[activeobj]["big"]
                var bigy = this.obj[activeobj]["big"]
                if (this.obj[activeobj]["bigx"]) bigx = 1
                if (this.obj[activeobj]["bigy"]) bigy = 1
                range = (xaa - xr) * (xaa - xr) + (yaa - yr) * (yaa - yr)
                ok = true
                for (xb = -1; xb <= 1 + bigx; xb++) {
                  for (yb = -1; yb <= 1 + bigy; yb++) {
                    if (
                      yb + yaa1 >= 1 &&
                      yb + yaa1 <= defyn &&
                      xaa1 + xb >= 0 &&
                      xaa1 + xb <= defxn - 1 &&
                      getmap(xaa1 + xb, yaa1 + yb) == 210 &&
                      mapobj[xaa1 + xb + (yaa1 + yb) * defxn] > 0 &&
                      this.obj[mapobj[xaa1 + xb + (yaa1 + yb) * defxn]]
                        .statix != 1
                    ) {
                      ok = false
                    }
                  }
                }
                if (
                  (range > 2 && ok) ||
                  this.obj[activeobj].hero ||
                  this.obj[activeobj].ballista ||
                  this.obj[activeobj].warmachine
                ) {
                  if (!this.obj[activeobj].hero) {
                    if (
                      (Math.sqrt(range) > this.obj[activeobj].range &&
                        !this.obj[activeobj].shadowattack) ||
                      (iswalls &&
                        !this.obj[activeobj].hero &&
                        checkwall(xaa, yaa, xr, yr)) ||
                      ((!this.obj[activeobj].siegewalls ||
                        btype == 118 ||
                        !this.obj[mapobj[yr * defxn + xr]].stone) &&
                        iswalls2 &&
                        !this.obj[activeobj].hero &&
                        checkwall2(xaa, yaa, xr, yr, activeobj))
                    ) {
                      set_cursor(4)
                    } else {
                      set_cursor(3)
                    }
                  }
                  if (this.obj[activeobj].hero) {
                    set_cursor(2)
                    if (
                      this.obj[activeobj].id == 59 ||
                      this.obj[activeobj].id == 54 ||
                      this.obj[activeobj].id == 48
                    ) {
                      set_cursor(3)
                    }
                  }
                  if (
                    this.obj[activeobj].magicattack ||
                    this.obj[activeobj].piercingbolt
                  ) {
                    lastmag = xr + yr * defxn
                    lastshad = -2
                    this.magshot(xr, yr)
                  }
                  attackx = xaa1
                  attacky = yaa1
                  res = 210.5
                  if (magicuse == "harpoonstrike") {
                    set_cursor(8)
                    magicx = attackx
                    magicy = attacky
                  }
                  if (cur_cursor == 2 || cur_cursor == 4 || cur_cursor == 3) {
                    if (
                      this.obj[activeobj]["hero"] &&
                      magic[activeobj]["brb"]
                    ) {
                      var init = 20
                      var defender = mapobj[xr + yr * defxn]
                      if (
                        this.obj[defender]["nowinit"] -
                          this.obj[activeobj]["nowinit"] +
                          init >
                        100
                      ) {
                        init = Math.max(
                          0,
                          Math.floor(
                            100 +
                              this.obj[activeobj]["nowinit"] -
                              this.obj[defender]["nowinit"]
                          )
                        )
                      }
                      this.reset_temp_magic()
                      this.obj[defender]["reset_init"] = init
                      this.showatb()
                      this.obj[activeobj]["was_atb"] = 1
                    }
                    this.check_shoot_abilities(
                      activeobj,
                      this.obj[activeobj].x,
                      this.obj[activeobj].y,
                      xr,
                      yr
                    )
                    this.attackmonster(
                      activeobj,
                      xr,
                      yr,
                      this.obj[activeobj].x,
                      this.obj[activeobj].y,
                      mapobj[yr * defxn + xr],
                      1
                    )
                    this.checkProbabilitySkill(
                      activeobj,
                      attackx,
                      attacky,
                      xr,
                      yr,
                      1
                    )
                    showuron()
                  }
                  break
                }
              }
              var def = mapobj[yr * defxn + xr]
              if (range <= 2 && magicuse == "harpoonstrike") return 0
              if (def <= 0 || !this.obj[def]) return 0
              if (activeobj > 0 && this.obj[activeobj].shootonly) {
                set_visible(csword, 0)
                set_cursor(5)
                res = 200
                return 0
              }
              if (
                (magicuse == "harmtouch" &&
                  (this.obj[def].warmachine ||
                    this.obj[def].stone ||
                    this.obj[def].portal ||
                    this.obj[def].maxhealth >= 400)) ||
                (magicuse == "layhands" &&
                  (!this.obj[def].alive || def == activeobj)) ||
                (magicuse == "orderofchief" && def == activeobj)
              ) {
                set_cursor(0)
                crun_visible2 = false
                clearshadway()
                return 0
              }
              set_cursor(2)
              if (
                activeobj > 0 &&
                this.obj[activeobj].strikeandreturn &&
                (shiftdown || likeshift > shiftcount)
              ) {
                set_cursor(7)
              }
              var xo = this.obj[def].x
              var yo = this.obj[def].y
              var xp = 0,
                yp = 0,
                xpp = 0,
                ypp = 0,
                dd = 0,
                bdd = 100000,
                bxp = 0,
                byp = 0
              var bigx = 0,
                bigy = 0,
                bxr = 0,
                byr = 0
              if (this.obj[def].bigx || this.obj[def].big) bigx = 1
              if (this.obj[def].bigy || this.obj[def].big) bigy = 1
              var one_place = 0
              if (xr_go > 0) {
                for (var xt = xo; xt <= xo + bigx; xt++)
                  for (var yt = yo; yt <= yo + bigy; yt++)
                    for (
                      xp = -1 - this.obj[activeobj].big + xt;
                      xp <= xt + 1;
                      xp++
                    )
                      for (
                        yp = -1 - this.obj[activeobj].big + yt;
                        yp <= yt + 1;
                        yp++
                      )
                        if (xr_go == xp && yr_go == yp) one_place = 1
              }
              if (one_place == 0) {
                xr_go = -1
                yr_go = -1
              }
              if (activeobj > 0) {
                for (var xt = xo; xt <= xo + bigx; xt++)
                  for (var yt = yo; yt <= yo + bigy; yt++)
                    for (
                      xp = -1 - this.obj[activeobj].big + xt;
                      xp <= xt + 1;
                      xp++
                    )
                      for (
                        yp = -1 - this.obj[activeobj].big + yt;
                        yp <= yt + 1;
                        yp++
                      ) {
                        if (wmap_a[yp * defxn + xp] >= 0) {
                          if (
                            magicuse == "incinerate" &&
                            (xp != this.obj[activeobj].x ||
                              yp != this.obj[activeobj].y)
                          )
                            continue
                          xpp =
                            (xp - xt + 1 + this.obj[activeobj].big + 0.5) /
                            (3 + this.obj[activeobj].big)
                          ypp =
                            (yp - yt + 1 + this.obj[activeobj].big + 0.5) /
                            (3 + this.obj[activeobj].big)
                          dd =
                            (xt - 1 + xpp - r.x) * (xt - 1 + xpp - r.x) +
                            (yt - 1 + ypp - r.y) * (yt - 1 + ypp - r.y)
                          if (
                            android &&
                            one_place &&
                            (xr_go != xp || yr_go != yp)
                          )
                            continue
                          if (dd < bdd) {
                            bdd = dd
                            bxp = xp
                            byp = yp
                            bxr = xt + xpp
                            byr = yt + ypp
                          }
                        }
                      }
              } else {
                break
              }
              ac = 200
              set_visible(csword, 1)
              if (bdd < 100000) {
                ac = 0
                xr = Math.floor(bxr)
                yr = Math.floor(byr)
                xr_last = xr
                yr_last = yr
                xb = bxp - xr
                yb = byp - yr
                xt = xr
                yt = yr
                xt2 = r.x + 1
                yt2 = r.y + 1
                xt2 = bxr
                yt2 = byr
                ac =
                  (Math.atan((yt + 0.5 - yt2) / (xt + 0.5 - xt2)) * 180) /
                  Math.PI
                if (xt + 0.5 - xt2 >= 0) ac = 180 + ac
              }
              if (ac == 200) {
                set_visible(csword, 0)
                set_cursor(5)
                res = 200
                break
              }
              a = ac
              if (xr + xb + (yr + yb) * defxn != lastshad) {
                if (lastshad > 0) {
                  set_visible(shado[lastshad], 0)
                  if (this.obj[activeobj].big) {
                    if (shado[lastshad + 1]) set_visible(shado[lastshad + 1], 0)
                    if (shado[lastshad + 1 + defxn])
                      set_visible(shado[lastshad + 1 + defxn], 0)
                    if (shado[lastshad + defxn])
                      set_visible(shado[lastshad + defxn], 0)
                  }
                  if (this.obj[activeobj].bigx) {
                    set_visible(shado[lastshad + 1], 0)
                  }
                  if (this.obj[activeobj].bigy) {
                    set_visible(shado[lastshad + defxn], 0)
                  }
                }
                lastshad = xr + xb + (yr + yb) * defxn
                set_visible(shado[xr + xb + (yr + yb) * defxn], 1)
                if (this.obj[activeobj].big) {
                  set_visible(shado[xr + xb + (yr + yb) * defxn + 1], 1)
                  set_visible(shado[xr + xb + (yr + yb) * defxn + 1 + defxn], 1)
                  set_visible(shado[xr + xb + (yr + yb) * defxn + defxn], 1)
                }
                if (this.obj[activeobj].bigx) {
                  set_visible(shado[xr + xb + (yr + yb) * defxn + 1], 1)
                }
                if (this.obj[activeobj].bigy) {
                  set_visible(shado[xr + xb + (yr + yb) * defxn + defxn], 1)
                }
              }
              attack_xr = xr
              attack_yr = yr
              xr_last = xr
              yr_last = yr
              attackx = xr + xb
              attacky = yr + yb
              if (
                magicuse == "harmtouch" ||
                magicuse == "feralcharge" ||
                magicuse == "unstoppablecharge" ||
                magicuse == "allaroundslash" ||
                magicuse == "slam" ||
                magicuse == "mightyslam" ||
                magicuse == "layhands" ||
                magicuse == "orderofchief" ||
                magicuse == "leap" ||
                magicuse == "leap6" ||
                magicuse == "incinerate"
              ) {
                if (
                  magicuse == "leap" ||
                  magicuse == "leap6" ||
                  magicuse == "feralcharge" ||
                  magicuse == "unstoppablecharge" ||
                  magicuse == "allaroundslash" ||
                  magicuse == "slam" ||
                  magicuse == "mightyslam" ||
                  magicuse == "harpoonstrike" ||
                  magicuse == "incinerate"
                ) {
                  set_cursor(8)
                } else {
                  set_cursor(6)
                }
                magicx = attackx
                magicy = attacky
                set_visible(csword, 0)
              }
              if (magicuse == "hailstorm") {
                magicx = attackx
                magicy = attacky
              }
              this.check_abilities(activeobj, attackx, attacky, xr, yr)
              if (cur_cursor == 2 || cur_cursor == 7) {
                this.attackmonster(activeobj, xr, yr, attackx, attacky, def, 0)
                this.checkProbabilitySkill(activeobj, attackx, attacky, xr, yr)
                showuron()
              }
              if (magicuse == "leap") {
                tUronkills = 0
                tUronkills2 = 0
                tPhysicalDamage = 0
                tPhysicalDamage2 = 0
                var dx = Math.abs(this.obj[activeobj]["x"] - attackx)
                var dy = Math.abs(this.obj[activeobj]["y"] - attacky)
                var diag =
                  Math.abs(dx - dy) +
                  1.5 * (Math.max(dx, dy) - Math.abs(dx - dy))
                var monatt = Math.floor(
                  (this.obj[activeobj]["attack"] +
                    this.obj[activeobj]["attackaddon"] +
                    this.obj[activeobj]["rageattack"]) *
                    diag *
                    0.1
                )
                this.obj[activeobj]["attackaddon"] += monatt
                setmap(this.obj[activeobj].x, this.obj[activeobj].y, 1, false)
                this.attackmonster(activeobj, xr, yr, attackx, attacky, def, 0)
                this.obj[activeobj]["attackaddon"] -= monatt
                showuron()
              }
              if (magicuse == "leap6") {
                tUronkills = 0
                tUronkills2 = 0
                tPhysicalDamage = 0
                tPhysicalDamage2 = 0
                var dx = Math.abs(this.obj[activeobj]["x"] - attackx)
                var dy = Math.abs(this.obj[activeobj]["y"] - attacky)
                var diag =
                  Math.abs(dx - dy) +
                  1.5 * (Math.max(dx, dy) - Math.abs(dx - dy))
                var koef = 1 + diag * 0.05
                setmap(this.obj[activeobj].x, this.obj[activeobj].y, 1, false)
                this.attackmonster(
                  activeobj,
                  xr,
                  yr,
                  attackx,
                  attacky,
                  def,
                  0,
                  koef,
                  "lep"
                )
                showuron()
              }
              set_angle(csword, Math.round(a))
              var b = getxa(xr, yr)
              xsize2 = b.x[2] - b.x[3]
              var scale = this.scaling
              set_scaleX(csword, scale)
              set_scaleY(csword, scale)
              set_X(
                csword,
                (b.x[3] + b.x[2]) / 2 +
                  (Math.cos((a / 180) * Math.PI) * xsize2) / 2
              )
              set_Y(
                csword,
                (b.y[3] + b.y[1]) / 2 +
                  (Math.sin((a / 180) * Math.PI) * (b.y[1] - b.y[3])) / 2
              )
              res = 210
            }
            break
        }
        if (res == 0) {
          crun_visible2 = false
          xr_go = -1
          yr_go = -1
          set_cursor(0)
        }
        if (res != 210) {
          set_visible(csword, 0)
        }
        if (res == 0 || res == 210.5 || res == 200) {
          clearshadway()
        }
        if (res == 200 && cancelway) {
          this.getnearpos(xr, yr)
        }
        this.check_uron_abil(res, xr, yr)
        if (crun_visible2) {
        } else {
          set_cursor(0)
        }
        draw_ground()
      }
      stage.pole.commandsproc = unsafeWindow.commandsproc = function () {
        ccounter++
        if (!android && inserted && ccounter % 4 == 0) {
          ccounter = 0
          if (KeyisDown(16)) shiftdown = true
          else shiftdown = false
          if (KeyisDown(17)) {
            ctrldown = true
            this.onMouseMoveFlash(false, mousePos.x, mousePos.y, 1)
          } else {
            ctrldown = false
          }
          if (lastshiftdown != shiftdown) {
            lastshiftdown = shiftdown
            movecounter = 0
          }
        }
        movecounter++
        if (activeobj && this.obj[activeobj] && this.obj[activeobj].firstaid) {
          magicuse = "firstaid"
        }
        if (!loading) {
          if (btype == 86 || btype == 87) {
            soundon = false
          }
          if (soundeff == -1 && btype != 86 && btype != 87 && btype != 82) {
            mousevisible = true
          }
        }
        if (!initialized) {
          return 0
        }
        if (soundeff == -1 && btype != 86 && btype != 87 && btype != 82) {
          if (typeof unsafeWindow.cordova_client != "undefined" && cordova_client) {
            soundeff = 1
          } else {
            show_sound_dialog()
          }
        }
        if (firstbattle && !buttons_visible["win_dialog"]) {
          if (firstbattle == 2 && btype == 87) {
            if (
              !buttons_visible["win_Mission"] &&
              !finished &&
              showed_hint[2] == 0 &&
              activeobj > 0 &&
              inserted
            ) {
              fastloadmy(
                "battle.php?reg_loaded=2&pl_id=" +
                  player +
                  "&warid=" +
                  warid +
                  "&rand=" +
                  mathrandom()
              )
              showed_hint[2] = 1
              hide_button("info_on")
              hide_war_buttons(1)
              show_button("win_Mission")
              if (lang == 0) {
                document.getElementById("mission_header").innerHTML =
                  "Задание: захватить шахту"
                document.getElementById("win_Mission_txt").innerHTML =
                  "Теперь в вашем распоряжении целая армия, состоящая из различных отрядов. Текущая задача - разгромить пограничников и захватить шахту. \n\nВы можете сами наносить удары на расстоянии, а так же давать любые указания своим отрядам.\nВаш союзник-эльфийка поможет победить!"
              }
              if (lang == 1) {
                document.getElementById("mission_header").innerHTML =
                  "Mission: Break through the security"
                document.getElementById("win_Mission_txt").innerHTML =
                  "You have an army of several different units at your disposal.\n\nCurrent mission - Defeat the Imperial border guards and occupy the sawmill. Your hero can strike them from a safe distance and order the units under your command. Your partner, the she-elf, will help you in your mission."
              }
            }
          } else if (firstbattle == 2) {
            if (
              !buttons_visible["win_Mission"] &&
              !finished &&
              showed_hint[2] == 0 &&
              activeobj > 0 &&
              inserted
            ) {
              if (!no_reg_stat) {
                fastloadmy(
                  "battle.php?reg_anim_finish=1&pl_id=" +
                    player +
                    "&warid=" +
                    warid +
                    "&rand=" +
                    mathrandom()
                )
              }
              showed_hint[2] = 1
              hide_button("info_on")
              hide_war_buttons(1)
              show_button("win_Mission")
              if (lang == 0) {
                document.getElementById("mission_header").innerHTML =
                  "Добро пожаловать в мир Героев!"
                var txts =
                  "Это увлекательная игра с разнообразными боями, гильдиями, квестами и кампаниями. В неё можно играть на любом устройстве - компьютере и телефоне.<br><br><b>Преимущество перед другими онлайн-играми:<br>1. Регулярно проходят боевые ивенты;<br>2. Не нужно быть топ-игроком или высоким уровнем, чтобы показывать отличные результаты в ивенте;<br>3. Разнообразный игровой мир (бои, квесты, карты, рулетка, экономика и т.п.)<br>4. Не требует реальных денег.</b><br><br>А пока вам необходимо подойти и разгромить вражескую нежить."
                document.getElementById("win_Mission_txt").innerHTML = txts
              }
              if (lang == 1) {
                document.getElementById("mission_header").innerHTML =
                  "Welcome to the world of heroes!"
                var txts =
                  "This is a fascinating game with various battles, guilds, quests and campaigns. You may enjoy it on your phone or computer. Whichever suits you best.<br><br><b>Advantages over other online games:<br>1. Scheduled regular combat events;<br>2. No need to be among the top players to demonstrate great results in event battles;<br>3. Diverse gaming experience (PVP battles, quests, campaigns, card game, economy and many more);<br>4) Free to play. You can be top player without donations!</b><br><br>Will you join now and annihilate this army of the undead?"
                document.getElementById("win_Mission_txt").innerHTML = txts
              }
              if (
                document.getElementById("win_Mission_txt").offsetHeight >
                document.getElementById("MissionItem_txt").offsetHeight * 1.22
              ) {
                document.getElementById("win_Mission_txt").style["font-size"] =
                  "65%"
              }
            }
          } else {
            if (initialized && showed_hint[1] == 0 && !inserted) {
              showhint(1)
            } else if (
              !buttons_visible["win_Mission"] &&
              showed_hint[2] == 0 &&
              activeobj > 0 &&
              inserted
            ) {
              if (demomode && lang == 0) {
                document.getElementById("mission_header").innerHTML =
                  "Пробный бой"
                texts[2] =
                  "Вы находитесь в новой игре Герои Войны и Денег. Это тактическая стратегия с элементами RPG и экономики. Здесь вы сможете реализовать все свои способности, постоянно развиваясь и улучшая свои навыки. � егулярные обновления сохранят ваш интерес к игре надолго.\n\nПобеди в бою и начинай играть!"
              }
              if (demomode && lang == 1) {
                document.getElementById("mission_header").innerHTML =
                  "Demo combat"
                texts[2] =
                  "You have embarked on a new journey with this game - Lords of War and Money. This is a tactical strategy game with RPG elements and a world with well-developed self-sustaining economy. Here, you can realize all your fantasies, constantly developing and improving your skills. Regular updates will keep you interested forever. Wait no longer and into battle!"
              }
              showhint(2)
            } else if (
              !buttons_visible["win_Mission"] &&
              demomode != 1 &&
              showed_hint[3] == 0 &&
              showed_hint[2] == 1 &&
              activeobj > 0 &&
              inserted
            ) {
              showhint(3)
            } else if (
              !buttons_visible["win_Mission"] &&
              demomode != 1 &&
              showed_hint[4] == 0 &&
              showed_hint[3] == 1 &&
              activeobj > 0 &&
              inserted &&
              this.obj[activeobj].hero != 1 &&
              this.obj[activeobj].shooter != 1
            ) {
              showhint(4)
            } else if (
              !buttons_visible["win_Mission"] &&
              showed_hint[5] == 0 &&
              (showed_hint[3] == 1 || demomode) &&
              activeobj > 0 &&
              inserted &&
              this.obj[activeobj].hero == 1
            ) {
              showhint(5)
            } else if (
              !buttons_visible["win_Mission"] &&
              showed_hint[6] == 0 &&
              (showed_hint[3] == 1 || demomode) &&
              activeobj > 0 &&
              inserted &&
              this.obj[activeobj].hero != 1 &&
              this.obj[activeobj].shooter == 1
            ) {
              showhint(6)
            }
          }
        }
        if (gpause) {
          return 0
        }
        if (someactive) {
          ok = false
          for (i = 1; i <= magicscount; i++) {
            if (
              ((magics[i].doing != "" && magics[i].doing != undefined) ||
                (magics[i].cmd != "" && magics[i].cmd != undefined)) &&
              magics[i] != undefined
            ) {
              ok = true
              break
            }
          }
          var len = this.obj_array.length
          for (var k1 = 0; k1 < len; k1++) {
            i = this.obj_array[k1]
            if (
              this.obj[i].active ||
              (this.obj[i].doing != "" && this.obj[i].doing != undefined) ||
              this.obj[i].donow2 == 1
            ) {
              if (this.obj[i].bomb) continue
              ok = true
              break
            }
          }
          someactive = ok
        }
        if (!someactive) {
          this["nowhit"] = -1
        }
        if (command != "") {
          k = tointeger(command.substr(1, 3))
          current = k
          cmd = command.substr(0, 1)
          if (cmd == "S" && !someactive) {
            tmp = command.substr(1, 18)
            curAbil = tmp
          }
        }
        let command_copy = command
        if (command_copy.indexOf("psc") != -1 && !someactive) {
          let phmCommand = command_copy.substr(command_copy.indexOf("psc"), 18)
          let a = tointeger(phmCommand.substr(3, 3))
          let d = tointeger(phmCommand.substr(6, 3))
          psc[d] = a
        }
        if (command_copy.indexOf("psa") != -1 && !someactive) {
          let phmCommand = command_copy.substr(command_copy.indexOf("psa"), 18)
          let a = tointeger(phmCommand.substr(3, 3))
          let d = tointeger(phmCommand.substr(6, 3))
          psa[d] = a
        }
        if (command_copy.indexOf("Sphm") != -1 && !someactive) {
          let phmCommand = command_copy.substr(command_copy.indexOf("Sphm"), 18)
          let source = Number(phmCommand.substr(12, 3))
          let phantom = Number(phmCommand.substr(7, 3))
          if (phm[phantom] === undefined) {
            phm[phantom] = source
          }
        }
        while (command_copy.substr(0, 1) == "S" && !someactive) {
          if (command_copy.substr(1, 3) == "lzb") {
            stage.pole.incrementParam(
              Number(command_copy.substr(4, 3)),
              "hitcount",
              -1
            )
          }
          command_copy = command_copy.substr(19)
        }
 
        for (i in this.obj) {
          if (
            this.obj[phm[i]] !== undefined &&
            this.obj[i].data_string !== undefined &&
            this.obj[i].data_string.indexOf("phm100000000001") != -1 &&
            this.obj[i]["phm"] === undefined
          ) {
            this.obj[i]["luckcount"] =
              this.obj[phm[i]]["luckcount"] === undefined
                ? 0
                : this.obj[phm[i]]["luckcount"]
            this.obj[i]["hitcount"] =
              this.obj[phm[i]]["hitcount"] === undefined
                ? 0
                : this.obj[phm[i]]["hitcount"]
            this.obj[i]["turnCount"] =
              this.obj[phm[i]]["turnCount"] === undefined
                ? 0
                : this.obj[phm[i]]["turnCount"]
            this.obj[i]["moraleCount"] =
              this.obj[phm[i]]["moraleCount"] === undefined
                ? 0
                : this.obj[phm[i]]["moraleCount"]
            this.obj[i]["phm"] = 1
          }
          // if ((this.obj[gate[i]] !== undefined) && (magic[i]) && (magic[i]['sum']) && (magic[i]['sum']['effect'] == 2) && (this.obj[i]["gate"] === undefined)) {
          // this.obj[i]["luckcount"] = this.obj[gate[i]]["luckcount"] === undefined ? 0 : this.obj[gate[i]]["luckcount"];
          // this.obj[i]["hitcount"] = this.obj[gate[i]]["hitcount"] === undefined ? 0 : this.obj[gate[i]]["hitcount"];
          // this.obj[i]["gate"] = 1;
          // }
        }
        this.calcComs_new()
        this.calcComs()
        if (srcafterload != undefined && srcafterload != "") {
          srcafterload = ""
        }
      }
      stage.pole.addself = unsafeWindow.addself = function (
        i,
        mname,
        init,
        eff,
        caster
      ) {
        if (mname == "lcr" || mname == "wof") {
          let cre = stage.pole.obj[i]
          cre["hitcount"] = 0
          cre["luckcount"] = 0
        }
        if (mname == "mrl") {
          stage.pole.clearPar(i, "morale")
          if (
            stage.pole.obj[i]["checkMrl"] === undefined ||
            stage.pole.obj[i]["checkMrl"] == 0
          ) {
            stage.pole.obj[i]["checkMrl"] = 1
          }
        }
        if (mname == "usd" && stage.pole.obj[i].id != 579) {
          //djinn_vizier ?
          console.log("1")
          stage.pole.incrementParam(i, "turnCount", -1)
        }
        var s = "",
          mn = "",
          meffect = ""
        if (!magic[i]) return false
        if (magic[i][mname]) {
          if (mname != "brf") {
            stage[war_scr].dispelmagic(i, mname, magic[i][mname]["effect"])
          }
        }
        magic[i][mname] = Array()
        magic[i][mname]["nowinit"] = init
        magic[i][mname]["effect"] = eff
        if (caster) {
          magic[i][mname]["caster"] = caster
        }
        if (init <= 0) {
          magic[i][mname] = 0
        }
        stage[war_scr].convertfromselfmagic(i, 1)
      }
      stage.pole.showmagicinfo = unsafeWindow.showmagicinfo = function (i, t = 0) {
        var k = 0,
          bit = 0
        mcount = -1
        ;(mname = []),
          (minit = []),
          (meffect = []),
          (mcast = []),
          (mdo = []),
          (mtype = []),
          (mperc = []),
          (out = "")
        var showeff = 1
        mcount = -1
        var tmp = i
        convertfromselfmagic2(i)
        var len = this.obj_array.length
        if (!this.obj[i].hero)
          for (var k1 = 0; k1 < len; k1++) {
            k = this.obj_array[k1]
            if (this.obj[k].owner == this.obj[i].owner && this.obj[k].hero) {
              i = k
              convertfromselfmagic2(i)
              break
            }
          }
        var plus = "",
          color = 0
        var dat = "<table>"
        i = tmp
        var enter = false
        if (!enter) {
          if (lang == 0) {
            dat +=
              "<tr><td>Тип</td><td width=10></td><td>Эффект</td><td width=10></td><td>Время</td></tr>"
          }
          if (lang == 1) {
            dat +=
              "<tr><td>Type</td><td width=10></td><td>Effect</td><td width=10></td><td>Time</td></tr>"
          }
        }
        if (this.obj[tmp].hero) {
          make_perks_html(this.obj[i].owner, stage[war_scr].subpath)
        } else {
          if (document.getElementById("hero_info_perks")) {
            document.getElementById("hero_info_perks").innerHTML = ""
            document.getElementById("hero_info_perks").style.display = "none"
          }
        }
        combat_was_vrag = Array()
        for (k = 0; k <= mcount; k++) {
          this.detectmagic(mname[k], k, tmp)
          if (minit[k] == 100000 && t == 1) {
            continue
          }
          if (
            minit[k] > 0 &&
            mdo[k] != "" &&
            (meffect[k] > 0 || meffect[k] == " " || mname[k] == "hyp")
          ) {
            enter = true
            plus = ""
            if (mtype[k] == 0) {
              color = "#0105b4"
            }
            if (mtype[k] == -1) {
              color = t ? "#ef312c" : "#b40501"
            }
            if (mtype[k] == 1) {
              color = t ? "#649615" : "#3f5b13"
            }
            if (mtype[k] == 1) {
              plus = "+"
            }
            if (mtype[k] == -1 && mname[k] != "mmn") {
              plus = "-"
            }
            if (mname[k] == "frd") {
              mcast[k] = lang ? "Defense" : "Защита"
            }
            dat +=
              '<tr style="color: ' +
              color +
              ';"><td>' +
              mcast[k] +
              "</td><td></td>"
            dat += "<td>"
            if (mtype[k] == 0) {
            } else {
              if (meffect[k] == " ") {
                meffect[k] = ""
                plus = ""
                mperc[k] = ""
              }
              let d = t
              if (mname[k] == "wof") {
                d = 0
              }
              dat +=
                (d != 1 ? mdo[k] : "") + "&nbsp;" + plus + meffect[k] + mperc[k]
            }
            dat += "</td><td> </td>"
            if (minit[k] == 100000) {
              dat += "<td>-</td></tr>"
            } else {
              dat += "<td>" + (minit[k] / 100).toFixed(2) + "</td></tr>"
            }
          }
        }
        if (!enter) {
          if (lang == 0) {
            dat = "<tr><td>Эффекты отсутствуют</td></tr>"
          }
          if (lang == 1) {
            dat = "<tr><td>No effects</td></tr>"
          }
        }
        dat += "</table>"
        document.getElementById("effects_list").innerHTML = dat
        document.getElementById("effects_info_head").innerHTML =
          this.get_name_html(i)
        return dat
      }
      stage.pole.calcdivinev = unsafeWindow.calcdivinev = function (i, xr, yr) {
        Totalmagicdamage = 0
        Totalmagickills = 0
        var ok = false
        var xx = 0,
          yy = 0,
          xp = 0,
          yp = 0
        mul = 1
        var len = this.obj_array.length
        for (var k1 = 0; k1 < len; k1++) {
          var j = this.obj_array[k1]
          this.obj[j]["attacked"] = 1
          this.obj[j]["attacked2"] = 1
        }
        var separhsum = this.obj[mapobj[xr + yr * defxn]].separhsum ?? 0
        var eff =
          (this.obj[i]["divineveffmain"] +
            Math.round(
              this.obj[i]["divineveffmult"] *
                Math.pow(this.obj[i]["nownumber"], 0.7)
            )) *
          Math.sqrt(separhsum)
        this.attackmagic(
          i,
          mapobj[xr + yr * defxn],
          eff,
          "other",
          "divinev",
          0,
          0,
          0
        )
        showuron(1)
      }
      stage.pole.calcflamestrike = unsafeWindow.calcflamestrike = function (
        i,
        xr,
        yr,
        magicuse,
        koef
      ) {
        Totalmagicdamage = 0
        Totalmagickills = 0
        var ok = false
        var xx = 0,
          yy = 0,
          xp = 0,
          yp = 0
        mul = 1
        var len = this.obj_array.length
        for (var k1 = 0; k1 < len; k1++) {
          var j = this.obj_array[k1]
          this.obj[j]["attacked"] = 1
          this.obj[j]["attacked2"] = 1
        }
        var herd = 0
        var hera = 0
        for (var k1 = 0; k1 < len; k1++) {
          k = this.obj_array[k1]
          if (
            this.obj[k].hero &&
            this.obj[k].owner == this.obj[mapobj[xr + yr * defxn]].owner
          )
            herd = k
          if (this.obj[k].hero && this.obj[k].owner == this.obj[i].owner)
            hera = k
        }
        let b = 0
        if (magic[hera] && magic[hera]["mle"]) {
          b = magic[hera]["mle"]["effect"]
          magic[hera]["mle"]["effect"] = 0
        }
        if (magic[herd] && magic[herd]["msk"]) {
          if (magic[herd]["mld"]) {
            let b = magic[herd]["mld"]["effect"]
            magic[herd]["mld"]["effect"] = magic[herd]["msk"]["effect"]
            this.attackmonster(
              i,
              xr,
              yr,
              xr,
              yr,
              mapobj[xr + yr * defxn],
              0,
              koef
            )
            magic[herd]["mld"]["effect"] = b
          } else {
            magic[herd]["mld"] = []
            magic[herd]["mld"]["effect"] = magic[herd]["msk"]["effect"]
            this.attackmonster(
              i,
              xr,
              yr,
              xr,
              yr,
              mapobj[xr + yr * defxn],
              0,
              koef
            )
            delete magic[herd]["mld"]
          }
        } else {
          this.attackmonster(
            i,
            xr,
            yr,
            xr,
            yr,
            mapobj[xr + yr * defxn],
            0,
            koef
          )
        }
        if (b != 0) {
          magic[hera]["mle"]["effect"] = b
        }
        showuron()
      }
      stage.pole.walk = unsafeWindow.walk = function (x, y) {
        loadmy(
          "battle.php?warid=" +
            warid +
            "&move=1&pl_id=" +
            player +
            "&my_monster=" +
            activeobj +
            "&x=" +
            x +
            "&y=" +
            y +
            "&lastturn=" +
            lastturn +
            "&lastmess=" +
            lastmess +
            "&lastmess2=" +
            lastmess2 +
            "&rand=" +
            mathrandom()
        )
      }
      stage.pole.calcchainlighting = unsafeWindow.calcchainlighting = function (
        i,
        xr,
        yr,
        magicuse
      ) {
        Totalmagicdamage = 0
        Totalmagickills = 0
        var ok = false
        var xx = 0,
          yy = 0,
          xp = 0,
          yp = 0
        mul = 1
        if (magicpower == true) mul = 1.5
        var len = this.obj_array.length
        for (var k1 = 0; k1 < len; k1++) {
          var j = this.obj_array[k1]
          this.obj[j]["attacked"] = 1
          this.obj[j]["attacked2"] = 1
        }
        var xx = 0,
          yy = 0,
          xp = 0,
          yp = 0
        if (magicuse == "chainlighting") {
          var lasto = mapobj[xr + yr * defxn]
          var j = lasto
          this.obj[j]["attacked2"] = 0
          var eff = this.obj[activeobj][magicuse + "_magiceff"]
          if (this.obj[activeobj]["spmult"] > 1) {
            eff = Math.round(
              this.obj[activeobj]["spmult"] *
                (this.obj[activeobj]["chainlightingeffmain"] +
                  this.obj[activeobj]["chainlightingeffmult"] *
                    Math.pow(this.obj[activeobj]["nownumber"], 0.7))
            )
          }
          this.attackmagic(
            i,
            mapobj[xr + yr * defxn],
            Math.round(eff * mul),
            "air",
            "lighting",
            0,
            0,
            0
          )
          let b = this.obj[j]["nownumber"]
          this.obj[j]["nownumber"] = this.obj[j]["nownumber"] + "\n#" + 1
          this.obj[j].set_number()
          this.obj[j]["nownumber"] = b
          let bDamage = Totalmagicdamage
          targetMagicdamage = Totalmagicdamage
          let totalh =
            (this.obj[j]["nownumber"] - 1) * this.obj[j]["maxhealth"] +
            this.obj[j]["nowhealth"]
          targetMagickills = Math.floor(
            Math.min(targetMagicdamage, totalh) / this.obj[j]["maxhealth"]
          )
          let nowhealth =
            this.obj[j]["nowhealth"] -
            (Math.min(targetMagicdamage, totalh) -
              targetMagickills * this.obj[j]["maxhealth"])
          if (nowhealth <= 0) targetMagickills++
          this.obj[j]["nownumber"] = b
          var penalty = Array(1, 0.5, 0.25, 0.125)
          let ambiguity = []
          let f = true
          for (var zz = 1; zz <= 3; zz++) {
            this.obj[lasto]["attacked"] = 0
            br = 0
            bj = 0
            var len = this.obj_array.length
            for (var k1 = 0; k1 < len; k1++) {
              j = this.obj_array[k1]
              rr =
                (this.obj[lasto]["x"] - this.obj[j]["x"]) *
                  (this.obj[lasto]["x"] - this.obj[j]["x"]) +
                (this.obj[lasto]["y"] - this.obj[j]["y"]) *
                  (this.obj[lasto]["y"] - this.obj[j]["y"])
              if (
                (rr <= br || br == 0) &&
                this.obj[j]["nownumber"] > 0 &&
                this.obj[j]["x"] < 20 &&
                !this.obj[j]["hero"] &&
                !this.obj[j]["stone"] &&
                this.obj[j]["y"] >= 0 &&
                !this.obj[j]["rock"] &&
                this.obj[j]["attacked2"] == 1
              ) {
                if (rr == br) {
                  ambiguity.push(j)
                } else {
                  ambiguity = [j]
                }
                br = rr
                bj = j
              }
            }
            if (zz == 1) {
              console.log(ambiguity)
              console.log(br)
            }
            if (bj > 0) {
              lasto = bj
              x1 = this.obj[bj]["x"]
              y1 = this.obj[bj]["y"]
              j = bj
              this.obj[j]["attacked2"] = 0
              this.attackmagic(
                i,
                j,
                Math.floor(Math.round(eff * mul) * penalty[zz]),
                "air",
                "lighting",
                0,
                0,
                0
              )
              let b = this.obj[j]["nownumber"]
              bDamage = Totalmagicdamage
              if (!f) {
                continue
              }
              if (ambiguity.length > 1) {
                f = false
                for (let i in ambiguity) {
                  let b1 = this.obj[ambiguity[i]]["nownumber"]
                  this.obj[ambiguity[i]]["nownumber"] =
                    this.obj[ambiguity[i]]["nownumber"] +
                    "\n#" +
                    (zz + 1) +
                    " ???"
                  this.obj[ambiguity[i]].set_number()
                  this.obj[ambiguity[i]]["nownumber"] = b1
                  setshadAbs(
                    this.obj[ambiguity[i]]["x"],
                    this.obj[ambiguity[i]]["y"],
                    1
                  )
                  this.obj[ambiguity[i]]["needSetNumber"] = 1
                }
              } else {
                this.obj[j]["nownumber"] =
                  this.obj[j]["nownumber"] + "\n#" + (zz + 1)
                setshadAbs(x1, y1, 1)
                this.obj[j].set_number()
                this.obj[j]["nownumber"] = b
              }
            }
          }
          ok = true
        }
        if (
          ok &&
          magicuse != "" &&
          (magicuse == "circle_of_winter" || magicuse == "icebolt") &&
          ((this.obj[activeobj]["hero"] && isperk(activeobj, 99)) ||
            this.obj[activeobj]["master_of_ice"])
        ) {
          this.showatb()
        }
        if (
          ok &&
          magicuse != "" &&
          this.obj[activeobj][magicuse + "elem"] == "air" &&
          ((this.obj[activeobj]["hero"] && isperk(activeobj, 100)) ||
            this.obj[activeobj]["master_of_storms"])
        ) {
          this.showatb()
        }
        if (ok) showuron(1)
      }
      unsafeWindow.setshadAbs = function (x, y, vis) {
        if (!initialized) return 0
        if (shado[y * defxn + x]) {
          set_visible(shado[y * defxn + x], vis)
        }
      }
      unsafeWindow.oneskill_button_release_test = function () {
        if (
          is_visible_element("magic_book") ||
          buttons_visible["scroll_runes"]
        ) {
          return 0
        }
        if (someactive || !inserted) {
          return 0
        }
        if (activeobj == 0) {
          return 0
        }
        if (
          activeobj > 0 &&
          stage.pole.obj[activeobj]["dash"] &&
          (magic[activeobj]["dsh"] === "undefined" ||
            magic[activeobj]["dsh"] === 0)
        ) {
          stage.pole.obj[activeobj].maxinit *= 2
          stage[war_scr].showatb(activeobj, 100)
          stage.pole.obj[activeobj].maxinit /= 2
        }
      }
      stage.pole.calcComs_new = function () {
        command_new = command
        var b = 0,
          i = 0,
          j = 0,
          x = 0,
          y = 0,
          k = 0,
          ok = false,
          time = 0,
          ii = false
        var cmd = ""
        if (Date.now() < waittimer && !finished) return 0
        if (!initialized) return 0
        if (someactive) {
          ok = false
          for (i = 1; i <= magicscount; i++) {
            if (
              ((magics[i].doing != "" && magics[i].doing != undefined) ||
                (magics[i].cmd != "" && magics[i].cmd != undefined)) &&
              magics[i] != undefined
            ) {
              ok = true
              break
            }
          }
          var len = this.obj_array.length
          for (var k1 = 0; k1 < len; k1++) {
            i = this.obj_array[k1]
            if (
              this.obj[i].active ||
              (this.obj[i].doing != "" && this.obj[i].doing != undefined) ||
              this.obj[i].donow2 == 1
            ) {
              if (this.obj[i].donow2 == 1) {
                this.obj[i].donow2c++
                if (this.obj[i].donow2 == 1 && this.obj[i].donow2c > 30) {
                  this.obj[i].x = Math.round(this.obj[i].destxx)
                  this.obj[i].y = Math.round(this.obj[i].destyy)
                  this.obj[i].donow2 = 0
                  this.obj[i].donow2c = 0
                  this.obj[i].set_pole_pos(this.obj[i].x, this.obj[i].y)
                }
              }
              if (this.obj[i].bomb) continue
              ok = true
              break
            }
          }
          someactive = ok
        }
        if (command_new == "") return 0
        k = tointeger(command_new.substr(1, 3))
        current = k
        cmd = command_new.substr(0, 1)
        if (loading) return 0
        while (
          cmd == "S" &&
          (command_new.substr(1, 3) == "at3" ||
            command_new.substr(1, 4) == "dsp-" ||
            command_new.substr(1, 4) == "ds2-" ||
            ((lastmagic == "rag" ||
              lastmagic == "ral" ||
              lastmagic == "raa" ||
              lastmagic == "ra2") &&
              command_new.substr(1, 3) == prelastmagic &&
              prelastmagic != "rgl") ||
            command_new.substr(1, 3) == "sld" ||
            command_new.substr(1, 3) == "aci" ||
            command_new.substr(1, 3) == "prt" ||
            command_new.substr(1, 3) == "scd" ||
            command_new.substr(1, 3) == "rnm" ||
            command_new.substr(1, 3) == "spc" ||
            command_new.substr(1, 3) == "wnd" ||
            command_new.substr(1, 3) == "bsh" ||
            command_new.substr(1, 3) == "net" ||
            command_new.substr(1, 3) == "rn4" ||
            command_new.substr(1, 3) == "enr" ||
            command_new.substr(1, 3) == "ass" ||
            command_new.substr(1, 3) == "btt" ||
            command_new.substr(1, 3) == "aim" ||
            command_new.substr(1, 3) == "mfc" ||
            command_new.substr(1, 3) == "zat" ||
            command_new.substr(1, 3) == "prp" ||
            command_new.substr(1, 3) == "eye" ||
            command_new.substr(1, 3) == "raa" ||
            command_new.substr(1, 3) == "fbd" ||
            command_new.substr(1, 3) == "wfr" ||
            command_new.substr(1, 3) == "rag" ||
            command_new.substr(1, 3) == "ral" ||
            command_new.substr(1, 3) == "ra2" ||
            command_new.substr(1, 3) == "mga" ||
            command_new.substr(1, 3) == "enc" ||
            command_new.substr(1, 3) == "rg2" ||
            command_new.substr(1, 3) == "mof" ||
            command_new.substr(1, 3) == "blt" ||
            command_new.substr(1, 3) == "ent" ||
            command_new.substr(1, 3) == "nmc" ||
            command_new.substr(1, 3) == "hfr" ||
            command_new.substr(1, 3) == "tob" ||
            command_new.substr(1, 3) == "cha" ||
            command_new.substr(1, 3) == "frz" ||
            command_new.substr(1, 3) == "wfr" ||
            command_new.substr(1, 3) == "blb" ||
            command_new.substr(1, 3) == "msl" ||
            command_new.substr(1, 3) == "slm" ||
            command_new.substr(1, 3) == "hsa" ||
            command_new.substr(1, 3) == "mlg" ||
            command_new.substr(1, 3) == "mvd" ||
            command_new.substr(1, 3) == "spi" ||
            command_new.substr(1, 3) == "mnl" ||
            command_new.substr(1, 3) == "eod" ||
            command_new.substr(1, 3) == "fod" ||
            command_new.substr(1, 3) == "fo2" ||
            command_new.substr(1, 3) == "wss" ||
            command_new.substr(1, 3) == "dtd" ||
            command_new.substr(1, 3) == "inv" ||
            command_new.substr(1, 3) == "irr" ||
            command_new.substr(1, 3) == "btr" ||
            command_new.substr(1, 3) == "flw" ||
            command_new.substr(1, 3) == "brf" ||
            command_new.substr(1, 3) == "chm" ||
            command_new.substr(1, 3) == "ard" ||
            command_new.substr(1, 3) == "rn9" ||
            command_new.substr(1, 3) == "def" ||
            command_new.substr(1, 3) == "dat" ||
            command_new.substr(1, 3) == "mrb" ||
            command_new.substr(1, 3) == "abs" ||
            command_new.substr(1, 3) == "cut" ||
            command_new.substr(1, 3) == "add" ||
            (lastmagic != "rgl" &&
              (lastmagic == command_new.substr(1, 3) ||
                (lastmagic.substr(0, 2) == "ds" &&
                  command_new.substr(1, 2) == "ds")) &&
              lastcaster == command_new.substr(4, 3) &&
              command_new.substr(1, 3) != "pss" &&
              command_new.substr(1, 3) != "paa"))
        ) {
          var obj_id = tointeger(command_new.substr(4, 3))
          if (command_new.substr(1, 3) == "def") {
            console.log("2")
            this.incrementParam(obj_id, "turnCount", -1)
          }
          command_new = command_new.substr(19)
          cmd = command_new.substr(0, 1)
          k = tointeger(command_new.substr(1, 3))
          current = k
        }
 
        if (
          (!someactive || cmd == "P") &&
          (!spellactive || flamewave_active) &&
          command_new.length > 1 &&
          loadcommand == "" &&
          (!loading || cmd == "P") &&
          initialized &&
          waitingcounter > 10
        ) {
          if (cmd == "S") {
            if (
              command_new.substr(1, 3) == "sac" &&
              tointeger(command_new.substr(13, 1)) == 1
            ) {
              let objId = tointeger(command_new.substr(4, 3))
              if (
                stage.pole.obj[objId]["checkTurn"] === undefined ||
                stage.pole.obj[objId]["checkTurn"] == 0
              ) {
                //stage.pole.obj[objId]["checkTurn"] = 1;
              }
            }
          }
 
          if (cmd == "r") {
            if (lastRaidsCount != stage.pole.obj[current]["nownumber"]) {
              raidsCurrentWave++
              stage.pole.showmitnv(1)
              lastRaidsCount = stage.pole.obj[current]["nownumber"]
            }
          }
          if (cmd == "w") {
            this.incrementParam(current, "turnCount", -1)
          }
          if (cmd == "u" && !stage.pole.obj[current]["endurance"]) {
            let u = new Date(Date.now())
            let time =
              u.getHours() +
              ":" +
              ("0" + u.getMinutes()).substr(-2) +
              ":" +
              ("0" + u.getSeconds()).substr(-2)
            let new_content = "[" + time + "] Скорость мобов +1"
            let chat_id = classic_chat ? "chat_classic_inside" : "chat_inside"
            if (addSpeedLastTurn != nowturn) {
              add_newtext(chat_id, new_content)
              addSpeedLastTurn = nowturn
            }
          }
          if (command_new.substr(0, 4) == "Sini") {
            let u = new Date(Date.now())
            let time =
              u.getHours() +
              ":" +
              ("0" + u.getMinutes()).substr(-2) +
              ":" +
              ("0" + u.getSeconds()).substr(-2)
            let new_content = "[" + time + "] Иня мобов +1"
            let chat_id = classic_chat ? "chat_classic_inside" : "chat_inside"
            if (addIniLastTurn != nowturn) {
              add_newtext(chat_id, new_content)
              addIniLastTurn = nowturn
            }
          }
          if (cmd == "i") {
            j = tointeger(command_new.substr(4, 4))
            if (current != -1 && current > 0) {
              if (
                this.obj[current].nowinit <= 0 &&
                this.obj[current].nowinit + j > 0
              ) {
                if (
                  magic[current] &&
                  magic[current]["hyp"] &&
                  magic[current]["hyp"]["nowinit"] > 0
                ) {
                  return 0
                }
                this.incrementParam(current, "turnCount")
              }
            }
          }
          if (cmd == "s" && !someactive && !loading) {
            //gating
            if (this.obj[current].x >= 100) {
              //gate[current] = activeobj;
              this.incrementParam(activeobj, "turnCount", -1)
            } else {
              k = tointeger(command_new.substr(8, 5))
              if (
                this.obj[current].id != 347 &&
                this.obj[current].id != 349 &&
                !this.obj[current].bonus
              ) {
                if (k == 0) {
                  this.incrementParam(activeobj, "turnCount", -1)
                  return 0
                }
                this.incrementParam(current, "turnCount", -1)
              }
            }
          }
        }
      }
      stage.pole.incrementParam = function (i, name, value = 1) {
        let cre = this.obj[i]
        if (cre === undefined) {
          return 0
        }
        if (cre[name] === undefined) {
          cre[name] = 0
        }
        cre[name] += value
      }
      stage.pole.setParam = function (i, name, value = 0) {
        let cre = this.obj[i]
        if (cre === undefined) {
          return 0
        }
        cre[name] = value
      }
      stage.pole.atb_scale = function (anyway) {
        document.getElementById("effectsDisplay").style.display =
          chatMode() == "V" ? "none" : ""
        cur_scaling = 1
        atby = Math.round(
          scr_top + pole_top_now + pole_height + atb_top * this.scaling
        )
        atbx = Math.round(
          (stage_width - scr_left - scr_right) / 2 +
            scr_left -
            ((atb_width * atb_scaling * atb_count) / 2) * this.scaling
        )
        if (!this.setted_atb) return 0
        if (!this.showed_atb) return 0
        this.atbg.x1 = Math.floor(atbx)
        this.atbg.y1 = Math.floor(atby)
        var sc = atb_cnt
        if (!inserted) {
          sc = stackcount - 1
          atb_n_x =
            atbx +
            (((atb_count - stackcount) * atb_width * atb_scaling) / 2) *
              cur_scaling *
              this.scaling
          this.atbg.x1 = Math.floor(atb_n_x)
        }
        set_scaleX(this.atbg2, this.scaling)
        set_scaleY(this.atbg2, this.scaling)
        set_X(this.atbg, Math.floor(this.atbg.x1))
        set_Y(this.atbg, Math.floor(this.atbg.y1))
        var k = cur_scaling * 90
        if (k < 20) {
          k = 20
        }
        if (atbsd > 0) {
          set_fontSize(this.ochered, k * atb_scaling)
          set_strokeThickness(
            this.ochered,
            (k / atb_font_size) * atb_stroke_width * atb_scaling
          )
          set_X(
            this.ochered,
            Math.floor(10 * cur_scaling * atb_scaling) +
              Math.round(atb_scroll_x * cur_scaling)
          )
          set_Y(this.ochered, Math.round(1 * cur_scaling))
        }
        let flag = true
        let dop = 40
        for (var j = 0; j <= atb_count; j++) {
          i = this.p_array[j]
          if (j > sc) {
            set_visible(this.ntext[j], 0)
            set_visible(this.portraits[j], 0)
            continue
          } else {
            set_visible(this.portraits[j], 1)
          }
          if (this.ntext[i]) {
            var ntext_vis = get_visible(this.ntext[i])
            if (ntext_vis) {
              var k = cur_scaling * 50 * atb_scaling
              if (k < 14) {
                k = 14
              }
              set_fontSize(this.ntext[i], k)
              while (
                get_width(this.ntext[i]) >
                  (atb_width * atb_scaling - 16) * cur_scaling &&
                k > 5
              ) {
                k--
                set_fontSize(this.ntext[i], k)
              }
              set_strokeThickness(
                this.ntext[i],
                (k / atb_font_size) * atb_stroke_width
              )
              if (this.ntext[i].need_cache || anyway) {
                this.ntext[i].need_cache = 0
              }
              set_X(
                this.ntext[i],
                Math.round(
                  atb_width * atb_scaling * (j + 1) * cur_scaling -
                    get_width(this.ntext[i]) -
                    8 * cur_scaling * atb_scaling
                )
              )
              set_Y(
                this.ntext[i],
                Math.round(
                  atb_height * atb_scaling * cur_scaling -
                    get_height(this.ntext[i]) * 0.98
                )
              )
              if (flag === true) {
                flag = false
                //dop = Math.round(atb_width * atb_scaling * cur_scaling - get_width(this.ntext[i]) - 8 * cur_scaling * atb_scaling)/2;
              }
            }
          }
          if (!this.portraits[i]) {
            continue
          }
          set_X(
            this.portraits[i],
            Math.round(j * atb_width * atb_scaling * cur_scaling)
          )
          set_visible(this.portraits[i], 1)
          if (this.portraits[i].img.show_it)
            set_visible(this.portraits[i].img, 1)
        }
        document.getElementById("dop-info").style.top =
          this.atbg.y1 * (1 / MainPixelRatio) + "px"
        document.getElementById("dop-info").style.width =
          stage.pole.atbg.x1 * (1 / MainPixelRatio) + "px"
        document.getElementById("dop-info").style.fontSize =
          Math.round(
            (atb_scaling *
              atb_height *
              stage.pole.scaling *
              (1 / MainPixelRatio)) /
              3 +
              1
          ) + "px"
        document.getElementById("dop-info").style.left = "0px"
        re_cache_atb()
      }
      stage.pole.getMoraleN = function (i) {
        if (!this.obj[i].hasOwnProperty("nametxt")) return 0
        var festering = false
        var deathstare = false
        let mimmune = false
        if (inserted) {
          mimmune = false
          if (magic[i] && magic[i]["wfr"] && magic[i]["wfr"]["effect"] == 1)
            mimmune = true
          if (this.obj[i]["twistedmind"] == 1) mimmune = true
          var k = 0
          var x = 0,
            y = 0,
            b = 0,
            x2 = 0,
            y2 = 0,
            b2 = 0
          var len = this.obj_array.length
          for (var k1 = 0; k1 < len; k1++) {
            k = this.obj_array[k1]
            if (
              this.obj[k].festeringaura &&
              !this.obj[i].undead &&
              this.obj[k].nownumber > 0 &&
              this.obj[i].side != this.obj[k].side
            ) {
              var bigx = this.obj[i]["big"]
              var bigy = this.obj[i]["big"]
              if (this.obj[i]["bigx"]) bigx = 1
              if (this.obj[i]["bigy"]) bigy = 1
              var bigkx = this.obj[k]["big"]
              var bigky = this.obj[k]["big"]
              if (this.obj[k]["bigx"]) bigkx = 1
              if (this.obj[k]["bigy"]) bigky = 1
              for (x = this.obj[i].x; x <= this.obj[i].x + bigx; x++) {
                for (y = this.obj[i].y; y <= this.obj[i].y + bigy; y++) {
                  for (x2 = this.obj[k].x; x2 <= this.obj[k].x + bigkx; x2++) {
                    for (
                      y2 = this.obj[k].y;
                      y2 <= this.obj[k].y + bigky;
                      y2++
                    ) {
                      if (Math.abs(x - x2) <= 1 && Math.abs(y - y2) <= 1) {
                        festering = true
                      }
                    }
                  }
                }
              }
            }
          }
        }
        if (inserted) {
          mimmune = false
          if (magic[i] && magic[i]["wfr"] && magic[i]["wfr"]["effect"] == 1)
            mimmune = true
          if (this.obj[i]["twistedmind"] == 1) mimmune = true
        }
        var morale = 0
        var day = 0
        if (
          heroes[this.obj[i].owner] &&
          magic[heroes[this.obj[i].owner]]["day"]
        ) {
          day = magic[heroes[this.obj[i].owner]]["day"]["effect"]
        }
        if (
          this.obj[i].stone ||
          this.obj[i].statix ||
          this.obj[i].portal ||
          (day != 1 &&
            (this.obj[i].undead ||
              this.obj[i].elemental ||
              this.obj[i].mechanical ||
              this.obj[i].warmachine ||
              magic[i]["und"]))
        ) {
          morale = 0
        } else {
          ma = 0
          if (this.obj[i].moraleaddon) ma = this.obj[i].moraleaddon
          var m = ma
          if (this.obj[i].packpower) {
            var len = this.obj_array.length
            for (var k1 = 0; k1 < len; k1++) {
              k = this.obj_array[k1]
              if (
                k != i &&
                this.obj[k].packpower &&
                this.obj[k].nownumber > 0 &&
                this.obj[k].side == this.obj[i].side &&
                this.obj[k].x <= defxn
              ) {
                m++
                if (this.obj[k].packboss) m++
              }
            }
          }
          if (inserted) {
            var k = 0
            var x = 0,
              y = 0,
              b = 0,
              x2 = 0,
              y2 = 0,
              b2 = 0
            var frig = false
            var brave = false
            var deathstare = false
            var set_zero_morale = false
            var len = this.obj_array.length
            for (var k1 = 0; k1 < len; k1++) {
              k = this.obj_array[k1]
              if (
                this.obj[k].deathstare &&
                this.obj[k].side != this.obj[i].side &&
                this.obj[k].nownumber > 0 &&
                !mimmune
              )
                deathstare = true
              if (
                this.obj[k].frightful_aura &&
                this.obj[k].side != this.obj[i].side &&
                this.obj[k].nownumber > 0 &&
                !mimmune
              ) {
                var bigx = this.obj[i]["big"]
                var bigy = this.obj[i]["big"]
                if (this.obj[i]["bigx"]) bigx = 1
                if (this.obj[i]["bigy"]) bigy = 1
                var bigkx = this.obj[k]["big"]
                var bigky = this.obj[k]["big"]
                if (this.obj[k]["bigx"]) bigkx = 1
                if (this.obj[k]["bigy"]) bigky = 1
                for (x = this.obj[i].x; x <= this.obj[i].x + bigx; x++) {
                  for (y = this.obj[i].y; y <= this.obj[i].y + bigy; y++) {
                    for (
                      x2 = this.obj[k].x;
                      x2 <= this.obj[k].x + bigkx;
                      x2++
                    ) {
                      for (
                        y2 = this.obj[k].y;
                        y2 <= this.obj[k].y + bigky;
                        y2++
                      ) {
                        if (Math.abs(x - x2) <= 1 && Math.abs(y - y2) <= 1) {
                          frig = true
                        }
                      }
                    }
                  }
                }
              }
              if (
                this.obj[k].auraofbravery &&
                this.obj[k].side == this.obj[i].side &&
                this.obj[k].nownumber > 0
              ) {
                var bigx = this.obj[i]["big"]
                var bigy = this.obj[i]["big"]
                if (this.obj[i]["bigx"]) bigx = 1
                if (this.obj[i]["bigy"]) bigy = 1
                var bigkx = this.obj[k]["big"]
                var bigky = this.obj[k]["big"]
                if (this.obj[k]["bigx"]) bigkx = 1
                if (this.obj[k]["bigy"]) bigky = 1
                for (x = this.obj[i].x; x <= this.obj[i].x + bigx; x++) {
                  for (y = this.obj[i].y; y <= this.obj[i].y + bigy; y++) {
                    for (
                      x2 = this.obj[k].x;
                      x2 <= this.obj[k].x + bigkx;
                      x2++
                    ) {
                      for (
                        y2 = this.obj[k].y;
                        y2 <= this.obj[k].y + bigky;
                        y2++
                      ) {
                        if (Math.abs(x - x2) <= 1 && Math.abs(y - y2) <= 1) {
                          brave = true
                        }
                      }
                    }
                  }
                }
              }
              if (
                (this.obj[i].morale > 0 || m > 0) &&
                !this.obj[i].bravery &&
                !mimmune &&
                this.obj[k].menacinglook &&
                this.obj[k].side != this.obj[i].side &&
                this.obj[k].nownumber > 0
              ) {
                var bigx = this.obj[i]["big"]
                var bigy = this.obj[i]["big"]
                if (this.obj[i]["bigx"]) bigx = 1
                if (this.obj[i]["bigy"]) bigy = 1
                var bigkx = this.obj[k]["big"]
                var bigky = this.obj[k]["big"]
                if (this.obj[k]["bigx"]) bigkx = 1
                if (this.obj[k]["bigy"]) bigky = 1
                for (x = this.obj[i].x; x <= this.obj[i].x + bigx; x++) {
                  for (y = this.obj[i].y; y <= this.obj[i].y + bigy; y++) {
                    for (
                      x2 = this.obj[k].x;
                      x2 <= this.obj[k].x + bigkx;
                      x2++
                    ) {
                      for (
                        y2 = this.obj[k].y;
                        y2 <= this.obj[k].y + bigky;
                        y2++
                      ) {
                        if (Math.abs(x - x2) <= 1 && Math.abs(y - y2) <= 1) {
                          m = 0
                          set_zero_morale = true
                        }
                      }
                    }
                  }
                }
              }
            }
            if (frig) {
              m -= 3
              this.clearPar(i, "morale")
            }
          }
          if (!mimmune && festering) {
            //+
            m -= 2
            this.clearPar(i, "morale")
          }
          if (!mimmune && deathstare) {
            m -= 1
          }
          morale = this.obj[i].morale + m
          if (set_zero_morale) {
            morale = 0
            brave = false
          }
          if (this.obj[i].morale + m < 3 && this.obj[i].bravery) {
            morale = 3
          }
          if (this.obj[i].morale + m < 3 && brave) {
            if (!this.obj[i].bravery && !this.obj[i].auraofbravery) {
              this.clearPar(i, "morale")
            }
            morale = 3
          }
        }
        if (magic[i] && magic[i]["hyp"] && magic[i]["hyp"]["nowinit"] > 0) {
          morale = Math.min(0, morale)
        }
        return morale
      }
      stage.pole.clearPar = function (i, name) {
        if (this.obj[i] === "undefined") {
          return 0
        }
        if (name == "morale") {
          this.obj[i].moraleCount = 0
          this.obj[i].turnCount = 0
        }
        if (name == "luck") {
          this.obj[i].luckcount = 0
          this.obj[i].hitcount = 0
        }
      }
      stage.pole.showmi = unsafeWindow.showmi = function (i) {
        if (typeof unsafeWindow.mini_info_panel === "undefined") return 0
        if (i > 0) {
          testBlock(i)
          infoBlock(i)
        } else {
          testBlock()
          infoBlock()
        }
        if (i == -1) {
          return 0
        }
        if (typeof unsafeWindow.mini_info_panel.miss === "undefined") {
          var stat = "miss"
          var temp = Make_Sprite()
          temp.inited_show = true
          temp.r = 0
          temp.aaa = "miss"
          set_visible(temp, 0)
          var img_temp = My_Image({
            offsetX: -razmetka["war_images"][17][mqc["sdx"]],
            offsetY: -razmetka["war_images"][17][mqc["sdy"]],
            image: stage.pole.ground["war_images"],
            width: razmetka["war_images"][19][mqc["xs"]],
            height: razmetka["war_images"][19][mqc["ys"]] / 2,
            crop: {
              x: razmetka["war_images"][19][mqc["x"]],
              y:
                razmetka["war_images"][19][mqc["y"]] +
                razmetka["war_images"][19][mqc["ys"]] / 2,
              width: razmetka["war_images"][19][mqc["xs"]],
              height: razmetka["war_images"][19][mqc["ys"]] / 2,
              visible: 1,
            },
            listening: false,
          })
          Make_addChild(temp, img_temp)
          mini_info_panel[stat] = temp
          var ttext = Make_Text("", {
            x: 55,
            y: 0,
            fontFamily: "Arial",
            fontStyle_konva: "Bold",
            fontSize: mini_info_font_size,
            fill: 0xffffff,
            stroke: 0x000000,
            strokeThickness: miniinfo_stroke_width,
            //						  strokeThickness: 0.5,
            shadowForStrokeEnabled: false,
            //						  textBaseline: 'middle',
            dropShadowColor: 0x000000,
            dropShadowAlpha: 1,
            dropShadowBlur: 2,
            dropShadow: true,
            dropShadowDistance: 0,
            dropShadowAngle: 0,
          })
          set_X(ttext, 55)
          set_Y(ttext, 0)
          temp.line = ttext
          Make_addChild(temp, ttext)
          Make_addChild(mini_info_panel, temp)
        }
        var y = Array(-7.45, 0.5, 9.05, 18.5)
        var k = 0
        if (
          !this.obj[i].mvisible ||
          this.obj[i].nownumber <= 0 /*||(this.obj[i]._x<0)*/
        )
          return 0
        var stats = ["tnv", "wave", "health", "blood", "mana", "arrow", "miss"]
        this.mini_info_panel_scale()
        var s_stats = Array()
        for (var j = 0; j < stats.length; j++) {
          if (mini_info_panel[stats[j]]) {
            set_visible(mini_info_panel[stats[j]], 0)
          }
          s_stats[stats[j]] = ""
        }
        set_visible(mini_info_panel, 1)
        var ntxt = ""
        if (this.obj[i].hero) {
          switch (lang) {
            case 0:
              ntxt =
                this.obj[i].nametxt + " [" + this.obj[i].maxhealth + " ур.]"
              break
            case 1:
              ntxt =
                this.obj[i].nametxt + " [" + this.obj[i].maxhealth + " lev.]"
              break
          }
          if (this.obj[i].maxmanna > 0 || this.obj[i].nowmanna > 0) {
            s_stats["mana"] = this.obj[i].nowmanna + "/" + this.obj[i].maxmanna
          }
          if (magic[i]["tur"]) {
            s_stats["tnv"] = magic[i]["tur"]["effect"] + "%"
          }
        } else {
          if (this.obj[i].boss > 0) {
            switch (lang) {
              case 0:
                ntxt = this.obj[i].nametxt + " [" + this.obj[i].boss + " ур.]"
                break
              case 1:
                ntxt = this.obj[i].nametxt + " [" + this.obj[i].boss + " lev.]"
                break
            }
          } else {
            ntxt = this.obj[i].nametxt
            if (this.obj[i].nownumber > 0) {
              var addinf = " [" + this.obj[i].nownumber + "]"
              if (
                this.obj[i].stone ||
                this.obj[i].statix ||
                this.obj[i].warmachine ||
                this.obj[i].portal ||
                magic[i]["nnm"] ||
                magic[i]["BLD"]
              ) {
                addinf = ""
              }
              ntxt = this.obj[i].nametxt + addinf
            } else {
              ntxt = this.obj[i].nametxt + " [" + this.obj[i].maxnumber + "]"
            }
            if (magic[i]["lev"]) {
              switch (lang) {
                case 0:
                  ntxt += "(" + magic[i]["lev"]["effect"] + " ур)"
                  break
                case 1:
                  ntxt += "(" + magic[i]["lev"]["effect"] + " lev)"
                  break
              }
            }
          }
          s_stats["health"] =
            this.obj[i].nowhealth + "/" + this.obj[i].maxhealth
          if (this.obj[i].shooter && !this.obj[i].shadowattack) {
            s_stats["arrow"] = this.obj[i].shots
          }
          if (
            this.obj[i].caster &&
            this.obj[i].caster != "" &&
            !this.obj[i].randomcasterd &&
            !this.obj[i].crystal
          ) {
            s_stats["mana"] = this.obj[i].nowmanna + "/" + this.obj[i].maxmanna
          }
          if (magic[i]["rag"] && this.obj[i]["ragingblood"]) {
            var rlevel = Array(-10000, 200, 500, 1000)
            var lev = 1
            for (var z = 1; z <= 2; z++) {
              if (rlevel[z] <= magic[i]["rag"]["effect"]) lev = z + 1
            }
            var her = 0,
              herolevel = 0
            var len = this.obj_array.length
            for (var k1 = 0; k1 < len; k1++) {
              var z = this.obj_array[k1]
              if (this.obj[z].hero && this.obj[z].owner == this.obj[i].owner)
                her = z
            }
            if (her > 0) herolevel = this.obj[her].maxhealth
            s_stats["blood"] = magic[i]["rag"]["effect"] + " / " + rlevel[lev]
            k++
          }
          s_stats["miss"] = ""
          if (this.obj[i].incorporeal) {
            if (this.obj[i].misscount == 1) {
              s_stats["miss"] = "50% +"
            } else if (this.obj[i].misscount == 2) {
              s_stats["miss"] = "0%"
            } else if (this.obj[i].misscount == -1) {
              s_stats["miss"] = "50% -"
            } else if (this.obj[i].misscount == -2) {
              s_stats["miss"] = "100%"
            } else {
              s_stats["miss"] = "50%"
            }
          }
        }
        ntxt = ""
        set_text(mini_info_panel.name_text, ntxt)
        var y = 0
        for (var j = 0; j < stats.length; j++) {
          if (s_stats[stats[j]] != "") {
            set_visible(mini_info_panel[stats[j]], 1)
            set_Y(mini_info_panel[stats[j]], y - 5)
            set_Y(mini_info_panel[stats[j]].line, 5)
            set_text(mini_info_panel[stats[j]].line, s_stats[stats[j]])
            set_fontSize(mini_info_panel[stats[j]].line, mini_info_font_size)
            var k = mini_info_font_size
            var p_height = get_height(mini_info_panel[stats[j]].line)
            while (get_width(mini_info_panel[stats[j]].line) > 180 && k > 3) {
              k--
              set_fontSize(mini_info_panel[stats[j]].line, k)
            }
            p_height -= get_height(mini_info_panel[stats[j]].line)
            set_Y(mini_info_panel[stats[j]].line, 5 + Math.floor(p_height / 2))
            set_strokeThickness(
              mini_info_panel[stats[j]].line,
              (k / mini_info_font_size) * miniinfo_stroke_width
            )
            yplus = 40
            y += yplus
            if (y >= yplus * 3) break
          }
        }
      }
      unsafeWindow.raidsCountWaves = 0
      if (btype == 8) {
        let lastCount = 0
        for (i in stage.pole.obj) {
          if (
            stage.pole.obj[i].owner == 2 &&
            lastCount != stage.pole.obj[i].nownumber
          ) {
            raidsCountWaves++
            lastCount = stage.pole.obj[i].nownumber
          }
        }
      }
      stage.pole.showmitnv = function (raids = 0) {
        if (typeof unsafeWindow.mini_info_panel === "undefined") return 0
        if (tnvscore == 0 && raids == 0) return 0
        var y = Array(-7.45, 0.5, 9.05, 18.5)
        var k = 0
        this.mini_info_panel_scale()
        var s_stats = Array()
        var stats = ["tnv", "health", "blood", "mana", "arrow"]
        for (var j = 0; j < stats.length; j++) {
          set_visible(mini_info_panel[stats[j]], 0)
          s_stats[stats[j]] = ""
        }
        set_visible(mini_info_panel, 1)
        var stats = ["tnv", "wave"]
        var y = 10
        var txt = Array()
        txt[0] = tnvscore
        if (raids == 1) {
          txt[1] = raidsCurrentWave + "/" + raidsCountWaves
        } else if (raids == 2) {
          txt[1] = global_init / 100 + " time"
        } else {
          txt[1] = tnvwave
        }
        set_text(mini_info_panel.name_text, "")
        for (var j = Math.ceil(raids / 10); j <= 1; j++) {
          set_visible(mini_info_panel[stats[j]], 1)
          set_X(mini_info_panel[stats[j]], 5)
          set_Y(mini_info_panel[stats[j]], y - 5)
          set_Y(mini_info_panel[stats[j]].line, 5)
          set_text(mini_info_panel[stats[j]].line, " " + txt[j])
          set_fontSize(mini_info_panel[stats[j]].line, mini_info_font_size)
          var k = mini_info_font_size
          while (get_width(mini_info_panel[stats[j]].line) > 175 && k > 3) {
            k--
            set_fontSize(mini_info_panel[stats[j]].line, k)
          }
          set_strokeThickness(
            mini_info_panel[stats[j]].line,
            (k / mini_info_font_size) * miniinfo_stroke_width
          )
          yplus = 60
          y += yplus
        }
      }
      document
        .getElementById("oneskill_button")
        .addEventListener("mouseover", oneskill_button_release_test)
      document
        .getElementById("oneskill_button")
        .addEventListener("mouseout", waitbutton_onRollOut)
      document
        .getElementById("oneskill_button2")
        .addEventListener("mouseover", oneskill_button_release_test)
      document
        .getElementById("oneskill_button2")
        .addEventListener("mouseout", waitbutton_onRollOut)
      stage.pole.atb_scale()
      unsafeWindow.timer_show_army = function () {
        nframe++
        var time_now = Date.now()
        if (last_timer_in == 0) last_timer_in = time_now
        var skip_frame = Math.min(
          1,
          Math.max(
            0,
            Math.floor((time_now - last_timer_in) / timer_interval) - 1
          )
        )
        var fps_l = 1000 / (time_now - last_timer_in)
        if (fps_long == 0) {
          fps_long = fps_l
        } else {
          fps_long = Math.min(fps_l, fps_long)
        }
        if (war_scr == "") return 0
        if (!was_benchmark) return 0
        if (animspeed_def < 1 && nframe % 2 == 0 && skip_frame == 0) {
          next_timer()
          return 0
        }
        animspeed = Math.max(1, animspeed_def) * (skip_frame + 1)
        last_timer_in = time_now
        if (skip_frame) {
          total_skips++
          total_skips2++
        } else {
          total_skips = 0
        }
        if (total_skips > 1) {
          skip_frame = 0
          total_skips = 0
        }
        was_skip_frame = skip_frame
        try {
          if (typeof unsafeWindow.stage[war_scr].animate_army === "function") {
            stage[war_scr].animate_army(nframe, skip_frame)
            updateBar(btype == 145 ? 6 : 2)
            if (
              typeof unsafeWindow.mini_info_panel !== "undefined" &&
              !mini_info_panel.visible
            ) {
              testBlock()
              infoBlock()
            }
            for (k in stage.pole.obj) {
              if (stage.pole.obj[k].hero != undefined) continue
              stage.pole.luckMoraleProbability(k, "morale")
              if (
                ((stage.pole.obj[k].nownumber == 0 &&
                  stage.pole.obj[k].gate != 1) ||
                  (stage.pole.obj[k].nowhealth == 0 &&
                    stage.pole.obj[k].last_dead != 1 &&
                    stage.pole.obj[k].gate == 1)) &&
                (inserted ||
                  stage.pole.obj[k].owner == 2 ||
                  btype == _QUESTWAR ||
                  btype == _VILLAGE_EVENT) &&
                !stage.pole.obj[k].rock
              ) {
                if (magic[k].def !== undefined) {
                  delete magic[k].def
                }
              }
            }
            if (magicuse != "chainlighting") {
              for (let i in stage.pole.obj) {
                if (
                  lastChain != 0 &&
                  stage.pole.obj[lastChain].chain &&
                  stage.pole.obj[i].needSetNumber == 1 &&
                  stage.pole.obj[lastChain].chain.indexOf(parseInt(i)) == -1
                ) {
                  stage.pole.obj[i].set_number()
                  stage.pole.obj[i].needSetNumber = 0
                }
              }
            }
            if (btime != global_init && btype == 119) {
              // stage.pole.showmitnv(2);
              btime = global_init
            }
          }
        } catch (e) {
          my_alert(e.stack + " " + war_scr)
        }
      }
      stage.pole.getmorale = stage.pole.getMoraleN
    }
  }
 
  if (location.pathname.indexOf("inventory.php") >= 0) {
    var inp = ""
    var bt = ""
    function inv_art_search_show() {
      let info = document.getElementById("inv_art_amount")
      for (let i = 0; i < info.children.length; i++) {
        info.children[i].style.display = "none"
      }
      if (inp == "") {
        inp = document.createElement("input")
        inp.setAttribute("placeholder", "Поиск по названию")
        inp.setAttribute("type", "text")
        inp.setAttribute("id", "inp_search")
        info.append(inp)
        inp.addEventListener("input", search)
        inp.style.display = "inline-block"
        bt = document.createElement("button")
        bt.innerHTML = "Скрыть поиск"
        bt.setAttribute("id", "bt_search")
        info.append(bt)
        bt.addEventListener("click", hide_search)
        bt.style.display = "inline-block"
      } else {
        bt.style.display = "inline-block"
        inp.style.display = "inline-block"
      }
      start_hide_hwm_hint()
    }
    function hide_search() {
      let info = document.getElementById("inv_art_amount")
      for (let i = 0; i < info.children.length; i++) {
        info.children[i].style.display =
          info.children[i].tagName == "DIV" ? "inline-block" : "none"
      }
    }
    function search() {
      let s = document.getElementById("inp_search").value
      let el = document.getElementById("inventory_block")
      for (let i = 0; i < el.children.length; i++) {
        let id = el.children[i].getAttribute("art_idx")
        if (id == null) {
          continue
        }
        el.children[i].style.display = arts[id].name
          .toLowerCase()
          .includes(s.toLowerCase())
          ? "block"
          : "none"
      }
    }
    let sDiv = document.createElement("div")
    let sImg = document.createElement("img")
    sImg.setAttribute("src", dailyURL + "i/search_logo.png")
    sImg.setAttribute("class", "inv_100mwmh")
    sDiv.append(sImg)
    sDiv.classList.add("divs_inline_right_24")
    sDiv.classList.add("btn_hover")
    sDiv.classList.add("show_hint")
    sDiv.style.right = "28px"
    document.getElementById("inv_art_amount").append(sDiv)
    sDiv.setAttribute("hint", "Поиск по названию")
    sDiv.setAttribute("hwm_hint_added", 1)
    sDiv.addEventListener("mousemove", show_hwm_hint)
    sDiv.addEventListener("touchstart", show_hwm_hint)
    sDiv.addEventListener("mouseout", hide_hwm_hint)
    sDiv.addEventListener("touchend", hide_hwm_hint)
    sDiv.addEventListener("click", inv_art_search_show)
  }
  if (
    location.pathname.indexOf("war.php") >= 0 ||
    location.pathname.indexOf("warlog.php") >= 0
  ) {
    let timer = setInterval(check_start, 10)
    function check_start() {
      //if (unsafeWindow.gpause == false) {
      //    unsafeWindow.gpause = true;
      //    clearInterval(timer);
      //}
    }
    var warid = location.search.match(/warid=([0-9]+)/)[1]
    var key = ""
    if (location.search.match(/show_for_all=([0-9a-zA-Z]+)/)) {
      key = location.search.match(/show_for_all=([0-9a-zA-Z]+)/)[1]
    }
    var att = 0
    var unit = ["", "", "", "", "", "", "", ""]
    getAtb(0)
    document.getElementById("confirm_ins").addEventListener(
      "click",
      function () {
        setTimeout(getAtb(1), 4000)
      },
      false
    )
    function getAtb(r) {
      GM_xmlhttpRequest({
        method: "GET",
        url: "/battle.php?lastturn=-3&warid=" + warid + "&show_for_all=" + key,
        onload: function (res) {
          let info =
            "<style>.cont{position:relative;display:inline-block}.count {position: absolute;right: 0;bottom: 0;color: #f5c140;text-shadow: 0px 0px 3px #000, 0px 0px 3px #000, 0px 0px 3px #000, 0px 0px 3px #000;font-size: 1rem;font-weight: bold;}</style>"
          info += "<b>Стартовый бонус АТБ</b><BR>"
          if (res.responseText == "t=950turns=") {
            if (r == 1) {
              info += "Ошибка загрузки, начните бой и обновите страницу!"
            } else {
              return false
            }
          }
          let data = res.responseText
            .substring(res.responseText.indexOf(";/") + 2)
            .split(";")
          for (let i = 0; i < data.length - 1; i++) {
            if (data[i].indexOf("|rock|") != -1) {
              continue
            }
            let unitNum = Number(data[i].substring(1, 3))
            let armyNum = Number(data[i].substring(5 + 0 * 6, 5 + 1 * 6)) - 1
            let count = Number(data[i].substring(5 + 12 * 6, 5 + 13 * 6))
            let startAtb =
              100 - Number(data[i].substring(5 + 9 * 6, 5 + 10 * 6))
            let img
            if (data[i].indexOf("|hero|") == -1) {
              img = data[i].substring(5 + 24 * 6, data[i].indexOf("|"))
            } else {
              img = data[i].split("|")[8].substring(1)
            }
            img = img.substring(0, img.length - 3)
            unit[armyNum] +=
              "<div class = 'cont'><img width = '40px' src='/i/portraits/" +
              img +
              "anip40.png'><div class = 'count'>" +
              startAtb +
              "</div></div>"
          }
          for (let i = 0; i < unit.length; i++) {
            if (unit[i] != "") {
              info += "Команда №" + (i + 1) + "<BR>" + unit[i] + "<BR>"
            }
          }
          let elem = []
          elem[0] = document.querySelector("#chat_format")
          elem[1] = document.querySelector("#chat_format_classic")
          //elem[0].innerHTML = info + elem[0].innerHTML;
          //elem[1].innerHTML = info + elem[1].innerHTML;
          elem[0].innerHTML =
            "<div class = 'atb-info' style = 'display:none'>" +
            info +
            "</div>" +
            elem[0].innerHTML
          elem[1].innerHTML =
            "<div class = 'atb-info' style = 'display:none'>" +
            info +
            "</div>" +
            elem[1].innerHTML
        },
      })
    }
  }
})()