Flexible Architecture for World-building and Narrative
Back in the dark times (mid-pandemic) I got an itch to create a new game. For background, I started out as a game developer for a short period of time immediately post-university, and quickly figured out that the mainstream game industry wasn’t to my taste. So, I did what any self-respecting twenty-something would do, quit the game industry and moved over to the finance industry where I did the same kind of thing (programming is pretty much the same wherever you go) for five times the pay.
(As an aside, if any of you readers want to go into the games industry as programmers, I strongly recommend against it. Go into a field that appropriately compensates your skills, and keep game development as a hobby - working in the field is a sure-fire way of having any enjoyment of it sucked out of you.)
In my case, keeping game development as a hobby after my initial foray into the field allowed me to also keep my sanity and will to live - as well as create a few relatively small, well-received indie games on the side.
These days, I work in the field of AI and Machine Learning for a large international consultancy. I still haven’t lost my interest in games and, in fact, my go-to project for learning any new technology is to implement a game (or utility library for a game) using said technology.
Recently, I got bitten by the Rust bug, and decided that a good learning project would be to convert some of my existing C# game libraries over to Rust. Most of these libraries had been used for prior game projects, but some of them were in development for the aforementioned mid-pandemic game idea. “You’re waffling - what’s the idea?” I hear you asking. Well, if you’d be a bit more patient, I’m about to tell you…
What kind of game?
I’ve always been a fan of getting the computer to do the hard stuff and the boring stuff for me. For this reason, Procedural Generation (PG) has always fascinated me as a technique for generating in-game content. Of course, the problem with PG is that it’s purely random and pure randomness is just not interesting. It’s boring, it’s chaotic, and there’s no structure. Sure, you can create interesting looking landscapes and populated worlds but, frankly, they’re just not that interesting because they aren’t “designed”. Interesting encounters have to be designed, and the player has to feel like there’s a meaning behind their actions. For me, at least, the biggest immersion breaker in any game is the feeling that I’m just playing with a random number generator. I like there to be a coherent story, and the feeling that I’m playing an experience that has been designed for my enjoyment.
This is where AI comes in, right?
With the massive explosion of AI over the past couple of years (you noticed, right?) and the (somewhat) understandable backlash against “they’re taking our jorbs” that resulted, there a lot of opposing views about the ethics of using AI for content creation. Personally, I’m not sure how I feel about that. On the one hand, you have artists, coders, musicians and writers worried that they are going to lose their livelihood. On the other hand you have individuals wanting to do these things who have neither the requisite skills, nor the money to pay other people to do it for them. On the other other hand, you have large corporations trying to squeeze out more profit by using AI to eliminate jobs. Either way, the genie is well and truly out of the bottle, and it’s not going back in no matter how some people would prefer that outcome. Adapt or die, I guess.
Personally, I think that AI would be of particular (legitimate) use in helping to shape the randomness of procedural content. Imagine a scenario where a player rides up to a procedurally generated abandoned village on the edge of a forest. Generating descriptive flavor text for every possible combination of village/location would be impractical, but for an LLM with a carefully crafted prompt and set of instructions, it would be trivial. For example, this response was generated by a simple request to Llama3:8B-Instruct for an introductory paragraph for a mostly abandoned village on the edge of a dark forest.
"content": {
"story": "As the last wisps of dusk's light faded, the village of Brindlemark lay shrouded in an unsettling silence.
The thatched roofs of the huts seemed to sag under the weight of the oppressive atmosphere, as if the very spirits of
the land had grown restless. The once-thriving market square was now a scene of desolation, the stalls abandoned and
the produce rotting in the mud. The villagers, few and far between, huddled in their homes, whispering tales of dark
omens and ancient evils stirring in the depths of the nearby forest."
}
Admittedly it’s not the best prose in the world, but it’s certainly not bad, and it’s the only practical method for creating this kind of descriptive information in a procedurally generated world without resorting to formulaic templates (which falls into the “boring” trap) or the use of Markov-Chain generation (which tend to result in more nonsensical output - or in other words, boring). As I implied earlier, in order to be engaging, generated content has to “feel” like it was created with purpose. Other than having an army of writers on 24-hour standby, using an LLM is the only practical and realistic way to implement this kind of functionality in a PG environment.
I’m rambling again, and I’ve not even really talked about what the game is. Let me fix that.
Okay, so what kind of game?
One of my favorite types of game, (at least theoretically), is the Roguelike. Most readers should be familiar with the concept, but the key feature of a roguelike is that the genre is arguably the first and oldest of the fully PG games. So why did I say that they are only theoretically my favorite game genre? You probably already know the answer: randomness. I like them, in theory, but I can’t shake the feeling that I’m just playing against a random number generator. Recently some games have improved on this, with a particularly notable example being Caves of Qud. (It has some other issues that I’m not so keen on, but it’s the best of the bunch, for sure.) Another one I think I should like (and I’m trying, honest!) is KeeperRL, and also Dwarf Fortress and Soulash/Soulash 2. There are many others that I haven’t mentioned, but that doesn’t mean they are any less good - it just means I haven’t played them enough to make a decent judgment. In fact, the only modern Roguelike I have put any significant time into recently would be Caves of Qud.
Each of these games are excellent within the genre, but they are still missing a certain something that I would like to see. Caves of Qud, for example, has an excellent main story, but the presentation and interface are designed for an audience of hardcore Roguelike fans. It’s not very approachable as a beginner. On the other end of the spectrum, KeeperRL has beautiful presentation and an appealing interface, but focuses more on the simulation than the story (at least as far as I’ve got in it anyway, which is not that far). And even then, my feeling is that the interface is more complicated than it needs to be - or at the very least, not as intuitive as it could be.
I could (and probably should) go into a lot more detail about specifics of these (and other) games - if only to do them justice rather than deliver dismissive soundbites - but that will be a post for another time.
So, the point of this long rambling post is that I’m thinking of making a Roguelike, bringing in some of the things I’ve learned from working in the A.I. field from the past few years. Currently this involves working on various support libraries that will make up the bones of the game.
I’ll talk about this in future posts, but I will announce the name of the engine I’m building… The "Flexible Architecture for World-building and Narrative"
AKA “The FAWN Engine”.
hiivelabs and its logo are registered trademarks of hiive llc.
All content © 2005-2024 by hiive llc.