Skip to main content

How Little Choices Make Sorcery! Feel Epic

And how other RPGs should learn from it

This is The Mechanic, where Alex Wiltshire invites developers to discuss the inner workings of their games. This time, Sorcery! [official site].

From Warlock of Firetop Mountain on I was pretty much obsessed with the Fighting Fantasy gamebooks. Of course I was: they presented richly drawn fantasies in which I could play a part, my imagination spinning on their words and illustrations. (My favourite illustrator? Obviously Russ Nicholson.) Inkle’s Sorcery! series, four text-based games adapted from Fighting Fantasy co-creator Steve Jackson’s original gamebooks, capture all that made Fighting Fantasy special and add a magical extra: the dynamism of videogames.

In fact, Sorcery! often feels more dynamic and alive than videogames. As you progress through the books, your adventure keeps getting richer, the world more responsive to your passage. It’s partly down to the increasing freedom you have to explore, but more, it’s because each book is filled with choices that feel like they have consequence; that the game is watching and remembers your every move. Sorcery! is fluid and feels player-directed, and yet it’s strongly authored. It’s like Steve Jackson is writing it for you as you play, reacting to your every action.

There’s no AI here, though. Sorcery!’s magic is down to a system that’s far simpler, but yet results in at least as much intricacy. This fantasy epic is actually just a lot of:

THE MECHANIC: Little choices

I wrote a while back about the richness of text and choices in Kentucky Route Zero, how it conjures characters and situations through giving nuanced multiple choice selections during dialogue. Sorcery also runs on multiple choice, as you’d expect from a gamebook adaptation, but it works in a very different way. “The system is that there isn’t really a system,” narrative director Jon Ingold tells me brightly. But he’s being glib. There is one, and it’s built on a couple of philosophical standpoints that are Inkle’s response to the usual way videogame RPGs deal with giving you choices.

“The reality of most RPGs is that you totally min-max them, because there appears to be no choice,” Ingold says. He contends that you need the best stats to be good at combat and to get all the dialogue options, and also that most RPGs are anxious to pre-warn you of the results of any choice. For Ingold and co-founder Joe Humfrey, these two tendencies encourage min-maxing, something that’s counter to the pure RPG intent of embodying a character and going forth into a world. “So our idea was to provide lots of choice and lots of responsiveness and no pre-choice feedback at all.” The second standpoint lies in when the game should give you feedback on your choice. Often, it comes either far too long after you’ve made it, when you’ve forgotten the context, or far too soon, when the consequences won’t have had time to sink in and there’s too much temptation to backtrack.

These two ideas went on to inform the snappy feel of the pacing in Sorcery! So, for example, we might talk to a guard, and they say, “What’s your business?” And we say that we’re a merchant. “Oh really, what do you sell?” asks the guard. And we reply, “Fish,” and he says, “You don’t smell like a merchant selling fish.”

“And you realise it’s too late to backtrack because you’re two choices into this experience,” says Ingold. “That general pacing meant we had to do short bursts of text; we had to do lots of little choices, because if you do big choices you can’t stack them so easily. I think we were quite surprised by how effective it was.”

A great strength to this approach is that choices aren’t outlined before you make them, so you don’t necessarily know which choices were going to be important. “Ideally, every time you put a choice in front of a player, they go, ‘Oh God, this is really serious…’ At the same time, to the game it’s irrelevant. That’s the ideal situation. It means we can author thousands of choices without having to worry about branching, but the player has this incredibly tense experience.” But that’s the ideal. In practice, Inkle were careful to educate the player that their choices matter by presenting enough choices that really do matter, or get called back repeatedly, so the player learns that they cannot predict what’s going to end up significant.

There are a few different systems working to do this, but a major one is character tracking. You don’t ever become aware of this, but as you play, certain choices will accrue you positive and negative points against five different traits: honour, empathy, haste, confidence and brains. Your actual score for each trait isn’t the sum of positive and negative points but the percentage of times you were honourable against dishonourable, or clever against stupid. This is super smart. In numerical scales like Knights of the Old Republic’s alignment system, you might have +10 points, and that might be because you’ve done 12 honourable things and two dishonourable things, or it could be because you’ve done 190 honourable things and 180 dishonourable things. In the former case you’re very good, and in the latter you’re very ambivalent, but in both cases you have the same score.

Instead, with Sorcery! you simply have a percentage which scales with the number of actions you take. With KOTOR’s approach, the game needs balance the numbers of events that allow players to be good and evil across the game so they have equal opportunity express themselves, but Sorcery! doesn’t need to do that at all. “The interesting thing about the character stats is that they’re robust in an environment in which we have no idea what content the player has seen and what they haven’t seen, and if they’ve been on a quick or long journey. It always works.”

These traits directly affect your game. In every scene the game checks against them and switches on and off options for actions accordingly, so if you’re a hasty character you might have an option that others would not. Although the game looks like it’s responding to your specific actions, it’s usually as a result of the accumulated actions you’ve taken over the course of the game.

This system of switching on and off options has steadily become more important to the series. The first book was a pretty straight adaptation of the first Sorcery! gamebook, in that it’s a linear progression from start to end. Book two is set in a city, and it allows you to make circuits of locations as you hunt for four clues that will lead to the book’s end. It used the same essential linear design as the first, but because some locations could be accessed seven different ways, it became very unwieldy to test and led to Inkle dropping linear progression completely for the third book. With the task to defeat seven serpents, Inkle wanted to give total freedom to move around the map. “Every scene in the game at the start will just say what sorts of things need to be true for the scene to run,” says Ingold. “Certain characters won’t appear if it’s night, or if you’ve been walking through the desert for 15 days, or if you’re too hungry to deal with them, or they will appear if you’ve burned down Kharé, blah blah blah.

“At that point we had a game we could shuffle pretty much at will with no real checks on whether the plot made any sense, no assumptions for what order players would do anything, and then we just beta tested it a lot. Every scene guards against errors itself, and nothing is baked into the system at all. It means you end up with the ability to make your game incredibly flexible because every scene is just checking to make sure that it makes sense. We have players with all sorts of character arcs and plotlines building strategies that I’ll read and realise you could play it that way, but I’ll have no idea they existed.”

The rest is just words. Inkle have a process they call ‘barnacling’, where a plotline is written and then they add barnacles every time they think of something interesting. “What happens if they put the beard on when they try and go through the gate?” suggests Ingold. “What if we let them talk to the snattercats and find out something there?” They add no load to the game, but create so much life. You’re left with little idea of how much of the game you’ve seen and feel sure that if you play again you’re sure to find something new. “It’s text, it’s very stable, very robust. If it breaks the balance, well, the balance is quite ad hoc anyway. The worst thing any bit of content can be is boring, so you just don’t write it if it’s boring.”

The game isn’t only made of lots of small choices. There are grander ones, but they tend to work in subtler ways than you might think. Spoiler alerts from here on since we’re going to focus on a couple of events in books three and four.

As an illustration of the flexibility of the system, at the end of book one you meet an assassin called Flanker, who you can kill. But if you don’t kill him, he appears at the end of the fourth book to play a role in the denouement and provide an extra challenge. He seems so significant that it’s hard to see how the game can end without him, but if you did kill him, he’s simply not there. There’s no replacement character; you simply walk directly to the room before the encounter with the Archmage. “Joe was saying what are we going to do for players who kill him early on? And my answer for that was to make sure the rest of the game is so good that they don’t notice there’s a gap.”

A larger scale choice concerns what happens in book four if you kill - or don’t - all seven serpents in the previous book. As much as the storyline impresses on you the importance of the quest, Inkle wanted the effect to be analogue, and for players to not have to kill all seven. Book four therefore starts in one of five states, calculated according to how long it took you to complete book three, how many serpents you killed, and other factors, such as whether you tell a little black elf that they’re the Analander. The states affect the likelihood that the Archmage has heard of the player, and the awareness of the Archmage affects the alert status of guards on the map. If they’re not alerted you can trick them into thinking you’re a merchant or some such, but if they are alerted, trivial approaches fail more frequently. “You’ll need to go for tougher, more intricate or more magic-focused approaches. [Take a look a the next page for some insight into how such an encounter is structured.] Tonally it should feel quite different, but I don’t think there are any massive scenes which exist or don’t depending on that stat. It’s mostly little things, like a guard here or there. We try to make it a thing which is significant in small ways in a lot of places, rather than big ways in a few places.”

So even the big choices ultimately comprise little choices, but the player’s experience is transformed nonetheless. “When you start to build a game out of lots of those choices you get a very small accretion effect of things building up. Individual choices don’t matter but there’s escalation and scale. I think the way Sorcery works is that players look back on it and feel they made too many decisions to be able to imagine how they could do things differently.”

The result is a game of choices where you’re not compelled to go only for the very best results. You play a story instead, and that story is yours.

On the next page, you can see an example of the markup text that Ingold wrote for a scene in Sorcery! 4. It concerns grumpy guards.

This is an example of an encounter with a guard outpost in Sorcery! 4 which illustrates the density of choices and possible options that comes with Inkle’s system and book four’s alert design.

Being written in Inkle’s own scripting language, Ink, it’s quite readable. You can try writing your own using Inkle’s own tools, which come with excellent guides. (If you do, my advice is to save a lot because it’s a little crashy.)

The Open Side Gate

- top
'What's your business?' demands the guard, one hand resting on her sword.
* 'I am a merchant.' --> merchant
* 'I am a traveller.' --> traveller
* 'I am a spy for the Archmage.' --> iamspy
* 'I bring your doom.' --> doom { not knock_gate-->laugh_along }
- merchant
'I am a merchant. I bring wares for the Archmage.'
{ disguised_as(MERCHANT):...
--> merchant_other_door
{night_time:'At this time of night?'} The guard looks at your pack. 'Not many wares in there, I'd wager.'
* 'What I have is valuable.' --> valuable
* 'I am only a simple trader.' --> simpletrader
* Smile --> shrug {up(empathy)}
* Stab her --> goforsword
- goforsword
You go for your sword as fast as you can manage, but the guard leaps back as the blade leaves your belt. -> fighting_gate --> fight_three_guards
- valuable
'What I have is valuable,' you reply.
'Is it now?' the guard answers, with clear interest. -> talk_guards_friendly-->most_come_with
- simpletrader
'I am only a simple trader,' you reply, humbly.
The guard pulls a face. -> talk_guards_friendly-->most_come_with
- shrug
You smile charmingly. The guards exchange glances.
'Says {he()}'s a merchant,' the first guard says.
{mampang_alarm_state <= LOW:... --> merchant_other_door
--> alarmed
- alarmed
The tall guard smacks the other on the head. 'Dung brain! {not defeated_wandering_serpents() && starting_book <= 3:You remember what the Serpents said?|You know our orders.} And you're just going to let some stranger pass{--> shrug: because they have a nice smile}?'
'I wasn't!' she protests.
'And you,' he says, turning to you and jamming a finger in your face, 'if you're not vetted at the main gate, you're not coming in. Be grateful I don't just run you through.'
-> side_gate_outcomes-->closingdoor
- merchant_other_door
'You're using the wrong door,' the taller guard remarks. 'Merchants go in through the front. This door is for guard patrols only.'
The other guard begins to close the door.
* 'The other gate was sealed.' --> sealed
* 'They sent me here.' --> mehere
* 'I'll go that way.' --> dothat
- sealed
'The other gate was sealed,' you reply quickly. 'There was no one there.'
'Ha,' replies the tall guard. 'I'm not surprised.' He frowns. -> talk_guards_friendly
- mehere
'They sent me here.'
'Did they?' the guard replies. 'They've always been lazy.' He frowns. -> talk_guards_friendly
- dothat
'I'll go that way,' you tell him, turning to go.
'No, wait, it's all right. You might as well come in,' the guard replies.
The other is less certain. -> talk_guards_friendly-->most_come_with
- iamspy
'I am a spy for the Archmage,' you reply.
'Are you now?' the tall guard demands, with some amusement. 'Good spy you are, coming out with it like that.{disguised_as_soldier(): And dressed like a guards{man()} too.}'
* 'Are you not to be trusted?' --> areyounot
* 'Let me in quickly.' --> letmein
* 'Why do you think I avoided the main gate?' --> maingate
- areyounot
'Are you not to be trusted?'
'Now don't start that kind of thing,' the guard replies. 'We're all loyal to the Archmage, every woman and man, and we won't have any one making trouble.'
-> side_gate_outcomes-->closingdoor
- letmein
'Let me in quickly.'
'Not a chance. {mampang_alarm_state >= LOW:There are rumours of enemy agents headed our way|You're some vagrant looking for refuge. Well, Mampang is no refuge}.'
-> side_gate_outcomes--> closingdoor
- maingate
'Why do you think I avoided the main gate?' you reply.
This seems to land with the guard, who thinks for a moment. 'A spy, are you?' -> side_gate_pretend_spy
- traveller
'I am a traveller. I've heard about the wonders of Mampang, and wanted to see it.'
A second, tall guard walks over as you speak. The two burst out laughing.
'A traveller, here?' The tall guard says. 'What a story! You're not getting in here, fool. {mampang_alarm_state <= LOW: I haven't heard of any disturbances, but I'm not going to take chances.|We were warned to expect thieves coming to steal the Crown.} Get away!' -> side_gate_outcomes--> closingdoor
- doom
'I bring your doom,' you reply coldly.
-> side_gate_outcomes-->attack

Read this next