Choicescript-Like Stats Screen And Opposed Pair Stats In Twine

Yeah, the current page won’t change just by changing a variable. See the post a couple up from yours for the basic principle of modifying something that already exists on the page. But it’d be slightly complicated to update the actual stat bar and I haven’t gotten around to sitting down and figuring that out, I’m afraid.

Ohh ok, thank you so much!

Hi, thank you for all your efforts.
I implemented this code and it works very well. I just have a problem with the math. I have a starting opposed stat bar of 50/50 by default.
If I change the value by adding a number, it rounds differently than if I subtract.

e.g.:
<<fair_plus “$X” +5>> gives 53/47
<<fair_plus “$X” -5>> gives 48/52

So the two results are not even.

While:
<<fair_plus “$X” +10>> gives 55/45
<<fair_plus “$X” -10>> gives 45/55

In this case, it rounds correctly.

Do you know why, and how to correct the rounding?
Thank you!

edit: I’ve also put the statbar in the header, but I can’t manage to put it in line with text and/or another statbar. It always goes to a new line.

If you plug the numbers into the given formula from Josh’s post, the result is 50 + 2.5 = 52.5 in the +5 case, which Math.round will round up to 53.

In the -5 case, we get 50 + (-2.5) = 47.5, and Math.round will round that up to 48.

(In the +10 and -10 cases, the results are 50 + 5 = 55 and 50 + (-5) = 45 directly, so there’s no effect from the final rounding.)

That’s where the resulting numbers come from in the example.

One possible solution that comes to mind is rounding before adding/subtracting, so that we only add or subtract whole numbers (in the example, 3 and -3). We could attempt to do it like this:

percent += Math.round(... etc. ...)

The problem with that approach is that, if the fractional part is exactly 0.5 and we have a negative number, JavaScript will round in the positive direction, so Math.round(-2.5) will become -2, not -3. This would lead to the same asymmetry (percent would be 50 + (-2) = 48).

So, I could be overlooking something, but I think I’d sort of “pretend” that the change is positive, then round it (so that it will be rounded the same way, no matter whether it’s intended to be negative or positive), and then restore the original sign of the change.

To do that, I’d change the line

percent += Math.abs(change)/100 * (end - percent)

to this:

percent += Math.sign(change) * Math.round(change/100 * (end - percent))

This part: change/100 * (end - percent) will always be positive:

  • if change is positive, then of course change/100 will be positive, and (end-percent) will be positive, because end will have been set to 100 in the preceding line (and percent will never be larger than 100)
  • if change is negative, then change/100 will be negative, and (end-percent) will be negative too, because end will have been set to 0 in the preceding line; the multiplication of the negatives will result in a positive value

So returning to the example, both in the case of +5 and -5, the value of change/100 * (end - percent) will be 2.5, when the starting value of the stat (= percent) was 50.

We can round that: Math.round(change/100 * (end - percent)) and will thus get 3.

Now we only need to restore the original sign of the intended change, by doing: Math.sign(change) * ...

… and we will get either percent += 3 or percent += -3.

which will result in 53 or 47, respectively, so we’ll have the same change by 3 from 50 both when it’s positive and when it’s negative.

I only tested this perfunctorily in the browser console, but it should work, I think. (It also works when plugging in some example numbers from the Choicescript site, and preserves the asymmetric changes which the fairmath system has by design, when the value of the stat is not 50, but higher or lower than that.)

1 Like

Not only you solved the problem, but you took the time to analyze it and explain it in terms even a newbie like me could understand.
Thank you very much sir, you and your avatar are great!

1 Like