Sunday, August 20, 2017

How to Win Friends and Influence Companions

Part eight in a weekly(🤝) devlog.

Standard development disclaimers apply. This is pre-pre-pre-Alpha content, everything is subject to change, features may not be present in the final version, there's a very strong chance none of this will ever be released, etc. etc.

There shouldn't be any plot spoilers in these posts, but there will be occasional discussions related to characters, locations, mechanics, and other aspects of my potential upcoming Shadowrun campaign (tentatively titled "CalFree in Chains"). You may wish to skip them if you'd like to be completely surprised.

It feels like my game design philosophy is entirely driven by quippy phrases attributed to Sid Meier. One of the many I like is his formula for crafting a successful sequel: "1/3 old, 1/3 new, 1/3 improved". Breaking that down a little:
  • There are parts of the first game that you and your players love. Don't feel compelled to mess with them just because you're making a new game. Carry them forward. This gives your fans something concrete to hold onto, and maintains the sense of continuity.
  • Because this is a new game, try to experiment with some new and exciting things. This gives existing players something new to look forward to, may entice new players to try your game, and allows you to stretch your creative muscles.
  • Are there parts of the first game that had promise but could have been better? This is your chance! Take what you've learned from the first game and make that experience better.
This post is about one of my "1/3 improved" items: companion interactions. One of the features I added in The Caldecott Caper was a companion favor system. This was directly ripped off from the Dragon Age series, and like in those games, companions will react favorably or unfavorably to the words you speak and the decisions you make.

The Favor Problem


I had two main motivations for this system. I wanted to gently encourage players to pay more attention to their companions: once you get to know their personalities, values and goals, you can accurately predict how they will react to your actions. I also wanted to provide another avenue for roleplaying. Different players will find themselves liking or clashing with different characters, providing more opportunities to differentiate their player character and evolve their personal story.

I think the first motivation largely succeeded. The favor system in particular got a good response, even more so than romance among the initial wave of players (although that has since inverted). And a majority of the comments on The Caldecott Caper have mentioned how much they like the characters; I don't think that's entirely due to the favor system, but it doesn't seem to have hurt.

The second motivation has gotten more mixed results. In particular, a sizeable minority of players have felt compelled to increase their favor with companions, even reloading if a conversation goes "poorly". That's the opposite of what I wanted, and I had even taken some steps to try and avoid it - for example, informing players in-game that there aren't any mechanical advantages or disadvantages based on companion favor.

Mulling it over post-release, I came to think that players are naturally conditioned to want to increase numbers: whether those numbers are for karma, or nuyen, or attributes, or favor, whatever: higher numbers are always better, lower numbers are always worse. And, in a moment of self-reflection, I realized that this exactly paralleled my own experience in my first play-through of Dragon Age 2: even though the game was specifically designed to reward rivalries with companions, my "make everyone like me!" instincts led me to a frustrating and unsuccessful attempt to rein in Fenris. I can hardly blame my players for having the same reaction to my game as I did to DA2!

Influential


I turned once again to Dragon Age for inspiration: in particular, I've always really liked the "Hardening" system in Dragon Age: Origins. Unlike Approval, which is always good, Hardening is more of a role-playing decision: should Alistair be more ruthless and results-oriented, or remain the goofy, responsibility-shirking pal? Should Leliana continue to embrace the peace and love of the Maker, or return to her strengths as an assassin?

CalFree in Chains will use a new "Influence" system that's a hybrid of "Approval" and "Hardening". Like Approval, it's mechanically-oriented, with multiple opportunities throughout the game to affect each companion, making individual decisions that lead to an aggregate outcome. But like Hardening, it's more focused on your companion's outlook rather than on their opinion of you. Also like Hardening, there isn't a straightforward right or wrong path, relying more on the player's philosophy and/or their roleplaying decisions.

Each of your companions will have their own dilemma that they're facing and will try to resolve over the course of the campaign. For example, Kora has risen into a higher position of authority within the People's University, and is torn between the responsibilities of her new leadership role and the comfort she feels with her previous support role as a decker. You and Kora will touch directly on this subject multiple times during your conversations at the hub. Furthermore, she will look to you for inspiration, and will occasionally be influenced when she witnesses you embracing leadership or deferring to others.

Kora's final fate will ultimately be determined by which of these paths you have encouraged her to go down. And, because neither is inherently any better or worse than the other, I'm finally comfortable with tying some gameplay effects to this. I'm still working out the details, but I'm thinking that each companion will get one of two unique upgrade abilities based on how you have influenced them, similar to the unique companion upgrades after loyalty quests in Shadowrun Dragonfall (and I think Hong Kong?).

Implementation


Mechanically, this system is nearly as simple as the Favor system. The difference is that, instead of a single global variable to track each companion, there are now two, one for each type of influence.

In the case of Kora, that means defining two story variables: Influence-Kora_Leadership and Influence-Kora_Support.


When creating story variables, it can be useful to include a prefix with a dash. When later selecting variables from a drop-down, the editor will automatically break all dashed tokens into separate submenus. So, doing this will group together all Influence- variables into a single submenu.


Influence can be shifted at many points throughout the game, but the sequence will always be the same:
  1. Send out an event indicating what type of influence has increased.
  2. Show an appropriate message based on what has occurred.
  3. Increment the corresponding story variable.
Let's look at some triggers!

Here's a simple one. When we get a "Kora Leadership" event, we increment the associated variable.


Now that this is in place, we can trigger an influence change from anything: another trigger, or a conversation, whatever. This makes it a lot easier and less bug-prone to port the behavior to additional scenes: instead of needing to manually wire up variable changes to dozens of different parts of the game, we just need to remember to send the right event name.

The "if" condition is important here. If you do something that would influence Kora, but she isn't actually around to observe it, then your decision doesn't have an impact on her. That makes sense to me, but is definitely something that other designers might feel differently about: if you think that Kora is likely to learn about what you've done, and if it makes as big an impact in the hearing as in the seeing, then perhaps she should still be influenced regardless.

Let's look at a more complex trigger now, one that shows an appropriate message for the player.


The corresponding trigger in The Caldecott Caper was simpler: you would just see "Gained Favor" or "Lost Favor" in response to your actions. Here, I'm communicating a bit more information. First, it's good to know what type of influence you're having. I've decided to convey this based on the color of the message, whether blue or red. Secondly, I want to communicate the impact of your influence. Here, you'll either see "Influence Increased" if you've further influenced Kora along the path she's currently on, or "Influence Shifted" if you're moving Kora onto another path. So, for example, if at first you are pushing Kora to leadership, you will see "Influence Increased" messages; if you later start pushing her to support, then you'll see "Influence Shifted", until the point where she has caught up to the leadership influence, at which point you'll resume seeing "Influence Increased".

You'll note the use of several "Const-" variables. This is useful when I want to use the same message in many different places. So, if I later decide that, instead of "Influence Shifted" I want to instead show "Changing Influence", I only need to change the string value in one place and it will automatically update the message throughout the entire game.

Also, you'll see that I never actually check to see whether Kora is present before running this trigger. That may seem odd but is totally OK: the trigger will run, but since the game won't find an actor tagged "isKora", it will just skip showing the message.

Outcomes

Here's a screenshot of my test case. Like a lot of my prototyping work, I iterated on this in a standalone "test" scene. This particular one just had one actor spawner to load and a handful of interactable objects; when I click on one, it sends out the influence event. Tiny test scenes like this are super-fast to load, which is important when I need to run a bunch of tests.


I haven't wired up the rewards yet, but I'm currently planning on finalizing influence via companion conversations at the hub. Once an NPC reaches a target Influence level, you'll unlock a new dialogue branch with them. Selecting this will cause them to reflect on the things they've learned from you, how they plan to apply that direction to their lives, and providing an in-universe explanation of the new ability (or whatever) that they have acquired. (Again, I haven't designed this yet, but it's possible that Kora's support track might culminate in her acquiring a new Matrix ability that she coded herself in the spare time that she's saved from attending strategy meetings; conversely, her leadership track might result in an inspirational ability that buffs other companions into being more effective on the battlefield.)

You can only get one influence-unlocked ability per companion. I'm planning on this being a first-past-the-post system: so, for example, if a companion needs 5 points to complete their track, then you'll get an ability once Kora's leadership reaches 5 or her support reaches 5. I think that I might still continue tracking influence changes even past the ability bestowal, though; so, even if Kora reaches her Leadership unlock first, she still might end the story narratively going down the Support-oriented future. That's all subject to change, though!

There are a couple of implications of this. First, you'll probably unlock abilities more quickly on companions who you usually bring with you on missions. That makes a ton of sense to me, both narratively and in terms of gameplay: they have more opportunities to learn from your example, and you're probably more interested in using them anyways. It avoids any single decision from being too disruptive: even if you generally want Kora to be a leader, undercutting her one single time won't torpedo her chances.

We'll see how this all turns out. I'm pretty happy with how things are looking and working in my tests so far, but I am a little concerned that it might be overly complicated or confusing for players. As a designer, I really like the cumulative effects of many tiny choices over a period of time; but there's a strong chance that players are more motivated by a single big choice at a dramatic time (similar to the Dragon Age hardening or Dragonfall loyalty quests). I'm reminded once again of yet another beloved Sid Meier quote: "There are games where the player is having fun, games where the designer is having fun, and games where the system is having fun." Hopefully I'm not being too clever for my own good, and making something that really is fun for players to engage with.

No comments:

Post a Comment