I wanted to have an idea of how well the new changes would hold up to new players and this was a wake-up call for how much work is still needed for me to consider this new build ready. In some ways, compared to how stable the last version was, it was a step back.
And so, the last two months have been completely focused on getting to that point.
But today, I want to talk about something that happened during that time, I started to watch a TV show called Westworld. I won’t go into any spoilers for those that follow the tv show, and for those that don’t, I’ll make sure this post still makes sense.
In case you have no idea, here is Wikipedia’s description of Westworld:
Westworld is a show about a technologically advanced amusement park populated completely by synthetic androids dubbed “hosts“. This park caters to high-paying visitors dubbed “guests“, who can do whatever they wish within the park, without fear of retaliation from the hosts.
Or in other words, a Disneyworld for adults where you can sleep or kill any of the attractions. And these attractions are so life-like that you can’t tell if they are a person or a machine. I assumed it would be a cheesy tv show about the guests enjoying torturing and abusing the hosts, but instead, its focus on the hosts and reflects on what their experience is like.
During the Day of the Devs, Chris Bell (a good friend and awesome game designer, that has been helping me crack the hardest challenges in Twelve Minutes), was giving the elevator pitch of the game to someone else. Rather than compare it to Groundhog Day or Source Code (or any other time loop movie), he called it: “A living simulation in which the player must manipulate the knowledge and emotions of the other characters to change how they behave (and thus uncover new timelines).” I was surprised he didn’t focus on the nature of the time loop but was more interested in the relationship with the NPCs (Non-Player Characters).
As the main narrative loop is getting finalized, I’m now focusing on how I can make the NPCs feel more than just puppets and this description stayed in my mind, and then Westworld happened.
In the show, the hosts are played by actors that we are supposed to believe are machines programmed to behave like humans. We know it’s all fake, and we keep getting reminded of that every couple of minutes, but you STILL care about them!
And my question is why? If someone is playing Twelve Minutes, what is the key to make you care about the characters? Even if while playing you know they are all programmed to behave a certain way, what can I do to bring even just a hint of a soul?
And then one of show’s AI creators, kinda the equivalent of a game developer in the park, said the following:
“The guests don’t return for the obvious things we do, the garish things. They come back because of the subtleties. The details. They come back because they discover something they imagine no one noticed before. Something they fall in love with. They’re not looking for a story that tells them who they are. They already know who they are. They’re here because they want a glimpse of who they could be.”
And I was speechless; I felt he was talking directly to me, teaching me how I should look at the game differently. It’s never been my goal to create an A.I.; I don’t have the skills, passion or patience to do so. But I’m very interested in creating and crafting emotions and each Westworld episode is a reflection on exactly that.
Just like Twelve Minutes, Westworld is a single complex narrative that resets at the end. So far, during the game development, I’ve been totally immersed in the player side of the experience. The interactions, the puzzles, the time loop and pacing as you go through the story, making sure it all flows and treating the NPCs as any other game object. But now it’s time to work on creating empathy.
And this is where the show keeps talking to me. Westworld is all about the hosts (NPCs), not the guests (the player). I’ve always assumed that the user is what I should care about the most, but that has been limiting me in understanding the NPCs, after all, I want to create the experience of you ‘stepping into someone else’s world.’
The player character needs to relate to the user, your frustrations as you try to figure out the puzzles, and your achievements as you progress. But the hosts are the ones I need to care about and give them enough complexity to be able to survive the experience I’m about to put them through.
In Westworld, two characters stand out in helping me see this. One is the park creator I mentioned above, the guy that I compared to the game designer. And the other, one of the ‘guests,’ (below) the equivalent of a hardcore gamer. He went so deep into the rabbit hole that he learned something about his true nature and he is addicted to the game as a way to find more about himself. In both cases, their goals have nothing to do with what I assumed was the most interesting aspect of Twelve Minutes and each episode keeps teaching me more about that.
Another interesting realization is the clear separation between narrative and host/NPC behaviour.
At the beginning of Twelve Minutes, as the story was constantly fluctuating, I would add specific behaviors to the NPCs that would help drive the narrative. As the game space grew in complexity, these tailored behaviours turned to reactions, less scripted and more organic. These reactions, with slight variations, allow the NPCs to behave more naturally to the multitude of possibilities the player can create (And I’m still sometimes surprised when a NPC does something that I forgot I wrote.)
Also, having the NPCs with a set of behaviours that are separate from whatever storyline I’m trying to say, might be the way to create the uniqueness and subtlety that will make you care about them. If will you play, for at least a few minutes, you believe that any of these NPCs are present in the moment with their own voice, then I’ll be pretty happy.
Like Chris said, from a higher perspective, it’s all a simulation, more than an adventure game. Just like Westworld, but wrapped in an apartment and a much shorter time frame.
I find the most valuable part of this blog is the insights as a game developer. With that in mind, I try to avoid writing about the technical progress of game development here. Still, I know some people enjoy it, so I’ll try to briefly compile them in a separate section from the ‘main’ post like the one below.
Root Motion and NavMesh
It took me a while to understand and properly separate when to use root motion to drive a character movement and when to let the navigation mesh do it. The game requires a lot of precision when two characters interact and trigger separate animations, and so I had to go over this again.
It also becomes a much more complex problem if you have two characters trying to affect each other and a third one decides to interrupt them. Who gets priority? How do I manage the available space for movement, etc?
Another major issue, also related to movement, was changing the time scale. In Twelve Minutes, you can ‘skip’ a dialogue but what is happening, is that I ‘speed up time’ so the dialogue line is spoken faster, but the simulation is still being calculated, the actions just become compressed.
But when you speed up time, it also means there are fewer frames to calculate what each character will be doing, and movement is once again affected since it relies on speed and distance, and those are suddenly compressed into a single frame. Anyway, it’s now fixed, and characters behave the same way even if time is 20x faster!
So far I’ve always focused on having debug tools while inside the game editor, but once I build the standalone executable, apart from reading the log for errors, there isn’t much else you can do if you run into a problem. And as the game gets more complicated, we start to have small discrepancies between the standalone and editor. So now I’m happy to say that all the necessary editor tools are also available in-game! (obviously not for when it gets released :P)
Save game system and versioning
Early in the project, I realized I needed to have a robust save game system to be able to play the game (since at the end of each loop the easiest way to reset the world is to reload the level and store the player knowledge).
The problem is that every time I made a new build and updated the save file class, the previous savegame would be incompatible and cause errors when loading the game. It’s easy for me to fix these as a developer, but now that I’ll be sending more regular builds to collaborators, it will very likely cause conflicts. To fix this, I’ve created a versioning system that can compare the current version with your latest save game and deal with it appropriately.
Currently, the game only supports mouse, but I want to allow a wider variety of controls. With that in mind, I started the first steps of a universal system to receive controller inputs so I can bind them to different keys/buttons. Pretty straightforward but a new concept to me on the programming side.