An Infinite Forest
by Ondřej Žára
HTML
<!--
@ = you
size = 251 bytes
terrain = random & infinite (reload for a new one)
arrow keys = move around (might need clicking into the map before)
author & contributors = @0ndras, @balazs_kutil, @aemkei
font rendering issues and jumps = remove droid sans mono declaration >>>
-->
<body id=b onkeyup=for(u=v=0,s="",n=589,p=31,c=event.which,c&&(c%2?u=c-38:v=c-39);n--;)i=n%p-15,j=(n/p|0)-9,k=(i+x-u)/9+9*(j+y-v),c=".#♣♠*"[k*(k*p+S)&15]||".",i|j||(c=="."||Q,c="@"),s+=c;x-=u,y-=v,innerHTML=s onload=S=Date.now(x=y=0);b.onkeyup(b)>
CSS
@import url(http://fonts.googleapis.com/css?family=Droid+Sans+Mono);
html {
background-color: #000;
}
body {
font-family: droid sans mono, monospace;
font-size: 150%;
word-wrap: break-word;
width: 31.5ch;
margin: auto;
background-color: #efa;
color: #090;
border-radius: 10px;
box-shadow: inset 0 0 10px 3px #000;
}
JavaScript
return;
/* Code explained: */
body.onkeyup = function() {
for (
u=v=0, // movement offsets
n=589, // number of visible chars - 31*19
p=31, // useful prime constant
s="", // string with map data
c=event.which, // pressed key
c && (c%2 ? u=c-38 : v=c-39); // convert key code to movement offset
n--; // for loop condition
)
i = n%p-15, // X viewport coord
j = (n/p|0)-9, // Y viewport coord
k = (i+x-u)/9+9*(j+y-v), // player's position in one number
c = ".#♣♠*"[ // template of available chars
k*(k*p+S)&15 // trivial noise modulo 16
] || ".", // fallback char when out of range
i|j || // collision detection: if the player
(c=="." || Q, // does not stand on a dot, throw
c="@"); // else force @ char
s+=c; // add generated char to string
x-=u, // adjust player's position
y-=v,
b.innerHTML=s // display map
}
body.onload = function() {
S=Date.now(x=y=0), // random seed, initialize player position
b.onkeyup(b) // initial draw
}