Don't you need to evil alignment to get your own race as favored enemy ? Or that was some other game ?
That was 3rd edition, this is 3rd-and-a-half edition...
Dunno if anime-esque stuff is allowed (I've heard of some DMs demanding western-styled art for characters)
That is idiotic.
Anyway, I should be ready for a session in a day or two, once I get the hang of maptools. Does anyone have a tutorial on how to use the tools for combat? All I've found is Maptools tutorials.
Well it is idiotic to allow anything western but disallow anything from Japan, but it does make a certain amount of sense to want a consistent artistic style through-out the setting. Of course, that would pretty much require that the D.M. provide all artwork, or at least provide several examples.
I will provide an example of some macro complexity. As for Maptools outside of macros? Holding space-bar can point at something. Control-z is handy for revoking anything you draw on the map, as the deletion tools are a little wonky. Most of the panels can be moved, reduced to a button, resized, and added or removed. It operates by changing the mouse mode. So if your mouse refuses to interact with the map, then you may have inadvertently switched to 'examine' mode. If you want to draw racial slurs against giants on the side of a fellow adventurer's wagon prior to reaching a heavily-patrolled stretch of road then you will want the 'drawing' mode. There is also a mode for putting in fixed shapes which is useful for area effects such as spells...
I suggest choosing a subdirectory for holding all your tokens, create the directory, put some images(preferably formatted) in it, then selecting "Add Resource to Library..." from the "file" menu in Maptools. The subdirectory will now be visibly in the library panel and you can drag images from the library onto the map. You can use
Tokentool to format the images, I do not believe that they need to be formatted, but Tokentool will make certain that there is some transparent space around the token to see what the terrain underneath it is and will make it square so that it isn't distorted or uneven... You can also download tokens, but the range is not comprehensive and they have their own style, which could contrast with the feel of the game... Oh, and you cannot just put a "<" into chat, it will try to encode it. "<insert name here> walks into a bar." prints "walks into a bar.", "1<2" prints "12", and "<s
>RUN AWAY!!!</s
> I say, this beast is surely unworthy of our attentions, let us depart to find more noble endeavours." prints "
RUN AWAY!!! I say, this beast is surely unworthy of our attentions, let us depart to find more noble endeavours.". There is a sequence for printing a '<' but I do not recall it and macro code will not interpret it as a < either...
Here is an example of a hit point adjustment macro in a few parts.
[macro.return=10+3+4+3+4]
This is the
Base_HP macro, it reports the total amount of hit points from dice rolls and any other comparatively fixed source such as feats.
I used an underscore in the name because I will want to use this macro's name in code, and code doesn't like spaces in its names...
The "
[" and "
]" brackets indicate that the enclosed text is code and should be processed as such. anything that isn't code will be considered to be just a normal message.
macro.return is a variable that can be transferred between macros. It goes away when the macro ends, so you can't use it as permanent storage, but it lets one macro use another, which is useful if you want lots of macros to do one specific thing.
"
=" indicates that the preceding item should be made equal to the following item. In this case it causes "
macro.return" to become equal to the result of "
10+3+4+3+4", or 24.
[macro.return=4]
As above but with different data.
/me
[h,MACRO("Base_HP@TOKEN"):""]
[h:base_HP=macro.return]
[h,MACRO("Hit_Dice@TOKEN"):""]
[h:hit_dice=macro.return]
[h:before_HP=HP]
[h,if(base_HP+floor(Constitution/2-5)*hit_dice>hit_dice):maximum_HP=base_HP+floor(Constitution/2-5)*hit_dice;maximum_HP=hit_dice]
[h:error=input("amplitude|0|Amount cured")]
[h:abort(error)]
[h:abort(isNumber(amplitude))]
[h,if(before_HP+amplitude>maximum_HP&&maximum_HP>before_HP):HP=maximum_HP]
[h,if(maximum_HP>=before_HP+amplitude):HP=before_HP+amplitude]
has been healed by [e:amplitude], taking them from [e:before_HP] to [e:HP] hit points.
[h,if(maximum_HP>0):bar.Health=HP/maximum_HP]
I don't care about spaces in the macro's name because this is a macro that should not be used by other macros. You may want a macro for healing that can be called by other macros, but that would likely have little or no text of its own...
/me changes the output format, I really don't advise using it but I wanted to show it off. You can get a list of these commands by typing "/help" into the maptool chat. Such commands must occur at the beginning of a macro, and cannot occur in a macro that is called by another macro. It is polite to use /self to start a macro you are testing so that you do not spam the chat with macro output. It is even more polite to have all your macros finished and tested before the game session starts...
The first
h means 'hidden' and indicates that the results of this code should not be printed to the chat.
Commas
, are used to separate roll options, whether something is a roll option or not is best left to the
wiki...
MACRO is a
function roll option that calls another macro.
The brackets
() are used in two main ways, one is to contain calculations, 1+2*3 is not equal to (1+2)*3, and the other is to set input for a function(or roll option...). In this case it is the latter, and everything within the brackets applies to the
MACRO roll option.
Quotes
"" or
'' can be used to indicate text within code. "arg" prints ""arg"", [arg] asks you for the value of arg and prints your reply, ["arg"] prints "arg". Once a text string is started with a quotation mark it will continue until it hits another quotation mark, if it is started with an apostrophe it will continue until it hits another apostrophe, you can use this to put one or the other into code. For example: ["The protagonist's voice"+' uttered "Lolcats for'+" sale, get'em while"+' they haz cheezeburger.".'] should produce the text "The protagonist's voice uttered "Lolcats for sale, get'em while they haz cheezeburger."."...
The text string "
Base_HP@TOKEN" has meaning dependant upon the
MACRO function roll option.
Base_HP is the name of the macro to be run.
TOKEN indicates, I believe, that the macro to be run is on the currently selected token. And
@ separates the two. The order of everything, and probably capitalisation are all important. I suspect that
TOKEN does not need to be capitalised, but as a general rule capitalisation is always important.
The
: separates things called roll options from the rest of the macro, you should only ever have one within a single pair of square brackets.
The empty set of quotes at the end of the MACRO code are a text string with no text in it. The space there can include data that will be inherited by the "macro.args" variable within the called macro. I don't have any data that I need to pass on to the Base_HP macro and a pair of quotes with nothing between them is as close to nothing as I can get while actually putting something there, and I suspect that it will complain if I leave the spot completely blank...
[h:base_HP=macro.return]:
macro.return contains the data passed on from the called macro, in this case
Base_HP. I like to save the contents of macro return to a different variable as soon as I have called a macro as it makes things more readable and less likely to be overwritten but with a little creativity you could generalyl get away with skipping this step.
HP is one of the variables stored on the token's properties list.
Empty lines are pretty much free and just there to make it easier to find things. By the first one I have set
base_HP to the fixed hit-point offset, the value of
hit_dice to the character's hit die total, and
before_HP is the number of hit points that the token had at the start of the macro.
if is a roll option that makes a decision. If the statement in the brackets is true, then it performs the action after the
: and skips the one after the
;. if the statement is false then it instead does the reverse. If there is no
; then it will do nothing if the statement is false.
floor is a function that rounds down.
Constitution is a token property.
* is the multiplication symbol used in computer programming.
The evaluation symbols are: == says that the values are equal which is different from = which causes them to be equal. > states that the former value is greater then the latter. >= states that the former value is greater than or equal to the latter. != declares that the two values are not equal. < is untrustworthy and should be avoided. && says that both the statement before it and the statement after it are true. || states that at least one of the statements is true.
[h,if(base_HP+floor(Constitution/2-5)*hit_dice>hit_dice):maximum_HP=base_HP+floor(Constitution/2-5)*hit_dice;maximum_HP=hit_dice] roughly translates to "without mentioning it, if the base hit points added to the constitution modifier(multiplied by the hit dice of course) are greater than the character's hit dice then set the maximum hit points to the base hit points plus the bonus hit points from constitution, otherwise the hit point maximum should be set at least as high as the total hit dice."
input is a function that creates a dialogue panel and its value is set based upon whether the cancel or ok button was pressed to exit it. If you want to use input then you should really review the
wiki page for all the options. For a brief over-simplification: It has a single input, a text-string, which is divided up into multiple entries using pipe symbols(
|). The first entry is the variable which will receive the data, the second entry is the default value, and the third entry is the question that will be asked.
abort is a function that stops the macro immediately if the value(in this case
error) is zero. This ends the macro here if the cancel button was pressed.
isNumber is a function that tests whether a variable is numerical. If
amplitude is not a number(which would be awkward) then the macro stops here.
If the healing would take you over your maximum, then it heals you to your maximum, unless you were already over your maximum...
If the healing will not take you over your maximum, then it is added to your hit points.
Plain text is just plain text, printed to the chat panel. I could have put the whole line between quotation marks... meh [e:"has been healed by "+amplitude+", taking them from "+before_HP+" to "+HP+" hit points."] like that...
bar.Health is a variable that is linked to the token's health bar, the creator of the campaign can add or remove bars so you could have bar.Altitude, bar.PowerPoints, bar.NegativeLevels, bar.Sanity, bar.BloodLoss, bar.LimbDamage, or all sorts of other bars, but they do quickly become crowded. 0 is empty, 1/2 is half-empty(Or half-full if it is measuring negative levels), 1 is full, and 1+1/2, 3, 4, and 5 are also all full.
Basically this line sets the character's health bar to their current hit points divided by their maximum hit point, unless their maximum hit points are zero for some reason...
[h,MACRO("Base_HP@TOKEN"):""]
[h:base_HP=macro.return]
[h,MACRO("Hit_Dice@TOKEN"):""]
[h:hit_dice=macro.return]
[h:before_HP=HP]
[h,if(base_HP+floor(Constitution/2-5)*hit_dice>hit_dice):maximum_HP=base_HP+floor(Constitution/2-5)*hit_dice;maximum_HP=hit_dice]
[h:error=input("amplitude|0|Hit points gained")]
[h:abort(error)]
[h:abort(isNumber(amplitude))]
[h,if(maximum_HP+amplitude>before_HP&&before_HP>=maximum_HP):HP=maximum_HP+amplitude]
[h,if(maximum_HP>before_HP):HP=before_HP+amplitude]
I have received [e:amplitude] temporary hit points, taking me from [e:before_HP] to [e:HP] hit points.
[h,if(maximum_HP>0):bar.Health=HP/maximum_HP]
Same thing but with a bit of an adjustment to the if statements to reflect how temporary hit points work. Ideally temporary hit points would be tracked separately, which would be difficult without a token property. There are ways to be sure, but they require a certain amount of tinkering that isn't entirely polite... It is worth noting that i haven't actually tested these macros at this point...
[h,MACRO("Base_HP@TOKEN"):""]
[h:base_HP=macro.return]
[h,MACRO("Hit_Dice@TOKEN"):""]
[h:hit_dice=macro.return]
[h:before_HP=HP]
[h,if(base_HP+floor(Constitution/2-5)*hit_dice>hit_dice):maximum_HP=base_HP+floor(Constitution/2-5)*hit_dice;maximum_HP=hit_dice]
[h:error=input("amplitude|0|Hit points lost")]
[h:abort(error)]
[h:abort(isNumber(amplitude))]
[h:HP=before_HP-amplitude]
I am now hosting [e:amplitude] new hit points worth of damage, taking me from [e:before_HP] to [e:HP] hit points.
[e,if(before_HP>-10&&-10>=HP):"<br><b>Congratulations on crossing the -10 threshold!</b>"]
[h,if(before_HP>-10&&-10>=HP):state.Dead=1]
[e,if(HP>maximum_HP*2):"<br><b>Congratulations! Your temporary hit points currently exceed your normal hit point total!<b>"]
[h,if(maximum_HP>0):bar.Health=HP/maximum_HP]
Once again, taking damage is subtly different, of not is that I used the
e roll option that makes sure to print the results to the chat panel and that I threw in some HTML code, specifically
<br> to perform a new-line+carriage return and
<b> followed by
</b> to print important details in bold.