October 19, 2014
Map of The Habitat World
By now a lot of you may have heard about the initiative at Oakland’s Museum of Digital Arts & Entertainment to resurrect Habitat on the web using C64 emulators and vintage server hardware. If not, you can read more about it here (there’s also been a modest bit of coverage in the game press, for example at Wired, Joystiq, and Gamasutra).
Part of this effort has had me digging through my archives, looking at old source files to answer questions that people had and to refresh my own memory of how things worked. It’s been pretty nostalgic, actually. One of the cooler things I stumbled across was the Habitat world map, something which relatively few people have ever seen because when Habitat was finally released to the public it got rebranded (as “Club Caribe”) with an entirely different set of publicity materials. I had a big printout of this decorating my office at Skywalker Ranch and later at American Information Exchange, but not very many people will have been in either of those places. Now, however, thanks to the web, I can share it publicly for the first time.
We wanted to have a map because we thought we would need a plan for enlarging the world as the user population grew. The idea was to have a framework into which we could plug new population centers and new places for stories and adventures.
The specific map we ended up with came about because I was playing around writing code to generate plausible topographic surfaces using fractal techniques (and, of course, lots and lots and LOTS of random numbers). The little program I wrote to do this was quite a CPU hog, but I could run it on a bunch of different computers in parallel and combine the results (sort of like modern MapReduce techniques, only by hand!). One night I grabbed every Unix machine on the Lucasfilm network that I could lay my hands on (two or three Vax minicomputers and six or eight Sun workstations) and let the thing cook for an epic all-nighter of virtual die rolling. In the morning I was left with this awesome height field, in the form of a file containing a big matrix of altitude numbers. Then, of course, the question was what to do with it, and in particular, how to look at it. Remember that in those days, computers didn’t have much in the way of image display capability; everything was either low resolution or low color fidelity or both (the Pixar graphics guys had some high end display hardware, but I didn’t have access to it and anyway I’d have to write more code to do something with the file I had, which wasn’t in any kind of standard image format). Then I realized that we had these new Apple LaserWriter printers. Although they were 1-bit per pixel monochrome devices, they printed at 300 DPI, which meant you could get away with dithering for grayscale. And you fed stuff to them using PostScript, a newfangled Forth-like programming language. So I ordered Adobe’s book on PostScript and went to work.
I wrote a little C program that took my big height field and reduced it to a 500×100 image at 4 bits per pixel, and converted this to a file full of ASCII hexadecimal values. I then wrapped this in a little bit of custom PostScript that would interpret the hex dump as an image and print it, and voilá, out of the printer comes a lovely grayscale topographic map. Another little quick filter and I clipped all the topography below a reasonable altitude to establish “sea level”, and I had some pretty sweet looking landscape. At this point, you could make out a bunch of obvious geographic features, so we picked locations for cities, and drew some lines for roads between them, and suddenly it was a world. A little bit more PostScript hacking and I was able to actually draw nicely rendered roads and city labels directly on the map. Then I blew it up to a much larger size and printed it over several pages which I trimmed and taped together to yield a six and a half foot wide map suitable for posting on the wall.
As I was going through my archives in conjunction with the project to reboot Habitat, I encountered the original PostScript source for the map. I ran it through GhostScript and rendered it into a 22,800×4,560 pixel TIFF image which I could open in Photoshop and wallow around in. This immediately tempted me to do a bit more embellishment with Photoshop, so a little bit more hacking on the PostScript and I could split the various components of the image (the topographic relief, the roads, the city labels, etc.) into separate images which could then be individually manipulated as layers. I colorized the topography, put it through a Gaussian blur to reduce the chunkiness, and did a few other little bits of cosmetic tweaking, and the result is the image you see here (clicking on the picture will take you to a much larger version):
(Also, if you care to fiddle with this in other formats, the PostScript for the raw map can be gotten here. Beware that depending on what kind of configuration your browser has, your browser may just attempt to render the PostScript, which might not have exactly the results you want or expect. Have fun.)
There a number of interesting details here worth mentioning. Note that the Habitat world is cylindrical. This lets us encompass several different interesting storytelling possibilities: Going around the cylinder lets you circumnavigate the world; obviously, the first avatar to do this would be famous. The top edge is bounded by a wall, the bottom edge by a cliff. This means that you can fall of the edge of the world, or explore the wall for mysterious openings. By the way, the top edge is West. Habitat compasses point towards the West Pole, which was endlessly confusing for nearly everyone.
We had all kinds of plans for what to do with this, which obviously we never had a chance to follow through on. One of my favorites was the notion that if you walked along the top (west) wall enough, eventually you’d find a door, and if you went through this door you’d find yourself in a control room of some kind, with all kinds of control panels and switches and whatnot. What these switches would do would not be obvious, but in fact they’d control things like the lights and the day/night cycle in different parts of the world, the color palette in various places, the prices of things, etc. Also, each of the cities had a little backstory that explained its name and what kinds of things you might expect to find there. If I run across that document I’ll post it here too.
Wow…is the original height map available anywhere? How condensed is the data in the .ps file?
Posted by: John Dougan | October 27, 2014, 10:30 pm
My memory on that is a little fuzzy, actually. In my archives I appear to have a data file that seems to be a raw 500×100 image (the pixels are 32 bits but appear to only contain values that would fit in a signed byte, i.e., 256 levels), so that may have been it. There’s also an ASCII file that seems to have the values printed — a quick inspection reveals pixel values in the range -74 to 8. That’s a little weird… The data in the .ps file looks like it’s the same spatial resolution but it has been quantized to 16 grey levels. I could probably write a little program to convert one of these into a greyscale PPM file, then read it with Photoshop and convert it into something more usable.
Now that I look, I also see that I have the code for the program that generated the original data, but of course if you ran it you wouldn’t get the same output as it’s quite non-deterministic.
Posted by: Chip | October 27, 2014, 10:49 pm
Not being familar with Habitat, I’m nt sure if this is a relevant question, but what is the map scale?
Posted by: John Dougan | October 29, 2014, 4:29 pm
I wouldn’t say it’s not a relevant question, but there isn’t really a meaningful answer. Unlike contemporary MMOs which are typically organized around some kind of 3D spatial model, the Habitat world was topological in nature. It consisted of a series of places (called “regions”, corresponding basically to a screenful of stuff) that were connected in a graph structure but which often didn’t necessarily correspond to anything that you could make a euclidean map of — as people who tried to draw such maps quickly found out! But aside from mapmakers people generally had little trouble with this; one interesting thing we discovered was that people generally don’t even notice when places like buildings are bigger on the inside than they are on the outside.
The purpose of this map was basically to give us a backstory that would motivate the various places that would be creating, rather than to be physical representation (which the Commodore 64 would not have had the horsepower to render even if we had one).
Posted by: Chip | October 29, 2014, 11:42 pm
Ah. It used MUD/MOO type spaces. Makes sense given the tiny hardware of the day. I wonder how many simultaneous users you could get with modern hardware and clusters and that “spatial” architecture? Eve Online is almost this architecture, but the topology nodes (solar systems) are sort of 3D internally (dynamic collection of coordinate coherent 3D grids), so that cuts down the high end user counts.
I was thinking about taking the mesh and turning it into a terrain for some VW platform….would be a good excuse for me to get back to Open Cobalt again. For that matter, I was looking for a better terrain generator. Who owns the rights to yours?
Posted by: John Dougan | October 30, 2014, 2:08 pm