Download

BLOG       DOWNLOAD/ABOUT         LINKS         CONTACT

28 September 2015

measurements of the known world

I want the setting to be highly random every time you play. Questlines, species of animals and plants, important places, they should all be procedurally generated – at least to a certain extent.  It's impossible not to work with some templates. Say you want random places – you have to stop the randomness at some point and set fixed parameters. If I want settlements to crop up in the game, it's not going to happen unless I make some blueprints with blanks to fill in, and a balanced "world blueprint" to put at least a few villages in addition to other places of interest. The same goes for animals: I can't just blindly generate a bunch of random species and put them on the map. There must be a balance of predators, prey, pets, and atmospheric population of The Land.

Every now and then, some fresh developer announces that he (mostly guys do this, yeh :P) is writing a RL where a totally unique world and plot will be generated each time. Content like trade, reputation and other intelligent behaviour will supposedly just procedurally occur from the sublimely wrought code that binds it all together. I think what we (counting myself amongst this throng of vapourware developers) fail to realize, is this basic principle, that you have to actually implement all the content that goes in the game. Sure, you can patch it together so that interesting combinations will occur procedurally, but there is a reason why so few RLs (if any?) exist that really take this to the next level. A conventional truth is that procedural generation can be used to alleviate manual labour by pregenerating stuff like landscapes, that would otherwise have to be coded by someone. This may be true for genres like FPSs and development models used in big business, but in RL development, the opposite seems to be true: Rather than handcrafting less content than the player is going to see in any one game, you'll end up having to make more, by orders of magnitude.

If there is something like a story in any given RL game, I think it's the setting. Exploration of the game's universe doesn't happen linearly, but rather fractured up by features like permadeath and randomness. I actually believe this to be a key to random stories in RL games: Granted, you'll find yourself implementing stuff like procedural dialogue and questlines, but the actual sense of the work will be in something perhaps much less grand: just the kind of random stories that have always been extolled on RL forums. So much for holy grails and silver bullets.

As I stated, I want the map to be randomly generated, but I'm not aiming for a huge world. My current testing version generates a landscape encircling a diameter of about 400 hexes, surrounded by endless desert. Rather than each playthrough taking place on an entirely different planet, I'm envisioning different regions in one and the same world. For one thing, it'll make a lot more sense if later I implement ghosts, or even the option for retired characters to show up as NPCs in later games. It also means I can write quite specific lore to reflect a single world/culture, and possibly conceive of one or more overarching plots, possibly even win conditions. (And yet, why bother with win conditions; doesn't an unwinnable game world highlight the very strengths of the RL genre?)

I will of course allow myself to vary parameters in the setting if I think it can be used to advance gameplay or the story itself. The Land is situated on the frontier of a continent loosely based on historic America, during a period of colonization by settlers and officials of «the old world». One could randomize the ruling form of the old world, for instance: Is it an empire or monarchy, or a federation or a group of rivaling states? That might not be worth the effort, actually. But it might be interesting if for instance the religious fractions were partly randomized. In one game priests and mystics hailing to the prevalent religion(s) might be wandering monks and nuns, in another they could set up temples in villages or near natural sources and holy sites. And I've been thinking about having the old world represented by a random currency in each game.

Old world money, however, would probably just function as trade goods. The popular currency used in The Land is always lead bullets. Slugs function as coins as well as ammunition, so in The Land, the saying that one person's life is worth one bullet, is no metaphor; it's the actual rate. It's a harsh land. Slavery may be more or less predominant in different playthroughs, but it will always be an issue
in the game world. But I guess there may be some sort of hope. Should I flesh out the theme of slavery into a main plotline, one conflict would surely have to be the fight for the abolishment of slavery! The law is still fluent in The Land, dictated by the varying influences of various power fractions. Fractions might include commercial companies and military forces from the old world, opposed to forces for political independence, ranging from semi-autonomous settlements to secret societies, but also powerbases ambiguous to this dichotomy, like the church or different sects/cults, local commercial interests and gangsters fighting it out between themselves while simultaneously trying to stave off the man, who wants all of their heads on a platter.

Some fractions might be pure berserker types when faced with the players, such as desperadoes, highwaymen, and parts of the natural world. For now, I have more than my hands full just getting all systems to work and writing the bare bones of a weird western setting, but naturally I would love to add an indigenous culture, with its own bases of power and playable careers. In the current public version, there is already the skeleton of a career system, starting the player out with a random career out of many. I'll soon pick and flesh out a few careers, and then add more as I go along. Careers might represent power fractions in themselves, and I hope to use them as stepping stones to describe the setting. I'm pretty sure The Land will feature lots of conspiracies, so it might make sense to have some of the careers represent something akin to guilds or networks. There may be a fellowship of the railway station masters, or a code of conduct taken by certain gunslingers and avengers, etc. The career you choose at the beginning of the game will represent your background, so it should be fully possible to start out as a lyncher, but then pursue the skills and ethos of a witch hunter or an agitator. Starting careers should open up something like a skill tree, however, and maybe possible starting missions. As development progresses, specialized skills can be assigned to specialized careers, in addition to being learnable in the game.

At the moment, I'm debugging and finalizing the basic world building engine, whilst simultaneously using it as an opportunity to add some content. For instance, I've been having some trouble with places/encounters containing subencounters (say, a pampas, containing a house, containing a critter). To test and tweak, what better way than writing up a few places that use this exact mechanism. The next release seems to be in sight. And if you think I've been ranting my way through this blog post, you should probably have stopped reading a long time ago.

As always,
Minotauros

20 September 2015

Shaping up

I've been hacking away some at LoSt (even if I borrowed my motto from Beckett's early prose piece The End: «I did not work every day.») – adding more infrastructure for loading and randomizing content, as well as a basic landscape/climate generator and encounter system (if still pretty crude, it'll do for our testing purposes).

This means I'm facing a period of adding some content, which is always fun. Especially as most of the game is generated from data files now, meaning I'll be able to quickly add and test different kinds of items and critters/people with particular behaviors.

I'm recycling a lot from abandoned projects, so I can move quickly enough, even if «I did not work every day».

I reckon the next release will feature a wasteland with some houses and human encounters, as well as plants and animals (randomly generated species, of course).


Speech and experience/time are probably next on the todo list, after which I'll be able to concentrate more and more on adding content.

Compared to coding, adding content is easier from a technical point of view, but it can be much harder to design and balance. (Not to mention that I'm still ironing out system basics like whether or not to use explicit facing).

As always,
Minotauros

17 June 2015

the joy of rotozoom()

A quick update: I've been working on a new routine to display tiles, with support for animated sprites. Instead of the epitomal @, you are a pair of footprints wanderig around. There are some dogs pawing about, as well, and the system currently supports critters up to 4 hexes big (mounts and pachyderms, I reckon). Further down the road, I'm opting for some kind of speech system with speech bubbles, and probably typographic sound effects (comic book onomatopoeia like "clank" and "boom").

All animations can be switched off in the configuration menu, of course. Even then, I've a nice system where you can switch between resolution levels (and, theoretically, tile sets) at a whim, to support both small and big screens. All very much thanks to pygame's smoothscale() and rotozoom() functions.

The next release is probably going to be all about a desert biotope, with pseudo-random species of animals and plants. I've been moving a lot of the content over in data files, to make it easier to add new stuff. The very template-like desert dog that's currently in the game, is contained in the following lines in the data files:
cri small dog # "cri" means "critter", as in "define new critter"
inherit "critter" # get some basic stats
nom ["a","big chihuahua","chihuahuas",""]
max_health (2,1)
tags ["animal"]
causes ['self-preservation','zombi moves'] # define behavious
hands "bite" # natural attack
size 2 # two hexes big
tile ((2,2),(2,2),(2,2),(2,2)) # refers to four (identical) paw sprites
end # end entry for critter "small dog"

# the following three entries make up a very simple "reptile brain" AI plugin:
cause self-preservation # "cause" = preferences/ethos of being
bias [(('harm',0,0,'self',0),('aggravate','agent'))] # hate attackers
states['relaxing'] ["zombi wander"] # when relaxing, just walk randomly
states['attacking'] ['zombi attack'] # need to be able to fight
end
state zombi wander # the "relaxing" state of the critter
actions [(30,("relaxing",0),("finish",0))] # 30% find other pastime
actions [(10,("wait",0),("finish",0))] # 10% stand still
actions [(100,("wander",0),("finish",0))] # 100% walk randomly
bias [((0,'foe',0,0,0),('attacking','agent'))] # attack foes on sight
end
state zombi attack # attacking state
actions [(100,("is_dead","q"),("return",0))] # if quarry q is dead, exit state
actions [(100,('ally','q'),('return',0))] # is q is an ally, exit state
actions [(1,('nil',0),('return',0))] # 1% P of randomly exiting state
actions [(40 ,('approach','q'),('finish',0))] # 40% try to approach quarry
actions [(100,('attack','q'),('finish',0))] # 100% try to attack quarry
actions [(100,('approach','q'),('finish',0)), (100,('wander',0),('finish',0)) # backup strategy: charge!
end


As you can see from such snippets, I'm not aiming for this to be expandable by anyone except me ;) but there is support for "modules" in the game, so you can theoretically mix and match packages of content. In the long run, one could release expansion packs, maybe stuff like a "steampunk mod" or an "undead apocalypse mod", for people who are into that kind of weird west, and the players could choose to include or exclude the various modules at their leisure (I would love a "postapocalypitic cowgirls/Burroughs/Genet queerporn mod", mesself).

Dreaming about long term goals such as this, is of course a very important part of RL development. I think I'll celebrate the next release with a meatier blog post detailing my sterling Slow Application Development (SAD) Method. In the meantime, interested parties can get your snapshot release here (python sources).

The next big thing to do, is to systemize how random elements are picked, so that I can start adding more content; the encounter tables, so to speak. I'm going to use the kind of rhizomatic data entries examplified above, but they need lines beginning with something like "frequency". There needs to be a module or object to make sense of cases like how, if an oasis appears in the desert, it might possibly contain the tent of a travelling salesboy (but probably not a nest of poison ugguks, which you'd be more likely to encounter underground), and in that tent (possibly) of box of posessions, amongst which (possibly) a handgun which (possibly) only holds four bullets, but scores deadly shots with a 1/6 accuracy (just possibly).

The devil, of course, is in the details, that is to say the content. The anatomy of a critical hit, and of the revolver itself, not to mention the salesboy and his tent, the oasis, the desert … With small steps I might be able to slowly populate the current waste land and build a world of biotopes subtle and sprawling, struggling centres of civilization, and a gruesome, mysterious subterranea.

By the way, rescaling the sprites can also be used to get a nifty overview map, although it would be risky to navigate around that, once I get some dangerous encounters up and going in the desert. On the long todo-list is a "travel mode" which zooms out to a larger map view. But here and now, it's more pressing to fix various issues with map generation, some of which become apparent from this very screenshot.

As always,
Minotauros

19 March 2015

On the fence

How time flies when development is at a standstill. LoSt can be said to be en route, though; in concordance with the Slow Application Development (SAD) methodology that "we" (that is to say, I) have proudly developed in-house, I'm zealously adhering to the doctrine of "release sometime, release sometimes".

Being busy with other things still leaves me headroom to ponder some issues I'll be tackling in LoSt (this being quite possibly the only redeeming quality of the SAD methodology). I'm not so far away from having most basic functionalities in place, but I still need to make some big decisions. For instance, I'm still on the fence regarding whether I should keep content in data files or put them straight in the source code. In my single big computer game project so far (Squirm RL) I kept "everything" in data files, and I loved how easy it was to add new effects, items, quests, and monsters. On the flip side, I had to stay within the boundaries of the "natural laws" that ruled the game world, and whenever I needed to step outside of these boundaries, I had to mess around with the parser itself, as well as dive into stuff like the main loop and basic event handling. (Let's hope this is the last time I squeeze in a Squirm postmortem on this blog)

For LoSt, it might have been a good idea to use a scripting language. But since I'm writing the darn thing in Python, anyway, that would basically amount to bundling content in with the source code. I think that may be the way to go, just to get maximum flexibility. For instance, I'm planning to have most animal species randomly generated for each world seed. It'll probably be easier to balance and maintain such a fluctuating bestiary as a separate module, rather than implementing a half-assed "catch-all" data syntax.

I already did some work on this, quite early in the process, and came up with a simple plant generator, which spits out basic info on six species of plants, balanced against each other so you won't get a  world with only poisonous plants, or no flora except grasses. A sample run gives something this result:

Bluebread (a small bush, bearing fruit, with a poisonous stem, and capable of walking by uprooting itself), nodding olive (a huge cactus, labeled a tree, with branches that can be used to make rope), sugarelder lilac (a tree with medicinal roots and flowers containing an antidote to poison), bane-grass lily (a toxic grass, however with edible flowers, and roots that can be made into rope), medusapod needle (a flowering grass tagged as "hexweed" and "species delicacy"), and crow's nest foxbrush (a big bush with medicinal berries, and which also is capable of walking).

It'll take some work of the imagination to expand this simple mock-up to include a whole biotope. I'll probably have the generator start out with some kind of "template ecology" where the blanks are filled in, to make sure of stuff like at least having some plants and herbivores at the bottom of the food chain, but more importantly to enforce such as affects gameplay: For instance, there should always be some ferocious animals for the player to fear, but not too many of them; and I certainly want horses or some kind of equestrian beast to appear in every world; and depending on how the game ends up balanced, I need to make sure that resources like food and medicine are distributed in appropriate quantities.

I imagine it a bit like laying out the cards in a fixed pattern for a game of solitaire, or when consulting the Tarot. Except the cards themselves may contain new blank slots, to be filled with yet new cards drawn from the deck. Thus, a "card" containing the template for a small predator will contain some basic stats, but also ask the engine for more "cards" to flesh out the details: whether it's a mammal or a reptile, how it lives and hunts, as well as more unique traits (eg. particularly fast or strong, or poisonous, or easy/hard to tame as a pet).

This, again, raises the question of how to draw random elements when constructing and populating the game world. I may hold on to the "deck of cards"-analogy, making each alternative less likely to show up twice in a row. That would make it easier to restrict for example the probability of every single species in a world being poisonous (although even that may be left at least theoretically possible). And a "deck of cards", periodically reshuffled, may be a better way to assure balanced random drops over time, than simply rolling a die and consulting a table of results.

At the moment, I'm happy enough to ponder this a bit more before getting back in the thick of coding.

In related news, I'm about to send off a pile of stuff for work, which might mean I'll manage to make space for some LoSt development in the next months – although I may have to scramble for a new big project, to accumulate the resources I need for that long-awaited frontal attack on the evergrowing stack of bills.

23 November 2014

Thinking Out Loud

Development of LoSt is seeing another burst of activity, be it long or short. On the top of my old todo list was to get a decent "AI" (or, call it, action determination system) up and going for NPCs and enemies, so that's where I'm at now.

A golden rule to keep in mind when developing NPC/critter behavior is that the actors need to be "thinking out loud" to a certain extent. It's easy for a developer to fall in love with a system where there's a lot of hidden stuff going on, stuff the player simply won't notice. In many situations, simple hacks are better than complex algorithms. Making changes in the code will also have more predictable results if you're using simple rules (a fixed probability to flee/fight as opposed to a function that takes into consideration factors like relative health and strength of the opponent).

Truly believable characters may come off as bland; a fictional person is much more easy to make memorable if defined by traits underlined to an almost absurd degree (consider the monomaniac ramblings of Captain Abab or The Red Queen in Alice; the archetypical nice naughtiness of someone like Little My (in the Moonmin books) or Pippi Longstockings; the sincere stupidity of Sancho Panza. Examples that might hit closer to home include the conspicuous inclination of pixies/leprechauns in traditional Rogue-games, or how that pesky puppy in ADOM ceaselessly gets into fights with ogres and worse).

I'm basing my "AI" system of how I did it in my abandoned Roguelike Squirm. Each actor is always in a certain state, which dictates the actor's behavior (eg. "hungry-at-home" state: if there is food on the table, eat it, else go to "cook-and-put-food-on-table" state). The personality of any actor is really contained in the sum of states that actor is capable of being in, as well as (what I call) the "bias switches" used to switch the state of the actor, depending on what it observes on the map. It is a quite flexible system for tactical behavior (switching between different attacking/defending states, so that some goon might keep her distance, seeking cover and firing a gun, maybe turning to run if she gets hit herself, whilst man-eating big-dogs might hunt in packs, aiming to surround their victim and go for the throat) as well as functional or even choreographic (going to the doctor if you've been shot in the leg; frequenting the railway station to proclaim the villainies of villains and handing out cash bounties to said villains' vanquishers; heading to the saloon with a loaded gun to settle all your debts once and for all).

The whole thing borrows heavily from Bear's Roguelike Intelligence articles on Roguebasin. Andrew Doull's essays about developing Unangband was also a huge inspiration back at the time I was developing Squirm.

Right now I'm just testing it with a desert stray dog, quite ineptly identified by the game as "a dog, holding teeth". It starts out in a "wander" state, which just loops endlessly, with the dog always walking in a random direction. Its sole cause in this world is self-preservation: if someone (presumably the player, being the only other living thing in this infinite desert) inflicts damage upon it, it fights to the death.

I might test this further with some more desert life (I have a prototype for randomly generated plant species lying around), but I'll soon be delving back into the lead mines to develop the slave break scenario a bit more. It's a pretty fruitful scenario to use for early development. It involves some fighting, possible even between two groups (slaves and owners, if it turns into a real uprising), which is good to get a lot of technicalities in place. There will also definitely be some talking, and I hope to develop at least the slave community as an interesting part of the setting/theme, with their own rumors and rituals, staying pretty small while hinting at larger issues.

As always,
Minotauros

17 July 2014

The Story So Far

A while ago, I started to tinker with a computer game named Land of Strangers. The game is a Roguelike set in a fantasy world inspired by various fictions about cowboys and cowgirls. It's still in the very early phases of development, but can already by downloaded (as a Windows executable, a software package for Debian/Ubuntu Linux, or as source code (written in python)).

Louise Ortiz, travelling salesgirl, soon to be dead (screenshot from LoSt v. 7)


This blog was established to write about LoSt (although I might make the odd excursion into stray topics, I'll try to stay on the case). For the sake of archival completeness, here is a final link, to a forum thread which I've been using to rant about LoSt: http://forums.roguetemple.com/index.php?topic=3221.0

The summer is going to be awfully quiet, but I'm guessing we can expect a new release early next fall. It will focus on making the supporting cast a little smarter.

As always,
Minotauros