Lesson #12: Achievements
As we’ve already seen with the Stat Screen (Lesson #9), CS comes with a built-in separate screen that works in parallel to the “main” play screen.
Similarly, the Achievements screen gives the author a chance to add more game elements to the player’s experience.
Unlike the Stat Screen, however, the author has to “enable” Achievements in order to make the button appear at the top of the player’s screen. The way to do that is to include at least one *achievement
line of code in your startup.txt file.
Sadly, CS’s Achievement screen is completely non-adaptive, which is more than a little weird when you think about it. If there is just one achievement available, the Achievement screen will still refer to them in the plural, and it will always pluralize the number of hidden achievements, even if there are none.
There is, quite literally, nothing you can do to change this.
Achievements as Feedback
Unfortunately, the design principles for using the Achievement page are more than a little muddled:
The *achievement
command is used to define one or more Achievements able to be awarded to a player for noteworthy feats or accomplishments within the game…
…[or] just about anything in your game entirely deserving of a hearty pat on the back.
My recommendation is to forget about giving your player a “pat on the back” as if you are their coach and focus on basic design principles, i.e. to use the Achievements page as a way to enhance and amplify the game elements of the IF experience.
To wit, Achievements should be awarded that give the player feedback on how well they are (or are not!) controlling (directing) their gameplay.
For example, in a simple game of Rock-Paper-Scissors (R-P-S), what Achievements would be useful?
- Winning one round
- Losing one round
- Winning three rounds in a row
Certainly, awarding an achievement for both winning one round and winning three rounds in a row are a type of “pat on the back” for the player, but why also include an Achievement for losing a round? That’s nothing to celebrate, is it?
Of course, not. The Achievement for losing a round isn’t to chastise or criticize the player but to give him/her critical feedback about their performance, i.e. that they aren’t doing things correctly in order to win the game of R-P-S.
Simply put, Achievements are signposts to the player, saying either “You’re on track” or “You’re off-track” in accomplishing their in-game goals.
Use Cases
Now that we understand the purpose of Achievements, let’s delve a little more deeply into how to apply them.
- Game performance feedback
- Story performance feedback
- Advertising the future
- Identifying story paths
Using Achievements as game performance feedback is rather intuitive. You simply let the player know when they’re succeeding (moving towards a win/winning) and when they’re not (moving towards a loss/losing), just as in the example above with R-P-S.
It’s the other three categories that merit more analysis.
However, it should not be forgotten that Achievements are all assigned a point value (from 1-100) by the author, so the player achieving the various Achievements as they progress through the story becomes, in effect, a minigame called “Get as high a score as possible.”
Story Performance
Most CS (and, indeed, most choice-based IF) game-stories are primarily stories with only a thin veneer of (pure) gaming elements. Therefore, the story is the central focus of the player’s experience.
As such, Achievements can be used to give the player feedback on their progression through a narrative arc (story) and, by doing so, add (at least the perception of) ludic weight to the player’s choices.
Achievements can then be rewarded for:
- Player inputs (such as name, gender, etc.)
- Beginning and finishing major story arcs
- Doing something remarkable in furtherance of the story
For example, in a D&D style game where the player sets up their initial character (including the name, stats, race/class, etc.) via a series of choices, awarding an Achievement once that’s completed is a nice way of telling the player that their inputs were recognized and that the main story is about to begin.
Likewise, if the story-game has three parallel arcs seen from the eyes of a Thief, a Wizard, and a Fighter, then awarding an Achievement at the start of each path (i.e. "Your adventure as a Thief has begun!) is a way to reinforce the player’s decision to follow one of the major stories in your game.
If the Thief’s path then continues with a series of exercises to build up their thieving skills (lockpicking, cracking safes, etc), then awarding an Achievement at the end of that would be a great way to tell the player “You’re making progress in the Thief’s story.”
Again, these Achievements may look like they are referencing game elements, but I am referring specifically to using Achievements as feedback on the player’s progression through your story.
Maybe the Thief always successfully learns how to pick locks in your story, so there’s no real “game” involved to get to that path. The Achievement is used simply to say to the player “You’re making progress” on their path through the Thief’s story.
In addition, you can also highlight the player’s reaching of an important story “crossroads” by using Achievements.
If your story-game is about a young royal who has to decide whether to execute an innocent person or else pardon them (and thus set off a civil war where thousands die), you can award an Achievement (regardless of which path the player picked!) that simply says something like “A crucial decision is made.”
This reinforces, to the player, that their choices really matter, which adds ludic weight, a critical element in story-first design. It also lets them know that this decision point was particularly important.
Likewise, if your story falls into regular “beats” akin to chapters, you can also award an Achievement every time the player progresses to the next beat or chapter.
Again, the purpose of these Achievements is to let the player know they are making progress in your story.
Advertising the Future
All Achievements tagged visible in your startup.txt file will be listed as possible Achievements on the Achievement screen.
This gives the player the opportunity to look through them before gameplay begins and see what is (possibly!) coming up in the future.
Used incorrectly, these can be “spoilers” for your narrative arcs, but used correctly, they can help build anticipation for the player (similar to foreshadowing in standard linear narratives).
For instance, if the player sees an Achievement described as “Pull the sword Excalibur from the stone at the lake” then the player will know:
- Somewhere in the game-story is a sword named Excalibur, and it’s probably pretty important and/or useful.
- The sword Excalibur is located inside a stone.
- Therefore, be on the lookout for a sword in a stone somewhere near a lake.
And then, when the player does come across a lake later on, they will be on the lookout for a sword sticking out of a stone.
In other words, you’ve managed to tell the player that the lake is important without ever having to say “keep your eyes peeled for a lake.” Nice!
Likewise, if the 1977 Star Wars movie were written as choice-based IF from Luke Skywalker’s POV, you could include a visible Achievement called “Leave Tattooine”.
This would tell the player that getting off the planet is an important event in the (future) story, so pay attention to opportunities to leave Tatooine!
All without ever giving away the “twist” that the only way to get off Tattooine is aboard the Millenium Falcon with a charming rogue named Han Solo.
Identifying Story Paths
The difference between “signposting the future” and “identifying goals” is that “signposting the future” is foreshadowing what will happen while “identifying goals” is foreshadowing what could happen.
The player won’t be able to tell the difference between these two. It’s only useful to the author to know, for design purposes.
If the bulk of your story-game is about story, then the main “game” element for the player is reaching a particular story out of all the possible stories available.
For instance, if you have a story-game that includes at least one narrative arc about falling in love with an NPC, you definitely want to include a visible Achievement that identifies “In a romantic relationship.”
Seeing this as a possible Achievement will tell the player “a story about falling in love is out there, and if I make the right choices, I can get to that story.”
For design reasons, many or most of the truly divergent story paths tend to begin closer to the end of gameplay than at the beginning.
Identifying these divergent story paths with a visible Achievement, therefore, tells the player “Here are the possible endings/main stories you can get to in this story-game.”
Imagine you were writing an IF game-story about Laura Ingalls WIlder’s book The Long Winter. You could put in two visible achievements:
- The family survives the winter
- The family succumbs to starvation
This tells the player “I better be careful with my choices if I don’t want to read the story about the family starving to death.”
OR it could tell the player “Hmm, I think I’ll make the necessary choices to read the story about the family starving because that sounds like a more interesting story.”
Either way, it’s telling the player that there are named, available story paths out there and that there is some way to get to each one. And, therefore, a game starts being played by the player called “let’s see if I can navigate my way to that story that I want!”
Assuming that the author’s story delivers, playing that game of navigating to a desired story will make the player quite satisfied and engaged. In fact, it is exactly the same experience that the children of Edward Packer enjoyed with their father all those years ago.
Hidden Achievements
ChoiceScript lets you create hidden Achievements that are only visible on the Achievement screen after they’ve been awarded to the player.
Therefore, being awarded these Achievements always come as a complete surprise to the player, so use these sparingly.
The two main uses for hidden Achievements are:
- Comedic or humorous purposes
- Fringe/edge cases
Having the option to spring a pop-up box with text (a hidden Achievement) on the player could be used to great effect for humorous or comedic purposes by any author so inclined.
Hidden achievements are also good for those proverbial “pats on the back” when a player arrives at a seldom-visited narrative path or condition.
For instance, in your D&D type game-story, if the player explores every single nook and cranny of the Thief’s story (perhaps tracked by stats), you might want to award them a hidden Achievement for that accomplishment (“maxing out” the stats).
Likewise, in your blatantly illegal Star Wars game-story, if Luke decides to regale everyone with a lengthy discourse on the nutritional properties of blue milk, you could award that an Achievement in recognition of the fact that few players will ever choose to go down that route.
In other words, anything “completist” can get a hidden Achievement. And anything “rarely accomplished” can also get a hidden Achievement.
First, put up the tree, then decorate it
My recommendation is to wait until after you’ve finished with the principle work of authoring your game-story and you can look at it from a holistic perspective before you go back and add in the code for the Achievements.
Ask yourself:
- Are there any (pure) game elements? If so, what does the “win” condition look like, and what does the “lose” condition look like?
- What are the main story paths?
- Which story junctures/decision points are critical/the most important?
- Are there any text/numerical player inputs? If so, which are most important to the story?
- Does the player contribute anything else to the story?
- What is the (main) ending of each story arc?
- What major/important events happen mid-way during each story arc?
- What major/important events happen at the beginning of each story arc?
- What are the edge cases/conditions?
For each one of these, you should consider adding an Achievement