I think I love MapTool

I’ve had a day to play around with MapTool.  When I first discovered this program for playing D&D online, I was very impressed, but still a little bit wary.  It seemed to do everything OpenRPG did, but better (with the possible exception of easy networking).  It had some slick features that Gametable lacked, but I didn’t know if it had dice macros.

Does MapTool have macros – that’s a good one!

MapTool, as it turns out, is all about macros.  See, I’m a very experienced programmer in languages such as Visual Basic for Applications (VBA – mainly for Excel).  When I discover the potential for programming in a game, I begin to salivate.  (I’m a former casual interactive fiction programmer.)  It turns out that MapTool lets you tie macros to individual tokens as well as to your campaign as a whole (for all of the players to use) and to your installation of MapTool (global macros).  This means that, for instance, you can put a monster token on the board and then start writing as many macros as you want for it.   Each macro will create a little button that’s available whenever you select the token.

I created a macro called “Simple Attack” and then imported it to every new token on the battlefield.  This would put a button connected to the token called “Attack” (in red letters, just for style).  When clicked, the Attack button would send messages to the chat window that only the GM can see, first with an attack roll (d20+0 versus AC by default) and then a damage roll (d6+0 by default).  I would edit this macro for the new token.  For instance, on a Giant Rat, I edited it to be called “Bite” and changed the attack roll to d20+6 versus AC and the damage to 3 (no roll).  On an Ochre Jelly, I changed the name to “Slam”, the attack to d20+8 versus AC and the damage to 2d6+1 and ongoing 5 acid damage (save ends).  This will all automatically show up in my chat window whenever I click the appropriate button.  No more looking up the attack modifier, what defense it’s attacking, how much damage, etc.  Just click the button and inform the player of the PC’s doom!

Naturally, the same can be done for player tokens.  I haven’t created any macros for the players yet, but I fully intend to do so.  I’ll be interested to see whether the players use the macros for their powers or not –  I’m guessing they probably will.

I’ve also set up each token with appropriate properties – hit points, defenses, speed, ability scores, etc.  Whenever you mouse over a token, a little portrait shows up with all of these stats next to it.  When I roll to hit Reflex against Barbara’s character,I can just mouse over Barbara’s token and see what her Reflex defense is.  Way, way cool.

MapTool ConditionsI’ve also customized the conditions I’m using in my campaign.  To the left, you can see what I’ve set the various conditions to look like.  Whenever a character is bloodied, I’ll set the “Bloodied” state to be checked, and a red dot will appear in the bottom right corner of the token’s picture.  If they’re prone, they get a blue ring.  Slowed, a red yield sign.  Dazed is a green cross.  I’ve added a purple triangle to remind us of ongoing damage.  Unconscious characters will have a gray X, which will become red if the character dies.  I absolutely love this.  I know there are more conditions I’ll need to add (I just realized that I need to show which tokens are marked, for instance), but these should get the game going.  Honestly, this is an area where MapTool is superior to a real life game.  It’s a pain in the butt to put little beads next to minis on a physical battle map to show which ones are marked by our warden, which are tagged by our ranger as her Hunter’s Quarry, which are bloodied, etc.  In MapTool you can’t miss it (as long as you know what the shapes mean, of course).

The down side of MapTool is that I do have to have map files prepared to import.  I found a great site with beautiful Keep on the Shadowfell maps called the Mad Mapper.  While I love the maps of the Keep that I built myself in Gametable (mine are more colorful), I’m having tremendous trouble with Gametable’s Export Map function.  This function is supposed to export the map as a JPG file, which I could load into MapTool after resizing, but for some reason the exporter either exports a blank map or a map with just a few objects from the top left corner of my map.  I hate going with screen shots, so for now I’m stuck with maps I find online.  I’d love to keep building maps within Gametable, but if I can’t export them as images that’s just not going to work.

What do you use for building map images?  Do you just draw in Photoshop?  That seems like it would be tremendously difficult if you want to stick to a grid.  I’m open to suggestions!

I should also mention that I’ve discovered the DND 4e Combat Manager, a totally slick little tool that lets you import your characters from Character Builder and your monsters from Adventure Tools and then run combats.  There seems to be a bug that prevents the Combat Manager from importing many of the Character Builder stats (max HP, defenses, ability scores, etc.) but it does import names and powers, and I added the numbers for my three PCs manually.  The monsters import perfectly.  With this tool, I can roll initiative, see what powers are available (including tracking encounter and daily powers for the PCs if they like), keep track of HP, and manage conditions that have certain end points (save ends, end of next turn, etc.).  I love the condition reminders for things like ongoing damages or saving throws.  I don’t know if I’ll end up preferring this program over my homebrew Excel tracker, but I’ll admit that it’s looking pretty attractive.

As always, I love getting comments, so please let me know your thoughts.

7 thoughts on “I think I love MapTool

  1. For live and in-person D&D, I personally prefer to use colored pipe-cleaners twisted into little rings and hung off the mini. See, Sara isn’t the only crafty one!

    I’ve also heard of using colored discs underneath the mini – usually painted wood ones. To me, that makes it harder to move it around.

  2. I like the pipe cleaner idea! Now I just need to go get some colored pipe cleaners…

    I’ve also seen some special things that companies make just for this purpose, but they were crazy expensive and too fiddly for my taste (kind of like the disks you described).

  3. Hey, OnlineDM –

    I was wondering if you could help me with some coding sometime. I am new, but I like the way you explain things, and I would appreciate any help you could provide. Thank you very much for all that you have written about Maptool, as it is very useful. =]

  4. More specifically, I suppose – I have a simple code that I wrote to factor Healing and Damage for D&D 3.5. I have it setting the states to disable them when between 0 and -10 HP and then killing them if they go beyond that, obviously. But, I cannot get the state to come off when they are healed, and I have to go in and manually clear it. Here is my code:

    [h:status = input(
    “hpChange|0|Number of Hit Points”,
    “dmgOrHealing|Damage,Healing|Is the character taking damage or being healed?|RADIO|SELECT=0″)]

    [if(dmgOrHealing == 0),CODE:
    [h:HP = HP – hpChange]
    [r:token.name] loses [r:hpChange] hit points
    [h:IsDisabled=if(HP > -10 && HP < 0, 1, 0)]
    [h:IsDead= if(HP <= -10, 1, 0)]
    [h:state.Disabled = IsDisabled]
    [h:state.Dead = IsDead]
    [h:diff = MaxHP – HP]
    [h:HP = min(HP+hpChange, MaxHP)]
    [r:token.name] is healed and gains [r:min(diff,hpChange)] hit points.
    {if(IsDisabled, "I’m disabled!”, “”)}
    {if(IsDead, “I’m dead!!”, “”)}

    • I’m certainly happy to do what I can to help. At a glance, I’m not familiar with the state.Disabled= syntax that you’re using. When I change a state, I use the setState() command. Give that a try and see if it works.

      Also, since this is just a snipped of code, I don’t know what’s going on with the first IF statement. If the dmgOrHealing variable is equal to zero, you have a lot of stuff going on, including messing with states… but when will that be the case? I would imagine that a macro like this would mainly be called when there is a non-zero amount of damage or healing happening.

      Finally, you’re the second person I’ve seen recently to use curly braces in a way that confuses me. Your last two lines look to me like they should be in square brackets rather than curly braces. I’d write them as

      [r: if(isDisabled, “I’m disabled!”, “”)]

      Michael the OnlineDM

      • It’s not so much the setting of the states, as it is getting the symbol of the state to disappear once they no longer suffer from the condition. Would I just create a state known as Normal, and then set that? Also, if you copy and paste the code and run it in maptool you could see what it does. It is the complete code, probably just written funny since I’m fairly new to it all.

        I was wondering if I could chat with you sometime about coding. I, like you, find joy in programming, but I have no background in it. I don’t have a brain that gathers from reading so much as hands on, and thought maybe if you weren’t surprisingly busy, you could help me learn, maybe. There just aren’t enough tutorials out there for me to grasp everything. Figured it was at least worth asking.

        Also, are you currently running a campaign? I am looking for a party to join. I have been playing D&D off and on for 5 years, but I find myself DMing more than playing, and sometimes it’s just nice to relax and play.

        • Okay, I took a few minutes to parse this, and I see the problem. You’re only checking the new state when the character is taking damage, not when it’s being healed. You should move the isDisabled/isDead/set state stuff outside the IF loop and do it afterward, whether it was damage or healing that took place. I also prefer the setState command, personally. Finally, if you want Disabled to be turned on at 0 hit points, you need a <=0 check instead of <0. Here's my version of your macro (I also added some indenting): [h:status = input( "hpChange|0|Number of Hit Points", "dmgOrHealing|Damage,Healing|Is the character taking damage or being healed?|RADIO|SELECT=0")] [h:abort(status)] [if(dmgOrHealing == 0),CODE: { [h:setProperty("HP", getProperty("HP") - hpChange)] [r:token.name] loses [r:hpChange] hit points }; { [h:diff = getProperty("MaxHP") - getProperty("HP")] [h:setProperty("HP", min(getProperty("HP")+hpChange, getProperty("MaxHP")))] [r:token.name] is healed and gains [r:min(diff,hpChange)] hit points. } ] [h:IsDisabled=if(getProperty("HP") > -10 && getProperty(“HP”) <= 0, 1, 0)] [h:IsDead= if(getProperty("HP") <= -10, 1, 0)] [h:setState("Disabled", IsDisabled)] [h:setState("Dead", IsDead)] [if(IsDisabled, "I'm disabled!", "")] [if(IsDead, "I'm dead!!", "")] I'm also open to doing a Skype call sometime; email me at onlinedungeonmaster at gmail.com to talk about scheduling. I'm not running an active campaign at the moment; sorry! Michael the OnlineDM

Leave a Reply