Sunday, October 15, 2017

Big Speech

Part sixteen in a weekly(⛰) devlog.

Standard development disclaimers apply. This is 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.  

I started work on the climax. Yay! I also rewrote the climax. Yikes!

I’ve been looking forward to this - obviously the climax is a significant milestone in the dev phase. As I was ramping up to begin work, though, it gradually dawned on me that the boss fight felt, uh, anti-climactic. I’d come off of a couple of late-game missions with final confrontations that were pretty interesting: unique mechanics or victory conditions or environmental factors that put a challenging twist on the fight. By comparison, the final fight in the game was a very stock “shoot all the bad guys until they are all dead” affair. I think there’s some interesting narrative context to what’s going on, and also some potentially cool visual elements to the battlefield, but the actual mechanics of the battle just felt bleh.

I’m curious about how our brain works. The interval between me recognizing “Oh, there’s a problem here” to “Here’s the solution!” was surprisingly short. It makes me wonder if my subconscious had realized the issue before and had been chugging away in the background, proposing alternatives, causing one to pop out to me before too much longer.

Much as with the horror level I mentioned last week, the solution here partially involved reviving a previously-discarded idea from what I’ve come to think of as the “bad end” of the game. It doesn’t necessarily change the ending, but adds the threat of a worse ending, with tiered failure conditions that will carry over into the finale, which I think adds even more motivation and tension to the fight, on top of the purely story-based ones that already exist. Once I had that in mind, there were some obvious mechanics that I could build into the fight that present some interesting decisions for players to pursue, weighing pros and cons against the more straightforward task of killing bad guys.

I’m still in the process of building it out, but I’m decently happy with it. In all honesty, it’s probably a step down from the final fight in Caldecott - that had a really nice combination of tightness, reactivity, and branching that I don’t think I’ve replicated here - but it does add some unique new elements that I think help this stand on its own.

So: As with all of my scenes, one component of the climax is crew reactions. As you encounter obstacles and make decisions, your teammates will periodically sound off, commenting on your actions or offering advice. I do this a TON, there are probably literally hundreds of reactions throughout the game. Let’s take a look at how to do ‘em.

Let’s start with an anti-pattern. Here’s an example of how this used to work back in the Dragonfall era, using a convo from the official campaign as an example:


This comes from the start of the Aztechnology raid. The basic idea is simple: you have four potential crew members, the game checks to see which of them are present and then has them speak. It feels nice and natural in-game, but it’s kind of clunky from a development perspective.

  • There’s a lot of duplication. Eiger delivers the exact same line many times.
  • This makes revisions/edits more difficult. If you later spot a typo, you need to track down the four or so copies of the line and make sure you update each of them.
  • The amount of work increases exponentially with the number of characters. This is a “four pick three” combination; when I think of doing this with a “six pick three”, my nose starts bleeding.
  • It’s difficult to track what’s going on. It’s so long that you can’t see easily all the branches on screen at once, which can make it harder to see if a character is getting skipped or if you’re missing something in a particular branch (like the etiquette check here).

Back in the Dragonfall days, this was probably the best way to do it. I took a different approach in the Antumbra games, with looping dialogs that returned to a an empty root node after each interjection; unfortunately, with the way the conversation engine worked in this game, it would auto-skip past intermediate blue nodes, so the player would only actually see the final interjection, unless I manually inserted a red-text player response after each one. This is why there are a lot of “nothing” responses in Antumbra, like “I see.” and “Go on.”

Fortunately, Hong Kong made a subtle but enormously helpful change, eliminating the skip-through and allowing each blue node to be shown in sequence as intended. That’s made my life writing reactive dialogue FAR easier. In all honesty, if it wasn’t for this one update, there’s a very good chance that I’d be writing CFiC in Dragonfall instead of in Hong Kong: I love the music and other goodies that we lost from that game, but the improvements in dialogue handling are so important that they blow all other considerations out of the water.

Anyways, let’s look at one particular conversation. This is an excerpt from the Sacramento mission that we’ve previously looked at. When your character encounters a decision, all of your companions can chime in, offering their own perspective that expresses their values and desires.


So, the basic idea here is:
  1. Create a blank blue node. It functions a little like a traffic conductor, deciding who should speak when. Here I've added the comment "Reactive party check-in" so I can easily see where it's referenced.
  2. Create an empty red node. The conversation will automatically proceed into any blank red node, PROVIDED IT IS VALID.
  3. Check the “Available only once” tick (bottom oval). This ensures that we won’t endlessly loop into this interjection.
  4. Add a prerequisite (middle oval). Here, we’re checking to see if an actor with the correct tag is present. These tags are set on the crew members’ character sheets, so we can access them even if we spawned them through the hiring screen. By setting this prerequisite, we’ll only proceed into this branch if the speaker is present, and skip it otherwise.
  5. Finally, add the companion’s own dialogue. For the speaker, select the [tag] for this character. When the scene runs, the game will find an actor with that tag and show their portrait in the interface. (If you mess up and select the wrong person’s tag, their portrait will show instead. If there is nobody with that tag present, it will show the default speaker. Avoid these problems by always matching the tag in the pre-req with the tag for the speaker.).
  6. If desired, you can add more nodes in this branch from the same speaker, responses from the player character, or dialogue from other folks in the scene.
  7. Once this branch is finished, use “copy link” to send the dialogue back to the blank blue node we created in step 1.
  8. Repeat steps 2-7 for all the crew members / other people you want to optionally speak.
  9. At the bottom, include a blank red node with no pre-requisites. This is the final branch out of the optional interjections, and continues the main thread of the dialogue. (Alternately, you could omit this to just end the convo, or give the player dialogue choices - those will display once they have exhausted all blank responses.)

That probably sounds like a lot - in practice, once you get it down, it’s almost trivial to build. I generally lay out one blank interjection, copy-paste it however many times I need, and then fill in each individual’s tags at the same time I’m adding their lines.

Here are some brief videos showing how the same conversation might play out differently depending on who you have in your squad. Dialogue contains some minor plot spoilers.





And, that’s it! These have been real meat-and-potatoes in my scene work, and it’s just now occurring to me that I’m probably almost done with them. There’s still a ton of branching dialogue to do, but specific party-based reactivity like this will be finished after I wrap up the climax. Once again, that’s a very nice milestone to reach!

No comments:

Post a Comment