Fast, flexible D&D4e monster creation in MapTool

Thoughts, Help, Feature Requests, Bug Reports, Developing code for...

Moderators: dorpond, trevor, Azhrei

Forum rules
PLEASE don't post images of your entire desktop, attach entire campaign files when only a single file is needed, or generally act in some other anti-social behavior. :)
Post Reply
User avatar
OnlineDM
Cave Troll
Posts: 40
Joined: Sun Jun 20, 2010 11:36 pm
Location: Highlands Ranch, CO
Contact:

Fast, flexible D&D4e monster creation in MapTool

Post by OnlineDM »

This is something that the awesome frameworks probably already handle very well, but since I'm not using a framework I ended up building it myself.

More details are on my blog, but in a nutshell I've created a set of monster properties and template monsters for D&D 4th Edition that helps me create monsters in MapTool very quickly. You grab the generic monster of the appropriate role (skirmisher, brute, etc.) and set its level; the math is now done. From there you just worry about the fun stuff - the monster's special abilities, effects of its various attacks, etc.

What's most useful for me is that I can re-level monsters quite trivially - just change the Level property and all of the math is updated (hit points, defenses, initiative, attacks, damage).

Finally, I ended up taking advantage of the fact that MapTool allows for the rolling of weird-sided dice (d7s and so on) to create a new set of damage expressions that have roughly the same average values and ranges as the official WotC tables but that have more variability (rolling 2d13+23 for 30th-level damage instead of 4d6+20, for instance).

The full properties and templates are over on the blog. Please let me know if you have any comments or suggestions.

User avatar
JonathanTheBlack
Dragon
Posts: 544
Joined: Mon Jun 28, 2010 12:12 pm
Location: I'm the worm...

Re: Fast, flexible D&D4e monster creation in MapTool

Post by JonathanTheBlack »

Create a campaign macro, label it Edit Monster. Make sure that both Auto Execute and Apply to Selected Tokens are checked. Now all you have to do is target the token and enter the numbers and such through an input window that pops up. No need to fiddle around with editing the token directly.

If you'd like, I can even include some options that will allow you to select a favored ability score and add an additional +3 to that one. It would also be possible to set the HP Bonus automatically based on the chosen role.

Code: Select all

[h: listRoles = "None, Artillery, Brute, Controller, Lurker, Skirmisher, Soldier, Solo"]
[h: listSizes = "None, Tiny, Small, Medium, Large, Huge, Gargantuan, Colossal"]
[h: listPronouns = "It, He, She"]
[h: selectRole = listFind(listRoles, Role)]
[h: selectSize = listFind(listSizes, NativeSize)]
[h: selectPronoun = listFind(listPronouns, HeShe)]

[h: status = input(
  "Level | " + Level + " | Level || WIDTH=4",
  "Role | " + listRoles + " | Role | LIST | SELECT=" + selectRole,
  "HPModifier | " + HPModifier + " | Hit Point Mod || WIDTH=4",
  "Spd | " + Spd + " | Speed || WIDTH=4",
  "NativeSize | " + listSizes + " | Size | LIST | SELECT=" + selectSize,
  "ActPts | " + ActPts + " | Action Points || WIDTH=4",
  "SaveBonus | " + SaveBonus + " | Save Bonus || WIDTH=4",
  "HeShe | " + listPronouns + " | Pronoun | LIST | SELECT=" + selectPronoun
  )]
[h: abort(status)]
[h: assert(0, "<b>" + token.name + "</b> has been updated!", 0)]

User avatar
OnlineDM
Cave Troll
Posts: 40
Joined: Sun Jun 20, 2010 11:36 pm
Location: Highlands Ranch, CO
Contact:

Re: Fast, flexible D&D4e monster creation in MapTool

Post by OnlineDM »

That's a nice piece of code - thanks for including it! I don't find editing the properties of the token directly to be all that difficult, but I suppose a macro like that one does make it a bit easier.

Also, I think I'd need to edit the code you included to make the text properties be saved as strings (as written, choosing Skirmisher as the role ended up setting my monster's role to 5, and Medium size got translated to 3), but that should be pretty simple.

Thanks for the feedback!

User avatar
JonathanTheBlack
Dragon
Posts: 544
Joined: Mon Jun 28, 2010 12:12 pm
Location: I'm the worm...

Re: Fast, flexible D&D4e monster creation in MapTool

Post by JonathanTheBlack »

Yeah, I realized that after I posted it. I have another version that's almost done... but it requires changing some of your campaign properties.

User avatar
JonathanTheBlack
Dragon
Posts: 544
Joined: Mon Jun 28, 2010 12:12 pm
Location: I'm the worm...

Re: Fast, flexible D&D4e monster creation in MapTool

Post by JonathanTheBlack »

Ok, here's an updated version that does the HP Modifiers by role and applies a SubTypeHPMod for minions, elites, and solos. It also automatically calculates the defenses of the token. I like the math you set up for attacks and such and will probably use this for my own one-shot games.

Updated Campaign Properties
[spoiler]#---StatsToSetManually-----
#Level:1
#Role:Skirmisher
#Spd:6
#NativeSize:Medium
#ActPts:0
#SaveBonus:0
#HeShe:It
#---JonathanTheBlackUpdates---
#ArmorClassRoleMod:0
#HPModifier:8
#InitiativeRoleMod:0
#Leader:0
#MinionHP:0
#SubType:Henchman
#SubTypeHPMod:1
#----StatsThatCanBeDefaulted---------
#MaxHP:{((HPModifier + Constitution + (Level * HPModifier)) * SubTypeHPMod) + MinionHP}
#ArmorClass:{Level+14+ArmorClassRoleMod}
#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+InitiativeRoleMod}
#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[/spoiler]

Edit Monster

Code: Select all

[h: listRoles = "None, Artillery, Brute, Controller, Lurker, Skirmisher, Soldier"]
[h: listSubTypes = "None, Minion, Henchman, Elite, Solo"]
[h: listSizes = "None, Tiny, Small, Medium, Large, Huge, Gargantuan, Colossal"]
[h: listPronouns = "It, He, She"]
[h: selectRole = listFind(listRoles, Role)]
[h: selectSubType = listFind(listSubTypes, SubType)]
[h: selectSize = listFind(listSizes, NativeSize)]
[h: selectPronoun = listFind(listPronouns, HeShe)]

[h: status = input(
  "Level | " + Level + " | Level || WIDTH=4",
  "Role | " + listRoles + " | Role | LIST | VALUE=STRING SELECT=" + selectRole,
  "Leader | " + Leader + " | Leader | CHECK",
  "SubType | " + listSubTypes + " | SubType | LIST | VALUE=STRING  SELECT=" + selectSubType,
  "Spd | " + Spd + " | Speed || WIDTH=4",
  "NativeSize | " + listSizes + " | Size | LIST | VALUE=STRING SELECT=" + selectSize,
  "ActPts | " + ActPts + " | Action Points || WIDTH=4",
  "SaveBonus | " + SaveBonus + " | Save Bonus || WIDTH=4",
  "HeShe | " + listPronouns + " | Pronoun | LIST | VALUE=STRING SELECT=" + selectPronoun
  )]
[h: abort(status)]

<!-- Role Mods -->
[h, if(Role == "Artillery"), code:
  {
    [HPModifier        =  6]
    [ArmorClassRoleMod = -2]
    [InitiativeRoleMod =  0]
  };{}]

[h, if(Role == "Brute"), code:
  {
    [HPModifier        =  10]
    [ArmorClassRoleMod = -2]
    [InitiativeRoleMod = -2]
  };{}]

[h, if(Role == "Controller"), code:
  {
    [HPModifier        =  8]
    [ArmorClassRoleMod =  0]
    [InitiativeRoleMod =  0]
  };{}]

[h, if(Role == "Lurker"), code:
  {
    [HPModifier        =  6]
    [ArmorClassRoleMod =  0]
    [InitiativeRoleMod =  0]
  };{}]

[h, if(Role == "Skirmisher"), code:
  {
    [HPModifier        =  8]
    [ArmorClassRoleMod =  0]
    [InitiativeRoleMod =  2]
  };{}]

[h, if(Role == "Soldier"), code:
  {
    [HPModifier = 8]
    [ArmorClassRoleMod = 4]
    [InitiativeRoleMod = 4]
  };{}]

<!-- SubType HitPoint Mods -->
[h: MinionHP = 0]
[h, if(SubType == "Solo"): SubTypeHPMod = 4]
[h, if(SubType == "Elite"): SubTypeHPMod = 2]
[h, if(SubType == "Henchman"): SubTypeHPMod = 1]
[h, if(SubType == "Minion"), code:
  {
    [SubTypeHPMod = 0]
    [MinionHP = 1]
    <!-- If it is a minion, the SubTypeMod reduces all other HP to zero and then adds MinionHP of 1 -->
  };{}]

<!-- Exits the macro with a message that says the token has been updated! This is only displayed to the person using the macro -->
[h: assert(0, "<b>" + token.name + "</b> has been updated!", 0)]

User avatar
OnlineDM
Cave Troll
Posts: 40
Joined: Sun Jun 20, 2010 11:36 pm
Location: Highlands Ranch, CO
Contact:

Re: Fast, flexible D&D4e monster creation in MapTool

Post by OnlineDM »

Cool! I'll have to play around with the Edit Monster macro update and the new properties you've provided.

In the mean time, I actually updated my damage expressions. I wasn't happy with the flat spots in the damage table (it should increase at every level), so I tweaked them. I also added expressions for 125% and 150% of standard damage (for recharge and encounter powers).

The updated blog post is here. I haven't added your new macro yet, but I probably will. Thanks!

Yay collaboration!

User avatar
OnlineDM
Cave Troll
Posts: 40
Joined: Sun Jun 20, 2010 11:36 pm
Location: Highlands Ranch, CO
Contact:

Re: Fast, flexible D&D4e monster creation in MapTool

Post by OnlineDM »

Okay, I've played around with your macro and properties, and I like them! I added a couple of tweaks.

First, I renamed the Henchman sub-type to Standard. That's the way the WotC books refer to monsters that aren't minions or elites or solos.

Second, I made the ActPts and SaveBonus numbers dependent on role (2 action points and +5 SaveBonus for solos, 1 action point and +2 SaveBonus for elites, 0/0 for standards and minions).

Third, I removed the "None" options from the various lists; this macro isn't for making a monster without a role or sub-type, and it could have unpredictable results.

Fourth, I added a line to set the size of the token to its new NativeSize.

Fifth, I corrected the ArmorClassRoleMod for soldiers - it should be 2, not 4.

I like it! I'll probably stick with my template monsters for most purposes, but I like being able to toggle the elite/solo status on and off, for instance.

Properties:
[spoiler=]#---StatsToSetManually-----
#Level:1
#Role:Skirmisher
#HPModifier:8
#Spd:6
#NativeSize:Medium
#ActPts:0
#SaveBonus:0
#HeShe:It
#ArmorClassRoleMod:0
#InitiativeRoleMod:0
#Leader:0
#MinionHP:0
#SubType:Standard
#SubTypeHPMod:1
#----StatsThatCanBeDefaulted---------
#MaxHP:{((HPModifier + Constitution + (Level * HPModifier)) * SubTypeHPMod) + MinionHP}
#ArmorClass:{Level+14+ArmorClassRoleMod}
#Fortitude:{Level+12}
#Reflex:{Level+12}
#Will:{Level+12}
#Init:{HalfLevel+DexMod-ArmorPenalty+0}
#Strength:{10+HalfLevel}
#Constitution:{10+HalfLevel}
#Dexterity:{10+HalfLevel}
#Intelligence:{10+HalfLevel}
#Wisdom:{10+HalfLevel}
#Charisma:{10+HalfLevel}
#DefaultAttackBonusVsAC:{Level+5}
#DefaultAttackBonusVsNAD:{Level+3}
#SingleTargetDamageBonus:{1+CEILING(Level*2/3)}
#SingleTargetDamageDie:{6+FLOOR(Level/3)}
#MultiTargetDamageDie:{SingleTargetDamageDie-2-FLOOR((Level+3)/9)}
#MultiTargetDamageBonus:{SingleTargetDamageBonus-1-FLOOR((Level+1)/9)}
#DamageDie125:{8+FLOOR(Level/3)}
#DamageBonus125:{1+CEILING(Level*2/3)+FLOOR((Level+1)/4)}
#DamageDie150:{9+FLOOR(Level/3)+FLOOR((Level+3)/6)}
#DamageBonus150:{2+CEILING(Level*2/3)+FLOOR((Level+1)/3)}
#-----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[/spoiler]

Code: Select all

[h: listRoles = "Artillery, Brute, Controller, Lurker, Skirmisher, Soldier"]
[h: listSubTypes = "Minion, Standard, Elite, Solo"]
[h: listSizes = "Tiny, Small, Medium, Large, Huge, Gargantuan, Colossal"]
[h: listPronouns = "It, He, She"]
[h: selectRole = listFind(listRoles, Role)]
[h: selectSubType = listFind(listSubTypes, SubType)]
[h: selectSize = listFind(listSizes, NativeSize)]
[h: selectPronoun = listFind(listPronouns, HeShe)]

[h: status = input(
  "Level | " + Level + " | Level || WIDTH=4",
  "Role | " + listRoles + " | Role | LIST | VALUE=STRING SELECT=" + selectRole,
  "Leader | " + Leader + " | Leader | CHECK",
  "SubType | " + listSubTypes + " | SubType | LIST | VALUE=STRING  SELECT=" + selectSubType,
  "Spd | " + Spd + " | Speed || WIDTH=4",
  "NativeSize | " + listSizes + " | Size | LIST | VALUE=STRING SELECT=" + selectSize,
  "HeShe | " + listPronouns + " | Pronoun | LIST | VALUE=STRING SELECT=" + selectPronoun
  )]
[h: abort(status)]

<!-- Role Mods -->
[h, if(Role == "Artillery"), code:
  {
    [HPModifier        =  6]
    [ArmorClassRoleMod = -2]
    [InitiativeRoleMod =  0]
  };{}]

[h, if(Role == "Brute"), code:
  {
    [HPModifier        =  10]
    [ArmorClassRoleMod = -2]
    [InitiativeRoleMod = -2]
  };{}]

[h, if(Role == "Controller"), code:
  {
    [HPModifier        =  8]
    [ArmorClassRoleMod =  0]
    [InitiativeRoleMod =  0]
  };{}]

[h, if(Role == "Lurker"), code:
  {
    [HPModifier        =  6]
    [ArmorClassRoleMod =  0]
    [InitiativeRoleMod =  0]
  };{}]

[h, if(Role == "Skirmisher"), code:
  {
    [HPModifier        =  8]
    [ArmorClassRoleMod =  0]
    [InitiativeRoleMod =  2]
  };{}]

[h, if(Role == "Soldier"), code:
  {
    [HPModifier = 8]
    [ArmorClassRoleMod = 2]
    [InitiativeRoleMod = 4]
  };{}]

<!-- SubType HitPoint Mods -->
[h: MinionHP = 0]
[h, if(SubType == "Solo"), CODE:
  {[SubTypeHPMod = 4]
   [SaveBonus=5]
   [ActPts=2]
  };{}]
[h, if(SubType == "Elite"), CODE:
  {[SubTypeHPMod = 2]
   [SaveBonus=2]
   [ActPts=1]
  };{}]
[h, if(SubType == "Standard"), CODE:
  {[SubTypeHPMod = 1]
   [SaveBonus=0]
   [ActPts=0]
  };{}]

[h, if(SubType == "Minion"), code:
  {
    [SubTypeHPMod = 0]
    [SaveBonus=0]
    [ActPts=0]
    [MinionHP = 1]
    <!-- If it is a minion, the SubTypeMod reduces all other HP to zero and then adds MinionHP of 1 -->
  };{}]

[h: setSize(NativeSize)]

<!-- Exits the macro with a message that says the token has been updated! This is only displayed to the person using the macro -->
[h: assert(0, "<b>" + token.name + "</b> has been updated!", 0)]

User avatar
JonathanTheBlack
Dragon
Posts: 544
Joined: Mon Jun 28, 2010 12:12 pm
Location: I'm the worm...

Re: Fast, flexible D&D4e monster creation in MapTool

Post by JonathanTheBlack »

Coo. I just like Henchman better than Standard.

Post Reply

Return to “MapTool”