Much as I want to get my @ displayed and moving around screen, last night and today have focused on level generation instead.

Scroll has kinda strange level generation method, compared to how I suppose most roguelikes do it. There are only 3 calls to rand in all of Scroll. Just a 3 random parameters, but that's enough to ensure a different level each time.

-- Random level generation function.
level :: Bool -> StdGen -> [String]
level randomize r = concat
        [ final (length tutorial + extra) $ concat $ rand mariner1body
        , concat $ rand mariner1end
        , concatMap rand kubla
        ]
  where
    -- here be spoilers

You could say there are two influences in Scroll's level generation method: Nick Montfort and Samuel Taylor Coleridge.


I have thought some about Scroll before starting the 7drl week, but my idea for the game was missing some key concepts. There was nothing to keep the player engaged in moving forward, an unclear victory condition, no clue how to generate appropriate random levels, a large potential for getting stuck, and no way to lose the game. This is all a problem for a roguelike.

But, I had an idea finally last night, about a single unified thing that all of that stuff falls out from. And it's right there in the name of the game!

Now that I understand Scroll better, I wrote the tutorial level. It's a very meta tutorial level that sets the scene well and serves more purposes than are at first apparent. I count a total of 6 things that this "tutorial level" will let the user do.

And interestingly, while the tutorial level is static, it interacts with the rest of the game in a way that will make it be experienced differently every time through.


The strangest line of code I wrote today is:

import GPL

Somehow, I have never before, in all my time programming, written a line like that one.


Finally, after 7 hours of nonstop coding, I got ncurses to display the generated game world, scrolling around in the display viewport. No @ yet; that will need to wait for tonight or tomorrow!