⇝ body temperature, fidgeting, heart rate, character quirks
⤠ environmental descriptions
⇝ descriptions using the five senses, setting, character’s appearances
⤠ internal dialogue
⇝ emotional reaction to what was said, reflection of past experiences, connections to other characters/settings/actions
➵ I want to reiterate… descriptions using the five senses ; when in doubt, think of the five senses your character is experiencing and pick what best moves the story forward
Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
✓ Live Streaming✓ Interactive Chat✓ Private Shows✓ HD Quality
Anya is LIVE right now
FREE
Free to watch • No registration required • HD streaming
「 note: this is for the editing stage; remember, first draft is for the writer & editing is for the reader; get it down before worrying about these things unless it is just for practice 」
✧
ACTIONS
↦ are the actions necessary?
↦ are the verbs as descriptive as possible?
↦ do the actions match the character? why did the character take those actions?
↦ are the actions clear?
DIALOGUE
↦ what is the purpose for each statement?
↦ does each statement move the story forward?
↦ are the dialogue tags as descriptive as possible?
↦ does the dialogue match the character? why did the character say those things?
EMOTIONS
↦ are each character’s emotions clearly stated or implied?
↦ are the character’s emotions justifiable?
↦ how does the character’s emotions affect their actions?
LANGUAGE
↦ are you showing or telling?
↦ does the scene have clarity & coherence?
↦ does the scene have the desired tone, mood, & voice?
PURPOSE
↦ is this scene necessary? (if removed, would the story still make sense?)
↦ are there stakes at risk in this scene? is there tension?
↦ has something changed from the beginning to the end of the scene?
↦ possible purposes: advance the plot? reveal character goal? increase tension? develop character? reveal conflict? react to conflict? explain backstory? foreshadow? build world? reinforce theme, tone, or mood?
SETTING
↦ will your reader clearly know the setting throughout the scene?
↣ readers invested their time into your publication ; make it worth it!
↣ the conclusion turns readers into fans
↣ endings should be memorable & satisfying ; this will make the readers want to indulge in more of your work
✦
Choosing Your Ending
↣ know your genre ; different genres can get away with different endings
↣ a thriller novel ending unexpectedly or ambiguously would be more satisfying to readers than a romance novel ending that way ; and vise vera, a romance novel ending emotionally and with happily ever after would be more satisfying than a thriller ending that way
↣ make it unpredictable but fair ; readers should feel like they could have seen it coming
↣ find a happy medium between what your readers want and what is unexpected
↣ be careful with unresolved or ambiguous endings ; regardless of the ending, the readers need to feel satisfied or they won’t come back
↣ be careful with expanded endings ; most editors frown upon relying on epilogues to reach a satisfying resolution
↣ have your ending in mind from the beginning ; this isn’t always plausible, but it’s very helpful — you’ll end up having hints to the resolution you may not even realize, & readers want that
✦
Types of Endings
⤷ ambiguous
→ an ending open to interpretation ; allows readers to come to their own conclusions
⤷ dialogue
→ ending with a quote from one of the characters
⤷ emotional
→ leaving the readers feeling some intense emotion ; negative, positive, or bittersweet
⤷ expanded
→ expands past the events of the narrative to resolve aspects that may not be explained in the main chapters ; usually takes form of an epilogue with a time skip
⤷ happily ever after
→ type of resolved ending where everything works out in the end
⤷ humorous
→ ends with a joke or in an ironic way
⤷ lesson learned
→ ends with clear, profound character development
⤷ reflection
→ ends with characters looking back on their choices, achievements, and experiences
⤷ resolved
→ leaves reader with no questions or loose ends ; all aspects have been clearly & satisfyingly resolved
⤷ tied
→ brings the story full-circle so it ends where it began
⤷ unexpected
→ a twist the readers did not see coming but also makes sense
⤷ unresolved
→ leaves readers with unanswered questions ; usually to lead into the next book
Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
✓ Live Streaming✓ Interactive Chat✓ Private Shows✓ HD Quality
Anya is LIVE right now
FREE
Free to watch • No registration required • HD streaming
First, I just want to say I lobe and appreciate your hard work in compiling and featuring different IFs and Authors in your page!
Second, is the rec list updated? I can't seem to find any recently asked genre 😔
Hi Anon,
Thank you for your message!
We try to update the rec list masterpost as regularly as we can (we sometimes update it, but forget to change the date, sorry). It is updated as of today.
If the list is not up-to-date, you can always check the tag #if: rec list ! All the rec list we create has this tag.
In the meantime, please be patient with us. We try to keep this blog as up-to-date as possible, but we are bound to miss something.
this may be a weird one for you but do have any idea how all these authors are doing their headers on their masterposts? like when they introduce their games and they have their title edited on a header to catch the readers eye
Hi Anon,
Thank you for your question!
We can't answer for authors what do they use to create their headers, many may answer differently. But there are many options out there, free or with a fee. Some author may even commission designs.
While we are more focused on providing resources around writing and coding, we know a few tools that may help you!
Free Programs:
Canva [link] (has a subscription option, but the free version still has a lot of choice)
GIMP [link]
Paint.NET [link]
photopea.com [link]
pixlr.com [link]
Figma [link]
Free Assests:
Google Font [link]
Unsplash [link] (photo)
Pexels [link] (photo)
FreePik [link] (vectors, psd, photo)
Please note that some of these website may require you to credit the original creator for free use of their assets.
If you know of a free neat tool or resource website, please let us know and we will add it to the list!
Creating a system to manage character relationships is one of the most popular game mechanics in interactive fiction games. While not every game needs a relationship system, it may be a good idea to implement one if the player character’s relationships with others are an important dynamic in your game.
This is an informal tutorial written for Twine and SugarCube. While the coding aspects will only work in SugarCube, the principles should be applicable to other story formats or IF engines. Even if you don’t work in Twine/SugarCube, this may still be helpful if you’re struggling with relationship stats!
This tutorial assumes you already have an understanding of setting stats in SugarCube (see here for a quick overview) and also the TwineScript and JavaScript conditional operators (see here in the documentation). TwineScript and JS conditional operators achieve the exact same thing, so I tend to use them interchangeably depending on what is faster/more comfortable for me.
What Is An Approval System?
An approval system is the mechanic that tracks how one character feels about another. This is typically the player character (PC) and the main NPCs. Most of the time these NPCs are romance options (ROs), but they could also be friends or party members. The higher the approval, the closer the PC and NPC become.
Choosing which characters will have an approval system and which ones do not is important. Unless you’re making a very small game (i.e. six or seven characters max, with no other characters involved in the story), not every character needs to have their approval tracked. These should be the characters whose relationship to the PC directly impacts the narrative and opens up different paths, routes, and outcomes.
How you build your approval system will depend on the scope and style of your game. A romance game where the PC follows the story route of their desired love interest will have different needs than an action/adventure game where the PC’s best friends can turn on them.
Before you design your approval system, there’s a few things you’ll want to think about:
Which characters will be affected by the approval system? How many? Keep in mind that every character who has a relationship/approval stat will need their own relationship/approval variable.
Do you want the approval system be linear? The approval system only ever moves forwards, with the player taking certain actions/dialogue options to gain approval points with an NPC, and they can never lose that progress.
Do you want the approval system to be bi-directional? The approval system can progress and regress. The player can take certain actions/dialogue to gain approval points with an NPC, but they can also take other actions/dialogue to lose points.
What is the impact your approval system will have on the game’s narrative? What types of things do you want it to lock or unlock? How will it shape the player’s experience?
What does your approval system measure? Friendship? Romance and friendship? Friendship and rivalry? Depending on your game’s needs, you may want to have more than one approval system to track different relationship names (for example, a separate system for friendship and one for romance, one for friendship and one for rivalry). You’ll want to think very carefully about using multiple relationship systems. If all of your desired outcomes can be controlled through one approval bar, then you probably don’t need more than one. However, if you want to do something like having a romance between a PC and an NPC who hate each other, you may want to split romance and friendship into two separate functions.
Linear Approval Systems
Linear approval systems measure the PC/NPC relationship in sequential order. The player can only ever gain approval points with an NPC. One gained, points cannot be lost. Usually with linear systems, the player needs to select the right dialogue and action options in order to progress the relationship, but they are not punished for selecting the wrong ones. Once the player achieves the right amount of points with the desired NPC, a special romance or friendship scene will unlock or they will attain some kind of additional content or flavour text.
When creating a linear system, you will want to decide how numerical values (the approval points) define the PC/NPC relationship. Here’s an example of a combined friendship/romance system, using units of 10:
0 – 9 – the characters have just met each other. They’re getting to know each other, but they’re not friends yet.
10 – 19 – The characters are warming up to each other. They are more friends than acquaintances and they are starting to flirt with each other.
20 – 29 – The characters know each other quite well. They are openly flirtatious; maybe they have started dating.
30 – 39 – The characters care a lot about each other. They have officially become a couple.
40 – 50+ – The characters know everything about each other. They are deeply in love and trust each other completely.
Here, the ranges are the same for every approval “level”, but they don’t have to be. Some levels could require fewer amounts of points (i.e. the “getting to know each other” range could be accomplished in 5 points, and the “caring a lot about each other” range could take 20 points). It could also change depending on the character, with some NPCs being more open to the player character right away and others taking more time to warm up to them.
How large your ranges are will depend on how many opportunities you plan to give the player to raise their approval level. If you only intend to provide a handful of opportunities to raise approval, then you won’t need ranges quite as large as this one.
Consider the scale of your game and what the long-term progression of the PC/NPC is; that will help you determine how many approval points you are working with. You should always know where the end point is.
Bi-Directional Approval Systems
Bi-directional approval systems are more difficult to implement than linear ones, but they are much more flexible. If you intend your PC and NPCs relationships to have any kind of rivalry, for them to fall in and out of love, or for them to end up hating each other over the course of your game, a bi-directional approval system may be better. This system creates a scale. The player can gain and lose approval over the course of the game, and depending on their actions, the PC/NPC relationship will either increase or decrease.
For this kind of system, you will want to think about your minimum point and maximum point for your scale (i.e. where does it start and where does it finish?). While you can set 0 as the neutral point and work with positive and negative numbers (anything above 0 being in the “like” range, anything below 0 being in the “dislike” range), this can be difficult to indicate visually later on if you want to use a meter or a progress bar.
I like to use 0 and 100 as my min and max points for sake of ease, but you can really set it to whatever you want.
Similarly to the linear approval system, you will want to define the numerical ranges that your PC/NPC relationship falls into. Here, it’s important to know where the where the mid point is—what value indicates the neutral ground between like and dislike.
It could look something like this:
0 - 19 — Extreme dislike
20 - 39 — Dislike
40 - 59 — Neutral feelings
60 - 79 — Friendly
80 - 100 — Loving/close friends
Here, I’ve divided the approval stat (0-100) into 5 approval ranges that increase in units of 20 points. 50 is the center—it is the mid point of the approval bar and the mid point of the neutral range.
Just like the linear system, how big your ranges are will depend on how many opportunities you plan to give the player to increase/decrease their approval stat.
Why Work in Ranges?
Having ranges in your approval system allows for more flexibility and control over the approval stat. It increases the amount of opportunities the player will have to change the course of their relationships, which makes for a more satisfying roleplaying experience.
For example, here’s a ten point approval system:
1 – We hate each other
2 – I can’t stand you
3 – I dislike you
4 – You bother me
5 – Neutral
6 – You’re okay
7 – I like you
8 – We’re good friends
9 – We’re close friends
10 – We unconditionally love each other
If gaining nine approval points is all it takes to go from “we hate each other” to “we unconditionally love each other”, then it only takes the player nine interactions for that growth to happen. The pacing of the relationship is going to feel off. When there’s less room for growth, growth between these extremes will happen very rapidly.
Working in ranges let’s the PC sit in different stages of the relationship for a longer amount of time. Because it takes more points (and therefore more time), any relationship progress or regression will feel more natural. At the same time, you don’t want the ranges to be too big, otherwise it will feel like no progress is happening. This will, of course, depend on how many points you are adding/subtracting with each approval gain and loss.
Adding/Subtracting Approval and Using Conditional Statements to Control Flavour Text, Dialogue, Choices & NPC Behaviour
Once you have your system established and you know your ranges, approval stats work very similarity to any other stat. You can use conditional statements that check the numerical value of the approval stat to show different flavour text, dialogue, choices and options.
I’m going to use the bi-directional system as an example here, with a range of 0-100.
Let’s say we have a character named Eliza and her approval is stored in a variable called $eliza_approval. Because she has just met the PC, let’s set her approval to 50, so she is in the exact centre of the neutral approval range.
<<set $eliza_approval to 50>>
If the player selects an option that coincides with something she approves of, you can add approval to her approval stat with:
<<set $eliza_approval +=1>>
(This adds +1 to her approval stat.)
<<set $eliza_approval -=1>>
(This subtracts -1 from her approval stat.)
You can accomplish the same thing inside a link, using SugarCube’s link markup:
[[1. Nice choice.|Next Named Passage][$eliza_approval +=1]]
[[2. Mean choice.|Next Named Passage][$eliza_approval -=1]]
In the text of your game, you can control what options and flavour text the player sees depending on Eliza’s approval stat by using conditional statements.
<<if $eliza_approval >=80>> Shows text/options for a loving/close friends relationship.
<<elseif $eliza_approval >=60 && $eliza_approval <=79>> Shows text/options for a friendly relationship.
<<elseif $eliza_approval >=40 && $eliza_approval <=59>> Shows text/options for a neutral relationship.
<<elseif $eliza_approval >=20 && $eliza_approval <=39>> Shows text/options for a relationship where they dislike each other.
<<elseif $eliza_approval >=0 && $eliza_approval <=19>> Shows text/options for a relationship where they hate each other.<</if>>
You could also close the statement with an <<else>> instead of the last <<elseif>>.
Depending on the context of the scene and options, you may not need flavour text or choices for all of your available ranges. Often when working with a bi-directional system, you may only need to have two options (one for low approval, one for high approval). What counts as “low” and what counts as “high” may change depending on where you are in the game, the current tensions, and what’s at stake.
To divide your ranges into low approval and high approval, you could do something like this:
<<if $eliza_approval >=60>> Shows the high approval option.
<<else>>Shows the low approval option.<</if>>
Here, high approval counts as anything that is 60 or over (the “friendly” range and above).
Later on, I may run into a situation where I want “high” approval to count anything in the neutral range. So I may change the code to this:
<<if $eliza_approval >=40>> Shows the high approval option.
<<else>>Shows the low approval option.<</if>>
How much differing flavour text and options will depend on the context of each individual moment in your game. Sometimes you will want to have more restrictions and more flavour text; other times, you’ll want to simplify.
A basic rule of thumb is that if the flavour text for a neutral relationship and a friendly relationship in a given scenario is basically the same, then you probably don’t need to separate them out (for that scenario). Even if you have your relationship stats divided into five ranges, you don’t always need to come up with text and options for all five.
Clamping Approval
I think the most important part of creating a relationship system that feels organic is pacing and offering a broad selection of player choice. One of the challenges with approval systems is crafting a system that allows the player to feel like they’re roleplaying their character. Sometimes, the choices that gain approval are out-of-character for the player and they won’t want to select them, even if they want to form a relationship with that NPC.
This can be frustrating for the player in games that have romance. Systems that don’t have enough varied opportunities for the player to gain approval can significantly hinder roleplaying and cause players to take out-of-character actions to get the RO they want.
However, developers may not want to offer a lot of opportunities for approval gain because players could max out (or deplete) their relationship stats too early. To circumvent this, I highly recommend clamping your approval.
Clamping keeps your relationship stats between a min/max range and prevents it from exceeding the limit. SugarCube can clamp numerical variables with a function called Math.clamp.
If we take Eliza’s approval variable from earlier and clamp it, it will look something like this:
<<set $eliza_approval to Math.clamp($eliza_approval + 5, 0, 100)>>
<<set $eliza_approval to Math.clamp($eliza_approval - 5, 0, 100)>>
The first code adds +5 to $eliza_approval, the second subtracts -5. Both clamp it between the range of 0 and 100.
This means that if $eliza_approval was at 98 and the game added +5 to it, it would max out at 100. And if $eliza_approval was at 3 and the game subtracted -5, it would only decrease to 0.
To clamp inside SugarCube’s link markup, you can do it like this:
[[1. Nice choice.|Next Passage][$eliza_approval to Math.clamp($eliza_approval + 5, 0, 100)]]
[[2. Mean choice.|Next Passage][$eliza_approval to Math.clamp($eliza_approval - 5, 0, 100)]]
You can use clamping to manipulate approval gains and loses at different stages of your game.
For example, in Wayfarer, the player has the opportunity to set the approval level of a major character with whom they have a pre-established relationship. If the player sets Aeran’s approval level to 80, then the game treats them as very close friends.
Because there are multiple opportunities to raise that approval level throughout Chapter 1, Aeran’s approval is clamped between 5 (as the minimum) and 90 (as the maximum) as I did not want players to fully deplete or max out his approval bar in the first chapter of a 14-chapter game.
It doesn’t matter if the player hits all of the possible approval gains available in the chapter, Aeran’s approval will always stop at 90 in Chapter 1.
Clamping approval gains and loses at different points in the game can be helpful for allowing more opportunities to affect approval. Instead of preventing players from maxing out their stats too soon by offering fewer choices, you can offer more choices and let the engine do the work for you to keep the player’s relationships within the desired range.
How Many Points to Add?
How many approval points you add or subtract will depend on your system’s range and your game’s needs. Approval gain/loss can always be static (+1 or -1), or it could depend on the action taken.
If the PC does something an NPC really likes, it could garner more approval points – +5, +10, or even enough to put them into the next range. Likewise, if the PC does something the NPC despises, it could net greater loses.
If the PC does something the NPC believes is unforgiveable, sometimes an approval loss is not enough because the PC could gain those relationship points back. You may want to add an additional check to control the NPC’s behaviour in regards to the Unforgiveable Event that supersedes the approval, or block the PC off from gaining approval with the NPC all together.
In SugarCube, this bit of code could look like this:
<<if $UnforgiveableEvent is true>>Unique flavour text that shows that Eliza is upset with the PC
<<elseif $eliza_approval <= 39>>Unique flavour text for a generic low approval interaction with Eliza
<<else>>Flavour text that isn’t covered by the above two situations (so, in this case, unique flavour text for a generic medium/high approval interaction with Eliza).<</if>>
Relationship Bars
If relationships are a crucial element of your game, you may want the player to access that information so they can track where their approval level is at.
There are multiple ways to do this, so it all depends on the design of your game and how much time you want to spend on it.
You can use conditional statements show relationship status through words, with no visuals. Something like this:
Eliza <<if $eliza_approval >=80>><b>loves</b> you.
<<elseif $eliza_approval >=60 && $eliza_approval <=79>>is a <b>close friend</b>.
<<elseif $eliza_approval >=40 && $eliza_approval <=59>>is <b>indifferent</b> towards you.
You could also create an approval bar that visually indicates approval level. I prefer using the progress element for this (explained here), but you could also use Chapel’s Meter Macro to accomplish the same thing.
Th progress element and meters cannot show negative values, which is why I recommended having 0 as your lowest value on any given relationship stat.
You could do a combination of the two, or even use image assets (controlled by conditional statements) to indicate approval. Visually indicated approval level can be as complicated or as simple as you want it to be.
Using Multiple Relationship Stats
Depending on the complexity of your relationship system, you may end up splitting your approval systems into multiple parts. For example, you could have separate variables for:
Friendship
Romance
Rivalry
This would allow you to have greater control over a wider arrange of combinations. A relationship that is high friendship and low romance would be different from a relationship that is high friendship and high romance. A relationship that is low friendship, high romance and high rivalry would again be different from a relationship that is low friendship, but high romance and high rivalry.
All of this can be controlled with effective use of conditional statements. For example, if you were working with separate friendship and romance systems, you would need to set two stats: one for friendship and one for romance.
Conditional statements would then look something like this:
<<if $eliza_approval >=40 and $eliza_romance >=80>>Options for a neutral or friendly Eliza who is romanced.
<<elseif $eliza_approval <=39 and $eliza_romance >=80>>Options for a hostile Eliza who still has feelings for the PC.
<<elseif $eliza_approval >=40 and $eliza_romance <=79>>Options for a neutral or friendly Eliza who is not romancing the PC.
<<elseif $eliza_approval <=39 and $eliza_romance <=79>>Options for a hostile Eliza who is not romancing the PC.
<<else>>Options for if none of the above is true.<</if>>
The more in-depth you make your system, the more complex it will be to maintain and the more variations you will have to manage. You will want to be careful about adding too many of these. Think about what your game needs and how you can make it effective; if something can be managed with fewer systems, then it probably should be.
Finally, the long awaited sequel to my original Twine tutorial! Long awaited by me, because I’ve been meaning to make another one but I just haven’t gotten around to it. If you need a refresher on what that tutorial covered, feel free to go check it out here. But now, it’s time to talk a little bit about stats!
As usual, the tutorial (below the cut) should be perfectly beginner friendly and explain everything you’ll need to know to implement this into your game, although it might be a bit long! It’ll also include a bit at the end telling you how to install and use custom macros. Enjoy!
Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
✓ Live Streaming✓ Interactive Chat✓ Private Shows✓ HD Quality
Anya is LIVE right now
FREE
Free to watch • No registration required • HD streaming
the twine grimoire vol 2 has been released!!! i highly recommend both twine grimoires for beginning coders. volume 1 focuses on an introduction to CSS and html, while volume 2 goes into more detail with things like cycling links, animations, and UI customization, etc. both are over 60 pages, include harlowe and sugarcube documenation, and are free!!! but i highly encourage donations for grim baccaris’s work.
Seeing as a lot of IF authors are now considering making the move from ChoiceScript to Twine, but are finding it a little daunting (understandably), I thought I would release my OOTB design/UI as a template for people to use and tweak into their own, as I know one of the biggest worries people have is not being able to play the game on mobile. Just wanted to help in any way I can, I feel so bad for everyone using CS.
I put this together rather quickly, so I’m not 100% everything works lol. Please let me know if something doesn’t work, or looks off, and I’ll fix it asap. Also, feel free to let me know if you want me to add more features, styles or explanations to it, as I wasn’t really sure how much to include? I didn’t populate the stat pages, because I assume people will want to make it their own? But I’m happy to add more if you want more included, or assist if you need help navigating it.
Just thought I would provide this as a sort of starting point for people, so feel free to change it up however you please.