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 .
×
Why do rogues wear leather armor? Because it’s made of hide. 🥷

Blindchecks

1777223324

Edited 1777223416
Hi all, I used this script during a previous campaign using the 2014 D&amp;D character sheet and it worked great.&nbsp; It doesn't seem to work for 2024 (I'm guessing something to do with the names of the attributes changing.)&nbsp; Can it work for the 2024 sheet by simply updating the attribute names?&nbsp; If so, can someone provide guidance on what specifically needs to be changed? Thanks in advance. -Adam /*jshint esversion: 9 */ // OPen and Blind Checks for the 5th Edition OGL by Roll20 // Create a token action macro called "OpenChecks" with the action "!OpenChecks" // Create a token action macro called "BlindChecks" with the action "!BlindChecks" // Give all your players access to both. const OpenBlindChecks = (() =&gt; { &nbsp; &nbsp; const buildTable = (values) =&gt; { &nbsp; &nbsp; &nbsp; &nbsp; let getMod = (g) =&gt; { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return g ? g.mod : -5; &nbsp; &nbsp; &nbsp; &nbsp; }; &nbsp; &nbsp; &nbsp; &nbsp; let s = { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; div: `display: block; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `min-height:60px; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `margin: 5px 0px 0px -30px; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `padding:0px 5px 0px 5px; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `border: 0px none; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `border-radius: 6px 6px 6px 6px; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `box-shadow: 2px 2px 4px 2px #000; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `background-color: #fff; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `background-image: url('${values.blind ? " <a href="https://i.imgur.com/UCIUXyr.jpg" rel="nofollow">https://i.imgur.com/UCIUXyr.jpg</a> " : " <a href="https://i.imgur.com/vjL1blE.jpg" rel="nofollow">https://i.imgur.com/vjL1blE.jpg</a> " }'); ` + // <a href="https://i.imgur.com/UCIUXyr.jpg" rel="nofollow">https://i.imgur.com/UCIUXyr.jpg</a> &nbsp; <a href="https://i.imgur.com/vjL1blE.jpg" rel="nofollow">https://i.imgur.com/vjL1blE.jpg</a> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `text-align: left; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `white-space: pre-wrap;`, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tbl_top: `width: 90%; margin: auto;`, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; img: `background-color: transparent; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `border: none ;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `max-height: 60px; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `padding: 5px; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `margin: auto; !important`, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; name: `font-weight: bold; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `font-size: 120%; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `font-style: italic; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `text-align: center; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `line-height: 18px; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `padding: 0px 5px 0px;`, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; blurb: `font-style: italic; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `text-align: center; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `line-height:18px; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `padding: 0px 5px 0px;`, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rolls: `text-align: center; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `line-height:18px; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `padding: 0px 5px 0px;`, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; inlinestyle: `display: inline-block; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `min-width:18px; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `min-height:18px; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `background: white; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `border: 1px solid black; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `font-style: normal; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `text-align: center;&nbsp; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `line-height:18px;&nbsp; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `padding: 0px:` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `color: black;`, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; inlineclass: `inlinerollresult showtip tipsy-n-right`, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tbl_abl: `width: 90%; margin: auto;`, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; th: `font-weight: bold; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `text-align: center; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `line-height:18px; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `padding: 0px 5px 0px;`, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; td: `text-align: center; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `line-height:18px; ` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `padding: 0px 5px 0px;"`, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tbl_skl: `width: 90%; margin: auto;`, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tr_even: `background-color: ${values.blind ? "#cfd2d0" : "#e0e5c1" };`, //cfd2d0 //e0e5c1 ${values.blind ? "cfd2d0" : "e0e5c1" } &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tr_odd: `background-color: ${values.blind ? "#eeeeee" : "#ffffff" };` //transparent #ffffff ${values.blind ? "#eeeeee" : "#ffffff" } &nbsp; &nbsp; &nbsp; &nbsp; }; &nbsp; &nbsp; &nbsp; &nbsp; let passive = `Passive Wisdom:&amp;nbsp;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;span class="${s.inlineclass}" style="${s.inlinestyle}" title="10 + ${getMod(values.mods.perception_bonus)}"&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `${10 + getMod(values.mods.perception_bonus)}` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/span&gt;`; &nbsp; &nbsp; &nbsp; &nbsp; let inlineRoll = (props) =&gt; { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return `&lt;span class="${s.inlineclass}" style="${s.inlinestyle}" title="${props.t1}"&gt;${props.r1}&lt;/span&gt;&amp;#171;-&amp;#187;&lt;span class="${s.inlineclass}" style="${s.inlinestyle}" title="${props.t2}"&gt;${props.r2}&lt;/span&gt;`; &nbsp; &nbsp; &nbsp; &nbsp; }; &nbsp; &nbsp; &nbsp; &nbsp; let rawRoll = inlineRoll({ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t1: `Rolling 1d20(${values.frst})`, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; r1: values.frst, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t2: `Rolling 1d20(${values.scnd})`, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; r2: values.scnd}); &nbsp; &nbsp; &nbsp; &nbsp; let abilityRow = (oe, l, m, sa) =&gt; { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return `&lt;tr style="${oe}"&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;td style="${s.td}"&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `${l}` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/td&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;td style="${s.rolls}"&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `${inlineRoll({ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t1: `Rolling 1d20(${values.frst})+${m}`,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; r1: values.frst + m, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t2: `Rolling 1d20(${values.scnd})+${m}`, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; r2: values.scnd + m &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; })}` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/td&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;td style="${s.rolls}"&gt;` +&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `${inlineRoll({ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t1: `Rolling 1d20(${values.frst})+${sa}`,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; r1: values.frst + sa, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t2: `Rolling 1d20(${values.scnd})+${sa}`, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; r2: values.scnd + sa &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; })}` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/td&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/tr&gt;`; &nbsp; &nbsp; &nbsp; &nbsp; }; &nbsp; &nbsp; &nbsp; &nbsp; let abilityList = [ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {oddeven: s.tr_even, label: 'Strength', mod: getMod(values.mods.strength_mod), save: getMod(values.mods.strength_save_bonus)}, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {oddeven: s.tr_odd, label: 'Dexterity', mod: getMod(values.mods.dexterity_mod), save: getMod(values.mods.dexterity_save_bonus)}, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {oddeven: s.tr_even, label: 'Constitution', mod: getMod(values.mods.constitution_mod), save: getMod(values.mods.constitution_save_bonus)}, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {oddeven: s.tr_odd, label: 'Intelligence', mod: getMod(values.mods.intelligence_mod), save: getMod(values.mods.intelligence_save_bonus)}, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {oddeven: s.tr_even, label: 'Wisdom', mod: getMod(values.mods.wisdom_mod), save: getMod(values.mods.wisdom_save_bonus)}, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {oddeven: s.tr_odd, label: 'Charisma', mod: getMod(values.mods.charisma_mod), save: getMod(values.mods.charisma_save_bonus)} &nbsp; &nbsp; &nbsp; &nbsp; ]; &nbsp; &nbsp; &nbsp; &nbsp; let skillRow = (oe, l, m, sa) =&gt; { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return `&lt;tr style="${oe}"&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;td style="${s.td}"&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `${l}` +&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/td&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;td style="${s.rolls}"&gt;` +&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `${inlineRoll({ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t1: `Rolling 1d20(${values.frst})+${m}`,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; r1: values.frst + m, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t2: `Rolling 1d20(${values.scnd})+${m}`, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; r2: values.scnd + m &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; })}` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/td&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/tr&gt;`; &nbsp; &nbsp; &nbsp; &nbsp; }; &nbsp; &nbsp; &nbsp; &nbsp; let skillList = [ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {oddeven: s.tr_even, label: 'Athletics', mod: getMod(values.mods.athletics_bonus)}, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {oddeven: s.tr_odd, label: 'Acrobatics', mod: getMod(values.mods.acrobatics_bonus)}, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {oddeven: s.tr_even, label: 'Animal Handling', mod: getMod(values.mods.animal_handling_bonus)}, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {oddeven: s.tr_odd, label: 'Arcana', mod: getMod(values.mods.arcana_bonus)}, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {oddeven: s.tr_even, label: 'Deception', mod: getMod(values.mods.deception_bonus)}, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {oddeven: s.tr_odd, label: 'History', mod: getMod(values.mods.history_bonus)}, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {oddeven: s.tr_even, label: 'Insight', mod: getMod(values.mods.insight_bonus)}, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {oddeven: s.tr_odd, label: 'Intimidation', mod: getMod(values.mods.intimidation_bonus)}, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {oddeven: s.tr_even, label: 'Investigation', mod: getMod(values.mods.investigation_bonus)}, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {oddeven: s.tr_odd, label: 'Medicine', mod: getMod(values.mods.medicine_bonus)}, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {oddeven: s.tr_even, label: 'Nature', mod: getMod(values.mods.nature_bonus)}, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {oddeven: s.tr_odd, label: 'Perception', mod: getMod(values.mods.perception_bonus)}, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {oddeven: s.tr_even, label: 'Performance', mod: getMod(values.mods.performance_bonus)}, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {oddeven: s.tr_odd, label: 'Persuasion', mod: getMod(values.mods.persuasion_bonus)}, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {oddeven: s.tr_even, label: 'Religion', mod: getMod(values.mods.religion_bonus)}, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {oddeven: s.tr_odd, label: 'Sleight of Hand', mod: getMod(values.mods.sleight_of_hand_bonus)}, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {oddeven: s.tr_even, label: 'Stealth', mod: getMod(values.mods.stealth_bonus)}, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {oddeven: s.tr_odd, label: 'Survival', mod: getMod(values.mods.survival_bonus)} &nbsp; &nbsp; &nbsp; &nbsp; ]; &nbsp; &nbsp; &nbsp; &nbsp; values.message = `` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;div style="${s.div}"&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;table style="${s.tbl_top}"&gt;` +&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;tr&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;td rowspan="3"&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;img style="${s.img}" src="${values.url}"&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/td&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;td style="${s.name}"&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `${values.name}` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/td&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/tr&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;tr&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;td style="${s.blurb}"&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `${passive}` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/td&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/tr&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;tr&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;td style="${s.rolls}"&gt;` +&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `${rawRoll}` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/td&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/tr&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/table&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;br&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;table style="${s.tbl_abl}"&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;tr&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;td style="${s.th}"&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `Ability` +&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/td&gt;&lt;td style="${s.th}"&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `Check` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/td&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;td style="${s.th}"&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `Save` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/td&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/tr&gt;`; &nbsp; &nbsp; &nbsp; &nbsp; abilityList.forEach( (row) =&gt; { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; values.message = values.message + abilityRow(row.oddeven, row.label, row.mod, row.save); &nbsp; &nbsp; &nbsp; &nbsp; }); &nbsp; &nbsp; &nbsp; &nbsp; values.message = values.message + `&lt;/table&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;br&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;table style="${s.tbl_abl}"&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;tr&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;td style="${s.th}"&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `Ability` +&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/td&gt;&lt;td style="${s.th}"&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `Check` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/td&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/tr&gt;`; &nbsp; &nbsp; &nbsp; &nbsp; skillList.forEach( (row) =&gt; { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; values.message = values.message + skillRow(row.oddeven, row.label, row.mod); &nbsp; &nbsp; &nbsp; &nbsp; }); &nbsp; &nbsp; &nbsp; &nbsp; values.message = values.message + `&lt;/table&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;br&gt;` + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `&lt;/div&gt;`; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return values.message; &nbsp; &nbsp; }; &nbsp; &nbsp; &nbsp; const getAttributes = (values) =&gt; { &nbsp; &nbsp; &nbsp; &nbsp; let attrNames = [ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'strength_mod', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'dexterity_mod', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'constitution_mod', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'intelligence_mod', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'wisdom_mod', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'charisma_mod', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'strength_save_bonus', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'dexterity_save_bonus', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'constitution_save_bonus', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'intelligence_save_bonus', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'wisdom_save_bonus', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'charisma_save_bonus', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'athletics_bonus', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'acrobatics_bonus', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'animal_handling_bonus', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'arcana_bonus', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'deception_bonus', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'history_bonus', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'insight_bonus', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'intimidation_bonus', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'investigation_bonus', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'medicine_bonus', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'nature_bonus', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'perception_bonus', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'performance_bonus', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'persuasion_bonus', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'religion_bonus', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'sleight_of_hand_bonus', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'stealth_bonus', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'survival_bonus', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'passive_wisdom' &nbsp; &nbsp; &nbsp; &nbsp; ]; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; values.attr = filterObjs( (a) =&gt; {&nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ( a.get('characterid') == values.cid &amp;&amp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a.get('type') === 'attribute' &amp;&amp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; attrNames.includes(a.get('name')) ) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }); &nbsp; &nbsp; &nbsp; &nbsp; values.mods = {}; &nbsp; &nbsp; &nbsp; &nbsp; values.attr.forEach( (a) =&gt; { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let key = a.get('name'); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let mod = a.get('current'); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let lbl = a.get('name') &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .replace(/_mod/gi,'') &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .replace(/_bonus/gi,'') &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .replace(/_/g, ' '); &nbsp; &nbsp; &nbsp; &nbsp; values.mods[a.get('name')] = { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; key: a.get('name'), &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mod: (Number(mod)||~~mod) || 0, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lbl: lbl &nbsp; &nbsp; &nbsp; &nbsp; }; &nbsp; &nbsp; &nbsp; &nbsp; }); &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sendChat('QuantumRoll', '[[2d20]]', function(qr) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; values.frst = qr[0].inlinerolls[0].results.rolls[0].results[0].v; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; values.scnd = qr[0].inlinerolls[0].results.rolls[0].results[1].v; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buildTable(values); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (values.blind) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sendChat(values.who, `/w gm ${values.message}`); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sendChat('API - QuantumRoll', `/w "${values.who}" Secret roll sent to GM. I'm sure its fine.`); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }else{ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sendChat(values.who, values.message); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; }; &nbsp; &nbsp; const handleInput = (msg) =&gt; { &nbsp; &nbsp; &nbsp; &nbsp; let values = {}; &nbsp; &nbsp; &nbsp; &nbsp; values.msg = msg; &nbsp; &nbsp; &nbsp; &nbsp; values.tok = getObj( &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; values.msg.selected[0]._type, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; values.msg.selected[0]._id); &nbsp; &nbsp; &nbsp; &nbsp; values.cha = getObj( &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'character', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; values.tok.get('represents')); &nbsp; &nbsp; &nbsp; &nbsp; if (values.cha) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; values.cid = values.cha.get('id'); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let imgsrc = values.tok.get('imgsrc'); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; values.url = imgsrc === '/images/character.png' ? &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ' <a href="https://i.imgur.com/MpqETqe.png" rel="nofollow">https://i.imgur.com/MpqETqe.png</a> ' : &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; imgsrc; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; values.name = values.cha.get('name'); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; values.blind = msg.content.startsWith("!BlindChecks"); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; values.who = values.msg.who &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .substring(0, values.msg.who.indexOf(' (GM)')); &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; getAttributes(values); &nbsp; &nbsp; }; &nbsp; &nbsp; on("ready",() =&gt; { &nbsp; &nbsp; &nbsp; &nbsp; on('chat:message', (msg_orig) =&gt; { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (msg_orig.type === 'api' &amp;&amp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (msg_orig.content.startsWith("!OpenChecks") || &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; msg_orig.content.startsWith("!BlindChecks")) &amp;&amp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; msg_orig.selected &amp;&amp; msg_orig.selected.length == 1 ) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; handleInput(_.clone(msg_orig)); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; }); &nbsp; &nbsp; }); &nbsp; &nbsp; return { &nbsp; &nbsp; }; })();
Just reformatting OP Blind Check Code for others to potentially use in their 2014 games. Original Link to Blindcheck API here:&nbsp;<a href="https://app.roll20.net/forum/post/9989663/slug%7D" rel="nofollow">https://app.roll20.net/forum/post/9989663/slug%7D</a> /*jshint esversion: 9 */ // OPen and Blind Checks for the 5th Edition OGL by Roll20 // Create a token action macro called "OpenChecks" with the action "!OpenChecks" // Create a token action macro called "BlindChecks" with the action "!BlindChecks" // Give all your players access to both. const OpenBlindChecks = (() =&gt; { const buildTable = (values) =&gt; { let getMod = (g) =&gt; { return g ? g.mod : -5; }; let s = { div: `display: block; ` + `min-height:60px; ` + `margin: 5px 0px 0px -30px; ` + `padding:0px 5px 0px 5px; ` + `border: 0px none; ` + `border-radius: 6px 6px 6px 6px; ` + `box-shadow: 2px 2px 4px 2px #000; ` + `background-color: #fff; ` + `background-image: url('${values.blind ? "<a href="https://i.imgur.com/UCIUXyr.jpg" rel="nofollow">https://i.imgur.com/UCIUXyr.jpg</a>" : "<a href="https://i.imgur.com/vjL1blE.jpg" rel="nofollow">https://i.imgur.com/vjL1blE.jpg</a>" }'); ` + //<a href="https://i.imgur.com/UCIUXyr.jpg" rel="nofollow">https://i.imgur.com/UCIUXyr.jpg</a> <a href="https://i.imgur.com/vjL1blE.jpg" rel="nofollow">https://i.imgur.com/vjL1blE.jpg</a> `text-align: left; ` + `white-space: pre-wrap;`, tbl_top: `width: 90%; margin: auto;`, img: `background-color: transparent; ` + `border: none ;` + `max-height: 60px; ` + `padding: 5px; ` + `margin: auto; !important`, name: `font-weight: bold; ` + `font-size: 120%; ` + `font-style: italic; ` + `text-align: center; ` + `line-height: 18px; ` + `padding: 0px 5px 0px;`, blurb: `font-style: italic; ` + `text-align: center; ` + `line-height:18px; ` + `padding: 0px 5px 0px;`, rolls: `text-align: center; ` + `line-height:18px; ` + `padding: 0px 5px 0px;`, inlinestyle: `display: inline-block; ` + `min-width:18px; ` + `min-height:18px; ` + `background: white; ` + `border: 1px solid black; ` + `font-style: normal; ` + `text-align: center; ` + `line-height:18px; ` + `padding: 0px:` + `color: black;`, inlineclass: `inlinerollresult showtip tipsy-n-right`, tbl_abl: `width: 90%; margin: auto;`, th: `font-weight: bold; ` + `text-align: center; ` + `line-height:18px; ` + `padding: 0px 5px 0px;`, td: `text-align: center; ` + `line-height:18px; ` + `padding: 0px 5px 0px;"`, tbl_skl: `width: 90%; margin: auto;`, tr_even: `background-color: ${values.blind ? "#cfd2d0" : "#e0e5c1" };`, //cfd2d0 //e0e5c1 ${values.blind ? "cfd2d0" : "e0e5c1" } tr_odd: `background-color: ${values.blind ? "#eeeeee" : "#ffffff" };` //transparent #ffffff ${values.blind ? "#eeeeee" : "#ffffff" } }; let passive = `Passive Wisdom:&amp;nbsp;` + `&lt;span class="${s.inlineclass}" style="${s.inlinestyle}" title="10 + ${getMod(values.mods.perception_bonus)}"&gt;` + `${10 + getMod(values.mods.perception_bonus)}` + `&lt;/span&gt;`; let inlineRoll = (props) =&gt; { return `&lt;span class="${s.inlineclass}" style="${s.inlinestyle}" title="${props.t1}"&gt;${props.r1}&lt;/span&gt;&amp;#171;-&amp;#187;&lt;span class="${s.inlineclass}" style="${s.inlinestyle}" title="${props.t2}"&gt;${props.r2}&lt;/span&gt;`; }; let rawRoll = inlineRoll({ t1: `Rolling 1d20(${values.frst})`, r1: values.frst, t2: `Rolling 1d20(${values.scnd})`, r2: values.scnd}); let abilityRow = (oe, l, m, sa) =&gt; { return `&lt;tr style="${oe}"&gt;` + `&lt;td style="${s.td}"&gt;` + `${l}` + `&lt;/td&gt;` + `&lt;td style="${s.rolls}"&gt;` + `${inlineRoll({ t1: `Rolling 1d20(${values.frst})+${m}`, r1: values.frst + m, t2: `Rolling 1d20(${values.scnd})+${m}`, r2: values.scnd + m })}` + `&lt;/td&gt;` + `&lt;td style="${s.rolls}"&gt;` + `${inlineRoll({ t1: `Rolling 1d20(${values.frst})+${sa}`, r1: values.frst + sa, t2: `Rolling 1d20(${values.scnd})+${sa}`, r2: values.scnd + sa })}` + `&lt;/td&gt;` + `&lt;/tr&gt;`; }; let abilityList = [ {oddeven: s.tr_even, label: 'Strength', mod: getMod(values.mods.strength_mod), save: getMod(values.mods.strength_save_bonus)}, {oddeven: s.tr_odd, label: 'Dexterity', mod: getMod(values.mods.dexterity_mod), save: getMod(values.mods.dexterity_save_bonus)}, {oddeven: s.tr_even, label: 'Constitution', mod: getMod(values.mods.constitution_mod), save: getMod(values.mods.constitution_save_bonus)}, {oddeven: s.tr_odd, label: 'Intelligence', mod: getMod(values.mods.intelligence_mod), save: getMod(values.mods.intelligence_save_bonus)}, {oddeven: s.tr_even, label: 'Wisdom', mod: getMod(values.mods.wisdom_mod), save: getMod(values.mods.wisdom_save_bonus)}, {oddeven: s.tr_odd, label: 'Charisma', mod: getMod(values.mods.charisma_mod), save: getMod(values.mods.charisma_save_bonus)} ]; let skillRow = (oe, l, m, sa) =&gt; { return `&lt;tr style="${oe}"&gt;` + `&lt;td style="${s.td}"&gt;` + `${l}` + `&lt;/td&gt;` + `&lt;td style="${s.rolls}"&gt;` + `${inlineRoll({ t1: `Rolling 1d20(${values.frst})+${m}`, r1: values.frst + m, t2: `Rolling 1d20(${values.scnd})+${m}`, r2: values.scnd + m })}` + `&lt;/td&gt;` + `&lt;/tr&gt;`; }; let skillList = [ {oddeven: s.tr_even, label: 'Athletics', mod: getMod(values.mods.athletics_bonus)}, {oddeven: s.tr_odd, label: 'Acrobatics', mod: getMod(values.mods.acrobatics_bonus)}, {oddeven: s.tr_even, label: 'Animal Handling', mod: getMod(values.mods.animal_handling_bonus)}, {oddeven: s.tr_odd, label: 'Arcana', mod: getMod(values.mods.arcana_bonus)}, {oddeven: s.tr_even, label: 'Deception', mod: getMod(values.mods.deception_bonus)}, {oddeven: s.tr_odd, label: 'History', mod: getMod(values.mods.history_bonus)}, {oddeven: s.tr_even, label: 'Insight', mod: getMod(values.mods.insight_bonus)}, {oddeven: s.tr_odd, label: 'Intimidation', mod: getMod(values.mods.intimidation_bonus)}, {oddeven: s.tr_even, label: 'Investigation', mod: getMod(values.mods.investigation_bonus)}, {oddeven: s.tr_odd, label: 'Medicine', mod: getMod(values.mods.medicine_bonus)}, {oddeven: s.tr_even, label: 'Nature', mod: getMod(values.mods.nature_bonus)}, {oddeven: s.tr_odd, label: 'Perception', mod: getMod(values.mods.perception_bonus)}, {oddeven: s.tr_even, label: 'Performance', mod: getMod(values.mods.performance_bonus)}, {oddeven: s.tr_odd, label: 'Persuasion', mod: getMod(values.mods.persuasion_bonus)}, {oddeven: s.tr_even, label: 'Religion', mod: getMod(values.mods.religion_bonus)}, {oddeven: s.tr_odd, label: 'Sleight of Hand', mod: getMod(values.mods.sleight_of_hand_bonus)}, {oddeven: s.tr_even, label: 'Stealth', mod: getMod(values.mods.stealth_bonus)}, {oddeven: s.tr_odd, label: 'Survival', mod: getMod(values.mods.survival_bonus)} ]; values.message = `` + `&lt;div style="${s.div}"&gt;` + `&lt;table style="${s.tbl_top}"&gt;` + `&lt;tr&gt;` + `&lt;td rowspan="3"&gt;` + `&lt;img style="${s.img}" src="${values.url}"&gt;` + `&lt;/td&gt;` + `&lt;td style="${s.name}"&gt;` + `${values.name}` + `&lt;/td&gt;` + `&lt;/tr&gt;` + `&lt;tr&gt;` + `&lt;td style="${s.blurb}"&gt;` + `${passive}` + `&lt;/td&gt;` + `&lt;/tr&gt;` + `&lt;tr&gt;` + `&lt;td style="${s.rolls}"&gt;` + `${rawRoll}` + `&lt;/td&gt;` + `&lt;/tr&gt;` + `&lt;/table&gt;` + `&lt;br&gt;` + `&lt;table style="${s.tbl_abl}"&gt;` + `&lt;tr&gt;` + `&lt;td style="${s.th}"&gt;` + `Ability` + `&lt;/td&gt;&lt;td style="${s.th}"&gt;` + `Check` + `&lt;/td&gt;` + `&lt;td style="${s.th}"&gt;` + `Save` + `&lt;/td&gt;` + `&lt;/tr&gt;`; abilityList.forEach( (row) =&gt; { values.message = values.message + abilityRow(row.oddeven, row.label, row.mod, row.save); }); values.message = values.message + `&lt;/table&gt;` + `&lt;br&gt;` + `&lt;table style="${s.tbl_abl}"&gt;` + `&lt;tr&gt;` + `&lt;td style="${s.th}"&gt;` + `Ability` + `&lt;/td&gt;&lt;td style="${s.th}"&gt;` + `Check` + `&lt;/td&gt;` + `&lt;/tr&gt;`; skillList.forEach( (row) =&gt; { values.message = values.message + skillRow(row.oddeven, row.label, row.mod); }); values.message = values.message + `&lt;/table&gt;` + `&lt;br&gt;` + `&lt;/div&gt;`; return values.message; }; const getAttributes = (values) =&gt; { let attrNames = [ 'strength_mod', 'dexterity_mod', 'constitution_mod', 'intelligence_mod', 'wisdom_mod', 'charisma_mod', 'strength_save_bonus', 'dexterity_save_bonus', 'constitution_save_bonus', 'intelligence_save_bonus', 'wisdom_save_bonus', 'charisma_save_bonus', 'athletics_bonus', 'acrobatics_bonus', 'animal_handling_bonus', 'arcana_bonus', 'deception_bonus', 'history_bonus', 'insight_bonus', 'intimidation_bonus', 'investigation_bonus', 'medicine_bonus', 'nature_bonus', 'perception_bonus', 'performance_bonus', 'persuasion_bonus', 'religion_bonus', 'sleight_of_hand_bonus', 'stealth_bonus', 'survival_bonus', 'passive_wisdom' ]; values.attr = filterObjs( (a) =&gt; { if ( a.get('characterid') == values.cid &amp;&amp; a.get('type') === 'attribute' &amp;&amp; attrNames.includes(a.get('name')) ) { return true; } else { return false; } }); values.mods = {}; values.attr.forEach( (a) =&gt; { let key = a.get('name'); let mod = a.get('current'); let lbl = a.get('name') .replace(/_mod/gi,'') .replace(/_bonus/gi,'') .replace(/_/g, ' '); values.mods[a.get('name')] = { key: a.get('name'), mod: (Number(mod)||~~mod) || 0, lbl: lbl }; }); sendChat('QuantumRoll', '[[2d20]]', function(qr) { values.frst = qr[0].inlinerolls[0].results.rolls[0].results[0].v; values.scnd = qr[0].inlinerolls[0].results.rolls[0].results[1].v; buildTable(values); if (values.blind) { sendChat(values.who, `/w gm ${values.message}`); sendChat('API - QuantumRoll', `/w "${values.who}" Secret roll sent to GM. I'm sure its fine.`); }else{ sendChat(values.who, values.message); } }); }; const handleInput = (msg) =&gt; { let values = {}; values.msg = msg; values.tok = getObj( values.msg.selected[0]._type, values.msg.selected[0]._id); values.cha = getObj( 'character', values.tok.get('represents')); if (values.cha) { values.cid = values.cha.get('id'); let imgsrc = values.tok.get('imgsrc'); values.url = imgsrc === '/images/character.png' ? '<a href="https://i.imgur.com/MpqETqe.png" rel="nofollow">https://i.imgur.com/MpqETqe.png</a>' : imgsrc; values.name = values.cha.get('name'); values.blind = msg.content.startsWith("!BlindChecks"); values.who = values.msg.who .substring(0, values.msg.who.indexOf(' (GM)')); } getAttributes(values); }; on("ready",() =&gt; { on('chat:message', (msg_orig) =&gt; { if (msg_orig.type === 'api' &amp;&amp; (msg_orig.content.startsWith("!OpenChecks") || msg_orig.content.startsWith("!BlindChecks")) &amp;&amp; msg_orig.selected &amp;&amp; msg_orig.selected.length == 1 ) { handleInput(_.clone(msg_orig)); } }); }); return { }; })();
1777254505

Edited 1777254538
Novercalis said: Just reformatting OP Blind Check Code for others to potentially use in their 2014 games. Original Link to Blindcheck API here:&nbsp; <a href="https://app.roll20.net/forum/post/9989663/slug%7D" rel="nofollow">https://app.roll20.net/forum/post/9989663/slug%7D</a> Thanks for responding so quickly.&nbsp; I tried your updated code but it doesn't seem to be working correctly.&nbsp; Looks like it applies a flat -5 penalty to everything and doesn't read the actual modifier: -Adam
1777660000

Edited 1777660059
Incase anyone else finds this thread, the 2014 script does not work for 2024.&nbsp; With help from another Roll20 community member (Pak), I was able to use the ScriptCards API script in combination with a Roll Template to create a macro that prints a menu of hidden check options to chat, then the player clicks on the appropriate button. It is definitely a bit of work to setup, but looks to meet the needs.&nbsp; Separately, a Roll20 mod indicated that blind check functionality was in existence for Pathfinder 2E so it should be possible for it to exist for the D&amp;D 2024 sheet.&nbsp; Sounds like its not a priority for Roll20 devs, but they might be able to get around to it in the future. -Adam
1777772156

Edited 1777772196
i just checked my blindcheck (using 2014) and I do not see the -5. Go down each category and you should see different values. I am going to assume the sheet you havem has a 0 or 1 value for str. From your screenshot it shows a 1d20 roll as well as a (+) &amp; (-5 modifier). Then again, it is also weird seeing all 1s and 11s on your screenshot.