Skip to content

Instantly share code, notes, and snippets.

on("ready",function(){
on("change:campaign:playerpageid",function(){
setTimeout(function(){
pingStartToken();
},1500);
});
on("chat:message",function(msg){
if(msg.type=="api" && msg.content.indexOf("!pingStart")==0){
pingStartToken();
!power {{
--name|Ray of Frost
--leftsub|Ranged Spell Attack
--rightsub|60 ft Range
--npc_qualities_summary @{target|character_id}
--Attack:|[[ [$Atk] ?{Attack|Standard,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1} + @{spell_attack_bonus} ]] vs AC @{target|AC}
--?? $Atk >= @{target|AC} AND $Atk.base <> 20 ?? Damage:|[[ [$Dmg] 2d8 ]]
--?? $Atk.base == 20 ?? Critical Hit|[[ [$CritDmg] 4d8 ]]
--soundfx|_audio,play,nomenu|freezeRay
--vfx_opt|@{selected|token_id} @{target|token_id} beam-frost
on("chat:message", function(msg)
{
if (msg.type == "api" && msg.content.indexOf("!customSpellbook") == 0){
var args = msg.content.split(/\s+/);
var spellName = args[1].toLowerCase();
var spellLevel = Number(args[2]);
var tokenid = msg.selected[0]._id;
var token = getObj("graphic",tokenid);
var charID = token.get("represents");
var tokenName = token.get("name");
function updateRoll20AM(){
sendChat("API","!roll20AM --config,remove");
sendChat("API","!roll20AM --config,import");
}
on("add:jukeboxtrack",function(){
updateRoll20AM();
});
on("change:jukeboxtrack",function(){
on("ready",function(){
on("change:campaign:playerpageid",function(){
log("Here")
setTimeout(function(){
pingStartToken();
},1500);
});
on("chat:message",function(msg){
if(msg.type=="api" && msg.content.indexOf("!pingStart")==0){
on("ready",function(){
on("chat:message",function(msg){
if(msg.type=="api" && msg.content.indexOf("!gatherRumors")==0){
var args = msg.content.split("--");
var PC = args[1].trim();
var NPC = args[2].trim();
var checkType = args[3].trim().toLowerCase();
var npcToken = getObj("graphic",NPC);
var pcSheet = getObj("character",PC);
on("ready",function(){
on("chat:message",function(msg){
if(msg.type=="api" && msg.content.indexOf("!ouija")==0){
let args = msg.content.split("--");
let commandText = args[1].trim().toLowerCase();
let params = commandText.split("|");
let command = params[0];
let commandValue = params[1];
let ouijaPage = findObjs({type:"page",name:"ouija"})[0];
on("chat:message",function(msg){
if(msg.type=="api" && msg.content=="!partyMover"){
buildPartyMoverMacro();
}
});
on("change:page:name",function(){
buildPartyMoverMacro();
sendChat("API","!mc refresh");
})
@nolivo
nolivo / gist:b89a06f88bdbb02793dc295800ded003
Created February 18, 2021 02:18
Macros from the Making More Macros video
Great Weapon Fighting
&{template:default} {{name=Great Weapon Fighting}} {{Attack=[[1d20 + @{strength_mod}[STR] + @{pb}[PB]]] | [[1d20 + @{strength_mod}[STR] + @{pb}[PB]]]}} {{Standard Damage=[[ 2d6ro<2 + @{strength_mod}]]}} {{Crit (if applicable)=[[2d6ro<2]]}}
Halo of Spores
&{template:default} {{name=Halo of Spores}} {{Necrotic Damage=[[1d[[4 + 2 * {6, 10, 14}<@{level}]]]] }} {{Saving Throw = @{spell_save_dc} CON Save negates}}
Eldritch Blast
&{template:default} {{name=Eldritch Blast}} {{Attack = [[1d20ro1 + @{charisma_mod}]]}} {{Damage=[[ 1d10 + @{charisma_mod} [AgonizingBlast]+ @{pb} [Thunder] ]]}}
/fx beam-death @{selected|token_id} @{target|token_id}
@nolivo
nolivo / spiritualWeapon.js
Last active January 4, 2022 06:55
A script for use with Roll20 to summon a spiritual weapon to the right of a selected character's token
on("ready",function()
{
on("chat:message",function(msg){
if(msg.type=="api" && msg.content.indexOf("!spiritualWeapon")==0 && playerIsGM(msg.playerid))
{
var selected = msg.selected;
if (selected===undefined)
{
sendChat("API","Please select a character.");
return;