Resources for stat balancing

I’m busy polishing up my contest entry for publication as a Hosted Game, and I’m currently immersed in resolving some narrative issues my wonderful beta testers have found.

When that’s done, I’m going to have to do something I dread and balance the stat checks. My game definitely falls more towards the traditional CYOA side of the Choice games spectrum and less towards the RPG number-crunching side, but I still have plenty of spots where the player character can fail an action because their skills aren’t up to it.

I have basically no idea how to go about efficiently balancing those spots. Is there some accepted method to figure out how difficult any given stat check should be? Is there some ratio of stat-improving opportunities to stat checks that I should go by?

Right now, I have a whole bunch of places where stats will improve, and a whole bunch of places where those stats will be checked, but there’s no rhyme or reason to it beyond what occurs in the story itself. As I was writing the story, I just threw them in where they seemed to make sense. I winged it, and I know that’s not good enough for the numbers to add up.

As an example, if the character engages in a sparring match with the captain of the guard, then their Strength stat increases by 2%. But I don’t know if it’s increasing by the right amount, or if I need to go through and include more opportunities to increase it, or what.

I’m just a little lost and hoping for some guidance.

1 Like

What I have been doing as I’ve been writing my game is just making a note somewhere of what the max possible number on each stat someone could have by the end of each chapter if they only focused on options with that stat, and use that info to give a rough idea of where stat checks need to be for the next chapter.

For example let’s say someone by the end of chapter 2, if they focused only on sparring, they would have 15%. Chances are that people are probably building two or three stats, so I may make most sparring checks only have a requirements of 5%, or for really difficult ones, 10-11%

Not sure if it’ll help you, but having a rough idea of what possible stats someone could have at each skill check by keeping running tabs on the max has been useful for me.


I did a post on this for the contest:


Thank you. I did read that at the time and used the automated tools as you described, but I guess I need to go through it again and pay more attention to the specific numbers of times particular outcomes trigger. It’s a little difficult for me to follow, but I’ll get there.

That depends on “how difficult” you want your story to be (I’ll be using the term story since you said that your game leans more to the CYOA rather the RPG). If you want it to be not as hard, you can either 1) keep the stat checks low enough, only one or two edge-cases of failings, or 2) keep the stat gains high. The former is preferrable than the latter. Don’t do both, though, unless you want to go meta.

And I doubt it that you want your story to be harder, but if you do, you can spice up the stat-checks.

Now, a good stats system is the one that makes you plan and think with a meaningful payoff when you thought of them well. This can be summarized as “progression.” How many stat gain points you have in the story? What about the number of the difficult stat checks? Are both your stat checks and stat gains balanced properly?

This can be a big topic to discuss at here, so I might write it on different thread. But the gist is, if you’re familiar with MOBA, there’re early-game, mid-game, and late-game phases.
In term of Moba:
Early-game = farm gold to improve your character, while preventing your enemy to do the same.
Mid-game = Skirmish and objective rush. Fight as a team, and survive.
Late-game = Focus is on Objective. Team fights are either decisive combat or assassin dive-fest. Destroy the towers, capture the boss monsters, eliminate key targets. And win the game.

Hope that can give you some insights :bulb:

1 Like

@Delliot if you’re having trouble with stat balancing can I suggest 3 things that I find helps me?

  1. Increase by an amount, not by a %. It can get harder to track if you’re unsure if someone’s stats has risen by 1 or 9 points if you increase by 10% as it depends on if that stat was a 10 or 90 to begin with. If you increase by 5, you know it will always increase by 5. Increasing by small percentages like 1-2% of the total (not an absolute number like +2) isn’t a great idea generally imo unless you know that stat is already high (if you increase a stat at 10 by +2% of the original value it only rises by 0.2 to 10.2)

  2. categorise your variables. So you might decide 1-20% is v. Weak, 21-40 is weak, 41-60 average strength, 61-80 strong, 81_100 is v. Strong. You then look at the task you want to stat check and say “well to lift that rock, you’d need to have at least average strength so I’m going to set the stat check for at least 40.”

  3. Simplify them. Sometimes it can help to simplify variables if appropriate. Like you might have health from 0-10 (with 0 being dead and 10 being perfect health) and then you’re adding or subtracting one or two points here and there instead of tracking %. (You can even write a small script to turn the numbers into labels to make it clearer for the reader what it means.)


Does fairmath do decimal points?

It doesn’t, no. +20 char

1 Like

Thanks everyone! Some good tips in here on all fronts.

I have a hack for this that I used for Choice of Magics, which is to have a big chain of nested if’s that don’t do anything but check larger and larger values of a stat. Then randomtest will tell you the distribution of each stat everywhere you did this, because each line only gets executed if the condition immediately above it passed. I then set checks to the median for normal checks, the upper quartile for a hard check, and so on. This keeps things still pretty easy in all likelihood, since players are nonrandom, but at least it sets a reasonable bar.


Thanks! Great idea to enhance what randomtest gives you, I think that will help a lot. And excellent use of very large math words.

I do want to keep things relatively easy, so that’s fine. It’s just that right now I’m pretty sure nobody will ever see any of my laboriously crafted fail states unless they specifically set out to do so.

1 Like

Players are never as amused by failure as I want them to be, either.


Give them “Fail” achievements? :thinking: I have at least eleven achievements that can only be gained by dying. :grin:


I dunno, you can lead a player to death, but I’m not sure you can make 'em like it.


The prehistoric Infocom game Infidel ended in the main character dying, but I don’t remember if I liked that or not. There are loads of TV shows and movies where the main character dies at the end and it’s very satisfying. Not sure if there are many games like that, though I can think of a couple of other “sort of”'s.

1 Like

Also, make sure the failures aren’t permanent; have checkpoints that you can return to after death, because CS is a very unforgiving medium for death, especially if it’s the death of a character you’ve sunk several hours into playing already.

That said, this is getting closer to the discussions in an earlier thread: How do you feel about "Bad Endings" or 'Game Over' states


Hmm, can you give a code sample of this if you don’t mind? I get the idea but I don’t understand what you mean exactly. :sweat_smile: Thanks!

So, for example, some recent randomtest output from the beginning of my chapter 2 looks like

town 2000: *label statHack
town 2000: *if negation > 0
town 1690:     *if negation > 1
town 1313:         *if negation > 2
town 904:             *if negation > 3
town 543:                 *if negation > 4
town 280:                     *if negation > 5
town 111:                         *if negation > 6
town 43:                             *if negation > 7
town 15:                                 *if negation > 8
town 1:                                     *if negation > 9
town 0:                                         *if negation > 10
town 0:                                             *if negation > 11
town 0:                                                 *if negation > 12
town 0:                                                     *if negation > 13
town 0:                                                         *if negation > 14
town 0:                                                             *if negation > 15
town 0:                                                                 *if negation > 16
town 0:                                                                     *if negation > 17
town 0:                                                                         *if negation > 18
town 0:                                                                             *if negation > 19
town 0:                                                                                 *comment foo

So I know 1690/2000 random playthroughs have nonzero negation, 1313/2000 have negation 2 or more, and so on.


Oh, I see how this works.
Randomtext can print out how many times a line got “passed through,” right?

Ohh! Okay, I get it now! This seems useful especially on the later parts. Thanks for sharing it! :hugs:

1 Like