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

Understanding "Conditional Statements (Math Only)"

1518935172

Edited 1518984044
[[{{x,something-less-than-A}>A}*(T-F) + F]] I'm not looking to solve any specific problem here, I have to understand how this works before I can fully utilize it. This code doesn't make sense to me and I've spent hours looking over the wiki pages and looking up forum posts to only find specific use questions rather than a generalized understanding of how this works in particular. Refer to the Wiki page -  Conditional Statements (Math Only) I understand the following : x is the value we are comparing to A Something-less-than-A is simply less than... A . A is the value we are comparing to X T is the value we want the statement to output as a value if the statement is true. F is the value we want the statement to output as a value if the statement is false. The curly brackets are being used to  group rolls . As a result of grouping rolls, I assume that Something-less-than-A is a placeholder more than anything and isn't actually used in the comparison. It just has to be written out in order for the comparison to work. Removing the comma and Something-less-than-A results in the following error TypeError: Cannot read property 'results' of undefined . Greater than sign ( > ) is behaving as a roll modifier to compare the info in the roll. However, unexpected behavior occurs when attempting to flip the sign to Less than (<). Example to follow below. Let's say I'm running a 4th edition game and I want to use this to determine weapon damage based on if the character is epic tier or not (Character >= Level 21). Before doing anything with weapon dice, I've made this bit of code... [[{{@{Character-Name|Level},0}>21}*(2-1) + 1 [Epic Tier] ]] Problem: This code will output a value of 1 for any the character's level of 20 or lower. If the character's level is 21 or higher, I will get a value of 2. If I simply reverse the > sign to <, I now get 3 in either case. This makes no sense to me. I also don't really understand the purpose of Something-less-than-A , though as mentioned above I have my assumptions. Is there something I'm missing here? Is this a glitch/bug? Any help is appreciated.  Part of the initial interest was being able to do this for more complicated changes during level up so macros update on their own. For example, the Cleric's Healing Word changes at level 6, level 11, level 16, level 21, and level 26. I'm sure I could use this for a variety of things but until I understand how this works better, I don't think I'll be able to determine how to best put it to use. For a power or ability which increases every tier, this code works which is far simpler.  [[ [[(ceil(@{Level}/10))]]d@{weapon-1-dice} [Weapon 1 High Crit - Extra W per tier] ]] I already sent an email out requesting the roll20 team to update the Wiki for  Computed dice rolls to make it clear you need to use an additional set of square brackets to make that macro work ( Source info ). 
1518974637
GiGs
Pro
Sheet Author
API Scripter
The first link is broken and should be:  Conditional Statements (Math Only) I have no idea what is going on there, either. I'd love to see an explanation of a practical use case. It seems pretty arcane, and extremely badly described.
Okay, I think I can explain what something-less-than-A is for. This macro uses the format for counting successes in a group. For example, 3d6>3 will roll 3d6 and return the number of dice greater than (or equal to) the target number of 3. So you want to create a comparison between X and A, but it only works with a *group* of dice/numbers, not a single die. The work-around is to create a group with X and another number that you know will fail. In other words, [[{x,something-less-than-A}>A]] means, "I have a group of two dice, how many are greater than A?" If X => A then you have 1 success and 1 Failure, so the whole expression returns "1". If X < A, then you have 1 Failure and 1 Failure, so the whole expression returns "0". The rest is fairly simple... if we condense that all to a value Y that's either 0 or 1, then 0 case: 0*(T-F) + F = 0 + F = F 1 case: 1*(T-F) + F = T + F - F = T If you want to reverse the comparison, you'll have to change the less-than-A to a greater-than-A so it still registers as a failure for the "count successes" modifier.
1519113120

Edited 1519118531
Author X said: Okay, I think I can explain what something-less-than-A is for. This macro uses the format for counting successes in a group. For example, 3d6>3 will roll 3d6 and return the number of dice greater than (or equal to) the target number of 3. So you want to create a comparison between X and A, but it only works with a *group* of dice/numbers, not a single die. The work-around is to create a group with X and another number that you know will fail. In other words, [[{x,something-less-than-A}>A]] means, "I have a group of two dice, how many are greater than A?" If X => A then you have 1 success and 1 Failure, so the whole expression returns "1". If X < A, then you have 1 Failure and 1 Failure, so the whole expression returns "0". The rest is fairly simple... if we condense that all to a value Y that's either 0 or 1, then 0 case: 0*(T-F) + F = 0 + F = F 1 case: 1*(T-F) + F = T + F - F = T If you want to reverse the comparison, you'll have to change the less-than-A to a greater-than-A so it still registers as a failure for the "count successes" modifier. That makes perfect sense now, I guess I was just too tired to see it for myself. This is pretty neat, I think I'll be able to use it for some of the examples I mentioned above. Thanks for the explanation! I've updated the Wiki page with the additional information, let me know what you think. Or feel free to change it if you can think of any improvements to it. 
G G said: The first link is broken and should be:  Conditional Statements (Math Only) I have no idea what is going on there, either. I'd love to see an explanation of a practical use case. It seems pretty arcane, and extremely badly described. After getting  Author-x 's response, I was able to make some progress on it. I updated the Wiki on it (as well as my original link so it works now), and I'm hoping it makes more sense now. Feel free to review it and add your two cents in, edit it, and/or suggest improvements. 
1519281972
Silvyre
Forum Champion
Thank you for your contributions!
Silvyre said: Thank you for your contributions! I'm glad to help, I like making ridiculous macros that are super complicated I guess. :P 
1519285489
Silvyre
Forum Champion
Wade S. said: Silvyre said: Thank you for your contributions! I'm glad to help, I like making ridiculous macros that are super complicated I guess. :P  Welcome to the club! =D
1519691941

Edited 1519692363
I never would have thought to use my GitHub for this stuff, but, now that I'm looking at it, that might actually be a half decent idea. P. S. I have the same name on GitHub lol feel free to snoop
1519727473
Mike W.
Pro
Sheet Author
It took me a while to figure it out out for myself. The fact that it does not work with decimal values and you have to convert them to whole numbers had me stumped for a while. The biggest problem was the contradicting wording on the use of .'>'. and '<'. It appears that '>' means 'Greater tan or Equal to' and '<' mean 'Less than or Equal to'. The Wiki flips back and forth on this. So there is no way to get just a 'Less than' or just a 'Greater than' function. My math had always used '<=' and >=' and that was a HUGE obstacle for me in learning how to do all of this. I think I spent 5 hours gettign it right.
1519740306

Edited 1519740451
Mike W. said: '>' means 'Greater tan or Equal to' Greater than or Equal to* (it's not a Tangential Number (tan()) lol THAT would be nuts) I recognized it by the 4th page of the wiki I'd read through (tracking down the list of @{} variables, which I promptly forgot the URL for lol), fortunately I'd previously encountered the concept previously when experiencing errors with using an if() / else() / then() parser to figure out (if ("x" not <=>"y") (then (goto "error"))) at which point I solved the parser bug by simply splitting it into 3 if() statements: (if ("x" !< "y") (then (goto "error"))) (if ("x" != "y") (then (goto "error"))) (if ("x" !> "y") (then (goto "error"))) and I've explicitly split them ever since. it's easiest to notice on their explanation of the inline Re-Roll or the Crit Success/Failure [[1d20cs<1cf>19r>20]] that roll will crit on a nat 1 or less, flop on a nat 19 or more, and reroll anything 20 or higher. by this format alone you can tell it is using the "=<" instead of the "<" simply because "how are you gonna roll less than 1 to get a success?" or "how are you gonna roll higher than a 20 to Re-Roll?"
To be fair, this is definitely not what the rolling system is intended for, and just an ad hoc hack to get it to do something else. When designing just for RPG rolls it makes sense that you would almost always want "greater than or equal to", since that's how target numbers work; and to reduce the operator from ">=" to ">" for brevity.
have any of us found a situation for attempting the = operator yet?
The = operator works for counting successes, so the whole macro should work if the < or > is replaced with =.
Mike W. said: It took me a while to figure it out out for myself. The fact that it does not work with decimal values and you have to convert them to whole numbers had me stumped for a while. The biggest problem was the contradicting wording on the use of .'>'. and '<'. It appears that '>' means 'Greater tan or Equal to' and '<' mean 'Less than or Equal to'. The Wiki flips back and forth on this. So there is no way to get just a 'Less than' or just a 'Greater than' function. My math had always used '<=' and >=' and that was a HUGE obstacle for me in learning how to do all of this. I think I spent 5 hours gettign it right. Yeah, I hadn't gotten through testing everything and had already spent hours myself trying to understand it. The state of the Wiki before I started to attack it left a lot more assumed for the reader to figure out on their own. If you have anything to add to the Wiki to make it better, go ahead. 
1519931138

Edited 1520475862
I already know enough variations on programing languages, if I find anything, I'll let one of you know, simply because you are better capable of handling it. My standards are decently high, and it looks pretty good, despite being about as Spread out as the 3.5 or 5e PHB, although, considering that this is a site dedicated to people who already are used to wading through the drudgery of their information spread across 20 pages in random locations of one general centralized system, I'd say it's an improvement, because one can't effectively ( key word ) search the PHB (index & compendium doesn't count, hence, effectively)
in a semi-related note, are there supposed to be so many Spells missing from the 5e Compendium? Like, for example, just in the Druid's Spell List, I noticed the following omissions: Wild Cunning Earth Tremor Ice Knife and many more Those were just me looking through the Lv 1 spells! I'm sure there's so~ much better missing from between 2nd ~ 9th Spell Lv. I could understand maybe not the Unearthed Arcana, but to not even have a Listing? we gotta outsource it to somewhere else like D&D Beyond or the Wiki/Wikia just to get some frame of reference, not even an Empty Nameplate is available in the Compendium. I personally prefer the Wikia.
1519938589

Edited 1519939274
Dana Lexa
Sheet Author
I don't know the exact list, but those are probably not in the System Reference Document for 5e. The SRD is all of the things that Wizards of the Coast has given permission to use freely, so that's what the compendium is made up of. However, that does not include everything in the PHB (because WotC wants there to be a reason for people to buy the PHB). This is explained in the  Compendium FAQ .
I was watching Critical Role Season 1 on YouTube just now, and they're leaving the lake after reuniting with Trinket the Bear, and they're doing a Group Stealth Check, and it got me thinking, how would I go about doing something like that with variables in Roll20? I assume that I would need to use the formula referenced in the first post in here, but I honestly have no idea how to go about doing that, I expect a few Variables to get called on during the entire series of commands: ?{DC} ?{SuccessCount} ?{FailCount} ?{Result|True} ?{Result|False} From what I can understand, the statement here can be used for something similar to a binary if/else statement, but would it be possible to do using variables that contains Strings of Text and/or entire variables? also, how can I use ?{} without a pop-up window? I know how to use it for Text Entry, and Drop-down menu style, but what if I'm simply using it to store a large equation (such as a Hit Dice Max, or Base Spell DC, the latter of which I use often), I have no idea how to Suppress the pop-up window so I can simply store the results of the equation (the variables are good for reducing the Lag & Calculation Power required by either the Server, or my weak Laptop, along with reducing Network Traffic) I also don't quite understand how to work ceil() & floor() on here, I thought they would be identical in operation, but they're not, and my brain is not quite gaining traction on the comprehension of it all.
You cannot use ?{} without a pop-up window, it's a query for player input. The rolling syntax doesn't really do variables, and there's no way to reuse results of a row (ie to make an inline roll and use the number of successes in one place then the number of failures in another). The trick this thread was asking about it is an interesting quick of the rolling syntax, but it's not really supposed to be a procedural language where you go through a series of steps and reuse variables, it's more like a (limited) functional language where you're just supposed to write a function that contains functions that contains functions and outputs a result without affecting anything outside the function... for actual procedural programming, you want an API script. Now, all that said... you don't need to reuse a roll to see if at least half the group succeeds, you can just divide the number of checks in two, and see if the number of successes is higher.
1521145937

Edited 1521156950
Author X said: You cannot use ?{} without a pop-up window, it's a query for player input. Bummer, looks like it's gonna be stuck as a Drop-Down then in order to limit interaction. Author X said: The rolling syntax doesn't really do variables, and there's no way to reuse results of a row (ie to make an inline roll and use the number of successes in one place then the number of failures in another). ... Now, all that said... you don't need to reuse a roll to see if at least half the group succeeds, you can just divide the number of checks in two, and see if the number of successes is higher. Well, it technically is possible !?{DC|10} !?{Blue64|Stealth,[[((1d20)+(@{Blue64|Stealth})-10)]]|Stealth,[[((1d20)+(@{Blue64|Stealth})-10)]]} !?{Author X|Stealth,[[((1d20)+(@{Author X|Stealth})-10)]]|Stealth,[[((1d20)+(@{Author X|Stealth})-10)]]} !?{Stealth|Party,(({{(?{Blue64}),(?{Author X})}>(?{DC})}*(1-0))-0)|Self,?{Blue64}} /w gm &{template:default} {{name=Stealth Check}} {{Result=?{Stealth}}} {{Blue64 Rolled=?{Blue64}}} {{Author X Rolled=?{Author X}}} Note: I know this isn't going to return a valid output, I have no idea what Order of Operations I'm getting wrong, and I've been trying to get this to work for the last hour or more that being said, I could add the Stealth Checks together after comparing them to the previously mentioned "is >= 0" flag, divide by the # of Party Members, and compare that to the DC, but, I'm foggy on a few things; can I compare more than 2 things? E.G. an entire Party's Stealth Roll all at once How can I actually get this thing working? I've been asking for help from y'all nobody has provided a single example since I've arrived even when providing variable names I'm seriously clueless on this task by this point. I can formulate a theoretical course of action without problem, but I'm lacking a fundamental understanding of exactly how this stuff works because; the stuff that I am capable of ripping apart is all abstract in it's form, I have nothing I can comprehend in terms I can understand, and not for a lack of asking. Even if it's a waste of the method's potential, if I can get a grip on what I'm working with, well, I started commenting here before I even knew how to ?{}, and now I have a complete initiative Tracker built into a Variable Macro (and it works!), but, I still can't really get a grip on [[{{x,something-less-than-A}>A}*(T-F) + F]] it's all abstract, and the explanation is an Abstract of an Abstract, I need something more Mundane to understand the properties of the tool in question. it's like speaking Hexadecimal in Binary, it's very convoluted, complex, and confusing, but if you can fill in the blanks so I can comprehend better what it actually does, that's different.
Are you trying to store the result of the roll using the query? Because that's not going to work. It will store the user input, which is a roll formula, but not the result . Everywhere that roll query name is used, it will post the same roll formula but they will all be rolled separately. In the above, the input saved from the query is "[[1d100]]". However, each instance rolled a different result. However, I was wrong about having no effect besides returning a result, as I forgot about the initiative tracker. I believe that is the only exception where the result of a roll can affect something besides the function it's embedded in (without getting the API involved, of course). A roll query can "store" the user input, but really it can't do anything that couldn't be accomplished by showing the query again and having the user input the same value again. When I say you could compare it to half the number of checks, I'm assuming the rule you're using is, "if half or more of the party succeeds, the group succeeds". In that case, you don't need to add any results together, just use the count successes function of {a,b,c}>x. In fact, you can just show the number of successes using this: !?{DC|10} ?{Cha1Stealth|5} ?{Cha2Stealth|5} /r {d20 + ?{Cha1Stealth},d20 + ?{Cha1Stealth}}>?{DC} Then plug it into the first part of the "conditional statement" formula above: !?{DC|10} ?{Cha1Stealth|5} ?{Cha2Stealth|5} /r {[[{d20 + ?{Cha1Stealth},d20 + ?{Cha1Stealth}}>?{DC}]],0}>1 Now it will return "0 Successes" if the whole group fails or "1 Success" if the whole group succeeds. The inline rolls can be hovered over to see all the rolls and results. To do the same for more characters, change the "1" at the end to half the number of characters (ie it's a 1 here because there's 2 characters). If you want to extend it to more characters, or replace the basic queries with attributes or queries to ask for the character name, you can use that as a base.
Author X said: Are you trying to store the result of the roll using the query? Because that's not going to work. It will store the user input, which is a roll formula, but not the result . Everywhere that roll query name is used, it will post the same roll formula but they will all be rolled separately. In the above, the input saved from the query is "[[1d100]]". However, each instance rolled a different result. it seems to have varying behavior, as it appears to be speeding up my Macros when I use it, where normally it Lags, it seems to be able to behave smoother for myself and my Players Author X said: However, I was wrong about having no effect besides returning a result, as I forgot about the initiative tracker. I believe that is the only exception where the result of a roll can affect something besides the function it's embedded in (without getting the API involved, of course). A roll query can "store" the user input, but really it can't do anything that couldn't be accomplished by showing the query again and having the user input the same value again. Speeds things up, allows variance and stability, fewer typos. Proving this wasn't even an intended consequence of my statement, I was using it more as a Skill Gauge. here is that initiave Macro in case anyone wants a copy btw, I made it look pretty and it works on Free Membership: Initiative: !?{Mod|Yes,[[(@{selected|dexterity_mod})]]|No,[[(0)]]|Invert,[[((abs(@{selected|dexterity_mod}))*(-1))]]} /w gm &{template:default} {{name=@{selected|token_name}'s Initiative Roll}} {{Initiative=[[(((1d20)+?{Mod})+((1d20)+?{Mod})*0.001)&{tracker}]]}} Author X said: When I say you could compare it to half the number of checks, I'm assuming the rule you're using is, "if half or more of the party succeeds, the group succeeds". In that case, you don't need to add any results together, just use the count successes function of {a,b,c}>x. In fact, you can just show the number of successes using this: !?{DC|10} ?{Cha1Stealth|5} ?{Cha2Stealth|5} /r {d20 + ?{Cha1Stealth},d20 + ?{Cha1Stealth}}>?{DC} Then plug it into the first part of the "conditional statement" formula above: !?{DC|10} ?{Cha1Stealth|5} ?{Cha2Stealth|5} /r {[[{d20 + ?{Cha1Stealth},d20 + ?{Cha1Stealth}}>?{DC}]],0}>1 Now it will return "0 Successes" if the whole group fails or "1 Success" if the whole group succeeds. The inline rolls can be hovered over to see all the rolls and results. To do the same for more characters, change the "1" at the end to half the number of characters (ie it's a 1 here because there's 2 characters). If you want to extend it to more characters, or replace the basic queries with attributes or queries to ask for the character name, you can use that as a base. I'm trying to inline roll it, /r is kinda large and unwieldily, I find tinkering around with what limited information I have for the Default Template to be more appealing and more customizable and generally more visually appealing how would I expand it though? Do i run 2 comparisons through a 3rd comparison? do I expand it with more commas? does it have some sort of Escape Character? Does it require some extra command? the words "too smart for my own good" comes to mind. I know so much that it holds me back trying to understand how things work until I figure it out, at which point I usually excell.
I find it helps to try to understand each individual function and how it works before trying to modify a huge macro/program. In this case the "count successes" syntax is just this: {A,B,C,D}>X Each comma separated value is compared to X (they're never compared to each other), and the function returns the number of values that are greater than or equal to X. In my macro above, "A" is "d20 + ?{Cha1Stealth}", "B" is "d20 + ?{Cha2Stealth}". Knowing that, it should be clear how to add more values to the group check, right?
1521169784

Edited 1521169827
Blue64 said: How can I actually get this thing working? I've been asking for help from y'all nobody has provided a single example since I've arrived even when providing variable names First of all, I have provided you help with your commands. And you've asked in pieces rather than what you've been aiming for outright. If you're going to ask for help on a thread, then perhaps you should outline all the details to begin with so people can make a coherent response. Not trying to be antagonistic here, but I've re-read every post you've made here and the first question you asked was about using the = sign with this particular conditional statement. Also I was at work for the most recent series of posts, so I haven't had a chance to respond myself.  So lets go over some of your questions.  Blue64 said: From what I can understand, the statement here can be used for something similar to a binary if/else statement, but would it be possible to do using variables that contains Strings of Text and/or entire variables? From what I understand, if-else statements are not something that can be done without having the Pro Account level to make such things via the API for custom scripting. As  Author X pointed out, API script is required because using it the way you showed doesn't store the result because it stores the roll formula. This means you'll get different output every time the same query is called with the same name. It does have varying behavior for this exact reason that was stated. It doesn't really matter if it makes things smoother for you because it's not achieving the desired effect of storing a result into an attribute, just whatever value was typed in if it isn't something that gets rolls.  Blue64 said: I also don't quite understand how to work ceil() & floor() on here, I thought they would be identical in operation, but they're not, and my brain is not quite gaining traction on the comprehension of it all. It's explained under the " Dice Reference " for " Rounding Rolls and Math Functions ". The function ceil() will round the result up to the next nearest whole number while floor() rounds down to the next nearest whole number.  i.e. 5.1 with ceil is 6 and is 5 with floor i.e. 2.89 with ceil is 3 and is 2 with floor Author X said: Then plug it into the first part of the "conditional statement" formula above: !?{DC|10} ?{Cha1Stealth|5} ?{Cha2Stealth|5} /r {[[{d20 + ?{Cha1Stealth},d20 + ?{Cha1Stealth}}>?{DC}]],0}>1 Now it will return "0 Successes" if the whole group fails or "1 Success" if the whole group succeeds. The inline rolls can be hovered over to see all the rolls and results. To do the same for more characters, change the "1" at the end to half the number of characters (ie it's a 1 here because there's 2 characters). If you want to extend it to more characters, or replace the basic queries with attributes or queries to ask for the character name, you can use that as a base. This part is somewhat incorrect. You can't hover over it to see the rolls because of nested brackets. Those will hide the results so all you end up seeing is the number of players that passed the check but not what they rolled. I made a variation of that same idea that ends up achieving the same thing but with one less comparison in play. [[ {(([[1d20+@{Character-1|Stealth}+1d20+@{Character-2|Stealth}+1d20+@{Character-3|Stealth}+1d20+@{Character-4|Stealth}]])/4),0}>?{DC for Group Check|10} ]] Group Success! Bear in mind, you must put the brackets around the dice rolls and bonuses from the party members as roll20 will otherwise give you this error message: "Cannot mix sum and M rolls in a roll group." If you absolutely must know what each player rolled individually, you can do this instead and use labels to make it clear which character made which roll. [[{1d20+@{Character-1|Stealth} [Cha 1],1d20+@{Character-2|Stealth} [Cha 2],1d20+@{Character-3|Stealth} [Cha 3],1d20+@{Character-4|Stealth} [Cha 4]}>?{DC for Group Check|10} [Difficulty Check] ]] succeeded the group stealth check. And that should be everything. If you're still confused about this: [[{{x,something-less-than-A}>A}*(T-F) + F]] Here's some information in closing. {x,something-less-than-A}>A = This part will ALWAYS return either a 0 or a 1, depending on if the value of x or something-less-than-A . The something-less-than-A should probably be called  False-value-compared-to-A , as this number basically should make the statement not true for this value in order to ensure you are returned a false result if x is also false when compared against A . For simplicity, let's call  False-value-compared-to-A a different variable called y . For situations in which you are comparing the variables to something greater than A (i.e. >A), Roll20 will actually treat the > symbol as greater than or equal to, and as such, y should be less than A and never equal to it. For situations in which you are comparing the variables to something less than A (i.e. <A), Roll20 will actually treat the <  symbol as less than or equal to, and as such, y should be greater than A and never equal to it. If you want a different value to be returned when the statement is true or false, then you change these variables to the appropriate number desired. T = This should be the number you want to see IF the statement is true.  F = This should be the number you want to see IF the statement is false. If you want to compare a value x to value A to see if they're equal, just substitute according to the same logic listed, following the same instructions for x , A , T , and F . Do not alter anything else in the equation. [[({0,floor(1-abs(x-A))}dl1)*(T-F)+F]] That's all there is to the equation.
Author X actually beat ya to the punch on the response for the {{A,B,C}>X}1, although you went the other direction with it, it was equally helpful, as I was able to comprehend your advice once I was capable of filling in the missing pieces with the cipher that Author X provided, it was rather frustrating as I've been stuck trying to figure that equation out for over 2 weeks straight, and I read through, I don't appear to have asked anything here specifically, but I'm pretty sure I've asked you similar questions in other threads haven't I Wade? (although I seem to have forgotten that it doesn't auto-subscribe to a thread when I respond to it, so this is one of the few ways I could find your wonderful intellect, and I figured I'd go ahead and ask here since it was on topic, I wasn't kidding about those examples though, everyone I'd asked until I went for the dramatic here except for 1 post that assisted me with Abyssal Coating and inline Dice Rolls based on inline math for it's numbers (specifically I was going for Con Mod affecting the Roll result, but was having trouble with the abs() also messing up the Order of Operations, this specific function was actually the suggested route, thus the 2+ weeks of smashing my head into a Wall trying to figure out this coding's behavioral functionality and method of operations, learned a LOT, not so much about this until today) I was unaware it was storing un-parsed strings in the ?{} until today also. I've been using them for all kinds of things, some of which I'll likely keep now that I'm aware of it's core functionality & timings, floor() & ceil() I was referring to their comparative properties, such as in the Finesse Math, it uses ceil() but I lose track of the Order of Operations in all that mess (4~8 calls to both Dex & Str each to compare) whereas floor(1-2) gives one result, ceil(1-2) offers a completely different prospective on how it even works. I've been trying to be as forthcoming as possible with the info that I have, the problem I'm having is that even I'm missing parts, and when I do have the parts, I tend to find people who simply reply with "I'm not familiar" and offer a theoretical answer with no demonstration, which these recent demonstrations has massively helped me understand btw, so thank you, I was very frustrated, and quite overly dramatic (I was even holding back!) and you both helped immensely.
Well, last I knew, your question was answered. I've got a lot of things on my mind besides this thread, and I believed your question was answered so I had stopped responding. *shrug* Glad things are understood better now though.