Macros Tutorial: Draft

Doc requests, organization, and submissions

Moderators: dorpond, trevor, Azhrei

User avatar
Mathemagician
Dragon
Posts: 666
Joined: Tue May 22, 2007 2:27 pm

Macros Tutorial: Draft

Post by Mathemagician »

This tutorial is using build 1.3.b39, at present, but my goal is to keep it updated as features and syntaxes change.
*-------------------
*Macros Tutorials
*-------------------
Why use Macros?
They allow commonly used actions to be automated. Contrary to what is often seen on the forums, they only need to be as complicated as you want them to be. Simple macros can update a token's hitpoints, or roll a skill check. Macros that are stored on the tokens are saved when you save the token, so you can just write them once!

What builds support Macros?
Good question...I'm always using the latest....I should figure this'n out.

What do I have to do to use macros?
It depends on the build, and the complexity of the macro. I'm under the impression most macros are best used on tokens, where they have full access to the tokens properties ("stats"), so having the appropriate token properties is usually the only requirement if you're using a relatively modern build. More recent builds have a "run macro on each token" option (right click on the macro button to see this), which allows macros to be written in the global or campaign context, but still access token properties. Both are very useful. You might use a token macro to allow a PC to automatically calculate and roll his attack roll. On the other hand, you might use a global macro to output the hitpoints of all the PCs at once, or as we'll see later, ask for a series of "attack rolls" to compare against monsters "defenses."

In this tutorial, I may resort to 4e terminology, just because that's what's on my mind. I hope things will be useful in a general context, and I hope that this thread can become a place to ask questions and receive answers about macros, system specific or not.

*-------------
* Macro Basics
*-------------
We should first distinguish between the two ways we can roll dice in the MapTool. These are [] and {}. The [] notation will output everything involved in the formula, while the {} notation gives only the final result.
So if I enter: "I attack the Darkness! {1d20}" I expect the below text to appear, supposing my name is Justin (and it is!):
justin: I attack the Darkness! 11
Whereas, had I entered, "I attack the Darkness! [1d20]" I expect a more verbose output.
justin: I attack the Darkness! « 1d20 = 16 »
Since many macros use a lot of properties, the [] notation can cause an awful lot of text to appear, so many people prefer {}, and trust the result. I'll be using {} in the following text.

We must now discuss variables. They come in 3 flavors: Token-Properties, Macro-Defined, and Prompted-For.
Token-Properties are defined on the token. A macro run on a token (whether the macro belongs to the token, or you've elected "run this macro on selected tokens" on a global macro) has access to all of a Token's Properties. Macro Defined variables make their first appearance on the left hand side of an =. They are good in the body of the macro, and then they disappear. There's no "saving" of variables between macros, or between macro runs, except for Token Properties. "Prompted for" variables are those that are used without ever having been on the left hand side of an =. The program will bring up a dialogue asking for the value of the variable, EVERY TIME YOU USE IT in this case. A common way around this will be seen in the "Healing" macro further down.

A short dialogue on a standard programming practice, and one that is used in MapTool macroing. "=" does not mean what it means in a mathematical sense. Instead it means "take whatever is on the right hand side of the =, and store it in the variable on the left hand side. So, if we wanted to update the variable "x" to 7, we might type: {x=7}. Or, if we pretend HP is a token property (not unlikely!) and we wanted to subtract 10 from it. We might enter {HP=HP-10}. But let's be honest, taking 10 HP off every time is probably not the most useful macro. Fortunately for you, dear reader, it's time to write our first macro!

Select your token, and make sure it has the property "HP" and it might be useful at this time to add the property "MaxHP" (your DM can add properties using the campaign properties option in the edit menu). Now, open the "selected" window, (window>selected), and right click, and elect "add new macro." We'll name the macro "Take Damage" In the body of the macro, we should type, {HP=HP-damageTaken}. Click OK. Now, if you run the macro, you'll notice that a dialogue pops up for damageTaken, where you would provide input. (If HP is prompted for, that means you didn't have anything in the property to begin with. This should only happen once).

Woohoo! You've written your first macro! Or, you watched me write a macro, and you're taking my word for it. Whatever the case, we should take some time to learn about prettying up our output. I know I know, I already said that {} only shows the last number and whatnot. Take into consideration however, what token you may have put this macro on. Was it a PC token? Then just seeing the number output might not mean too much. Was it a monster token? Then seeing the number output is the last thing you want your players to see!

Anything you don't put in {} or [] will show up, just like it would in the chat window. So if it was a player token, we might do the following:
Right click on the macro, and choose "Edit Macro." Change the Macro Command field to read: "Current HP : {HP=HP-damageTaken}".

On the other hand, for a monster's macro, we would like to hide the numeric output. So we'll learn a technique due to BigO, which is to use HTML comments to hide output. The idea is that anything contained in <!-- ... --> will not be seen, though it is still executed. So we might change the macro to: "<!-- {HP=HP-damageTaken}--> Ouch!", so that when click the macro for the monster, you can update the HP, but all the players see is the monster saying "Ouch!" Neat, huh?

At this point, you could use this macro and enter a negative number to heal your token. There's just one problem with that strategy...You might "overheal." We'll tackle this problem with a new macro, we'll call it "Heal," and a handy function built into MapTool, called "min". The min function works like this: min(x,y) spits out whichever the smaller of x, or y, is. so min(1,2) gives 1, min(10,-2) gives -2. We'll use this to compare HP to MaxHP, so that we correct any overhealing. The Heal macro might look like (for a player):

Code: Select all

Received Healing {Healed=Healed} <br>
Current HP: {HP=min(HP+Healed,MaxHP)}
This might look a little strange, let me explain. First, "{Healed=Healed}". What's happening here is this is a way to prompt the player for the value of "Healed" just one time. We're using it here to demonstrate that your macros can have lots of lines, and multiple outputs. However, because we prompted for the value of Healed, and then stored it in the variable Healed, MapTool will not prompt for it on the next line, it'll use the value we entered. That's good! But before we get to the next line, we should note that <br> is an HTML code that is like hitting return in a word processor. It says that out output will appear on two different lines. It's a good time to mention that all HTML code works in MapTool, so if you know fancy things about tables and colors and whatnot, feel free to use them. The next line uses the min function. The idea is this, if HP+Healed is less than MaxHP, min gives back HP+Healed, and so HP is updated properly: HP=HP+Healed. However, if the healing put your HPs over the top, that is, MaxHP < HP+Healed, so the min function "returns" that one, HP=MaxHP as desired. (Returns is programming lingo for the "output" of a function. so min(1,2) "returns" 1)

You might have noticed that I explained the above macro using "if then" logic. We could in fact have used the if statement to implement it! First, a brief discussion on how if statements work.

The syntax for "if" is if(condition,then,else). The way to think about it, is that if condition evaluates to true, the if clause will become the "then" portion, while should the condition be false, the clause will become the "else" portion. The condition can use any of the following operators:
x > y, is true if x is greater than y, false otherwise.
x >= y, is true if x is greater than OR equal to y, false otherwise.
x < y, is true if x is less than y, false otherwise.
x <= y is true if x is less than OR equal to y, false otherwise.
x == y is true if x is equal to y, false otherwise.
x != y is true if x is NOT equal to y, false otherwise.

There's also some more advanced symbols we can use, && for "and" and || for "or". They work like this:
true && true = true
true && false = false
false && true = false
false && false = false

true || true = true
true || false = true
false || true = true
false || false = false

So "AND" is only true if both sides are true, and "OR" is true if either side is true. So if we wanted to check if x > y AND x < z, we could use (x>y)&&(x<z).

So if we typed {if(1>0,"Beep","Arr!")} into the chat, we would see the output "Beep", whereas if we typed {if(1==0,"Beep","Arr!")} into the chat, we would see "Arr!" One important thing to note, you can put expressions (like 1d20+7) in the "then" or "else" part, but YOU CANNOT PUT AN =. Don't do it! The = has to go BEFORE "if"! Instead, let's see how to use "if" to check if we overflowed on the heal, and assign HP properly.

Code: Select all

Amount Healed {Healed=Healed}
Current HP: {HP = if(HP+Healed > MaxHP, MaxHP, HP+Healed)}
So we read that as, "if HP+Healed > Max HP" (that is, if we overflow) then HP=MaxHP, otherwise, HP = HP+Healed.

Let's now learn how to set states in the macros. We use the syntax state.NameofState . So let's suppose we want to update our Take Damage macro to change our state to "Dead" should our HPs go to 0 or less. That is, we want state.Dead=1 if we died, state.Dead=0 if the GM will kill us later. (1 means "on", 0 means "off").

Your Take Damage macro code might look like:

Code: Select all

Current HP: {HP=HP-damageTaken}
<!-- {state.Dead=if(HP<=0,1,0)} -->
We're using <!-- ... --> here to hide the unneeded output from setting the state property, you'll see that on your token whether you want to or not :)

Let's also update our Healing macro, to show how you can use also use states in the if statement.

Some systems use the convention that if you receive healing when you are at negative HP, the healing starts from 0. We'll use that here. We might change our Healing Macro to something like this:

Code: Select all

Healing Received: {Healed=Healed}
HP are now: {HP = if(state.Dead==1, Healed,HP+Healed)}
<!-- state.Dead=0 -->
Another popular topic is "Critical Hit" detection in d20 based games. We're going to use this to discuss two important points:
Storing dice rolls in variables, and storing dice rolls in properties.
Let's assume you're using a system "like 4e" (that is, I'll use some 4e things as I darn well please, and ignore things that will bloat the macro), where 1/2 your level (round down) is factored into a melee attack, and 1/2 your strength is also factored into your attack. And that you store weapon dice (say 1d6 for a shortsword, 1d8 for a longsword) in a token property "CurrentWeaponDice." Also, we'll store the weapon's critical range (roll >= than this to get a crit), in "CurrentWeaponCrit." For now we'll ignore magical weapon bonuses, feat bonuses, and the like. These are easy to add in with extra token properties, if you understand the following macro.

This is where this thread becomes very specific to build 39. In previous builds, you could store "CurrentWeaponDice" as 1d8, and then type {CurrentWeaponDice} and it would roll the die. Instead, we must treat properties exactly as we treat text. So in "CurrentWeaponDice" I will store "{1d8}".

Image



So what we'd like to do, is roll a d20, compare that against the crit range, and output whether or not the roll was a critical threat or not, along with the damage.

So our macro might look like this. First we'll save the roll so we can use it in comparisons later. Also, the "floor" function rounds all fractions down. so floor(2.5)=2. floor(2)=2.

Code: Select all

/me makes a mathemagical attack with his {CurrentWeaponName}!
You rolled a {roll=1d20} <br>
For a total of {attackRoll=roll+floor(Level/2)+floor(Strength/2)} <br>
The damage is {Dmg=CurrentWeaponDice+floor(Strength/2)} <br>
if(roll>=CurrentWeaponCrit,"Critical Threat!","")

Notice how we split the roll away actual roll + bonuses, to more easily test for the critical.

The reason you see "CurrentWeapon" in all of these names, is because often a player attacks with more than one weapon. By making the Attack Macro make use of "CurrentWeapon" type things, we can easily introduce weapon changing macros:

Let's say I've stored my chalksword information in the Weapon1 slots. I might make a macro that looks like this, to change to my chalksword:

Code: Select all

/me sheathes his {CurrentWeaponName}, and draws out his {Weapon1Name}.  
<!--
{CurrentWeaponName=Weapon1Name}
[CurrentWeaponDice="{"+Weapon1Dice+"}"]
{CurrentWeaponCrit=Weapon1Crit}
-->
I might make a similar macro for ruler (the stats I might store in Weapon2 stuff). Some explanation is needed, about this line:

Code: Select all

[CurrentWeaponDice="{"+Weapon1Dice+"}"] 
First, it's important to note that I used [] here, even when I said in general I would be using {}. The reason is that because I'm using "{" and "}" in the same line. The parser presently has an issue with that. It doesn't matter that I'm using [] because I hid the output in <!-- ... -->. Now, let's address the "{" + "}" stuff. If you look at my token, you'll see that I did NOT put {} around the Weapon1Dice and Weapon2Dice. That's because I do not want these evaluated as dice rolls. If I had {} in the actual property, and then typed "[CurrentWeaponDice=Weapon1Dice]" My chalksword would always roll THE SAME NUMBER. The way around this is what I've done above. I store the Weapon1Dice as a string "1d8" (no curlies), because I have no intention of actually using Weapon1Dice to do any calculations, it will always be CurrentWeaponDice that I use. Since I want there to be {} around the 1d8 in the CurrentWeaponDice field (so that it can be used in calculations easily), I "force" the {} into the property by doing "{" + Weapon1Dice +"}".

One more macro that is easy to write, and I think is pretty handy for the GM. I use it for when my players use an area of effect attack, such as fireball. For simplicity, we'll assume the attack is an area attack against AC. (Armor class...it's a defensive stat. If your attack exceeds the enemy defense, you hit).

This macro goes in the GLOBAL context, even though it'll access token properties. To use this, I also create two custom states, one I call "Hit" and another I call "Miss". (edit > campaign properties > states tab). The goal of the macro is for me to prompt the player for a series of attack rolls, which I will rate against each token's defense, and set the state to Hit or Miss. This lets me tell which damage to apply to what token, (maybe with a "Take Damage" macro we already wrote? hmmmmm?!):

Code: Select all

<!--
{roll=attackRoll}
{state.Hit=if(roll>=AC,1,0)}
{state.Miss=if(roll<AC,1,0)}
-->


If I select a group of monsters, and right click on this macro and select "run for each selected", it asks me for the attack roll against each monster. Then it gives me a _visualization_ of whether the monster was hit or missed. I can then add the damage with a group macro to all the hit monsters, and to all the missed monsters seperately. I also advise a Hit/Miss clearing macro:

Code: Select all

<!--
{state.Hit=0}
{state.Miss=0}
-->
To use when the area attack is resolved.

So that's it for "Basic" macros. I hope this gets you started in adding some macros to your tokens and campaigns to speed things up a bit so that you can get back to the real game!

*------------------------
* Advanced Macro Features
*------------------------

For now, I'll ask you to view my thread about if/then/else/else if for a more detailed look at what can be done with the if command. The link is here:

http://forums.rptools.net/viewtopic.php?t=4831

You can also use tables in macros now, but they will not display the image, if there is one associated. The syntax is:
{tbl("MyTable",myRoll)} where the quotes around MyTable are CRITICAL.

*--------------------------------------------------
* Macro Troubleshooting & Common Solutions
*--------------------------------------------------

-Sometimes, you have some problems with your macros. I want to address some of those here. Remember if you are converting macros from previous builds, you might need to put {} around your properties, in build 39 if a property stores a dice roll, you have to wrap it in {}.

-Sometimes you get unexpected math results. That's because of this crazy little thing called order of operations. In macros, parenthesis make a HUGE difference. For instance 2*3+1 is different from 2*(3+1). The order of operations is everything in parenthesis happens first, then power,multiply, divide, add, subtract, and then the last thing that ever happens is =. An example is appropriate here:
2*3+1
->6+1
-->7

whereas
2*(3+1)
->2*(4)
-->8

*-------------
* TO DO LIST
*-------------
-Cover Various Strings in Macros
-Using tables to "spice up" macros
-Incorporate / Update if-then-else directly into this thread
-Using if-then-else and copy/paste to imitate for loops for multiple attack rolls
-Incorporate "Tables in macros and a cute trick" thread, maybe using salmelo's Marvel thread as an example of "variable variable names"
-Make formatting prettier, less rambly.
-Reexplain if stuff

*Note to self: First macro, dice rolls. Second macro, dice rolls with user input. Third macro, add text. Fourth macro, hide dice rolls, show output. Fifth Macro: HP update macro.


*---------------
* Disclaimer
*---------------
This is a rough draft of the Macros tutorial, I want to get questions / comments so that it can be as useful as possible. Thanks!

Please don't forget to disable HTML when posting macros, or when quoting this thread![/img]
Last edited by Mathemagician on Sun Aug 03, 2008 5:53 pm, edited 4 times in total.

User avatar
BigO
Dragon
Posts: 558
Joined: Mon Jul 28, 2008 12:23 pm
Location: Oshkosh, WI
Contact:

Post by BigO »

That's a great start!
--O

I am a small and fragile flower.
http://maptool.rocks.andyousuck.com

Palladinthug2
Kobold
Posts: 19
Joined: Sun May 06, 2007 11:02 pm

Macro activated Secret Random Encounter Table roll

Post by Palladinthug2 »

I am currently trying to design a macro, and maybe this would be the thread to ask it in so that others may benefit from it.

I have designed a nested table called "Ran" for Random encounters. I'd like to press the macro to roll the table results for me, easily done.

Macro: /tbl Ran

However my players can see it. I would like them not to see it and use the /self command. A secret Random Encounter roll. Unfortunately I cannot use two commands in the same line.

I attempted to use this method
Macro: /self {tbl=Ran}
<> In these brackets with the appropriate dashes
and
Macro: /self {tbl Ran} <>

It asked me to assign a value to Ran. I am a bit lost. Assigning any value from the table specifics produces no result.

User avatar
Micco
Giant
Posts: 148
Joined: Mon Jun 16, 2008 10:21 pm

Post by Micco »

The syntax you are looking for is:

Code: Select all

/self {Encounter = tbl("Ran")}
That will return the value from the table "Ran" to only you with no other text on the line.

The table calling function has the following format:

tbl(T, M) where:
T = the table name as a String. It can resolve the table name from a variable. If that is the intent just put the property name in here and put the table name in the appropriate property or variable.
M = the value to look up. If it is a variable name do not put it in quotes.

Examples

Code: Select all

/self New encounter: {tbl("Ran", 1d20+5)}
You could replace either the table name or the tested value with a variable if you wanted to be able to customize the results based on the situation.

Code: Select all

/self <!--{Mod = RollModifier}{ToRoll = 1d20+Mod}-->New encounter {tbl("Ran",ToRoll}

User avatar
Stitched
Dragon
Posts: 274
Joined: Fri Jul 11, 2008 5:56 am
Location: Uppsala, Sweden

Post by Stitched »

Thanks, Math.

With all the changes that have been going on, this looks to be a concise starter lesson on Macros that I can then use to start doing my own.

Cheers for that!

User avatar
jfrazierjr
Deity
Posts: 5176
Joined: Tue Sep 11, 2007 7:31 pm

Post by jfrazierjr »

Mathemagician, I know this is basic to programmers and math people, but those who may have been out of school for a while and don't use math a lot in their day to day lives may benefit from a talk in the first post about operator precedence and how to "fix" using parenthesis.
I save all my Campaign Files to DropBox. Not only can I access a campaign file from pretty much any OS that will run Maptool(Win,OSX, linux), but each file is versioned, so if something goes crazy wild, I can always roll back to a previous version of the same file.

Get your Dropbox 2GB via my referral link, and as a bonus, I get an extra 250 MB of space. Even if you don't don't use my link, I still enthusiastically recommend Dropbox..

Sepp
Dragon
Posts: 251
Joined: Fri Jul 25, 2008 7:41 pm

Post by Sepp »

Thank you for this!

User avatar
Mathemagician
Dragon
Posts: 666
Joined: Tue May 22, 2007 2:27 pm

Post by Mathemagician »

jfrazierjr wrote:Mathemagician, I know this is basic to programmers and math people, but those who may have been out of school for a while and don't use math a lot in their day to day lives may benefit from a talk in the first post about operator precedence and how to "fix" using parenthesis.
Thanks jf, will definitely include this.

User avatar
Azhrei
Site Admin
Posts: 12086
Joined: Mon Jun 12, 2006 1:20 pm
Location: Tampa, FL

Post by Azhrei »

Wow, good job! I seems like you have it well thought out. I like the progression from simple to more advanced with some examples along the way... :)

But in the section on using and/or, you've got lines that say something like:

Code: Select all

true && true = true
There are a few things that bother me about that for beginners. First, don't use an equals sign! You just finished telling them that it means assignment! Either use a double-equals or change those four lines into a <table> with a border width of "1" and put true && true in the first column and true in the second column. Something like this (but I can't get it to work in a forum post, even if I don't disable HTML):

Code: Select all

<table><tbody>
<tr><th>Comparison</th><th>Result</th></tr>
<tr><td>true && true</td><td>true</td></tr>
</tbody></table>
Second, in the section on if-statements, you mention "don't put '=' in the 'if'!" but you don't say why. I think a better admonition would be to use "==" instead of "=" and refer to your earlier description that the first is a comparison and the second is an assignment.

And last, I would add some font control to your document. Start by deciding which phrases should be highlighted with a font change and then how the font should change. For example, all literal text will be in <code>constant width</code> Courier font, variable text that the user supplies will be <i><b>bold italics</b></i>, and macro variables will be <i>normal italics</i>. (Oops, the Courier doesn't work in a forum post.) This would go a long way towards readability. But it will be a pain to do using a regular forum post, so you might consider switching to .RTF or .PDF and provide a link. (I would stay away from Word documents since they're not portable. Heck, even .RTF isn't that great but it's waaay better than .DOC. Ideal would be to use OpenOffice to write the .ODT file and then also use it to generate the .PDF. Or perhaps use a wiki, since font control in most wikis is pretty easy.)

It looks like a great start! After doing the network FAQ I know that keeping a document up to date can be time consuming, but it will be more so for your macro document given how quickly things are changing! (In fact, that's another reason for using OpenOffice -- change tracking inside the document itself and change bars in the margins of any PDF you might create.)

User avatar
Jector
Great Wyrm
Posts: 1164
Joined: Sun Aug 27, 2006 9:19 pm
Location: Atlanta

Post by Jector »

Thanks for the help, Math. Lots of us need this kinda thread.
I cast firecube! ~4E

Palladinthug2
Kobold
Posts: 19
Joined: Sun May 06, 2007 11:02 pm

Post by Palladinthug2 »

Micco wrote:The syntax you are looking for is:

Code: Select all

/self {Encounter = tbl("Ran")}
That will return the value from the table "Ran" to only you with no other text on the line.

The table calling function has the following format:

tbl(T, M) where:
T = the table name as a String. It can resolve the table name from a variable. If that is the intent just put the property name in here and put the table name in the appropriate property or variable.
M = the value to look up. If it is a variable name do not put it in quotes.

Examples

Code: Select all

/self New encounter: {tbl("Ran", 1d20+5)}
You could replace either the table name or the tested value with a variable if you wanted to be able to customize the results based on the situation.

Code: Select all

/self <Mod>New encounter {tbl("Ran",ToRoll}
This is fantastic and helps me better to understand the code allowing me to play with it, thank you. Unfortunately it didn't work. You see the values of the nested tables that pull from the preexisting other tables are words not number values. So when I pull up a table in this fashion I am left with which nested table it pulled from and not the value itself. I will keep at it and try again some tonight.

Thank you very much for the assistance, it is much appreciated.

User avatar
Mathemagician
Dragon
Posts: 666
Joined: Tue May 22, 2007 2:27 pm

Post by Mathemagician »

Azhrei wrote: .
.
.
Lots of good suggestions
.
.
.
You are completely correct, in all things. I will update the true/false table to actually use your fancy table mumbo jumbo (even if I have to ascii art it). There is a lot of formatting that needs to be done, of that there's no doubt.
I will try to clarify the if stuff some more.

I like the forum post for now because it is easier to deliver new content to the readers, especially when right now I'm just trying to get ideas down in some sort of coherent order. My goal is to, when things are in an acceptable format, write things up in LaTeX, and then provide a link to both a PDF and a TeX2HTML document that will be easier for casual reading.

User avatar
Mathemagician
Dragon
Posts: 666
Joined: Tue May 22, 2007 2:27 pm

Post by Mathemagician »

Palladinthug2 wrote:
This is fantastic and helps me better to understand the code allowing me to play with it, thank you. Unfortunately it didn't work. You see the values of the nested tables that pull from the preexisting other tables are words not number values. So when I pull up a table in this fashion I am left with which nested table it pulled from and not the value itself. I will keep at it and try again some tonight.

Thank you very much for the assistance, it is much appreciated.
I believe trevor noted that in this first-blush of being able to use tables in macros, it does not support nested tables in the macro. Hopefully, this will be implemented soon!

User avatar
emirikol
Dragon
Posts: 708
Joined: Sun Jan 13, 2008 5:52 pm
Location: Lakewood, CO North America
Contact:

Post by emirikol »

This is a great idea.

One thought: I would have a BASIC and ADVANCED macros bit. BASIC for people like me, who don't want to do a bunch of code, and advanced for people who do want to do a bunch of code.

Things for BASIC would be NOT referencing tables or stats on the character. For example: some basic text with a dice roll for each of a D&D PC's "powers" or one-touch dice rolls + mod or something.

JayH
Yes, I'm a chiropractor. Gamer fitness at Hafner Chiropractic in Lakewood, CO: http://www.HafnerChiropractic.com

User avatar
Mathemagician
Dragon
Posts: 666
Joined: Tue May 22, 2007 2:27 pm

Post by Mathemagician »

emirikol wrote:This is a great idea.

One thought: I would have a BASIC and ADVANCED macros bit. BASIC for people like me, who don't want to do a bunch of code, and advanced for people who do want to do a bunch of code.

Things for BASIC would be NOT referencing tables or stats on the character. For example: some basic text with a dice roll for each of a D&D PC's "powers" or one-touch dice rolls + mod or something.

JayH
Thanks for the input emirikol! I think you are right, "My first macro" should really be just dice rolls.

Post Reply

Return to “Documentation Requests/Discussion”