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
}