D&D Score Modifiers Part 2 (Current Versions for Twine and Sugarcube)

+1 vote
asked Apr 5 by The Hellfox (250 points)
So awhile ago I asked about incorporating D&D mechanics like score modifiers into twine game. The response I got was to use one massive if statement for each stat and modifier to each pair of scores up to 20. However, it seems that this system is not communicating at all with the player object. Thoughts?

2 Answers

0 votes
answered Apr 5 by Akjosch (5,630 points)

You probably mean this question, right?

While the answer's code is not what I would typically go for calculating the modifier (my preference would be something like Character.mod($hellfox.dex) to get the value), you will have to explain what you mean by "this system is not communicating at all with the player object" exactly. Ideally, with code you are writing and explaining what this code is supposed to be doing, but apparently isn't.

commented Apr 6 by The Hellfox (250 points)
I am basically running everything through a StoryInit passage so everything has a default setting essentially. I have a player object in there with default values than can be changed via a point buy passage. The stat point buy works fine and stats change no problem. However the player object ability scores are not setting, they remain at a 0. I will post everything below.

<<set $player to {
    name: "Hiro",
    MVIT: 0,
    VIT: 0,
    STR: 10,
    STRmod: 0,
    DEX: 10,
    DEXmod: 0,
    CON: 10,
    CONmod: 0,
    INT: 10,
    INTmod: 0,
    WIS: 10,
    WISmod: 0,
    CHA: 10,
    CHAmod: 0,
    } >>

<<if $player.STR lte 1>>
  <<set $player.STRmod to -5>>
  <<elseif $player.STR == 2 or $player.STR == 3>>
  <<set $player.STRmod to -4>>
  <<elseif $player.STR == 4 or $player.STR == 5>>
  <<set $player.STRmod to -3>>
  <<elseif $player.STR == 6 or $player.STR == 7>>
  <<set $player.STRmod to -2>>
  <<elseif $player.STR == 8 or $player.STR == 9>>
  <<set $player.STRmod to -1>>
  <<elseif $player.STR == 10 or $player.STR == 11>>
  <<set $player.STRmod to 0>>
  <<elseif $player.STR == 12 or $player.STR == 13>>
  <<set $player.STRmod to 1>>
  <<elseif $player.STR == 14 or $player.STR == 15>>
  <<set $player.STRmod to 2>>
  <<elseif $player.STR == 16 or $player.STR == 17>>
  <<set $player.STRmod to 3>>
  <<elseif $player.STR == 18 or $player.STR == 19>>
  <<set $player.STRmod to 4>>
  <<elseif $player.STR == 20>>
  <<set $player.STRmod to 5>>
commented Apr 6 by Akjosch (5,630 points)

Basically, it looks like you forget to set the modifiers again after the values were changed.

This is one of the reasons why I prefer my approach - it calculates the modifiers dynamically without a need to re-run anything. All it takes is to add the method definition to the JavaScript portion of your game:

window.Character = {
	mod: function(val) {
		if(val >= 1 && val <= 20) {
			return Math.floor(val / 2) - 5;
		} else {
			return 0;
	// Add other methods and constants as needed

Now instead of accessing $player.CHAmod, you access Character.mod($player.CHA), instead of $player.STRmod you use Character.mod($player.STR) and so on.

commented Apr 6 by The Hellfox (250 points)
So would the Character.mod($player.CHA) stuff get added to the player object? And the Javascript to the Story Javascript window??? I am a bit new at this tbh.
commented Apr 6 by Akjosch (5,630 points)
The player object loses all the "mod" attributes, the JavaScript code gets added to the Story JavaScript, and Character.mod($player.CHA) is what you use to get the current CHA mod - the value you previously accessed via $player.CHAmod.
0 votes
answered Apr 10 by Valareos (200 points)
Depending on the version of D&D you use, you should be able to modify based on raw scores on the fly.

3rd edition, for example, you could calculate the modifier with floor [(score-10)/2] (Not in twine code)

you would have 18 be a +4, a 15 as +2, 10 is a +0  and 6 would be a -2.  It also means you have near infinite scalability

I would expect it would be a lot easier than trying to have a table with all possibilities.

If later editions used different numbers, its just a matter of finding a mathematical conversion that works
Welcome to Twine Q&A, where you can ask questions and receive answers from other members of the community.

You can also find hints and information on Twine on the official wiki and the old forums archive.

See a spam question? Flag it instead of downvoting. A question flagged enough times will automatically be hidden while moderators review it.