Developing Tau Station’s Mission Builder

A drawing of a diagram of computer chips, with two construction workers about to place the final piece in the largest computer chip, which has the Tau Station logo on it.

Mission Builder is one of the most important components of Tau Station and yet, ironically, it’s one that not a single player will be directly exposed to at any point in time. So what is Mission Builder, and what makes it such a valuable part of Tau Station? It’s the most heavily used content creation tool in the game, used by our narrative designers to create jobs, missions, NPC dialogues, and more. While Mission Builder isn’t quite one-stop shopping for the narrative team, it’s the equivalent of a Swiss Army chainsaw hanging in the team’s toolshed.

Why develop a custom mission tool when there are already a bunch of great programs out there to assist creative teams in building game content? We built our own because we’re doing some complicated things with our missions that, quite frankly, many of the existing tools out there can’t support. They can’t natively know what sorts of actions our players can take, or what our stat rolls will entail, whether a particular action is illegal in certain areas of the game, or anything of the sort. We’re creating rather complex, non-linear missions on a daily basis, and as we kept adding features to the game it became clear that it would take us longer and longer to translate a mission written in an external tool into something Tau Station could use. Even though many of those tools had great APIs available, the amount of work it would have taken to build an integration – that still wouldn’t completely meet our needs – was not that much less than the work required to develop our own tool from scratch. Therefore, why not spend that time building our own mission editor?

Mission Builder fills a lot of needs for our narrative team, but its primary purposes are for mission building, job creation, and NPC dialogues. Missions in Tau Station are similar to quests in other RPGs and can be as simple as running a delivery errand for a vendor or as complex as overthrowing a rogue dictatorship. Jobs are usually simple, repeatable tasks that a player can do to earn some extra credits while playing the game. Dialogues with NPCs are an integral part of missions and jobs, but we want Tau Station to be immersive which means sometimes you can also just sit down and have a chat with a random NPC. Mission Builder lets our narrative team breathe life into the characters you’ll encounter in your travels.

Yaroslav was the dev selected for the (possibly unenviable) task of designing and coding our Mission Builder program. He knew the story we wanted to tell and had an idea of the kinds of missions we would have in the game, but when he started work on it the creative team hadn’t come on board yet and many of the game’s mechanics were still being sorted out – it was up to him to try and anticipate what would be needed in a tool that was going to be a critical piece of the game’s creation. Fortunately for us, Yaroslav is adept at finding the way forward despite pesky details like a lack of a design document and incomplete specs. He polled the rest of the technical team for ideas, did some research, and got to work on the program. He did a phenomenal job. By the time his first draft of Mission Builder was ready we had hired two of our narrative designers and they were able to create some jobs and missions to test it out. It was still in a basic state, but the core functionality was in place for us to build upon and it gave the creative team even more ideas about how to put together missions for the kind of game we want to deliver.

As the narrative designers began to write missions and more decisions were made about the game mechanics, the suggestions for additional Mission Builder functionality began pouring in fast and furious. More preconditions, the ability to put a player in the brig for failing a roll, integrating the game’s reputation system, offering more than one successful mission outcome…the ideas were flowing. We also identified a few kinks that needed to be worked out before it could become our primary tool for content creation. In particular, Mission Builder itself was closely coupled with the mission validator engine, which prevented the narrative designers from saving a mission unless it was in some semblance of a finished state – in other words, the mission validator had to think the mission was valid before it would save it. This made it difficult for the narrative team to manage a mission that was a work in progress; sometimes they needed to save an unfinished mission to move on to another priority, and the validator wouldn’t let them. As a workaround the narrative designers often created and refined their content in other programs first, and only when it was polished would they enter it into Mission Builder. It was a time-consuming process and exactly what we’d been trying to avoid by making our own tool in the first place. Before fixing that issue or starting to implement any of the numerous new feature requests, we decided we should take a moment to pause and assess everything. Yaroslav spent some more time talking with the creative team about their needs, and from there we prioritized which changes to Mission Builder were critical to reach our alpha testing goals and which were enhancements that could wait. Then, list in hand, he started in on Mission Builder, round two.

Refactoring the Mission Builder has been one of the tougher parts of developing Tau Station so far. Lots of great work was going into the program to make it better, but all those improvements built upon each other and we couldn’t really release one improvement without releasing all of them. Not a lot of new content was entered into the game engine during this time, but it did give the narrative team the opportunity to flesh out some storylines and game mechanics that needed their thought and attention. And I’d say it worked out pretty well. Mission Builder is much more robust and feature-laden now, and the narrative team has more options for creating content. Furthermore, we decoupled the mission validator from Mission Builder, allowing the narrative team to save a mission in any state. Missions are checked for validity only when a narrative designer asks for a validity check, or when they’re ready to unleash new game content upon the player base.

So what makes Mission Builder tick? It’s built using a directed graph, which allows any one node/action/decision point within a mission to take an arbitrary number of complex pathways to reach an eventual outcome. This graph is represented by a JSON data structure; JSON is easy for the developers to understand and parse, easy to store in our Postgres database, and can be easily communicated to the front-end by the game’s API.

The backend of Mission Builder is an API that has been implemented in Perl using the Catalyst web framework. The front-end of Mission Builder is built upon JointJS, an amazing diagramming library for JavaScript. Its usage of SVG for rendering the graph makes each mission diagram easy to scale, which allows the writer to get the big picture of a mission when needed, or to quickly zoom in on a specific part of a mission for work.

We’ve spent a lot of time on Mission Builder, and it’s something we are really happy with. It’s not perfect, but it is constantly improving and we have a detailed roadmap of new features and improvements that will allow our narrative team to produce more complex and immersive missions for our players. It’s already been used to create some great game content, and we think you’ll agree that it’s been worth the work.