battleHelper (fixed)

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

// ==UserScript==
// @name           battleHelper (fixed)
// @author         Neleus
// @namespace      Neleus
// @description    Исправленный и рабочий battleHelper
// @version        0.43
// @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++) {
					let percentage = (nHP[i - 1] / sHP[i - 1]) * 100
					document.getElementById('hp' + i + 't').innerHTML = `${nHP[i - 1]}/${sHP[i - 1]} (${percentage.toFixed(2)}%)`
					document.getElementById('hp' + i + 'c').style.width = `${percentage.toFixed(2)}%`
				}
			}
			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', 'https://daily.heroeswm.ru/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
				},
			})
		}
	}
})()