MapTool geek-out: Creating flexible monsters FAST

Edit 7/15/2011: I put up a revised version of this post with a better set of damage tables and everything a day after the original went live. I’ve left the original below for posterity.

I run all of my D&D games using MapTool, whether online in the traditional MapTool way or in-person using my projector rig. I don’t use a pre-made campaign framework for my games, since I enjoy learning new things and I enjoy computer programming (as a hobbyist, not a professional). More of my posts about my learnings with MapTool can be found in my MapTool Education Central.

Today I spent a fair part of the afternoon creating flexible monster templates. This came about because I’m working on finishing up the third adventure in my Staff of Suha trilogy (part 1 is here, and part 2 is here), and I want to use custom monsters and to make it as easy as possible to run the adventure at multiple levels (adventure level 2, 4, 6, 8 and 10). I’m already updating older monsters to use the most current monster math, so I thought, why not create flexible templates for each monster role?

My goal was to make it so that I could create a new monster in very little time. All I wanted to have to do was pick a role, pick a level, and then write down any special abilities. All of the math should be baked in based on the level and role. This meant that I needed to change around my monster properties.

I’ll paste the full properties at the end of the post, but what follows is a discussion of the math you’ll see there.

The math

HP modifier is either 6, 8 or 10. Artillery and Lurkers get 6 hit points per level; Skirmishers, Soldiers and Controllers get 8; Brutes get 10. MaxHP follows the formula laid out by Wizards of the Coast post-MM3 (HP modifier times Level+1, plus Constitution).

Defenses are tied to level and role. By default, Armor Class is Level+14 and the non-AC defenses (NADs) are Level+12. Soldiers have AC of Level+16; Brutes and Artillery have AC of Level+12.

The AttackBonus is Level+5. Versus NADs it’s Level+3, but I handle that in the attack macros instead of here in the properties (maybe I should do the latter).

Ability scores default to 10+Half Level each. I tweak these based on monster flavor, of course. I haven’t seen this explicitly spelled out anywhere, but glancing through recent monsters, it appears to be about right.

Initiative is basically a Dexterity check – Dex mod plus half level. Brutes reduce this by 2, Skirmishers increase it by 2 and Soldiers increase it by 4.

The most interesting part comes with damage. The table laid out by Wizards of the Coast is nice in that it scales pretty steadily in terms of average damage (Level+8 on average for a single target attack). It’s a bit tricky, though, in that it uses varying numbers of d6s and d8s at different levels. I wanted an easy-to-program solution to this problem that would give me similar average damage and a similar-shaped damage distribution to the official numbers.

What I ultimately came up with was to always roll two damage dice and add a bonus. The size of the die varies with level. It starts as a d6 and increases by 1 every fourth level. No, that doesn’t mean it goes to a d8 at level 5 – it goes to a d7! I’m leveraging the power of MapTool here; it’s happy to roll a d7 or d17 or whatever you like, just as easily as a d6 or d8.

Thus, every attack rolls a pair of damage dice, ranging from d6s at 1st-4th level to d13s at 29th-20th level.

The static damage bonus goes up every level or every other level, starting at 2 and ending at 23. Thus, a first-level monster deals 2d6+2 damage on a normal attack and a 30th-level monster deals 2d13+23.

The distribution of results is going to be a bit different from the official results, especially at higher levels, but I like it. My damage expressions have a slightly narrower range (at 30th level, WotC’s minimum damage is 24 and maximum 52 while mine ranges from 25 to 49). However, my distributions have more variability within that range (if you roll four dice instead of two, it’s much less likely that you’ll get extreme results). Honestly, I think the shape of my damage distribution curve at higher levels is more fun; higher variance in a slightly narrower range.

Also, due to rounding I have a couple of spots on my table where the damage from one level to the next is actually the same; I’m not overly concerned, honestly.

Multi-target attacks deal a bit less damage; I won’t go into the details.

Recharge and encounter powers (and Brute attacks) also deal extra damage, which I handle in either the token properties for the Brute (altering the static damage) or in the individual attack macros for recharge and encounter powers.

The templates in action

Once I had finished putting these new properties together and creating token templates for each role, I started putting an encounter together.

Wow, was it fast! I knew I wanted a level 7 skirmisher, a level 8 soldier and a level 8 artillery. I copied the appropriate token templates, set the levels, tweaked a few stats (a bit more Reflex and a bit less Fortitude on the artillery; low Intelligence on the beast skirmisher, etc.) and then got to the meat of monster building – abilities.

I was able to focus all of my attention on what would be a cool ability for a monster to have. For instance, my Skirmisher is a beast called a Digger. It can grab an enemy with its Pincers. It can use a special move action to drag the enemy up to half its speed without requiring a check. It has a recharge power that lets it burrow under an enemy, trying to make the enemy fall into the newly created channel.

It literally took about five minutes. I gave no thought to math. I just thought about flavor and abilities.

I built this Digger with an eye on the level 8 version of the adventure, but when it comes time to run it at Adventure Level 2, all I need to do is change the level. One stat; that’s all.

The download

I figure that the best way to share this is in a campaign file that has all of the necessary properties and a set of the tokens. You can download that template file here. Note that this file was created in MapTool version 1.33.b66.

The properties

#---StatsToSetManually-----
#Level:1
#Role:Skirmisher
#HPModifier:8
#Spd:6
#NativeSize:Medium
#ActPts:0
#SaveBonus:0
#HeShe:It
#----StatsThatCanBeDefaulted---------
#MaxHP:{HPModifier+Constitution+(Level*HPModifier)}
#ArmorClass:{Level+14}
#Fortitude:{Level+12}
#Reflex:{Level+12}
#Will:{Level+12}
#AttackBonus:{Level+5}
#DamageBonus:{1+Level-FLOOR((Level+2)/4)}
#DamageDie:{5+FLOOR((Level+3)/4)}
#MultiTargetDamageBonus:{1+Level-FLOOR((Level+2)/4)-(1+FLOOR(Level/4))}
#MultiTargetDamageDie:{4+FLOOR((Level+3)/4)}
#Init:{HalfLevel+DexMod-ArmorPenalty+0}
#Strength:{10+HalfLevel}
#Constitution:{10+HalfLevel}
#Dexterity:{10+HalfLevel}
#Intelligence:{10+HalfLevel}
#Wisdom:{10+HalfLevel}
#Charisma:{10+HalfLevel}
#-----CalculatedOrStaticStats-----
#HitPoints:{MaxHP}
#TempHP:0
#BloodiedHP:{FLOOR(MaxHP/2)}
#DeathFails:0
*#HP:{Hitpoints}/{MaxHP} + {TempHP}
*#AC/Fort/Ref/Will:{ArmorClass} / {Fortitude} / {Reflex} / {Will}
*#Type:Level {Level} {Role}
*#Speed:{Spd}
*#Initiative:{Init}
*#ActionPoints:{ActPts}
*#Str/Con/Dex:{Strength} / {Constitution} / {Dexterity}
*#Int/Wis/Cha:{Intelligence} / {Wisdom} / {Charisma}
#E1:1
#E2:1
#E3:1
#E4:1
#E5:1
#R1:1
#R2:1
#R3:1
#R4:1
#R5:1
#PowerCharged:1
---------------------------Skills-------------------------------------
#ArmorPenalty:0
#Acrobatics:{HalfLevel+DexMod-ArmorPenalty+0}
#Arcana:{HalfLevel+IntMod+0}
#Athletics:{HalfLevel+StrMod-ArmorPenalty+0}
#Bluff:{HalfLevel+ChaMod+0}
#Diplomacy:{HalfLevel+ChaMod+0}
#Dungeoneering:{HalfLevel+WisMod+0}
#Endurance:{HalfLevel+ConMod-ArmorPenalty+0}
#Heal:{HalfLevel+WisMod+0}
#History:{HalfLevel+IntMod+0}
#Insight:{HalfLevel+WisMod+0}
#Intimidate:{HalfLevel+ChaMod+0}
#Nature:{HalfLevel+WisMod+0}
#Perception:{HalfLevel+WisMod+0}
#Religion:{HalfLevel+IntMod+0}
#Stealth:{HalfLevel+DexMod-ArmorPenalty+0}
#Streetwise:{HalfLevel+ChaMod+0}
#Thievery:{HalfLevel+DexMod-ArmorPenalty+0}
------------------AbilityMods-------------------------------
#StrMod:{FLOOR((Strength-10)/2)}
#ConMod:{FLOOR((Constitution-10)/2)}
#DexMod:{FLOOR((Dexterity-10)/2)}
#IntMod:{FLOOR((Intelligence-10)/2)}
#WisMod:{FLOOR((Wisdom-10)/2)}
#ChaMod:{FLOOR((Charisma-10)/2)}
#HalfLevel:{FLOOR(Level/2)}
---------------Other-----------------------------------------
Elevation:0

4 thoughts on “MapTool geek-out: Creating flexible monsters FAST

  1. hey just a question. The section you labeled Stats to set manually. Do you set them with a macro input or in the tokens properties. Also when you set them does it have any real bearing on the rest? like init going up for soldiers or down for brute etc.

    • I’m glad you like this!

      Personally, I edit the token properties manually, but this thread over on the MapTool forums has another person who’s put up a macro to help (though I think just editing the token properties is easy enough).

      The role name doesn’t directly affect anything else (it just changes what’s displayed), so feel free to add Leader or whatever you like. The same goes for Spd.

      Level obviously affects a whole bunch of things.

      HPModifier obviously affects maximum hit points.

      ActPts affects whether the monster has any action points to spend (each token as a Action Point Spent macro, which says “No can do” if the monster doesn’t have action points).

      SaveBonus affects any bonus to saving throws in the Saving Throw button macro.

      HeShe affects the language in the hit point changing macros (Take Damage, Gain HP, Gain Temp HP). The output from those macros is only displayed to the DM, so it’s no big deal if you always leave the pronoun on “It”.

  2. Pingback: Status update on “ZWMRPG” (my Gzdoom RPG mod) « Anarchy Software

Leave a Reply to Mike Frizzell Cancel reply