function P(b,e){c[e?'stroke':'fill'](c.arc(b[0]+=(b[0]>W?-W:b[0]<0?W:0)+b[3],b[1]+=(b[1]>H?-H:b[1]<0?H:0)+b[4],b[5],e?0:b[2]-2,e?6.3:b[2]+2,c.beginPath()))}function T(b,e){return M.sqrt(M.pow(b[0]-a[0],2)+M.pow(b[1]-a[1],2))<a[5]+b[5]}function L(){c.clearRect(0,0,W,H);i=u?.2:d?-.08:0;p[3]=p[3]*.986+X(t=p[2]+=l?-.12:r?.12:0)*i;p[4]=p[4]*.986+Y(t)*i;P(p);for(i=7;i--;x|=T(p)){P(a=A[i]=A[i]||[p[0]+W/4+R()*W/2,p[1]+H/4+R()*H/2,t=R()*6.3,X(t),Y(t),R()*40+20],1);for(n in G)T(g=G[n])?s+=g[6]|G.splice(n,1)|A.splice(i,1):i?0:--g[6]?P(g):G.shift()}c.fillText("Score: "+s,5,14);x?alert("GameOver"):setTimeout(L,17)}L(D=document,C=D.body.children[0],C.style.position='fixed',C.width=W=innerWidth,C.height=H=innerHeight,c=C.getContext('2d'),M=Math,R=M.random,X=M.cos,Y=M.sin,p=[W/2,H/2,0,0,0,10],A=[],G=[],a=g=l=u=r=d=z=i=n=t=x=s=0,D.onkeyup=K=function(b,e){t=b.keyCode-32;t?t-5?t-6?t-7?t-8?0:d=e:r=e:u=e:l=e:z=z|!e?e:G.push([p[0],p[1],t=p[2],p[3]+X(t)*14,p[4]+Y(t)*14,4,30])},D.onkeypress=D.onkeydown=function(b){K(b,1);return!1})
          /**
 * move and draw an object to the canvas
 */
function P(o/*object*/, a/*isAsteroid=false*/)
{
    c[a ? 'stroke' : 'fill'](
        c.arc(
            o[0] += (o[0] > W ? -W : o[0] < 0 ? W : 0) + o[3],
            o[1] += (o[1] > H ? -H : o[1] < 0 ? H : 0) + o[4],
            o[5],
            a ? 0   : o[2] - 2,
            a ? 6.3 : o[2] + 2,
            c.beginPath()
        )
    )
}
/**
 * hittest object against Asteroid(which is 'a')
 */
function T(o/*object*/, r/*objectRadius*/)
{
    return M.sqrt(M.pow(o[0] - a[0], 2) + M.pow(o[1] - a[1], 2)) < a[5] + o[5]
}
//main loop
function L()
{
    //clear the canvas
    c.clearRect(0, 0, W, H);
    
    //update the Player
    i = u ? .2 : d ? -.08 : 0;
    p[3] = p[3] * .986 + X(t = p[2] += l ? -.12 : r ? .12 : 0) * i;
    p[4] = p[4] * .986 + Y(t) * i;
    
    //draw the Player
    P(p);
    
    //loop through the Asteroids
    for (i = 7; i--; /*hittest Asteroid against the Player*/ x |= T(p))
    {
        //draw an Asteroid
        P(
            //create an Asteroid if there are less than 7 alive
            a = A[i] = A[i] || [
                p[0] + W/4 + R() * W/2, //posX (1/4 to 3/4 of the stage away from the player)
                p[1] + H/4 + R() * H/2, //posY (1/4 to 3/4 of the stage away from the player)
                t = R() * 6.3,          //direction
                X(t),                   //deltaX
                Y(t),                   //deltaY
                R() * 40 + 20           //radius (20-60)
            ],
            1
        );
        
        //loop through the Bullets for hittests
        for (n in G)
            //hittest Asteroid against the Bullet
            T(g = G[n]) ?
                //if true
                s += g[6] |         //add score
                G.splice(n, 1) |    //remove Bullet
                A.splice(i, 1)      //remove Asteroid
            :
                //if false check if we are 'not' in the last loop of Asteroids
                i ?
                    //if true do nothing
                    0
                :
                    //if false check if frames are left
                    --g[6] ?
                        //if true draw the Bullet
                        P(g)
                    :
                        //if false remove the Bullet
                        G.shift()
    }
    
    //draw the score
    c.fillText("Score: " + s, 5, 14);
    
    //check for gameover
    x ? alert("GameOver") : setTimeout(L, 17)
}
L(
    //init vars
    D = document,
    C = D.body.children[0],     //canvas
    C.style.position = 'fixed',
    C.width = W = innerWidth,
    C.height = H = innerHeight,
    c = C.getContext('2d'),     //context
    M = Math,
    R = M.random,
    X = M.cos,
    Y = M.sin,
    p = [W/2, H/2, 0, 0, 0, 10],//Player [posX, posY, direction, deltaX, deltaY, radius]
    A = [],                     //Asteroids [[posX, posY, direction, deltaX, deltaY, radius]]
    G = [],                     //Bullets [[posX, posY, direction, deltaX, deltaY, radius, framesleft]]
    a =                         //single Asteroid
    g =                         //single Bullet
    l = u = r = d = z =         //keyflags l=left, u=up, r=right, d=down
    i = n = t =                 //tmp vars
    x =                         //gameover flag
    s = 0,                      //score
    
    //init key events
    D.onkeyup = K = function(e, f)
    {
        t = e.keyCode - 32;
        
        //update the pressed key flag
        t ? 
            t - 5 ?
                t - 6 ?
                    t - 7 ?
                        t - 8 ? 0 : d = f
                    : r = f
                : u = f
            : l = f
        : z =
            z | !f ?
                f
            ://fire a Bullet
                G.push([
                    p[0],               //posX
                    p[1],               //posY
                    t = p[2],           //direction
                    p[3] + X(t) * 14,   //deltaX
                    p[4] + Y(t) * 14,   //deltaY
                    4,                  //radius
                    30                  //framesleft
                ])
    },
    D.onkeypress = D.onkeydown = function(e)
    {
        //update the pressed key flag to true
        K(e, 1);
        
        //return false for opera
        return !1
    }
)