Roll20 uses cookies to improve your experience on our site. Cookies enable you to enjoy certain features, social sharing functionality, and tailor message and display ads to your interests on our site and others. They also help us understand how our site is being used. By continuing to use our site, you consent to our use of cookies. Update your cookie preferences .
×
Create a free account

[Macro Request] Reducing a value to Balanced Ternary

I want to determine whether a given attribute is positive, negative, or zero, and respond appropriately just through dice representation, and without using a custom character sheet. I can't use the scripting API for a character sheet because I can't afford to be a mentor, so I have to do it all in roll math. Okay, so what I have is I'm running D&D 3.5 using Roll20's built-in 3.5 character sheet where as a variant I'm using Pathfinder's Combat Maneuver system. Everything is working fine, except that I've just discovered that Pathfinder's Combat Maneuver system says that creatures of Tiny Size or smaller use their Dexterity Modifier in place of their Strength modifier for their Combat Maneuver Bonus. What I have right now for determining the CMB bonus is... +[[ @{selected|bab} + @{selected|strmod} - @{selected|size} + @{selected|CMB-misc} ]] ...where @{selected|size} is subtracted because it's the size bonus to AC and that's the negative of the special size modifier for combat maneuvers, and where @{selected|CMB-misc} is a custom attribute that exists for every creature. Ideally, I'd have the ability to do simple boolean conditionals in a roll like... if(@{selected|size}>1){@{selected|dexmod}}else{@{selected|strmod}} ...but I haven't found a way to do that. I've thus figured that if I can somehow convert a value into Balanced Ternary (-1,0, or 1) based on whether it's negative, zero, or positive, I can then do... + ( @{selected|dexmod} * ( "math that returns 1 if size>1 and 0 otherwise" ) ) + ( @{selected|strmod}} * ( "math that returns 1 if size<2 and 0 otherwise" ) ) How can I accomplish my goal?
1427251531

Edited 1427346890
I was able to discover the following through experimentation. Assume that all ALL_CAPS variables are integers. [[ ( 1 - ( floor( ( TARGET_NUMBER - 1 - ROLL_RESULT ) / ( abs( TARGET_NUMBER - 1 - ROLL_RESULT ) + 0.001 ) ) + 1 ) ) ]] ...returns 1 for all integers TARGET_NUMBER or more, and returns 0 for all other integers. This means that I can do... [[ ROLL_RESULT * ( 1 - ( floor( ( TARGET_NUMBER - 1 - ROLL_RESULT ) / ( abs( TARGET_NUMBER - 1 - ROLL_RESULT ) + 0.001 ) ) + 1 ) ) ]] ...which will return ROLL_RESULT when it's an integer that meets or exceeds the TARGET_NUMBER and will be 0 for all other integers. Likewise, for a situation where above a certain maximum you should ignore that value (such as ignoring a Dex Bonus when flatfooted but keeping a penalty), you can use... [[ ( floor( ( MAXIMUM_VALID_RESULT - ROLL_RESULT ) / ( abs( MAXIMUM_VALID_RESULT - ROLL_RESULT ) + 0.001 ) ) + 1 ) ]] ...and summarily within the macro itself... [[ ROLL_RESULT * ( floor( ( MAXIMUM_VALID_RESULT - ROLL_RESULT ) / ( abs( MAXIMUM_VALID_RESULT - ROLL_RESULT ) + 0.001 ) ) + 1 ) ]] ...which will return a 1 when ROLL_RESULT is an integer less than or equal to MAXIMUM_VALID_RESULT and will be 0 for all other integers. From there I was able to derive the following solution: [[ @{selected|strmod} * ( floor( ( 1 - @{selected|size} ) / ( abs( 1 - @{selected|size} ) + 0.001 ) ) + 1 ) + @{selected|dexmod} * ( 1 - ( floor( ( 2 - 1 - @{selected|size} ) / ( abs( 2 - 1 - @{selected|size} ) + 0.001 ) ) + 1 ) ) ]] This accomplishes what I asked for without having to use Balanced Ternary math. The full macro I made for my game, if you're curious, was... /w gm &{template:default} {{name=Attack Roll Modifiers for @{selected|character_name} }} {{Base Melee=+[[ @{selected|bab} + @{selected|size} + @{selected|strmod} ]] = [[ @{selected|bab} + @{selected|size} + @{selected|strmod} +11 ]]}} {{Base Ranged=+[[ @{selected|bab} + @{selected|size} + @{selected|dexmod} ]] = [[ @{selected|bab} + @{selected|size} + @{selected|dexmod} +11 ]]}} /w gm &{template:default} {{name=AC Roll Modifiers for @{selected|character_name} }} {{Normal=+[[ @{selected|DefenseBonus}-(@{selected|DefenseBonus}*@{selected|Is Wearing Physical Armor?}) + @{selected|acitembonus} + @{selected|shieldbonus} + @{selected|dexmod} + @{selected|size} + @{selected|armorclassnaturalarmor} + @{selected|armorclassdeflectionmod} + @{selected|armorclassmiscmod} ]] = [[ @{selected|DefenseBonus}-(@{selected|DefenseBonus}*@{selected|Is Wearing Physical Armor?}) + @{selected|acitembonus} + @{selected|shieldbonus} + @{selected|dexmod} + @{selected|size} + @{selected|armorclassnaturalarmor} + @{selected|armorclassdeflectionmod} + @{selected|armorclassmiscmod} +10 ]]}} {{Touch=+[[ @{selected|DefenseBonus}-(@{selected|DefenseBonus}*@{selected|Is Wearing Physical Armor?}) + @{selected|dexmod} + @{selected|size} + @{selected|armorclassdeflectionmod} + @{selected|armorclassmiscmod} ]] = [[ @{selected|DefenseBonus}-(@{selected|DefenseBonus}*@{selected|Is Wearing Physical Armor?}) + @{selected|dexmod} + @{selected|size} + @{selected|armorclassdeflectionmod} + @{selected|armorclassmiscmod} +10 ]]}} {{Flat-Footed=+[[ @{selected|DefenseBonus}-(@{selected|DefenseBonus}*@{selected|Is Wearing Physical Armor?}) + @{selected|acitembonus} + @{selected|shieldbonus} + @{selected|size} + @{selected|armorclassnaturalarmor} + @{selected|armorclassdeflectionmod} + @{selected|armorclassmiscmod} + @{selected|dexmod} * ( floor( ( (-1) - @{selected|dexmod} ) / ( abs( (-1) - @{selected|dexmod} ) + 0.001 ) ) + 1 ) ]] = [[ @{selected|DefenseBonus}-(@{selected|DefenseBonus}*@{selected|Is Wearing Physical Armor?}) + @{selected|acitembonus} + @{selected|shieldbonus} + @{selected|size} + @{selected|armorclassnaturalarmor} + @{selected|armorclassdeflectionmod} + @{selected|armorclassmiscmod} + @{selected|dexmod} * ( floor( ( (-1) - @{selected|dexmod} ) / ( abs( (-1) - @{selected|dexmod} ) + 0.001 ) ) + 1 ) +10 ]] (Subtract lost Dodge bonus)}} {{Flat-Footed Touch=+[[ @{selected|DefenseBonus}-(@{selected|DefenseBonus}*@{selected|Is Wearing Physical Armor?}) + @{selected|size} + @{selected|armorclassdeflectionmod} + @{selected|armorclassmiscmod} + @{selected|dexmod} * ( floor( ( (-1) - @{selected|dexmod} ) / ( abs( (-1) - @{selected|dexmod} ) + 0.001 ) ) + 1 ) ]] = [[ @{selected|DefenseBonus}-(@{selected|DefenseBonus}*@{selected|Is Wearing Physical Armor?}) + @{selected|size} + @{selected|armorclassdeflectionmod} + @{selected|armorclassmiscmod} + @{selected|dexmod} * ( floor( ( (-1) - @{selected|dexmod} ) / ( abs( (-1) - @{selected|dexmod} ) + 0.001 ) ) + 1 ) +10 ]] (Subtract lost Dodge bonus)}} /w gm &{template:default} {{name=Saving Throw Modifiers for @{selected|character_name} }} {{Fortitude=+[[ @{selected|conmod} + @{selected|fortitudebase} + @{selected|fortitudemagicmod} + @{selected|fortitudemiscmod} + @{selected|fortitudetempmod} ]] = [[ @{selected|conmod} + @{selected|fortitudebase} + @{selected|fortitudemagicmod} + @{selected|fortitudemiscmod} + @{selected|fortitudetempmod} +11 ]]}} {{Reflex=+[[ @{selected|dexmod} + @{selected|reflexbase} + @{selected|reflexmagicmod} + @{selected|reflexmiscmod} + @{selected|reflextempmod} ]] = [[ @{selected|dexmod} + @{selected|reflexbase} + @{selected|reflexmagicmod} + @{selected|reflexmiscmod} + @{selected|reflextempmod} +11 ]]}} {{Will=+[[ @{selected|wismod} + @{selected|willbase} + @{selected|willmagicmod} + @{selected|willmiscmod} + @{selected|willtempmod} ]] = [[ @{selected|wismod} + @{selected|willbase} + @{selected|willmagicmod} + @{selected|willmiscmod} + @{selected|willtempmod} +11 ]]}} /w gm &{template:default} {{name=Combat Maneuver Roll Modifiers for @{selected|character_name} }} {{Bonus (Offense)=+[[ @{selected|bab} + @{selected|strmod} * ( floor( ( 1 - @{selected|size} ) / ( abs( 1 - @{selected|size} ) + 0.001 ) ) + 1 ) + @{selected|dexmod} * ( 1 - ( floor( ( 2 - 1 - @{selected|size} ) / ( abs( 2 - 1 - @{selected|size} ) + 0.001 ) ) + 1 ) ) - @{selected|size} + @{selected|CMB-misc} ]] = [[ @{selected|bab} + @{selected|strmod} * ( floor( ( 1 - @{selected|size} ) / ( abs( 1 - @{selected|size} ) + 0.001 ) ) + 1 ) + @{selected|dexmod} * ( 1 - ( floor( ( 2 - 1 - @{selected|size} ) / ( abs( 2 - 1 - @{selected|size} ) + 0.001 ) ) + 1 ) ) - @{selected|size} + @{selected|CMB-misc} +11 ]]}} {{Defense=+[[ @{selected|bab} + @{selected|strmod} + @{selected|dexmod} - @{selected|size} + @{selected|CMD-misc} + @{selected|CMD-extras} + @{selected|DefenseBonus}-(@{selected|DefenseBonus}*@{selected|Is Wearing Physical Armor?}) ]] = [[ @{selected|bab} + @{selected|strmod} + @{selected|dexmod} - @{selected|size} + @{selected|CMD-misc} + @{selected|CMD-extras} + @{selected|DefenseBonus}-(@{selected|DefenseBonus}*@{selected|Is Wearing Physical Armor?}) +10 ]] (account for # of legs)}} {{Flat-Footed Defense=+[[ @{selected|bab} + @{selected|strmod} - @{selected|size} + @{selected|CMD-misc} + @{selected|DefenseBonus}-(@{selected|DefenseBonus}*@{selected|Is Wearing Physical Armor?}) + @{selected|CMD-extras} + @{selected|dexmod} * ( floor( ( (-1) - @{selected|dexmod} ) / ( abs( (-1) - @{selected|dexmod} ) + 0.001 ) ) + 1 ) ]] = [[ @{selected|bab} + @{selected|strmod} - @{selected|size} + @{selected|CMD-misc} + @{selected|CMD-extras} + @{selected|DefenseBonus}-(@{selected|DefenseBonus}*@{selected|Is Wearing Physical Armor?}) + @{selected|dexmod} * ( floor( ( (-1) - @{selected|dexmod} ) / ( abs( (-1) - @{selected|dexmod} ) + 0.001 ) ) + 1 ) +10 ]] (account for # of legs; subtract lost Dodge bonus)}}
1427255550
The Aaron
Roll20 Production Team
API Scripter
Moved to Specific Use Questions. API is for the Javascript API.