I like to think that one of things we’re especially good at on Epitaph is finding creative solutions to the problems caused by having a massively complicated game and not an awful lot of developers. I like to think too that we’re reasonably good at identifying when we’re not doing something well – we might not have an immediate plan for how to fix it, but we are at least honest about the problems as we see them. One of the things that has constantly niggled at me in that respect is the provision of our room chats, and today I wanted to talk a little bit about how we’re looking at creative solutions to that problem.

First of all, let’s discuss the room chat problem – for those who haven’t encountered the term before, room chats are those incidental bits of atmospheric text that occasionally flash up in a room – they have no in-game impact, they’re just little bits of flavour designed to make a room feel less static.

That’s fine, as it goes, but the problem that we and other MUDs tend to have is that they become very repetitive after a while – this is a problem shared with NPC random chatter[1]. Traditionally, a room may have four or five room chats and they play every few minutes. The end effect is that after a while hanging around in a single room begins to feel a bit like Groundhog Day.

The second problem that comes from the way room chats are traditionally done is a great difficulty in having chats that are contextually consistent because they tend to be done at a room by room level. That discourages creators from investing a lot of effort into checking ongoing conditions such as whether someone is blind, or deaf. They tend to ignore weather conditions too[2] – you’ll see ‘the trees are gently swaying’ regardless of if it’s blowing a gale or there’s no wind at all.

We’ve never really had enough room chats on Epitaph, and the limitations of the system have never really incentivised us to add more. So, as a part of the overarching changes that are coming with patch 1.1, I’ve written an extended framework which I have termed the Ambiance System.

It works now by allowing us to create related packages of chats, and then bundling those chats into modules, and then registering relevant modules to rooms. The benefit of this is that it centralises the code, meaning that there finally is a reason to spend time on making individual chats more sophisticated. The system allows for the setting of pre-reqs on chats, as well as have particular chats have an impact on the room and the players within them. Pre-reqs let us have chats that only work when a particular condition is met – so we have certain chats now that are linked to the level of wind in a room, or the temperature. Chats can now have active effects, so when you see a chat like ‘Someone comes in and steals money from the shop safe’, we can actually have that linked to a corresponding decrease in the amount of money available. ‘A dog comes by and sprays its explosive diarrhea everywhere’ can result in everyone being stained with dog poo. While I still intend for room chats to be mostly flavour, this does allow things to be much more flexible.

Core to the system too is an emphasis on variability through special replaceable tokens – one room chat template may generate several dozen variations. Along with this comes the ability to have separate sets of room chats for players who are blind, deaf, or blind *and* deaf so we don’t get the immersion breaking effect of chats such as ‘a big dog looks at you’ when you’ve just had acid splashed in your eyes. We can take into account light levels too – if it’s a dark room, you might see ‘Something brushes against your leg’ while in a well lit room the same chat would appear as ‘A cat brushes against your leg’.

The variability cooked into the system is perhaps the most significant aspect, because in addition to letting us use arbitrary replacements defined at the chat level, we can also use special codes that query elements of the room. For example, the $shopkeeper$ code can be used to refer to a shopkeeper in a room, by name. The $light_source$ code can be used to pick out a source of light in the room. All of these codes too come with a wide range of modifiers, such as $possessive_light_source$ which will result in chats such as:

‘Your torch illuminates frightening shadows on the wall’
‘Drakkos’ torch illuminates frightening shadows on the wall’

Using tokens like this only works when we can be sure that there is something in the room that matches all the provided tokens, so a certain degree of checking is done before a chat is selected for being displayed. If there is something mentioned that isn’t present, then it won’t select that chat. Thus, we don’t even need to be careful when adding the chats – only the ones that make sense in context will be selected.

It’s amazing sometimes the difference that centralisation can make to the motivation to do things. Previously, I used to code a certain degree of randomness for chats into core inherits, but that was cumbersome and needed to be done on an inherit by inherit basis. It didn’t allow for the framework to be shared, and meant that each inherit had a subtly incompatible version of the system basic systems. The ambiance system provides it all hanging off of a consistent and flexible framework.

The Ambiance system doesn’t replace bespoke room chats – those can be used alongside the new modular system. Ambiance is designed to work at a much broader level, creating a library of chats that can be used across the entire game. I’ve long been of the opinion that having fifty chats shared between ten rooms is much better than ten rooms each with their own five chats, and that’s what Ambiance lets us do. My intention is that over time we’ll end up with thousands of chats in there, and each time we add a new set of chats it increases the richness of the entire game.

That’s really what I mean when I say we’re pretty good at finding creative ways to work around the issues that come with having a big game and a small developer team. We can’t just throw people at the problem, safe in the knowledge that if we break their spirits there will be more where they came from. We need to instead find a system that is appropriate for what *we* want to do, and one that can offer sufficient impact across the entire game. We need bang for our buck, and I find that aiming for that means in the end we get something better than what we may otherwise have simply been lulled into tolerating.

As an update on patch 1.1, it almost certainly *won’t* be the end of February, but it almost certainly will be the end of March. The fact it’s taking us to 1.1 should be a pretty clear message as to how significant I think the patch is. I think it genuinely makes a big difference to the game, and I’m very much looking forward to seeing it go live, Patch 1.1.1 will almost certainly be a maintenance patch focusing on fixing up what 1.1 will break. As usual, we’ll be adding in some new things as we go along there, but I think 1.1 will be enough in terms of changes to the core game for a little while at least.

[1] I’ve been playing through Skyrim again, and if I hear ‘I used to be an adventure then I took an arrow to the knee’ one more time I will kill everyone in every city.
[2] We have some chats that are associated with weather patterns too, but that works on a separate system entirely.