Roll20 uses cookies to improve your experience on our site. Cookies enable you to enjoy certain features, social sharing functionality, and tailor message and display ads to your interests on our site and others. They also help us understand how our site is being used. By continuing to use our site, you consent to our use of cookies. Update your cookie preferences .
×
Create a free account

Tim's NPC Stat Block Mod (ScriptCards) D&D 5e 2014

March 14 (3 weeks ago)

Edited April 06 (1 day ago)

Hi All,

This is my new Mod for displaying an NPC Stat Block in chat. It's for the D&D 5E (2014) by Roll20 character sheet. It requires the Scriptcards API mod.

******As of the writing of this, the 2024 content will work with this Mod, as 2024 NPC's are still using the 2014 character sheets. I don't know if that is changing in the future, but I suspect it may when the 2024 sheet is out of BETA****


What Does This Mod Do?

This mod displays the selected token's NPC Stat Block in chat, it is displayed as closely to the 2014 monster manual stat block as I could get it. There are buttons for all Skills, Saves, Traits and Actions; including bonus, reaction, legendary and mythic actions.

Installation Instructions

This mod requires a custom template to be installed. To create a custom template, create a new character called "ScriptCards_TemplateMule" without the quotes, it is case sensitive. Then create two new abilities on the character. One called "Reset Templates" and put !sc-reloadtemplates as the macro(use this to reset templates any time you make a change to one.). For the second ability, name it "statblock" without the quotes. This is the template/style for the Mod. Add the code below:

boxcode::{div style='background-image: url("https://files.d20.io/images/105716505/oymO0pnVyLCv-tQDw2vddA/med.png") ; background-size: 100% 100% ; display: block ; text-align: left ; font-size: 12px ; padding-top: 1em ; font-family: serif ;  font-style: normal ; line-height: 1.2em ;'}||

titlecode::{div style='background-image: url("https://files.d20.io/images/105716694/59KW_4mBR3y_Iz45sQw2-g/med.png") !important ; background-size: 101% 4px ; width: 101% ; height:4px; display: block ; border: 1px solid #2f2112; border-radius: 2px ; vertical-align: top ; position: relative ;  top: -15px ; left: -3px'}{/div}{div style='margin: 0em .25em 0em .25em ; font-size: 24px ; font-variant: small-caps ; font-family: serif ; color: #6e2425 ; display: block ; font-weight: bold ; font-style: normal ; vertical-align: top ; position: relative ; top: -10px; left: 4px';}||

textcode::{/div}{div}{div style='color: #611b1c ; font-weight: normal; display: inline-block; margin: 0 1em 0 1em; vertical-align: top ; position: relative ; top: -10px';'}||

buttonwrapper::{div style='display: block ;'}{div style='background-image: url("https://files.d20.io/images/105716694/59KW_4mBR3y_Iz45sQw2-g/med.png") !important ; background-size: 111% 4px ; width: 111% ; height:4px; display: block ; border: 1px solid #2f2112; border-radius: 2px ; vertical-align: bottom ; position: relative ;  bottom: -10px ; left: -14px'}{/div}||

buttonstyle::style='color: #611b1c ; background-color: transparent ; padding: 2px ; border: none'||
footer::


Run your Reset Templates 

Now create your new macro and add the code below:

!Script{{

  --/|Script Name : Tim's NPC Statblock Mod (Scriptcards) for D&D 5E 2014
  --/|Version     : 1.1.1
  --/|Author      : Timothy Beasley

  --/|Description : This script displays an NPC statblock that mimics the 2014 Monster Manual in chat that has buttons for all 
  --/|              rolls; Skills, Saves, Traits, and Actions(bonus, reaction, Legendary, Mythic).
  --/|
  --/|Usage       : This script is for the 2014 edition of the official D&D 5E Character Sheet by Roll20 and requires the
  --/|              installation of the ScriptCards MOD using a pro account with API access. 
  --/|              This script also requires the installation of a custom ScriptCards template. Instructions for installing 
  --/|              a custom style template can be found on the Roll20 wiki page for ScriptCards. The code for the scriptcard
  --/|              template can be found in the post associated with this Script on the Roll20 forums below;
  --/|              https://app.roll20.net/forum/post/12267264/tims-npc-stat-block-mod-scriptcards-d-and-d-5e-2014
  --/|              or on my GitHub below as statblock.css;
  --/|              https://github.com/VirulentArc/ScriptCards
  --/|              Make sure the template "macro" name is stablock or change #overridetemplate to whatever name you'd prefer
  --/|              it to have.

  --#Debug|0
  --#overridetemplate|statblock
  --#Whisper|self
  --#sourceToken|@{selected|token_id}
  --#title|[*S:npc_name]
  --#emoteState|0
  --&obrac|{
  --&cbrac|}
  --?"[*S:npc_actype]" -ne ""|&NPCactype;([*S:npc_actype])
  --?"[*S:hp]" -ne ""|&BaseHP; [*S:hp] /
  --&Divider|[t][tr][td height=5px][/td][/tr][/t][t][tr][td width=100% style="border: none; border-top: 0.10em solid transparent; border-bottom: 0.25em solid transparent; border-left: 14em solid #7e2d40; line-height: 1.25em; font-size: 1.4em; display: block;"][/td][/tr][/t][t][tr][td height=5px][/td][/tr][/t]
  --&Space|[t][tr][td height=5px][/td][/tr][/t]

  --+|[t width=240px]
  --+|[tr][td][F::12][#000][i][*S:npc_type] [/i][/#][/F][/td][/tr]
  --+|[tr][td][&Divider][/td][/tr]
  --+|[tr][td][F::12][b]Armor Class[/b] [*S:npc_ac] [&NPCactype][br][/F][/td][/tr]
  --+|[tr][td][F::12][b]Hit Points[/b][&BaseHP] [*S:hp^] ([*S:npc_hpformula])[br][b]Speed[/b] [*S:npc_speed][/F][/td][/tr][/t]
  --+|[&Divider]

  --&SkillBlock|[t width=240px style="text-align: center;"][tr]
  --&SkillBlock|+[td width=80px][F::14][b][button]STR [*S:strength] ([*S:strength_mod])::~selected|npc_str[/button] |[/b][/F][br][button]save::~selected|npc_str_save[/button][/td]
  --&SkillBlock|+[td width=80px][F::14][b][button]DEX [*S:dexterity] ([*S:dexterity_mod])::~selected|npc_dex[/button] |[/b][/F][br][button]save::~selected|npc_dex_save[/button][/td]
  --&SkillBlock|+[td width=80px][F::14][b][button]CON [*S:constitution] ([*S:constitution_mod])::~selected|npc_con[/button][/b][/F][br][button]save::~selected|npc_con_save[/button][/td][/tr]
  --&SkillBlock|+[tr][td width=80px][F::14][b][button]INT [*S:intelligence] ([*S:intelligence_mod])::~selected|npc_int[/button] |[/b][/F][br][button]save::~selected|npc_int_save[/button][/td]
  --&SkillBlock|+[td width=80px][F::14][b][button]WIS [*S:wisdom] ([*S:wisdom_mod])::~selected|npc_wis[/button] |[/b][/F][br][button]save::~selected|npc_wis_save[/button][/td]
  --&SkillBlock|+[td width=80px][F::14][b][button]CHA [*S:charisma] ([*S:charisma_mod])::~selected|npc_cha[/button][/b][/F][br][button]save::~selected|npc_cha_save[/button][/td]
  --&SkillBlock|+[/tr][/t]
  --+|[&SkillBlock]
  --+|[&Divider]

  --&SecondBlock|[t width=240px][tr][td style="width: 240px ; display: block ; font-size: 12px ; "]
  --~|array;define;SaveArray;str;dex;con;int;wis;cha
  --%SaveLoop|foreach;SaveArray
    --?"[*S:npc_[&SaveLoop]_save_base]" -gt 0|[
	  --~SaveTitle|string;totitlecase;[&SaveLoop]
      --&AddSave|+[&SaveTitle] [*S:npc_[&SaveLoop]_save_base], 
    --]|
  --%|
  --?"[&AddSave]" -ne ""|[
    --&SavingThrows|[b]Saving Throws [/b]
  --]|
  --=SecondBlockCalc|[&AddSave(length)] - 7
  --&SecondBlock|+[&SavingThrows][&AddSave(0,[$SecondBlockCalc.Raw])][/td][/tr][/t]
  --+|[&SecondBlock]

  --&ThirdBlock|[t width=240px][tr][td style="width: 240px ; display: block ; font-size: 12px ; "]
  --~|array;define;SkillArray;acrobatics;animal_handling;arcana;athletics;history;insight;intimidation;investigation;medicine;nature;perception;performance;persuasion;religion;sleight_of_hand;stealth;survival
  --%SkillLoop|foreach;SkillArray
    --?"[*S:npc_[&SkillLoop]_base]" -gt 0|[
	  --~SkillTitle|string;totitlecase;[&SkillLoop]
      --&AddSkill|+[&SkillTitle] [*S:npc_[&SkillLoop]_base], 
    --]|
  --%|
  --?"[&AddSkill]" -ne ""|[
    --&SkillHeading|[b]Skills [/b]
  --]|
  --=ThirdBlockCalc|[&AddSkill(length)] - 7
  --&ThirdBlock|+[&SkillHeading][&AddSkill(0,[$ThirdBlockCalc.Raw])][/td][/tr][/t]
  --+|[&ThirdBlock]

  --#parameterDelimiter|$$$
  --?"[*S:npc_vulnerabilities]" -ne ""|&FourthBlock$$$[tr][td][F::12][b]Damage Vulnerabilities[/b] [*S:npc_vulnerabilities][/F][br][/td][/tr]
  --?"[*S:npc_resistances]" -ne ""|&FourthBlock$$$+[tr][td][F::12][b]Damage Resistances[/b] [*S:npc_resistances][/F][br][/td][/tr]
  --?"[*S:npc_immunities]" -ne ""|&FourthBlock$$$+[tr][td][F::12][b]Damage Immunities[/b] [*S:npc_immunities][/F][br][/td][/tr]
  --?"[*S:npc_condition_immunities]" -ne ""|&FourthBlock$$$+[tr][td][F::12][b]Conditions Immunities[/b] [*S:npc_condition_immunities][/F][br][/td][/tr]
  --?"[*S:npc_senses]" -ne ""|&FourthBlock$$$+[tr][td][F::12][b]Senses[/b] [*S:npc_senses][/F][br][/td][/tr]
  --?"[*S:npc_languages]" -ne ""|&FourthBlock$$$+[tr][td][F::12][b]Languages[/b] [*S:npc_languages][/F][br][/td][/tr]
  --?"[*S:npc_challenge]" -ne ""|&FourthBlock$$$+[tr][td][F::12][b]Challenge[/b] [*S:npc_challenge] [*S:npc_xp]xp[/F][br][/td][/tr]
  --?"[*S:npc_pb]" -ne 0|&FourthBlock$$$+[tr][td][F::12][b]Proficiency Bonus[/b] [*S:npc_pb][/F][br][/td][/tr]
  --&FourthBlock|+[/t]
  --+|[&FourthBlock]
  --+|[&Divider]
  --#parameterDelimiter|;

  --Rfirst|[*S:character_id];repeating_npcatrait
  --?"[*R:name]" -ne "NoRepeatingAttributeLoaded" -and "[*R:name]X" -ne "X"|[
    --&TraitOutput|[t width=240px]
    --~|array;fullrepeatingsection;Traits;[*S:character_id];repeating_npctrait;name:description;|
      --%TraitLoop|foreach;Traits
        --~TraitSplit|string;split;|;[&TraitLoop]
        --Rfind|[*S:character_id];[&TraitSplit1];repeating_npctrait;name
          --&TraitOutput|+[tr][td title="[&TraitLoop]" style="width: 200px ; display: inline-block ; white-space: nowrap ; overflow: hidden ; text-overflow: ellipsis ; color: #000 ; font-weight: bold ; font-style: italic ; "][&TraitSplit1][/td][td style="width: 40px ; display: inline-block ; text-align: right ; "][F::14]|[button]📜::~%[&obrac]selected|[*R>npc_roll_output]}[/button]|[/F][/td][/tr]
      --%|
    --&TraitOutput|+[/t]
    --+|[&TraitOutput]
    --+|[&Space]
  --]|

  --Rfirst|[*S:character_id];repeating_npcaction
  --?"[*R:name]" -ne "NoRepeatingAttributeLoaded" -and "[*R:name]X" -ne "X"|[
    --&ActionOutput|[t width=240px]
    --&ActionOutput|+[tr][td][F::20]Actions[/F][hr #922610][/td][/tr]
    --~|array;fullrepeatingsection;Actions;[*S:character_id];repeating_npcaction;name:description;|
      --%ActionLoop|foreach;Actions
        --~ActionSplit|string;split;|;[&ActionLoop]
        --Rfind|[*S:character_id];[&ActionSplit1];repeating_npcaction;name
        --?"[*R:name]" -ne "NoRepeatingAttributeLoaded" -and "[*R:name]X" -ne "X"|[
          --&ActionOutput|+[tr][td title="[&ActionLoop]" style="width: 200px ; display: inline-block ; white-space: nowrap ; overflow: hidden ; text-overflow: ellipsis ; color: #000 ; font-weight: bold ; font-style: italic ; "][i][&ActionSplit1][/i][/td][td style="width: 40px ; display: inline-block ; text-align: right ; "][F::14]|[button]⚔️::~%[&obrac]selected|[*R>npc_action][&cbrac][/button]|[/F][/td][/tr]
        --]|
      --%|
    --&ActionOutput|+[/t]
    --+|[&ActionOutput]
    --+|[&Space]
  --]|

  --Rfirst|[*S:character_id];repeating_npcbonusaction
  --?"[*R:name]" -ne "NoRepeatingAttributeLoaded" -and "[*R:name]X" -ne "X"|[
    --&BonusOutput|[t width=240px]
    --&BonusOutput|+[tr][td][F::20]Bonus Actions[/F][hr #922610][/td][/tr]
    --~|array;fullrepeatingsection;Bonus;[*S:character_id];repeating_npcbonusaction;name:description;|
      --%BonusLoop|foreach;Bonus
        --~BonusSplit|string;split;|;[&BonusLoop]
        --Rfind|[*S:character_id];[&BonusSplit1];repeating_npcbonusaction;name
        --?"[*R:name]" -ne "NoRepeatingAttributeLoaded" -and "[*R:name]X" -ne "X"|[
          --&BonusOutput|+[tr][td title="[&BonusLoop]" style="width: 200px ; display: inline-block ; white-space: nowrap ; overflow: hidden ; text-overflow: ellipsis ; color: #000 ; font-weight: bold ; font-style: italic ; "][i][&BonusSplit1][/i][/td][td style="width: 40px ; display: inline-block ; text-align: right ; "][F::14]|[button]⚔️::~%[&obrac]selected|[*R>npc_action][&cbrac][/button]|[/F][/td][/tr]
        --]|
      --%|
    --&BonusOutput|+[/t]
    --+|[&BonusOutput]
  --]|

  --Rfirst|[*S:character_id];repeating_npcreaction
  --?"[*R:name]" -ne "NoRepeatingAttributeLoaded" -and "[*R:name]X" -ne "X"|[
    --&ReactionOutput|[t width=240px]
    --&ReactionOutput|+[tr][td][F::20]Reactions[/F][hr #922610][/td][/tr]
    --~|array;fullrepeatingsection;Reaction;[*S:character_id];repeating_npcreaction;name:description;|
      --%ReactionLoop|foreach;Reaction
        --~ReactionSplit|string;split;|;[&ReactionLoop]
        --Rfind|[*S:character_id];[&ReactionSplit1];repeating_npcreaction;name
        --?"[*R:name]" -ne "NoRepeatingAttributeLoaded" -and "[*R:name]X" -ne "X"|[
          --&ReactionOutput|+[tr][td title="[&ReactionLoop]" style="width: 200px ; display: inline-block ; white-space: nowrap ; overflow: hidden ; text-overflow: ellipsis ; color: #000 ; font-weight: bold ; font-style: italic ; "][i][&ReactionSplit1][/i][/td][td style="width: 40px ; display: inline-block ; text-align: right ; "][F::14]|[button]⚔️::~%[&obrac]selected|[*R>npc_roll_output][&cbrac][/button]|[/F][/td][/tr]
        --]|
      --%|
    --&ReactionOutput|+[/t]
    --+|[&ReactionOutput]
    --+|[&Space]
  --]|

  --Rfirst|[*S:character_id];repeating_npcaction-l
  --?"[*R:name]" -ne "NoRepeatingAttributeLoaded" -and "[*R:name]X" -ne "X"|[
    --&LegendOutput|[t width=240px]
    --&LegendOutput|+[tr][td][F::20]Legendary Actions[/F][hr #922610][/td][/tr][tr][td][F::12][#000][*S:npc_legendary_actions_desc][/#][/F][/td][/tr]
    --~|array;fullrepeatingsection;Legend;[*S:character_id];repeating_npcaction-l;name:description;|
      --%LegendLoop|foreach;Legend
        --~LegendSplit|string;split;|;[&LegendLoop]
        --Rfind|[*S:character_id];[&LegendSplit1];repeating_npcaction-l;name
        --?"[*R:name]" -ne "NoRepeatingAttributeLoaded" -and "[*R:name]X" -ne "X"|[
          --&LegendOutput|+[tr][td title="[&LegendLoop]" style="width: 200px ; display: inline-block ; white-space: nowrap ; overflow: hidden ; text-overflow: ellipsis ; color: #000 ; font-weight: bold ; font-style: italic ; "][i][&LegendSplit1][/i][/td][td style="width: 40px ; display: inline-block ; text-align: right ; "][F::14]|[button]⚔️::~%[&obrac]selected|[*R>npc_action][&cbrac][/button]|[/F][/td][/tr]
        --]|
      --%|
    --&LegendOutput|+[/t]
    --+|[&LegendOutput]
    --+|[&Space]
  --]|

  --Rfirst|[*S:character_id];repeating_npcaction-m
  --?"[*R:name]" -ne "NoRepeatingAttributeLoaded" -and "[*R:name]X" -ne "X"|[
    --&MythicOutput|[t width=240px]
    --&MythicOutput|+[tr][F::20]Mythic Actions[/F][hr #922610][/td][td][F::12][#000]@{selected|npc_mythic_actions_desc}[/#][/F][/td][/tr]
    --~|array;fullrepeatingsection;Mythic;[*S:character_id];repeating_npcaction-m;name:description;|
      --%MythicLoop|foreach;Mythic
        --~MythicSplit|string;split;|;[&MythicLoop]
        --Rfind|[*S:character_id];[&MythicSplit1];repeating_npcaction-m;name
        --?"[*R:name]" -ne "NoRepeatingAttributeLoaded" -and "[*R:name]X" -ne "X"|[
          --&MythicOutput|+[tr][td title="[&MythicLoop]" style="width: 200px ; display: inline-block ; white-space: nowrap ; overflow: hidden ; text-overflow: ellipsis ; color: #000 ; font-weight: bold ; font-style: italic ; "][i][&MythicSplit1][/i][/td][tdstyle="width: 40px ; display: inline-block ; text-align: right ; "][F::14]|[button]⚔️️::~%[&obrac]selected|[*R>npc_action][&cbrac][/button]|[/F][/td][/tr]
        --]|
      --%|
    --&MythicOutput|+[/t]
    --+|[&MythicOutput]
  --]|

  --+|[hr #922610]
  --&SkillOutput|[t width=240px style="text-align: center ; "]
  --&SkillOutput|+[tr][td][button]Acrobatics::~selected|npc_Acrobatics[/button] | [button]Animal Handling::~selected|npc_Animal_Handling[/button] | [button]Arcana::~selected|npc_Arcana[/button][/td][/tr]
  --&SkillOutput|+[tr][td][button]Athletics::~selected|npc_Athletics[/button] | [button]History::~selected|npc_History[/button] | [button]Insight::~selected|npc_Insight[/button] | [button]Intimidation::~selected|npc_intimidation[/button][/td][/tr]
  --&SkillOutput|+[tr][td][button]Investigation::~selected|npc_Investigation[/button] | [button]Medicine::~selected|npc_Medicine[/button] | [button]Nature::~selected|npc_Nature[/button] | [button]Perception::~selected|npc_Perception[/button][/td][/tr]
  --&SkillOutput|+[tr][td][button]Performace::~selected|npc_Performance[/button] | [button]Persuasion::~selected|npc_Persuasion[/button] | [button]Religion::~selected|npc_Religion[/button][/td][/tr]
  --&SkillOutput|+[tr][td][button]Sleight of Hand::~selected|npc_Sleight_of_Hand[/button] | [button]Stealth::~selected|npc_Stealth[/button] | [button]Survivial::~selected|npc_Survival[/button][/td][/tr]
  --+|[&SkillOutput]

--X|

}}

2025-03-24 Updated to include conditional to check if resource exists but is blank, do not output.

2025-03-30 Updated to remove the red line image and replace it with inline css. statblock style needs to be updated as well, don't forget to reset your templates.

2025-04-03 Updated to 1.1.0, formatting overhaul, just for consistency across platforms and browsers and fixes formatting problems with the bottom bar widening the longer the statblock is. Not a necessary update if what you're using is working for you. If you do update, also replace template code and reset your templates.

2025-04-06 Updated to 1.1.1. Found and fixed a bug with Skills and Saves. If there were multiple of any of them it completely broke the statblock. Did a bunch of complicated(for me) stuff to fix it. Also changed the size of the title a fraction, so update and reset templates as well. 

March 14 (3 weeks ago)

Edited March 30 (1 week ago)

The forum code boxes are acting up, so I'll continue in a new reply,

I would really appreciate feedback, I don't think I missed anything, but I did please let me know.

Thanks.


March 14 (3 weeks ago)
keithcurtis
Forum Champion
Marketplace Creator
API Scripter

That's gorgeous! Great work!

March 15 (3 weeks ago)

Edited March 15 (3 weeks ago)

Thanks Keith!

I should point out that the images used are not mine, they are actually the images used in the compendium. Which is actually pretty convenient for me, cause then I don't have to find a place to upload them and maintain them. As long as Roll20 doesn't delete them, for some reason, they'll be there "forever".

EDIT: With the exception of the tapered divider line, that image is in my github. I couldn't figure out how to add the css to the horizontal rule as inline css, so I had to use an image.

Updated the statblock theme to reduce line height by a tiny fraction. Won't affect too much with this Mod, but will with future Mod releases that use the same theme.

Just updated to version 1.0.1. Nothing major, just adding a conditional to see if a repeating resource exists and is blank, don't output. This is really just to make it more compatible with my existing summon Mods, as depending on the NPC summon, some repeating resources might be blank and so there's button that shows that does nothing.

March 30 (1 week ago)

Edited March 30 (1 week ago)

Updated to version 1.0.2. I figured out how to do the inline CSS for the divider and so no longer require an image. I'll keep the image up on my github for anyone using this that doesn't update.

EDIT: Also update the statblock css, the divider threw off some of the layout. Don't forget to reset your templates.

April 03 (4 days ago)

Edited April 03 (4 days ago)

Updated to version 1.1.0. It's a formatting update with static rules to avoid formatting breaking(the bottom bar would grow the longer the NPC statblock is you're viewing). If you're using this Mod and it's working for you, it's not absolutely necessary to update. If you do decide to update, also update the template code and restart your templates or the bottom bar will appear too wide.

Updated to version 1.1.1. The Saves and Skills section were completely broken, I hadn't tested on an NPC with multiple of either and so didn't know that it completely broke the statblock if that was the case. A lot of bashing my head against a wall with this one. If you are using this Mod I would suggest updated as you'll find very quickly how broken those sections are if you use certain NPC's. Update and reset template as well.

Also, I didn't know this as I haven't really used the 2024 character sheet stuff yet, but the 2024 NPC's are still using the old character sheets. That means, for the time being anyway, this is compatible with the 2024 content.