How Should You Set Affection Thresholds for Novelez Endings?
October 9, 2026

You finish a short romance route in Novelez, add an affection variable, and write a Condition that sends players to a confession scene when affection >= 10. The first playtest ends in the friend ending. So does the second. Nothing is broken. The story simply never hands out ten points, so the confession you wrote can only be reached in the editor.
That is the most common way an affection system fails, and it happens before any bug appears. The threshold was chosen as a round number instead of being placed inside the range players can actually reach. The fix is a habit rather than a feature: write down what each choice adds, calculate the lowest and highest totals on every route, and only then decide where the line between endings belongs.
This guide uses one small example throughout. Mina is a character the player meets at a train station. Three choices along the way change affection, and the story ends in either a friend ending or a confession ending.
What should a single point of affection mean?
Before choosing numbers, decide what the variable records. Novelez treats a variable as a plain value. A Variable block can assign with =, add with +=, or subtract with -=, and the docs note that adding and subtracting only make sense for numbers. The meaning of a point is up to you.
A useful definition is narrow. In the station example, one point means the player acted in a way Mina would remember warmly. Waiting with her for a delayed train is worth two points. Asking about her ticket is worth one. Walking off to buy coffee is worth nothing.
Keep the values small and few. A scale of 0, 1 and 2 is easy to reason about when you later add up a whole route. A scale where one choice gives 7 and another gives 15 makes every later calculation slower and invites mistakes. If you find yourself wanting a large number to force a result, that usually means the choice should set a flag instead, such as missed_train = true, and be checked separately.
Name the variable for what it tracks. The Variable block docs suggest names like affection_alice, and that pattern helps as soon as a second character appears. A typo in the name quietly creates a new variable, so pick names from autocomplete instead of retyping them.
How do you find the range players can reach?
Make a small table with one row per choice point and one column per option. For the station route it might look like this:
- Platform: wait together (+2), ask about the ticket (+1), buy coffee alone (0)
- Train: share the window seat (+2), read a book (0)
- Arrival: walk her to the exit (+2), say goodbye on the platform (+1)
Now add up the extremes. The lowest total takes the smallest value at each point: 0 + 0 + 1 = 1. The highest takes the largest: 2 + 2 + 2 = 6. Every player who follows this route will finish with a score between 1 and 6. A threshold of 10 cannot work. A threshold of 1 cannot fail.
Branching makes this more important. Suppose the first choice splits the story, and the ticket hall route skips the train scene entirely. That route has only two scoring points, so its highest total is 4. If the confession requires 5, it is reachable on the platform route and impossible on the ticket hall route. That may be exactly what you want. It should still be a decision you made, not something you discover in a playtest.

Do this for every route that reaches the Condition. Where routes rejoin through a Go to chapter, the totals carry over, so add the scores from before the split to each branch.
Where should the threshold sit inside that range?
Once you know the range, place each threshold where it asks for a clear pattern of behavior rather than a perfect run.
On a 1 to 6 route, a confession threshold of 6 means the player must pick the warmest option every time. That can suit a hidden ending, but it makes the main romantic ending feel like a test. A threshold of 5 allows one less-than-perfect choice. A threshold of 3 lets most players through, which can make the confession feel unearned.
A practical approach is to write two short descriptions first. Describe the player who should see the confession: someone who stayed with Mina at least twice. Then describe the player who should not: someone who spent most of the trip elsewhere. Translate those descriptions into totals using your table. If the first player can score 5 at minimum and the second can score 3 at most, any threshold of 4 or 5 separates them.
For three endings, repeat the exercise for each boundary. Leave at least one point of space between neighboring thresholds so a single small choice does not swing the player across two endings at once.
If an ending depends on two things, such as affection and whether the player kept a promise, do not try to fit both into one expression. The Condition block docs recommend one simple comparison per branch and suggest chaining Condition blocks when you need more. Check the flag first, then send the player to a second Condition that reads the score.
How should the Condition branches be ordered?
Novelez evaluates Condition branches from top to bottom and moves to the chapter of the first branch that is true. Later branches are not checked. That makes order part of the design.
With three endings, the strictest requirement goes first:
affection >= 5:ending_confessionaffection >= 3:ending_close_friendelse:ending_friend
If the second line sat above the first, every player with 5 or 6 points would also satisfy >= 3, match it first, and never see the confession. The table you made earlier will not catch that mistake. Only the order will.

Always add the default branch. The docs describe else as the safe pattern because it runs when nothing above matches. In this example it is also the friend ending, so it carries real story weight, not just error handling.
Two smaller details are worth checking in the properties panel. A destination that no longer exists is shown in red, and the Condition does not stop there: play continues with the block after it. An empty expression counts as always true, and an expression the editor cannot read counts as always false. Both warnings appear in the panel, so read them before you test.
Finally, give the variable a starting value. The Variable block docs recommend assigning initial values such as affection = 0 in the first chapter at the top of the list. Your range table assumes everyone starts from the same number, and this block is what makes that true.
Can a player earn the same points twice?
The range calculation assumes each choice is passed once. Some structures break that assumption without anyone noticing.
A hub chapter that the player can return to, or a Go to chapter that loops back to an earlier scene, can run the same += block again. The testing docs list this as an edge case worth checking: whether repeating the same choice inflates a variable in unintended ways.
There are two simple ways to keep the range honest. Place scoring Variable blocks only in chapters the player passes through once. Or, for events that should count once, record them with a flag such as waited_together = true and add the points in a single place the loop cannot reach. Either way, update your table so it reflects the structure you actually built.
How do you prove every ending is reachable?
Novelez offers two ways to play. Play from here starts from the selected block and is excellent for checking staging. For score testing it has a limit the docs spell out: it applies every Variable block above the selected block in list order before it starts, and that can include Variable blocks from branches the player did not take. A score you see this way may not match any real playthrough.
For thresholds, use Play from start and follow real paths. Four runs cover most of the risk:
- The lowest path: pick the coldest option every time and confirm the lowest ending.
- The highest path: pick the warmest option every time and confirm the top ending.
- Exactly on the line: find a combination that totals 5 and confirm it reaches the confession.
- Just below the line: find a combination that totals 4 and confirm it does not.
The testing docs suggest dropping the value into a temporary Dialogue line to see it, for example (debug) affection: {affection}. Put it right before the Condition so each run shows the total that is about to be judged.

When all four pass, delete the debug line before you share the link. Novelez saves changes to the same share link, so players would otherwise see it on their next visit. Then open Flow View once more and confirm that every Condition arrow lands on the ending chapter you intended and that each ending chapter finishes with an Ending block.
What Novelez does not decide for you
Novelez provides the pieces: variables, Conditions that read them, warnings for missing destinations and unreadable expressions, and Flow View to see the arrows. It does not calculate the possible range of a variable, and it will not tell you that a threshold is out of reach. That table stays your job, and it is usually a ten-minute job for a short route.
The payoff is a system that feels fair. Players who acted warmly see the ending that warmth deserves, and nobody hits a wall that only the author could pass. If you are building an affection route in Novelez now, what is the highest total your current route can actually produce, and is your confession threshold below it?