for(_="|0Z)/YatXt=W10V0,U60S+3S)%3SRR,pQ=((O%SN(p30onkey&&)),c[(xMXh.sin(e/SZz(6eN,3hypot((W13,v||)*/PI%212ImageDXa(-e -+p)%2/3:1d+l*8,6*min( *2>f|3<f ?(%6-p );image-rendering:=,y)=>()%V-9FN<(g=6+(eR28%64<39-g/4zN-v=F=Wu=Ua.style.cssTexW'height:V0%pixelXed-moz-crisp dges',zx<(y24x>Udown=up39-x.which]=x.type[5],A=new Uw=1SsetIntervalrequestAnimXionFrame{for(i=0*1S;i--;d=1,-US-x,-p+vY-2)w*l/VUA.dXa.set([9*l+S],i*4))x=i%Uy=1S+-iYUeO2]?69-x:x-53)Q=u+y,l=z(f=p-v+T*/2+14(1]?1:14-t)Y8Ze+1,16~f48 >f*2f>17 *3|e*5-3>f38f -7?313<f )+35:6)-(f*3 *eYS:p<0?p+62<p?T-SY(V0-y5+F/5&15-i*i:=acos/S-1)-+(eO(1 /PI180+DZ)Q<42z(150 3 %3+6,55+5 N)z/6%51,15p%6%(11+%8+/6Z(/Z)5)2-(e=p*3S e;c.putA,U0)},DO!2]-!0]4+DQ=v+=W-1]ww--?2:8,1-tu=-1V-v,-v-5,u)(T=v<29)(v=W0]=e=98+D,-t,1-t1(38+D)N,52+=-vN0<v=-2F+=1D=33)";G=/[^ -MPT[-~]/.exec(_);)with(_.split(G))_=join(shift());eval(_)
playery = step = sy = scrolly = 0,
a.style.cssText = 'height:100%;image-rendering:pixelated;image-rendering:-moz-crisp-edges',
between = (x, y) => x < (y || 24) && x > 0,
onkeydown = onkeyup = (x, y) => c[39 - x.which] = x.type[5],
data = new ImageData(120, magic = 160),
setInterval(
x = (x, y) => requestAnimationFrame(
x = (x, y) => {
for (i = 120 * 160; i--;
d = Math.min(1, -Math.min(0, Math.hypot(60 - x, 12 - p + playery) / 12 - 2)) * magic * l / 100,
data.data.set([9 * d + l * 8, 6 * d + l * 8, 6 * l + d + l * 8, 6 * 60], i * 4))
x = i % 120,
y = 160 + (x - i) / 120,
e = ((c[2] ? 69 - x : x - 53) + 360) % 360,
p = scrolly + y,
l =
// player
between(f = p - playery + active * Math.sin(e / 2 + 14)*(c[1]?1:14-Math.hypot(sy))/8|0) && between(e + 1, 16) && ~f && 48 - e > f * 2 && f > 17 - e * 3 | e * 5 - 3 > f && 38 - e * 2 > f | 3 < f - e
? (
f - e - 7
? 31 - e * 2 > f | 3 < f - e
? (3 < f - e) + 3 - (x + p) % 2 / 3
: 15
: 6
) - (f * 3 - e * e) / 60
// world
: p < 0
// ground
? p + 6 - (x + p) % 2 / 3
: 1230 < p
// sky
? active || (x - 60) / (100 - y) * 5 + step / 5 & 1 && 5 - i * i / Math.PI % 2
// tower
: Math.sin(e = Math.acos(x / 60 - 1)) * 12 - 12 + (
e = (((1 - e / Math.PI) * 180 + scrollx | 0) + 360) % 360,
// door
p < 42 && between(150 - e) && 3 - e % 3
// windows
|| ((p / 60 | 0) % 10 - 9 || step % 60 < 30) && (g = (p / 60 | 0) * 6 + ((e + 360) % 360) / 60 | 0) * 28 % 64 < 39 - g / 4 && between(p % 60 - 30 + 6, 6) && between(e % 60, 36) && between(e % 60, 35) * 5 + 5
|| ((p / 60 | 0) % 10 - 9 || step % 60 < 30) && (g = (p / 60 | 0) * 6 + ((e + 360) % 360) / 60 | 0) * 28 % 64 < 39 - g / 4 && between(p % 60 - 30) && between(30 - e % 60)
// wall
|| between(p / 6 % 51, 1) && 5
|| p % 6 && (p % 6 - p - e) % 12 && (11 + (p % 6 - p - e) % 12 && 8 + (p / 6 | 0) * ((p % 6 - p - e) / 12 | 0) / Math.PI % 2 || 5)
) * 2 - (e = p * 360 - e) * e / Math.PI % 2;
c.putImageData(data, 0, 0)
},
scrollx = ((!c[2] - !c[0]) * 4 + scrollx + 360) % 360,
// update position
p = playery += sy = -Math.min(c[1] && magic && magic-- ? 2 : 8, 1 - sy),
scrolly = -Math.min(110 - playery, -Math.min(playery - 5, scrolly)),
// check tower top collision
(active = playery < 1229) || (playery = c[sy = 0] = 1230),
// check window collision
e = 98 + scrollx,
((p / 60 | 0) % 10 - 9 || step % 60 < 30) && (g = (p / 60 | 0) * 6 + ((e + 360) % 360) / 60 | 0) * 28 % 64 < 39 - g / 4 && between(p % 60 - 30 - sy, 1 - sy || 1) && between((38 + scrollx) % 60, 52) && (
sy = 13, playery += 30 - playery % 60
),
// check ground collision
0 < playery || (sy = 13, playery = -2),
step += 1
),
scrollx = 33
)