deepio script

lol

此腳本不應該直接安裝,它是一個供其他腳本使用的函式庫。欲使用本函式庫,請在腳本 metadata 寫上: // @require https://update.gf.qytechs.cn/scripts/20128/128677/deepio%20script.js

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

var colorScheme = {
	'rgb(205,205,205)':		'rgb(30,30,30)',		// background
	'rgb(245,245,245)':		'rgb(222,222,222)',		// name
	'rgb(255,255,255)':		'rgb(255,255,255)',		// all text except name
	'rgb(0,0,0)':			'rgb(0,0,0)',			// black overlays usually semi opaque
	'rgb(0,178,225)':		'rgb(22,99,222)',		// blue tank
	'rgb(241,78,84)':		'rgb(222,22,22)',		// red tank / ffa bullet
	'rgb(153,153,153)':		'rgb(55,55,55)',		// tank's nozzle
	'rgb(85,85,85)':		'rgb(10,10,10)',		// outline for objects, names and healthbar

	'rgb(255,232,105)':		'rgb(255,222,55)',		// square
	'rgb(252,118,119)':		'rgb(255,66,33)',		// triangle
	'rgb(118,141,252)':		'rgb(111,55,255)',		// hexagon
	'rgb(241,119,221)':		'rgb(255,111,255)',		// triangle bot
	'rgb(252,195,118)':		'rgb(255,155,55)',		// square minion

	'rgb(252,173,118)':		'rgb(252,173,118)',		// stat - hp regen
	'rgb(249,67,255)':		'rgb(249,67,255)',		// stat - max hp
	'rgb(133,67,255)':		'rgb(133,67,255)',		// stat - body dmg
	'rgb(67,127,255)':		'rgb(67,127,255)',		// stat - bullet speed
	'rgb(255,222,67)':		'rgb(255,222,67)',		// stat - bullet penetration
	'rgb(255,67,67)':		'rgb(255,67,67)',		// stat - bullet damage
	'rgb(130,255,67)':		'rgb(130,255,67)',		// stat - reload
	'rgb(67,255,249)':		'rgb(67,255,249)',		// stat - move speed
};

function onCanvasFill(fullColor) {
	fullColor = fullColor.replace(/ /g, '');
	if(colorScheme.hasOwnProperty(fullColor)) return document.getElementById('optnDarkTheme').checked ? colorScheme[fullColor] : fullColor;
	else return fullColor;
}
function onCanvasStroke(fullColor) {
	fullColor = fullColor.replace(/ /g, '');
	if(colorScheme.hasOwnProperty(fullColor)) return document.getElementById('optnDarkTheme').checked ? colorScheme[fullColor] : fullColor;
	else return fullColor;
}

var canvas = document.getElementById('canvas');
var nick = document.getElementById('textInput');
var optionsDiv, popupsDiv;
var keepOptionOpen = false, playerAlive = -1;
var holdingKey = {};
var tankInfo = {}, statInfo = {}, currentTank = '';

function editPanels() {
	optionsDiv = document.createElement('div');
	optionsDiv.id = 'gameOptions';
	optionsDiv.style = 'position: absolute; display: none; top: 60%; left: 50%; transform: translate(-50%, 0%); width: 340px; padding: 6px 12px; border: 2px dashed #333; background-color: #EEE; color: #000; font-family: Tahoma; font-size: 12px;';
	optionsDiv.innerHTML = '<div></div><div></div><div></div>';
	document.body.insertBefore(optionsDiv, nick.parentElement.nextElementSibling);
	optionsDiv.children[0].style = 'margin-bottom: 4px; padding-bottom: 6px; border-bottom: 1px solid #888; font-family: Ubuntu; font-size: 16px; text-align: center';
	optionsDiv.children[1].style = 'margin-bottom: 12px;';
	optionsDiv.children[2].style = 'font-size: 10px; text-align: right;';
	optionsDiv.children[0].innerHTML += 'Game Options<a style="position: absolute; top: 1px; right: 4px; color: #222; text-decoration: none; font-family: serif; font-size: 12px;" href="#">&#x2716;</a>';
	optionsDiv.children[1].innerHTML += '<div><strong>(Z)</strong><label><input type="checkbox" id="optnAutoRespawn">Auto respawn</label></div>';
	optionsDiv.children[1].innerHTML += '<div><strong>(X)</strong><label><input type="checkbox" id="optnAutoFire">Auto fire</label></div>';
	optionsDiv.children[1].innerHTML += '<div><strong>(C)</strong><label><input type="checkbox" id="optn4x3">4:3 aspect</label></div>';
	optionsDiv.children[1].innerHTML += '<div><strong>(V)</strong><label><input type="checkbox" id="optnDarkTheme">Dark theme</label></div>';
	optionsDiv.children[2].innerHTML += 'Mod by condoriano. <a style="color: blue; text-decoration: none;" target="_blank" href="https://greasyfork.org/en/scripts/19892-diep-io-auto-respawn-mod">Homepage</a> - <a style="color: blue; text-decoration: none;" target="_blank" href="http://pastebin.com/raw/MQGQLuiy">Source</a> <form style="display: inline-block;" id="donate-mod" action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_blank"><input name="cmd" value="_donations" type="hidden"><input name="business" value="[email protected]" type="hidden"><input name="lc" value="US" type="hidden"><input name="item_name" value="Donation" type="hidden"><input name="no_note" value="0" type="hidden"><input name="currency_code" value="USD" type="hidden"><input name="bn" value="PP-DonationsBF:btn_donateCC_LG.gif:NonHostedGuest" type="hidden"><input style="height: 11px; vertical-align: bottom; margin-left: 5px;" name="submit" src="https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif" alt="PayPal btn" border="0" type="image"><img src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" alt="" height="1" border="0" width="1"></form>';

	popupsDiv = document.createElement('div');
	popupsDiv.id = 'notificationPopups';
	popupsDiv.style = 'position: absolute; display: flex; flex-direction: column-reverse; bottom: 10px; left: 210px; width: 260px; max-height: 200px; overflow: hidden; font-family: Ubuntu;';
	document.body.insertBefore(popupsDiv, optionsDiv.nextElementSibling);
	optionsDiv.children[0].getElementsByTagName('a')[0].onclick = function(e) { toggleOptions(); e.preventDefault(); };

	var options = optionsDiv.children[1];
	for(var i = 0; i < options.children.length; i++) {
		options.children[i].style = 'display: inline-block; width: 50%; margin: 2px 0px;';
		options.children[i].children[0].style = 'display: inline-block; width: 18px;';
		options.children[i].children[1].style = 'position: relative; top: 1px;';
		options.children[i].children[1].children[0].style = 'position: relative; top: 2px;';
	}
}
editPanels();

var inputs = document.getElementsByTagName('input');
for(var i = 0; i < inputs.length; i++) {
	if(!inputs[i].id) continue;
	if(localStorage.getItem(inputs[i].id) !== null) {
		if(inputs[i].type == 'checkbox') inputs[i].checked = JSON.parse(localStorage.getItem(inputs[i].id));
		else inputs[i].value = localStorage.getItem(inputs[i].id);
	}
	inputs[i].addEventListener('change', onInputsChanged);
}
function onInputsChanged() {
	if(this.id == 'optnAutoRespawn' && this.checked) respawnPlayer();
	else if(this.id == 'optnAutoFire') canvas.dispatchEvent(new MouseEvent(this.checked ? 'mousedown' : 'mouseup'));
	else if(this.id == 'optn4x3') toggle4x3(this.checked);
	if(this != nick) createPopup(this.parentNode.textContent + ' <span style="color: ' + (this.checked ? '#9D2;">Enabled</span>' : '#F33;">Disabled</span>'));
	if(this.type == 'checkbox') localStorage.setItem(this.id, this.checked);
	else localStorage.setItem(this.id, this.value);
}
function toggle4x3(enabled) {
	if(enabled) {
		canvas.setAttribute('width', window.innerHeight * 4 / 3 + 'px');
		canvas.style.width = window.innerHeight * 4 / 3 + 'px';
	}
	else {
		canvas.setAttribute('width', window.innerWidth);
		canvas.style.width = '';
	}
	optionsDiv.style.left = canvas.width / 2 + 'px';
}
document.addEventListener('keydown', function(e) {
	var key = e.keyCode || e.which;
	if(key == 27) toggleOptions();
	if(document.activeElement == nick) { if(key == 13) onPlayerSpawn_Pre(); }
	else {
		if(e.ctrlKey || e.altKey) return;
		if(key == 90) document.getElementById('optnAutoRespawn').click();
		else if(key == 88) document.getElementById('optnAutoFire').click();
		else if(key == 67) document.getElementById('optn4x3').click();
		else if(key == 86) document.getElementById('optnDarkTheme').click();
	}
});
function toggleOptions() {
	optionsDiv.style.display = optionsDiv.style.display == 'none' ? 'block' : 'none';
	keepOptionOpen = keepOptionOpen ? false : true;
}
function createPopup(msg, displayTime=2000, bgColor='rgba(0,0,0,0.7)') {
	var popup = document.createElement('div');
	popup.style = 'display: table; background-color: ' + bgColor + '; color: #DDD; margin: 2px 0px; max-width: 260px; padding: 0px 16px 2px 16px; border-radius: 30px; font-size: 12px;';
	popup.innerHTML = msg;
	popupsDiv.insertBefore(popup, popupsDiv.firstChild);
	setTimeout(function() { popup.remove(); }, displayTime);
}

var observer = new MutationObserver(function(changes) {
	changes.forEach(function(change) {
		if(nick.parentElement.style.display == 'none') {
			onPlayerSpawn();
			playerAlive = true;
		}
		else {
			if(playerAlive == -1) onGameLoad();
			else if(playerAlive === true) onPlayerDeath();
			playerAlive = false;
		}
	});
});
observer.observe(nick.parentElement, { attributes: true, attributeFilter: ['style'] });

function onGameLoad() {
	nick.value = localStorage.getItem('textInput');
	optionsDiv.style.display = 'block';
	if(document.getElementById('optnAutoRespawn').checked) setTimeout(function() { respawnPlayer(); }, 1000);
	if(document.getElementById('optn4x3').checked) toggle4x3(true);
}
function onPlayerSpawn_Pre() { if(!keepOptionOpen) optionsDiv.style.display = 'none'; }
function onPlayerSpawn() {
	currentTank = '';
	for(var i = 0; i < statInfo.level.length; i++) statInfo.level[i] = 0;
	if(document.getElementById('optnAutoFire').checked) canvas.dispatchEvent(new MouseEvent('mousedown'));
}
function onPlayerDeath() {
	if(document.getElementById('optnAutoRespawn').checked) respawnPlayer();
	else optionsDiv.style.display = 'block';
}
function respawnPlayer() {
	nick.focus();
	if(navigator.userAgent.toLowerCase().indexOf('firefox') != -1) {
		window.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 13 }));
		window.dispatchEvent(new KeyboardEvent('keyup', { keyCode: 13 }));
	}
	else {
		var eventObj;
		eventObj = document.createEvent("Events"); eventObj.initEvent("keydown", true, true); eventObj.keyCode = 13; window.dispatchEvent(eventObj);
		eventObj = document.createEvent("Events"); eventObj.initEvent("keyup", true, true); eventObj.keyCode = 13; window.dispatchEvent(eventObj);
	}

	if(!keepOptionOpen) optionsDiv.style.display = 'none';
}
['blur', 'focus'].forEach(function(e) {
	window.addEventListener(e, function() {
		if(document.getElementById('optnAutoFire').checked) canvas.dispatchEvent(new MouseEvent('mousedown'));
		holdingKey = {};
	});
});
canvas.addEventListener('click', function() {
	if(document.getElementById('optnAutoFire').checked) {
		canvas.dispatchEvent(new MouseEvent('mouseup'));
		canvas.dispatchEvent(new MouseEvent('mousedown'));
	}
});
window.addEventListener('resize', function() { if(document.getElementById('optn4x3').checked) toggle4x3(true); });

function modCanvas() {
	currentTank = '';
	tankInfo = {
		'tankList': {
			'Twin': [ 'Triple Shot', 'Quad Tank', 'Twin Flank' ],
			'Sniper': [ 'Assassin', 'Overseer', 'Hunter' ],
			'Machine Gun': [ 'Destroyer', 'Gunner' ],
			'Flank Guard': [ 'Quad Tank', 'Twin Flank', 'Tri Angle' ],
			'Triple Shot': [ 'Triplet', 'Penta Shot' ],
			'Quad Tank': [ 'Octo Tank' ],
			'Twin Flank': [ 'Octo Tank', 'Triple Twin' ],
			'Overseer': [ 'Overlord', 'Necromancer' ],
			'Assassin': [ 'Stalker' ],
		},
		'titlePos': [ 59, 22 ],
		'buttonWidth': 62,
		'buttonHeight': 62,
		'buttonX': 36,
		'buttonY': [ 44, 117, 190, 263 ],
	};
	statInfo = {
		'name': [ 'Health Regen', 'Max Health', 'Body Damage', 'Bullet Speed', 'Bullet Penetration', 'Bullet Damage', 'Reload', 'Movement Speed' ],
		'color': [ 'FCAD76', 'F943FF', '8543FF', '437FFF', 'FFDE43', 'FF4343', '82FF43', '43FFF9' ],
		'oldcolor': [ 'FFAA55', 'FF55FF', 'AA55FF', '55AAFF', 'FFFF55', 'FF3333', '55FF55', '55FFFF' ],
		'level': [ 0, 0, 0, 0, 0, 0, 0, 0 ],
		'buttonWidth': 26,
		'buttonHeight': 9,
		'buttonX': 138,
		'buttonY': [ 540, 556, 572, 588, 604, 620, 636, 652 ],
	};

	document.addEventListener('keydown', function(e) {
		var key = e.keyCode || e.which;
		if(e.ctrlKey || e.altKey) return;
		if(key >= 49 && key <= 56) {
			if(holdingKey[key]) return;
			var upgrade = key - 49;
			if(e.shiftKey) handleTankUpgrade(upgrade, true);
			handleStatUpgrade(upgrade, true);
		}
		holdingKey[key] = true;
	});
	document.addEventListener('keyup', function(e) {
		var key = e.keyCode || e.which;
		holdingKey[key] = false;
	});
	function populatePoses() {
		for(var i = 0; i < tankInfo.buttonY.length; i++) tankInfo.buttonY[i] = 44 + i * 73;
		for(i = 0; i < statInfo.name.length; i++) statInfo.buttonY[i] = canvas.height - 143 + i * 16;
	}
	populatePoses();
	window.addEventListener('resize', populatePoses);
	canvas.addEventListener('click', function(e) {
		if(canvas.style.cursor == 'pointer') {
			for(var i = 0; i < statInfo.name.length; i++) {
				if(e.clientY >= tankInfo.buttonY[i] && e.clientY <= tankInfo.buttonY[i] + tankInfo.buttonHeight && e.clientX >= tankInfo.buttonX && e.clientX <= tankInfo.buttonX + tankInfo.buttonWidth) handleTankUpgrade(i);
				else if(e.clientY >= statInfo.buttonY[i] && e.clientY <= statInfo.buttonY[i] + statInfo.buttonHeight && e.clientX >= statInfo.buttonX && e.clientX <= statInfo.buttonX + statInfo.buttonWidth) handleStatUpgrade(i);
			}
		}
	});
	function handleTankUpgrade(upgrade, byKey) {
		if(byKey) {
			var ctx = canvas.getContext("2d");
			var imgData = ctx.getImageData(tankInfo.titlePos[0], tankInfo.titlePos[1], 1, 1);
			if(imgData.data[0] >= 220 && imgData.data[1] >= 220 && imgData.data[2] >= 220) simulateClick(tankInfo.buttonX, tankInfo.buttonY[upgrade]);
			else return;
		}
		if(currentTank === '') currentTank = Object.keys(tankInfo.tankList)[upgrade];
		else currentTank = tankInfo.tankList[currentTank][upgrade];
		if(currentTank) createPopup('Tank upgrade: <span style="color: #FA2;">' + currentTank + '</span>', 4000, '#500');
	}
	function handleStatUpgrade(upgrade, byKey) {
		var ctx = canvas.getContext("2d");
		var imgData = ctx.getImageData(statInfo.buttonX, statInfo.buttonY[upgrade] - 1, 1, 2);
		if(imgData.data[0] < 90 && imgData.data[1] < 90 && imgData.data[2] < 90) {
			if(isStatOpen(imgData)) {
				if(statInfo.level[upgrade]) statInfo.level[upgrade]++;
				else {
					imgData = ctx.getImageData(26, statInfo.buttonY[upgrade], 1, 1);
					if(imgData.data[0] < 90 && imgData.data[1] < 90 && imgData.data[2] < 90) statInfo.level[upgrade]++;
				}
				if(statInfo.level[upgrade] <= 7) createPopup('Upgraded level ' + statInfo.level[upgrade] + ' <span style="color: #' + statInfo.color[upgrade] + '">' + statInfo.name[upgrade] + '</span>');
			}
		}
	}
	function isStatOpen(imgData) {
		if(document.getElementById('optnDarkTheme').checked) {
			var low, high;
			for(var i=4; i<=6; i++) {
				if(imgData.data[i] > 180 && imgData.data[i] < 200) high = true;
				else if(imgData.data[i] > 40 && imgData.data[i] < 100) low = true;
			}
			if(low && high) return true;
		}
		else if(document.getElementById('optnDarkTheme').checked === false && (imgData.data[4] > 220 || imgData.data[5] > 220 || imgData.data[6] > 220)) return true;
	}
	return false;
}
function simulateClick(x,y) {
	var ev = new MouseEvent('mousemove', { 'clientX': x, 'clientY': y }); canvas.dispatchEvent(ev);
	ev = new MouseEvent('mousedown', { 'clientX': x, 'clientY': y }); canvas.dispatchEvent(ev);
	ev = new MouseEvent('mouseup', { 'clientX': x, 'clientY': y }); canvas.dispatchEvent(ev);
}
modCanvas();