MichuuBotv2

Boty do gry agar.io!

// ==UserScript==
// @name        MichuuBotv2
// @namespace   MichuuBest
// @description Boty do gry agar.io!
// @include     http://agar.io/
// @version     3.01
// @grant       none
// @author      twitch.tv/michalped23
// ==/UserScript==

var totalBotCount = 0;

function game(h, r, bot, botUrl, botName) {

	var window = h;
	var canvas;
	var botsUrl;
	var botsCount = 15;
	var botsCreated = false;
	
	if(bot){
		totalBotCount++;
		botName = botName + "_b" + totalBotCount;
	}

    function init() {


		if(bot){
			console.log("bot - " + botName);
			connectTo(botUrl);
			setInterval(sendPosition, 100);
			return;
		}

		//! bot
		
		loadRegions();
        setInterval(loadRegions, 18E4);

        A = X = document.getElementById("canvas");
		canvas = A;
		
        d = canvas.getContext("2d");

		canvas.onmousedown = function(a) {
            if (fa) {
                var b = a.clientX - (5 + k / 5 / 2), c = a.clientY - (5 + k / 5 / 2);
                if (Math.sqrt(b * b + c * c) <= k / 5 / 2) {
                    sendPosition();
                    sendCommand(17);
                    return
                }
            }
            O = a.clientX;
            P = a.clientY;
            Y();
            sendPosition()
        };
        canvas.onmousemove = function(e) {
            O = e.clientX;
            P = e.clientY;
            Y()
        };
        canvas.onmouseup = function() {};

        var a = !1, b = !1, c = !1;
        if(!bot) window.onkeydown = function(e) {
            32 != e.keyCode || a || (sendPosition(), sendCommand(17), a = !0);
            81 != e.keyCode || b || (sendCommand(18), b = !0);
            87 != e.keyCode || c || (sendPosition(), sendCommand(21), c = !0);
            27 == e.keyCode && r("#overlays").fadeIn(200)
        };
        if(!bot) window.onkeyup = function(e) {
            32 == e.keyCode && (a = !1);
            87 == e.keyCode && (c = !1);
            81 == e.keyCode && b && (sendCommand(19), b = !1)
        };
        if(!bot) window.onblur = function() {
            sendCommand(19);
            c = b = a = !1
        };
		
        h.onresize = ga;
        ga();

        window.requestAnimationFrame ? window.requestAnimationFrame(ha) : setInterval(Z, 1E3 / 60);

		setInterval(sendPosition, 100);

        ia(r("#region").val())

    }



    function va() {
        if (.5 > g)
            G = null;
        else {
            for (var a = Number.POSITIVE_INFINITY, b = Number.POSITIVE_INFINITY, c = Number.NEGATIVE_INFINITY, e = Number.NEGATIVE_INFINITY, d = 0, f = 0; f < p.length; f++)
                p[f].shouldRender() && (d = Math.max(p[f].size, d), a = Math.min(p[f].x, a), b = Math.min(p[f].y, b), c = Math.max(p[f].x, c), e = Math.max(p[f].y, e));
            G = QUAD.init({minX: a - (d + 100),minY: b - (d + 100),maxX: c + (d + 100),maxY: e + (d + 100)});
            for (f = 0; f < p.length; f++)
                if (a = p[f], a.shouldRender())
                    for (b = 0; b < a.points.length; ++b)
                        G.insert(a.points[b])
        }
    }
    function Y() {
        Q = (O - k / 2) / g + s;
        R = (P - q / 2) / g + t
    }
    function loadRegions() {
        null == S && (S = {}, r("#region").children().each(function() {
            var a = r(this), b = a.val();
            b && (S[b] = a.text())
        }));
        r.get("http://m.agar.io/info", function(a) {
            for (var b in a.regions)
                r('#region option[value="' + 
                b + '"]').text(S[b] + " (" + a.regions[b].numPlayers + " players)")
        }, "json")
    }
    function hideMenu() {
		if(bot) return;
        r("#adsBottom").hide();
        r("#overlays").hide()
		//autoRestart = true;
    }
    function ia(a) {
        a && a != $ && ($ = a, ka())
    }
    function la() {
        r.ajax("http://m.agar.io/", 
		{
			error: function() {
                setTimeout(la, 1E3)
            },
			success: function(a) {
                a = a.split("\n");
                connectTo("ws://" + a[0])
            },
			dataType: "text",
			method: "POST",
			cache: false,
			crossDomain: !0,
			data: $ || "?"})
    }
    function ka() {
		if(!bot) r("#connecting").show();
        la()
    }
    function connectTo(url) {
        l && (l.onopen = null, l.onmessage = null, l.onclose = null, l.close(), l = null);
        C = [];
        m = [];
        w = {};
        p = [];
        D = [];
        u = [];
        console.log("Connecting to " + url);
        l = new WebSocket(url);
        l.binaryType = "arraybuffer";
        l.onopen = function(){
			onConnected(url)
		};
        l.onmessage = xa;
        l.onclose = ya;
        l.onerror = function() {
            console.log("socket error")
        }
    }
    function onConnected(url) {
        r("#connecting").hide();
        console.log("socket open");

		botsUrl = url;

        var a = new ArrayBuffer(5);
        var b = new DataView(a);
        b.setUint8(0, 255);
        b.setUint32(1, 1, !0);
        l.send(a);

        restartGame()
    }
    function ya(a) {
        console.log("socket close");
        setTimeout(ka, 500)
    }
    function xa(a) {
        function b() {
            for (var a = ""; ; ) {
                var b = e.getUint16(c, !0);
                c += 2;
                if (0 == b)
                    break;
                a += String.fromCharCode(b)
            }
            return a
        }
        var c = 1, e = new DataView(a.data);
        switch (e.getUint8(0)) {
            case 16:
                za(e);
                break;
            case 17:
                x = e.getFloat64(1, !0);
                y = e.getFloat64(9, !0);
                H = e.getFloat64(17, !0);
                break;
            case 20:
                m = [];
                C = [];
                break;
            case 32:
                C.push(e.getUint32(1, !0));
                break;
            case 48:
                for (u = []; c < e.byteLength; )
                    u.push({id: 0,name: b()});
                oa();
                break;
            case 49:
                a = e.getUint32(c, !0);
                c += 4;
                u = [];
                for (var d = 0; d < a; ++d) {
                    var f = e.getUint32(c, !0), c = c + 4;
                    u.push({id: f,name: b()})
                }
                oa();
                break;
            case 64:
                I = e.getFloat64(1, !0), J = e.getFloat64(9, !0), K = e.getFloat64(17, !0), L = e.getFloat64(25, !0), x = (K + I) / 2, y = (L + J) / 2, H = 1, 0 == m.length && (s = x, t = y, g = H)
        }
    }
    function za(a) {
        E = +new Date;
        var b = Math.random(), c = 1;
        aa = !1;
        for (var e = a.getUint16(c, !0), c = c + 2, d = 0; d < e; ++d) {
            var f = w[a.getUint32(c, !0)], g = w[a.getUint32(c + 4, !0)], c = c + 8;
            f && g && (g.destroy(), g.ox = g.x, g.oy = g.y, g.oSize = g.size, g.nx = f.x, g.ny = f.y, g.nSize = g.size, g.updateTime = E)
        }
        for (; ; ) {
            e = a.getUint32(c, !0);
            c += 4;
            if (0 == e)
                break;
            d = a.getFloat64(c, !0);
            c += 8;
            f = a.getFloat64(c, !0);
            c += 8;
            g = a.getFloat64(c, !0);
            c += 8;
            a.getUint8(c++);
            for (var h = a.getUint8(c++), l = a.getUint8(c++), k = 
            a.getUint8(c++), h = (h << 16 | l << 8 | k).toString(16); 6 > h.length; )
                h = "0" + h;
            h = "#" + h;
            k = a.getUint8(c++);
            l = !!(k & 1);
            k & 2 && (c += 4);
            k & 4 && (c += 8);
            k & 8 && (c += 16);
            for (k = ""; ; ) {
                var n = a.getUint16(c, !0), c = c + 2;
                if (0 == n)
                    break;
                k += String.fromCharCode(n)
            }
            n = null;
            w.hasOwnProperty(e) ? (n = w[e], n.updatePos(), n.ox = n.x, n.oy = n.y, n.oSize = n.size, n.color = h) : (n = new pa(e, d, f, g, h, l, k), n.pX = d, n.pY = f);
            n.nx = d;
            n.ny = f;
            n.nSize = g;
            n.updateCode = b;
            n.updateTime = E;
            -1 != C.indexOf(e) && -1 == m.indexOf(n) && (document.getElementById("overlays").style.display = "none", m.push(n), 1 == m.length && (s = n.x, t = n.y))
        }
        a.getUint16(c, !0);
        c += 2;
        f = a.getUint32(c, !0);
        c += 4;
        for (d = 0; d < f; d++)
            e = a.getUint32(c, !0), c += 4, w[e] && (w[e].updateCode = b);
        for (d = 0; d < p.length; d++)
            p[d].updateCode != b && p[d--].destroy();
        aa && 0 == m.length
			&& showOverlays()
    }

	function showOverlays(){
		if(! bot)
			r("#overlays").fadeIn(3E3);
		else
			restartGame();
	}

    function sendPosition() {
        if (null != l && l.readyState == l.OPEN) {
            var a = O - k / 2, b = P - q / 2;
            64 > a * a + b * b || qa == Q && ra == R;
			qa = Q;
			ra = R;
			var x = Q;
			var y = R;

			if(!bot){
				clientX = x;
				clientY = y;
			} else {
				x = clientX;
				y = clientY;
			}

			a = new ArrayBuffer(21);
			b = new DataView(a);
			b.setUint8(0, 16);
			b.setFloat64(1, x, !0);
			b.setFloat64(9, y, !0);
			b.setUint32(17, 0, !0);
			
			//if(bot) console.log("X="+x+", Y="+y);

			l.send(a);
        }
    }
    function restartGame() {
        if (null != l && l.readyState == l.OPEN && null != M) {
            var a = new ArrayBuffer(1 + 2 * M.length), b = new DataView(a);
            b.setUint8(0, 0);
            for (var c = 0; c < M.length; ++c)
                b.setUint16(1 + 2 * c, M.charCodeAt(c), !0);
            l.send(a)
        }
    }
    function sendCommand(a) {
        if (null != l && l.readyState == l.OPEN) {
            var b = new ArrayBuffer(1);
            (new DataView(b)).setUint8(0, a);
            l.send(b)
        }
    }
    function ha() {
        Z();
        h.requestAnimationFrame(ha)
    }
    function ga() {
        k = h.innerWidth;
        q = h.innerHeight;
        X.width = A.width = k;
        X.height = A.height = q;
        Z()
    }
    function Aa() {
        if (0 != m.length) {
            for (var a = 0, b = 0; b < m.length; b++)
                a += m[b].size;
            a = Math.pow(Math.min(64 / a, 1), .4) * Math.max(q / 1080, k / 1920);
            g = (9 * g + a) / 10
        }
    }
    function Z() {

		if(bot) return;

		var g = 0.5;
        var a = +new Date;
        ++Ba;
        E = +new Date;
        if (0 < m.length) {
            Aa();
            for (var b = 0, c = 0, e = 0; e < m.length; e++)
                m[e].updatePos(), b += m[e].x / m.length, c += m[e].y / m.length;
            x = b;
            y = c;
            H = g;
            s = (s + b) / 2;
            t = (t + c) / 2
        } else
            x > K - (k / 2 - 100) / g && (x = K - (k / 2 - 100) / g), y > L - (q / 2 - 100) / g && (y = L - (q / 2 - 100) / g), x < I + (k / 2 - 100) / g && (x = (I + k / 2 - 100) / g), y < J + (q / 2 - 100) / g && (y = (J + q / 2 - 100) / g), s = (29 * s + x) / 30, t = (29 * t + y) / 30, g = (9 * g + H) / 10;
        va();
        Y();
        d.clearRect(0, 0, k, q);
        d.fillStyle = ba ? "#111111" : "#F2FBFF";
        d.fillRect(0, 0, k, q);
        d.save();
        d.strokeStyle = ba ? "#AAAAAA" : "#000000";
        d.globalAlpha = .2;
        d.scale(g, g);
        b = k / g;
        c = q / g;
        for (e = -.5 + (-s + b / 2) % 50; e < b; e += 50)
            d.beginPath(), d.moveTo(e, 0), d.lineTo(e, c), d.stroke();
        for (e = -.5 + (-t + c / 2) % 50; e < c; e += 50)
            d.beginPath(), d.moveTo(0, e), d.lineTo(b, e), d.stroke();
        d.restore();
        p.sort(function(a, b) {
            return a.size == b.size ? a.id - b.id : a.size - b.size
        });
        d.save();
        d.translate(k / 2, q / 2);
        d.scale(g, g);
        d.translate(-s, -t);
        for (e = 0; e < D.length; e++)
            D[e].draw();
        for (e = 0; e < p.length; e++)
            p[e].draw();
        d.restore();
        z && 0 != u.length && d.drawImage(z, k - z.width - 10, 10);
        N = Math.max(N, Ca());
        0 != N && (null == T && (T = new U(24, "#FFFFFF")), T.setValue("Score: " + ~~(N / 100)), c = T.render(), b = c.width, d.globalAlpha = .2, d.fillStyle = "#000000", d.fillRect(10, q - 10 - 24 - 10, b + 10, 34), d.globalAlpha = 1, d.drawImage(c, 15, q - 10 - 24 - 5));
        Da();
        a = +new Date - a;
        a > 1E3 / 60 ? v -= .01 : a < 1E3 / 65 && (v += .01);
        .4 > v && (v = .4);
        1 < v && (v = 1)
    }
    function Da() {
        if (fa && ca.width) {
            var a = k / 5;
            d.drawImage(ca, 5, 5, a, a)
        }
    }
    function Ca() {
        for (var a = 0, b = 0; b < m.length; b++)
            a += m[b].nSize * m[b].nSize;
        return a
    }
    function oa() {
		if(bot) return;
        if (0 != u.length)
            if (V) {
                z = document.createElement("canvas");
                var a = z.getContext("2d"), b = 60 + 24 * u.length, c = Math.min(200, .3 * k) / 200;
                z.width = 200 * c;
                z.height = b * c;
                a.scale(c, c);
                a.globalAlpha = .4;
                a.fillStyle = "#000000";
                a.fillRect(0, 0, 200, b);
                a.globalAlpha = 1;
                a.fillStyle = "#FFFFFF";
                c = null;
                c = "Leaderboard";
                a.font = "30px Ubuntu";
                a.fillText(c, 100 - a.measureText(c).width / 2, 40);
                a.font = "20px Ubuntu";
                for (b = 0; b < u.length; ++b)
                    c = u[b].name || "An unnamed cell", V || (c = "An unnamed cell"), -1 != C.indexOf(u[b].id) ? (m[0].name && 
                    (c = m[0].name), a.fillStyle = "#FFAAAA") : a.fillStyle = "#FFFFFF", c = b + 1 + ". " + c, a.fillText(c, 100 - a.measureText(c).width / 2, 70 + 24 * b)
            } else
                z = null
    }
    function pa(a, b, c, e, d, f, g) {
        p.push(this);
        w[a] = this;
        this.id = a;
        this.ox = this.x = b;
        this.oy = this.y = c;
        this.oSize = this.size = e;
        this.color = d;
        this.isVirus = f;
        this.points = [];
        this.pointsAcc = [];
        this.createPoints();
        this.setName(g)
    }
    function U(a, b, c, e) {
        a && (this._size = a);
        b && (this._color = b);
        this._stroke = !!c;
        e && (this._strokeColor = e)
    }



	var X, d, A, k, q, G = null, l = null, s = 0, t = 0, C = [], m = [], w = {}, p = [], D = [], u = [], O = 0, P = 0, Q = -1, R = -1, Ba = 0, E = 0, M = null, I = 0, J = 0, K = 1E4, L = 1E4, g = 1, $ = null, sa = !0, V = !0, da = !1, aa = !1, N = 0, ba = !1, ta = !1, x = 0, y = 0, H = 1, fa = "ontouchstart" in h && /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent), ca = new Image;
	ca.src = "img/split.png";
	var S = null;


	if(!bot) h.setNick = function(a) {
		hideMenu();
		M = a;
		restartGame();
		N = 0

		if( !bot && ! botsCreated){

console.log("create bots...");
botsCreated = true;
for (i = 0; i < botsCount; i++) {
	//нужно делать паузу перед новым ботом,
	//чтобы сервер не отклонил слишком частые соединения
	setTimeout(function(){
		game(window, r, true, botsUrl, M);
	}, 500);
}

		}

	};
	else {
		M = botName;
	}



	if(!bot) h.setRegion = ia;
	if(!bot) h.setSkins = function(a) {
		sa = a
	};
	if(!bot) h.setNames = function(a) {
		V = a
	};
	if(!bot) h.setDarkTheme = function(a) {
		ba = a
	};
	if(!bot) h.setColors = function(a) {
		da = a
	};
	if(!bot) h.setShowMass = function(a) {
		ta = a
	};
	if(!bot) h.spectate = function() {
		sendCommand(1);
		hideMenu()
	};
	if(!bot) h.connect = loadRegions;
	
	var qa = -1, ra = -1, z = null, v = 1, T = null, W = {}, Ea = "poland;usa;china;russia;canada;australia;spain;brazil;germany;ukraine;france;sweden;hitler;north korea;south korea;japan;united kingdom;earth;greece;latvia;lithuania;estonia;finland;norway;cia;maldivas;austria;nigeria;reddit;yaranaika;confederate;9gag;indiana;4chan;italy;ussr;pewdiepie;bulgaria;tumblr;2ch.hk;hong kong;portugal;jamaica;german empire;mexico;sanik;switzerland;croatia;chile;indonesia;bangladesh;thailand;iran;iraq;peru;moon;botswana;bosnia;netherlands;european union;taiwan;pakistan;hungary;satanist;qing dynasty;nazi;matriarchy;patriarchy;feminism;ireland;texas;facepunch;prodota;cambodia;steam;piccolo;ea;india;kc;denmark;quebec;ayy lmao;sealand;bait;tsarist russia;origin;vinesauce;stalin;belgium;luxembourg;stussy;prussia;8ch;argentina;scotland;sir;romania;belarus;wojak;isis;doge".split(";"), Fa = ["m'blob"];
	pa.prototype = {id: 0,points: null,pointsAcc: null,name: null,nameCache: null,sizeCache: null,x: 0,y: 0,size: 0,ox: 0,oy: 0,oSize: 0,nx: 0,ny: 0,nSize: 0,updateTime: 0,updateCode: 0,drawTime: 0,destroyed: !1,isVirus: !1,destroy: function() {
			var a;
			for (a = 0; a < p.length; a++)
				if (p[a] == this) {
					p.splice(a, 1);
					break
				}
			delete w[this.id];
			a = m.indexOf(this);
			-1 != a && (aa = !0, m.splice(a, 1));
			a = C.indexOf(this.id);
			-1 != a && C.splice(a, 1);
			this.destroyed = !0;
			D.push(this)
		},getNameSize: function() {
			return Math.max(~~(.3 * this.size), 24)
		},setName: function(a) {
			if (this.name = a)
				null == this.nameCache ? this.nameCache = new U(this.getNameSize(), "#FFFFFF", !0, "#000000") : this.nameCache.setSize(this.getNameSize()), this.nameCache.setValue(this.name)
		},createPoints: function() {
			for (var a = this.getNumPoints(); this.points.length > a; ) {
				var b = ~~(Math.random() * this.points.length);
				this.points.splice(b, 1);
				this.pointsAcc.splice(b, 1)
			}
			0 == this.points.length && 0 < a && (this.points.push({c: this,v: this.size,x: this.x,y: this.y}), this.pointsAcc.push(Math.random() - .5));
			for (; this.points.length < a; ) {
				var b = ~~(Math.random() * this.points.length), c = this.points[b];
				this.points.splice(b, 0, {c: this,v: c.v,x: c.x,y: c.y});
				this.pointsAcc.splice(b, 0, this.pointsAcc[b])
			}
		},getNumPoints: function() {
			var a = 10;
			20 > this.size && (a = 5);
			this.isVirus && (a = 30);
			return ~~Math.max(this.size * g * (this.isVirus ? Math.min(2 * v, 1) : v), a)
		},movePoints: function() {
			this.createPoints();
			for (var a = this.points, b = this.pointsAcc, c = b.concat(), e = a.concat(), d = e.length, f = 0; f < d; ++f) {
				var g = c[(f - 1 + d) % d], h = c[(f + 1) % d];
				b[f] += Math.random() - .5;
				b[f] *= .7;
				10 < b[f] && (b[f] = 10);
				-10 > b[f] && (b[f] = -10);
				b[f] = (g + h + 8 * b[f]) / 10
			}
			for (var k = this, f = 0; f < d; ++f) {
				c = e[f].v;
				g = e[(f - 1 + d) % d].v;
				h = e[(f + 1) % d].v;
				if (15 < this.size && null != G) {
					var l = !1, n = a[f].x, m = a[f].y;
					G.retrieve2(n - 5, m - 5, 10, 10, function(a) {
						a.c != k && 25 > (n - a.x) * (n - a.x) + (m - a.y) * (m - a.y) && (l = !0)
					});
					!l && (a[f].x < I || a[f].y < J || a[f].x > K || a[f].y > L) && (l = !0);
					l && (0 < b[f] && (b[f] = 0), b[f] -= 1)
				}
				c += b[f];
				0 > c && (c = 0);
				c = (12 * c + this.size) / 13;
				a[f].v = (g + h + 8 * c) / 10;
				g = 2 * Math.PI / d;
				h = this.points[f].v;
				this.isVirus && 0 == f % 2 && (h += 5);
				a[f].x = this.x + Math.cos(g * f) * h;
				a[f].y = this.y + Math.sin(g * f) *
				h
			}
		},updatePos: function() {
			var a;
			a = (E - this.updateTime) / 120;
			a = 0 > a ? 0 : 1 < a ? 1 : a;
			a = a * a * (3 - 2 * a);
			this.getNameSize();
			if (this.destroyed && 1 <= a) {
				var b = D.indexOf(this);
				-1 != b && D.splice(b, 1)
			}
			this.x = a * (this.nx - this.ox) + this.ox;
			this.y = a * (this.ny - this.oy) + this.oy;
			this.size = a * (this.nSize - this.oSize) + this.oSize;
			return a
		},shouldRender: function() {
			return this.x + this.size + 40 < s - k / 2 / g || this.y + this.size + 40 < t - q / 2 / g || this.x - this.size - 40 > s + k / 2 / g || this.y - this.size - 40 > t + q / 2 / g ? !1 : !0
		},draw: function() {
			if (this.shouldRender()) {
				var a = !this.isVirus &&
				.5 > g;
				d.save();
				this.drawTime = E;
				var b = this.updatePos();
				this.destroyed && (d.globalAlpha *= 1 - b);
				d.lineWidth = 10;
				d.lineCap = "round";
				d.lineJoin = this.isVirus ? "mitter" : "round";
				da ? (d.fillStyle = "#FFFFFF", d.strokeStyle = "#AAAAAA") : (d.fillStyle = this.color, d.strokeStyle = this.color);
				if (a)
					d.beginPath(), d.arc(this.x, this.y, this.size, 0, 2 * Math.PI, !1);
				else
					for (this.movePoints(), d.beginPath(), a = this.getNumPoints(), d.moveTo(this.points[0].x, this.points[0].y), b = 1; b <= a; ++b) {
						var c = b % a;
						d.lineTo(this.points[c].x, this.points[c].y)
					}
				d.closePath();
				a = this.name.toLowerCase();
				sa ? -1 != Ea.indexOf(a) ? (W.hasOwnProperty(a) || (W[a] = new Image, W[a].src = "skins/" + a + ".png"), b = W[a]) : b = null : b = null;
				a = b ? -1 != Fa.indexOf(a) : !1;
				d.stroke();
				d.fill();
				null != b && 0 < b.width && !a && (d.save(), d.clip(), d.drawImage(b, this.x - this.size, this.y - this.size, 2 * this.size, 2 * this.size), d.restore());
				if (da || 15 < this.size)
					d.strokeStyle = "#000000", d.globalAlpha *= .1, d.stroke();
				d.globalAlpha = 1;
				null != b && 0 < b.width && a && d.drawImage(b, this.x - 2 * this.size, this.y - 2 * this.size, 4 * this.size, 4 * this.size);
				b = -1 != m.indexOf(this);
				a = ~~this.y;
				if ((V || b) && this.name && this.nameCache) {
					var e = this.nameCache;
					e.setValue(this.name);
					e.setSize(this.getNameSize());
					c = Math.ceil(10 * g) / 10;
					e.setScale(c);
					var e = e.render(), h = ~~(e.width / c), c = ~~(e.height / c);
					d.drawImage(e, ~~this.x - ~~(h / 2), a - ~~(c / 2), h, c);
					a += e.height / 2 + 4
				}
				ta && b && (null == this.sizeCache && (this.sizeCache = new U(this.getNameSize() / 2, "#FFFFFF", !0, "#000000")), b = this.sizeCache, b.setSize(this.getNameSize() / 2), b.setValue(~~(this.size * this.size / 100)), c = Math.ceil(10 * g) / 10, b.setScale(c),
				e = b.render(), h = ~~(e.width / c), c = ~~(e.height / c), d.drawImage(e, ~~this.x - ~~(h / 2), a - ~~(c / 2), h, c));
				d.restore()
			}
		}};
	U.prototype = {_value: "",_color: "#000000",_stroke: !1,_strokeColor: "#000000",_size: 16,_canvas: null,_ctx: null,_dirty: !1,_scale: 1,setSize: function(a) {
			this._size != a && (this._size = a, this._dirty = !0)
		},setScale: function(a) {
			this._scale != a && (this._scale = a, this._dirty = !0)
		},setColor: function(a) {
			this._color != a && (this._color = a, this._dirty = !0)
		},setStroke: function(a) {
			this._stroke != a && (this._stroke = a, this._dirty = !0)
		},setStrokeColor: function(a) {
			this._strokeColor != a && (this._strokeColor = a, this._dirty = !0)
		},setValue: function(a) {
			a != this._value && (this._value = a, this._dirty = !0)
		},render: function() {
			null == this._canvas && (this._canvas = document.createElement("canvas"), this._ctx = this._canvas.getContext("2d"));
			if (this._dirty) {
				this._dirty = !1;
				var a = this._canvas, b = this._ctx, c = this._value, d = this._scale, g = this._size, f = g + "px Ubuntu";
				b.font = f;
				var h = b.measureText(c).width, k = ~~(.2 * g);
				a.width = (h + 6) * d;
				a.height = (g + k) * d;
				b.font = f;
				b.scale(d, d);
				b.globalAlpha = 1;
				b.lineWidth = 3;
				b.strokeStyle = this._strokeColor;
				b.fillStyle = this._color;
				this._stroke && b.strokeText(c, 3, g - k / 2);
				b.fillText(c, 3, g - k / 2)
			}
			return this._canvas
		}};



	if(!bot) h.onload = init;
	else init();
	

}

var playerX = 0;
var playerY = 0;

game(window, jQuery);