Hello! We're inkle - we made 80 Days, Heaven's Vault and Overboard!. Now we're making A Highland Song. Follow along with our progress right here!
Here at inkle we're currently into the closing stages of work on our upcoming Scottish adventure, A Highland Song. It's a 2D platformer with climbing, running and jumping - and narrative elements. As the protagonist, Moira, explores the hills and caves on her way to sea she'll find things to investigate and characters to talk to.
So far so good - but there's a problem with mixing adventure gaming and platforming. In adventure games, it's usual for the player to walk up to an interactive object and stand in front of it while the protagonist describes it. But platformers are all about motion. Taking away control from the player feels bad.
So how do we keep things feeling snappy and responsive, while still allowing the player to get stuck into a good inkle-style conversation if they want to?
Put another way, how do we let the player get knots-deep into a conversation - while still being able to walk away at any moment?
Enter the "autocut": two variables we set at the start of a conversation or interaction which are observed on the game side.
~ autoCutZone = WOODSMAN_TRIGGER_VOLUME ~ autoCutKnot = -> leave_woodsman
For those who know ink, the first of these variables takes a LIST value, which specifies a volume in the world. Should the player, who's still free to move, step outside of this volume, the game uses ChoosePathString to divert immediately to the knot specified in the second variable (and it wipes the autocut values to prevent an infinite loop).
So perhaps you meet a friend who wants to stop and chat, but the sun is going down and you need to get away... you can. And if you meet a lonely poet and ask him for a sample, and he starts to recite at length... you don't have to wait for him to finish before you vote with your feet.
And for almost every conversation in the game, we don't block the player's control at all.
(And should the player - or the other character - finish the conversation with a friendly farewell instead, we simply empty the
autoCutZone variable and move on as normal.)
Simple but powerful
It's a simple system, but we're finding it incredibly effective: a game-character can be mid-exposition and the player can simply walk off... and the character will react. They can bid you farewell, remark on your rudeness, or even shout something to try and lure you back.
We can even define a second, larger trigger volume to give the player another chance to really walk away... and so forth.
And ink can still track which bits of content you've seen and which bits you've skipped. So despite having a trapdoor anywhere in any conversation, it doesn't make the flow more complex or damage the script's continuity. We can still test the flow in inky or with an automated tester.
Keeping things moving!
So while the character might still pause on the spot if they're reading a signpost or picking something up, they'll never get stuck in a conversation they don't want to.
... Although, of course, turning your back on someone can have its consequences too...