7 March 2016

sense of place (part i)

One of the features I'm working on right now, is map building. There is a lot to be done here. I need locations, starting with a small frontier settlement. I need the different biotopes to stay more distinct, as well as blending more seamlessly together. I need a map that makes sense, which can be used to tell a story.

So to clear my mind, perhaps, throw out some ideas, I'm going to write a bit about map generation in LoSt. I'll be covering some of the game's principal design decisions as I go along. In this series started in the midst of the 2016 7drl frenzy, let's hope for a modest first article, just to lay out some basics and get the ball rolling.

Kitting up

The data is stored in homebrew module files of what I call kits. Each defined kit can spit out an instance of a certain class (eg. a critter or a place template). An important feature of kits is that they can look up and invoke other kits semi-randomly.

On the implementation part of things, most classes share certain functions and features, by inheriting a basic class that I call FlagThing. I suck at OOP, so bear with me. FlagThings are used to keep track of everything, store things like variables (a house may store a $dweller1 and $dweller2, its inhabitants, who in turn know that house as their $home). "Everything" is a FlagThing, from place templates to skills to critters, and even kits in themselves. They make up a kind of network of parents and children, emanating from a "world" FlagThing at the root of it all.

What's in a place?

Regarding the grid, suffice to say that it's hexagonal, and that, in addition to single coordinates, I keep track of "superhexes" (clusters of ~16 hexes; and then of course you get your hyperhexes and ultrahexes).

Speaking to world generation more specifically, the world consists of layers of places: The map as a whole is treated as a single place, containing several smaller places, called landscapes. Each landscape is a continuous field of hexes which share one climate and one name. They in turn contain smaller places: a house, a cluster of plants, a circle of totem stones, an animal or human encounter … Some of these places even contain within themselves subplaces or encounters (a wandering desert animal, a family seated to dinner in a house). Basically anything that spawns a being on the map when it is generated, is understood to be a place.

When a new place is generated, the first thing it does is to find and occupy some open space within the confines of its mother place. While some places use blueprints, most places are circular at the moment. Upon generation, they can fill parts of their interior to percentage values, like a basic house or a lake, put instances of inhabitants and subplaces, and do other interesting stuff.

   place bungalow template
shape "circle"
size (4,6)
get $wall ['dirt wall']
get $gate ['closed door']
room_fill {'wood tile':100}
edge_fill {'$wall':100}
edge_put {'window'(0,2)}
edge_put {'$gate':(1,1)}

   place salt pond
shape "circle"
size (2,5)
edge_fill {'water tile':50}
core_fill {'water tile':99}
brim_fill {'water tile':75}

   place hermit house
inherit "bungalow template"
get $hermit (['cri'],['persons'])
get $thing (['prop'],['loot','tools'])
core_put {'$hermit':(1,1)}
core_put {'$thing':(0,2)}

The routines for place generation are sound enough. Next steps include establishing more meaningful relations between places. That's a topic I hope to cover in my next post.

As always,

Some experiments are
just pure failures

No comments:

Post a Comment