Skip to content

Instantly share code, notes, and snippets.

@keithcurtis1
keithcurtis1 / KeyCapture
Created October 24, 2025 00:49
Key Capture for Roll20, userscript written by the Aaron
// ==UserScript==
// @name Key Capture
// @namespace Violentmonkey Scripts
// @match https://app.roll20.net/editor/
// @grant unsafeWindow
// @version 1.0
// @author -
// @description 6/9/2021, 2:13:30 PM
// @require https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js
// ==/UserScript==
@keithcurtis1
keithcurtis1 / LayerCompBrowser.jsx
Last active October 15, 2025 21:35
Layer Comp Browserfor Photoshop
#target photoshop
(function () {
if (!app.documents.length) {
alert("No document is open.");
return;
}
var doc = app.activeDocument;
@keithcurtis1
keithcurtis1 / 5eMarkdownScript.css
Created October 10, 2025 03:15
5e CSS for Roll20 Markdown script
bg {
background-image: url('https://i.imgur.com/vjL1blE.jpg');
padding: 30px;
padding-top: 1px;
margin: -30px;
}
p {
font-family: Georgia;
font-size: 13px;
@keithcurtis1
keithcurtis1 / Spell Reporter - Using InsertArg
Created September 9, 2020 17:20
This macro creates a spell list for the selected character. The list is presented as a whispered menu, and clicking on any spell will output a spellcard to chat, useful for presenting details of a spell during the game, regardless of the spells settings, and without triggering athe usage of a spell slot. The macro requires the user to install th…
!ia --menu --row#spellreport --^^spellreport#getrow{{!!t#Cantrips !!c#ffffff !!s#getrepeating{{!!c#@{selected|character_name} !!d# |  !!s#spell-cantrip !!sfxn#spellname !!op#bC !!emptyok !!sfxa#spellname !!sfxlist#spellschool School:|spellcastingtime Casting Time:|spellrange Range:|spelltarget Target:|spellcomp_materials Components:|spellduration Duration:|spelldescription Description: (fw) !!frmt#o+}}}} --^^spellreport#getrow{{!!t#Level 1 !!f#.9 !!s#getrepeating{{!!c#@{selected|character_name} !!d# |  !!s#spell-1 !!sfxn#spellname !!op#bC !!emptyok !!sfxa#spellname !!sfxlist#spellschool School:|spellcastingtime Casting Time:|spellrange Range:|spelltarget Target:|spellcomp_materials Components:|spellduration Duration:|spelldescription Description: (fw) !!frmt#o+}}}} --^^spellreport#getrow{{!!t#Level 2 !!c#ffffff !!s#getrepeating{{!!c#@{selected|character_name} !!d# |  !!s#spell-2 !!sfxn#spellname !!op#bC !!emptyok !!sfxa#spellname !!sfxlist#spellschool School:|spellcastingtime
!chatmenu @{selected|character_id} {template:npcaction}{{rname=@{selected|character_name}}}{{name=Put non-spell invocations in here}}{{description=CHATMENU}} --separator: | --title:Cantrips — *Save DC @{selected|spell_save_dc}* --repeating_spell-cantrip|spellname|spell|spellsource=Mystic --title:Lvl-1 *(@{selected|class_resource}/@{selected|class_resource|max})* --repeating_spell-1|spellname|spell|spellsource=slot --title:Lvl 2 --repeating_spell-2|spellname|spell|spellsource=slot --title:Lvl 3 --repeating_spell-3|spellname|spell|spellsource=slot --title:Lvl 4 --repeating_spell-4|spellname|spell|spellsource=slot --title:Lvl 5 --repeating_spell-5|spellname|spell|spellsource=slot --title:Invocation-1 --repeating_spell-1|spellname|spell|spellsource=invocation --title:Invocation-2 --repeating_spell-2|spellname|spell|spellsource=invocation --title:Invocation-3 --repeating_spell-3|spellname|spell|spellsource=invocation --title:Invocation-4 --repeating_spell-4|spellname|spell|spellsource=invocation --title:Invoca
@keithcurtis1
keithcurtis1 / Mass Sight
Created May 25, 2020 16:51
This Roll20 script sets the has sight setting for mass tokens. Use with caution. Command is: !set-has-sight --[true|false] --[npc|pc|all]
on('ready',()=>{
const playerCanControl = (obj, playerid='any') => {
const playerInControlledByList = (list, playerid) => list.includes('all') || list.includes(playerid) || ('any'===playerid && list.length);
let players = obj.get('controlledby')
.split(/,/)
.filter(s=>s.length);
if(playerInControlledByList(players,playerid)){
return true;
!chatmenu @{selected|character_id} {template:npcaction}{{rname=@{selected|character_name}}}{{name=@{selected|npc_type}
**HP: **@{selected|bar1} / @{selected|hp|max} | ** AC: ** @{selected|npc_ac} | **Spd: ** @{selected|npc_speed}
**Languages: **@{selected|npc_languages}
**Senses: **@{selected|npc_senses}
 **Resists:: **@{selected|npc_resistances}
 **Immune: **@{selected|npc_immunities}
 **Cond. Immune: **@{selected|npc_condition_immunities}}}{{description=CHATMENU}} --separator: | --title:Ability Rolls --**Str @{selected|strength}** *(@{selected|strength_mod})* ,strength|**Dex @{selected|dexterity}** *(@{selected|dexterity_mod})*,dexterity|**Con @{selected|constitution}** *(@{selected|constitution_mod})* ,constitution|**Int @{selected|intelligence}** *(@{selected|intelligence_mod})* ,intelligence|**Wis @{selected|wisdom}** *(@{selected|wisdom_mod})*,wisdom|**Cha @{selected|charisma}** *(@{selected|charisma_mod})*,charisma --title:Saving Throws --Str,npc_str_save|Dex,npc_dex_save|Con,npc_con_save|Int,npc_in
!chatmenu @{selected|character_id} {template:npcaction}{{rname=@{selected|character_name}}}{{name=@{selected|class_display}
@{selected|race_display}, @{selected|background}
**Jump** - Long [[(@{selected|strength}/2)]] / [[@{selected|strength}]]ft. | High [[((@{selected|strength_mod}+2)/2)]] / [[@{selected|strength_mod}+2]] ft.
**HP: **@{selected|hp} / @{selected|hp|max} | ** AC: ** @{selected|ac} | **Spd: ** @{selected|speed} | **Passive: ** @{selected|passive_wisdom}}}{{description=CHATMENU }} --separator: |   --title:Ability Rolls --**Str @{selected|strength}** *(@{selected|strength_mod})* ,strength|**Dex @{selected|dexterity}** *(@{selected|dexterity_mod})*,dexterity|**Con @{selected|constitution}** *(@{selected|constitution_mod})* ,constitution|**Int @{selected|intelligence}** *(@{selected|intelligence_mod})* ,intelligence|**Wis @{selected|wisdom}** *(@{selected|wisdom_mod})*,wisdom|**Cha @{selected|charisma}** *(@{selected|charisma_mod})*,charisma --title:Saving Throws --Str,strength_save|Dex,dexterity_