Creating a dynamic relationship system in Scarlet Hollow

Tony Howard-Arias
7 min readJan 25, 2021


In our first run at figuring out the relationship system for Scarlet Hollow (play Episode 1 for free on Steam), we tried a kind of Dragon Age-style approval system — some actions and dialogue choices would give the player a quantity of “yes, good” points with an NPC, while others take those points away. These points changed how NPCs would interact with the player and sometimes unlock bonus scenes or conversations.

Who among us hasn’t been crushed by this handsome boy’s disapproving gaze?

We quickly abandoned this for two reasons:

  • A like/dislike system meant that some dialogue options would be read as “correct” and others as “incorrect,” which in turn would encourage players to metagame for an ideal outcome instead of roleplay a character.
  • A binary system like that doesn’t allow for nuance!

One of the first walls we hit with that second point was trying to figure out how many points to assign to different actions. How many negative points do you get for insulting someone to their face as opposed to getting caught lying to them? Does insulting someone to their face make getting caught lying to them later worse? Or does it make it less bad? Are there actions that irreparably damage a relationship? Should there be?

While there’s no world where Tabitha likes being called #girlboss, exactly how that lands should depend on what kind of relationship you have with her.

We weren’t able to answer those questions using a binary good/bad relationship system, but after a bit of head scratching we assigned some point values and moved on. But we were immediately hit with an even more challenging obstacle: what if the context of your relationship would entirely change how a given action is perceived?

This was especially an issue when it came to writing for Tabitha, the player character’s grumpy, if not downright hostile cousin. Early on in the game, she guides the player on a tour through the crumbling family estate, and the player can choose whether or not to make flattering remarks about the dusty and decrepit building. Whether or not she would take kindly to those remarks was a looming question.

And the answer we settled on was that, well, it depends on the context of the player’s relationship with her. Would those flattering remarks be seen as genuine, or would they seem like the player was just being superficially nice, or even mocking?

Trying to map that complexity quickly led to a prototype of the relationship system currently in-game. Instead of a single axis, a binary plus or minus, we created several, each of which measures a different component of a relationship. In the final build of the game, we landed on five axes:

“Please stop agreeing with everything I say. I know my house is a mess please stop pretending it isn’t.”
  • Agreeable vs adversarial. Does the player tend to agree with or say nice things to a given character? Do they push back when a character is out of line?
  • Open vs closed. Is the player emotionally available to a given character? Does the player share an interest in a character’s feelings and does the player offer up their own vulnerabilities?
  • Bold vs passive. Does the player take charge in situations around a given character, or do they follow along with other characters’ plans? Likewise, does the player act decisively in stressful situations? Are they direct with their words and desires?
  • Reliable vs unreliable. If a character asks the player to do something, will they do it? Can they be trusted with secrets or to have a given character’s back?
  • Insightful vs dull. Is the player seen as observant or sharp by a given character? Do they actively contribute to mystery solving? Are they a himbo/shimbo/thembo?

Each of the 10 attributes described above is stored in a separate variable as an integer. In most situations, an interaction between the player character and an NPC (read, choosing a dialogue option) can increment one or more of those 10 variables by one. In rare, extreme circumstances, a variable might be incremented several times by a single action.

**Spoilers for Scarlet Hollow Episode 1**

For example, choosing to dive for the flashlight instead of Gretchen increments ‘adversarial’, ‘unreliable’, and ‘closed’ by three points each for the player’s relationship with Stella, which in turn makes it harder to pass a check later on in the chapter to mercy-kill Gretchen for Stella instead of letting her do it herself.

**End of spoilers**

Before moving on, it’s worth noting that none of these descriptors are inherently bad or worse than their opposite. A character who’s perceived as dull can still be beloved by the other characters (who doesn’t love a himbo?), and may have even lulled them into a false sense of security that could lead to great character moments later in the game.

Despite being on opposite ends of a given axis, we store opposing qualities as separate variables. It lets us keep track of the relative value of the two ends of that axis — an in-game relationship where the player has a ‘reliability’ score of 10 and an ‘unreliability’ score of 0 should be functionally different than a relationship where a player has a ‘reliability’ score of 100 and an ‘unreliability’ score of 90. This also allows us to look at a single variable in isolation where it’s relevant.

For the most part, when checks come up they’re made against a combination of variables. Going back to the example of your cousin Tabitha early on, our system lets us look at how genuine the player’s compliments feel to her based on how other aspects of their relationship have developed.

A peak at how the sausage gets made. Tabitha apologizes being testy if the player has been emotionally open with her OR if they’ve been friendly without being overly agreeable.

Complimenting Tabitha makes the player more ‘agreeable’ in her eyes, but without developing other aspects of the relationship, she winds up viewing the player as a bit of a sycophant. Just being superficially nice is something that she despises in people. Tabitha is a bit more accepting of the player being nice if they also have more ‘open’ points relative to their ‘closed’ score. Contrary to how a lot of relationship dynamics work in other games, Tabitha also responds well to push-back. She likes it when the player has a spine, and will actually be meaner to and take advantage of a player who smiles and nods and goes along with her bad attitude.

Balancing Act

We played with the idea of providing players with some sort of user interface that tracked how their relationships were developing with each of the important characters in our story, but we decided that providing that information would go against our core design philosophy. More than anything else, we wanted Scarlet Hollow to be immersive, and part of maintaining the game’s immersion was to do whatever we could to stop players from metagaming. If players saw themselves gaining or losing points with every interaction, it would put them in the mindset of asking themselves which decisions were “correct” rather than which decision represented how they wanted to interact with our story.

Much like with our trait system, we’ve put careful attention into making sure that no relationship dynamic is objectively better or worse than another in terms of the quality of storytelling. Whether you wind up eventually connecting with your cousin or if you spend the whole game at each other’s throats, we want each player’s experience to feel right to them, and to feel thematically relevant with the rest of the narrative.

So instead of a loud UI that carefully spells out the details of our relationship system, we’ve instead buried subtle cues that reinforce the player’s behavior and makes it feel like the game notices and validates the decisions they’ve made.

For instance, if the player’s been loud and confident but then starts to shrink at the first sign of danger, Stella mentions that she’d gotten the impression that the player was adventurous, and checks in on them.

A gentle reminder that you’re being a coward.

Sometimes the relationship ties into specific flags as well, with a character opening up to the player and referencing a past conversation that made them feel safer about being vulnerable.

For the most part, checks are set up to be relatively easy to pass, so long as passing them will feel vaguely consistent for your character, so don’t worry about being locked out of major content without knowing how to access it!

Feedback on this system has been pretty positive to date — many of our players have gone out of their way to tell us how much it felt like our game noticed the little decisions they’ve made and how organic interactions with our characters felt. We can’t wait to show you how we’ve built on this in Episode 2!

If you’ve enjoyed this post and want early access to new content (and want to lend a hand in suggesting what kind of devlogs you’d like to see next) feel free to support our two-person indie game studio on Patreon!