Roll20: Difference between revisions
Line 100: | Line 100: | ||
[link or image](url) | [link or image](url) | ||
[x](img_url) | |||
*I* **love** [Roll20](https://app.roll20.net) | *I* **love** [Roll20](https://app.roll20.net) |
Revision as of 23:45, 16 November 2023
Sub Pages Table of Contents
Roll 20.net
Moving Tokens
Manipulating Graphics - Roll20 Wiki - https://wiki.roll20.net/Manipulating_Graphics
Alt key for fine movements
Tapping ←, →, ↑ or ↓ arrow keys will move a selected token one grid unit in the specified direction
X key for token past movement
Q key for waypoint movement
E and mouse wheel to rotate
Rotation
When token selected, blue handle will stick out the front of the token.
Can also hold E and mouse wheel to rotate.
Can also hold Alt + E and mouse will to rotate more accurately.
Roll Dice
/roll 1d20+10 vs AC /roll 1d4+9 Damage /roll 5+3
Ref: https://wiki.roll20.net/Dice_Reference
Ref: https://roll20.zendesk.com/hc/en-us/articles/360037773133-Dice-Reference
Inline Roll
I like the number [[1d100]] or 5+3
Drop/Keep
Advantage/Disadvantage
/r 4d20k1 # roll 4d20 keep highest /r 4d20kh1 # roll 4d20 keep highest (ditto) /r 4d20kl1 # roll 4d20 keep lowest /r 4d20dl # drop lowest /r 4d20dl # drop highest
Chat
Ref: https://wiki.roll20.net/Text_Chat
Whisper
/w [user] [msg]
Whisper to GM
/w gm [msg]
GM Roll
/gmroll 2d6+3
Emote
/em ... /me rams his dagger home
Out of Character
OOC entries always appear as the player (e.g. "Riley D.") rather than the Character you have selected in the "Speaking As" drop-down (e.g. "Orrbain").
/ooc I could really use another Red Bull right now.
Talk To Myself
/talktomyself or /talktomyself on
/talktomyself (again) or /talktomyself off
Chat Markup
Text Chat - Roll20 Wiki https://wiki.roll20.net/Text_Chat
Bold
** bold **
Italicize
* italicize*
Link or Image
[link or image](url) [x](img_url)
*I* **love** [Roll20](https://app.roll20.net)
Inline Roll
Inline roll 1d20+5
Colored Text
NOTE: Doesn't appear to work...
<inline style="color: rgb( 31 , 73 , 125 )">blue</inline>
<span style="background: yellow">OOC: What is this?</span>
Community Forums: Colored text | Roll20: Online virtual tabletop https://app.roll20.net/forum/post/2069398/colored-text
Escape Text
Start line with back tick `
`&{template:default} {{attack=[[1d20]]}}
Useful for sharing Macros
GM Descriptions
/desc (description not spoken by anyone: center aligned, bold, italicized, black font, light grey highlight) /as /emas
/gmroll in secret /gr
Talk to Myself
/talktomyself on /talktomyself off
Images
[Gold the Great](https://s3.amazonaws.com/files.d20.io/images/1725103/oXeN9hS_kB395ps0zsHD9Q/med.gif?1377575057&size=200x200#.gif)
Ref: https://app.roll20.net/forum/post/1793704/how-to-show-pictures-slash-images-to-players
---
Image by choice: (will ask for caption, and url, but provides defaults)
[?{Caption|no caption}](?{URL|http://www.d20pfsrd.com/_/rsrc/1420094759946/config/customLogo.gif?revision=40}#.png)
Macros
Anything you can command. Name the macro, and you can then call it with #[MACRO_NAME]
(Nesting Macros) Macros can also call other macros with the #[MACRO_NAME]
Use selected token: (user bar1 value
/r 1d20 + @{selected|bar1}
/r 1d20 + @{selected|Intelligence}
/r 1d20 + @{selected|token_name} fires his gun! # use selected name /r 1d20 + @{selected|character_name} fires his gun! # use selected name
ref: https://wiki.roll20.net/Macros
Roll Query
?{Prompt Message}
//Example: /roll ?{Number of Dice}d20
//You can also include a default value: (1 is default) /roll ?{Number of Dice|1}d20
?{Which macro?|Attack,#use-sword |Defend,#use-shield }
ref: https://wiki.roll20.net/Dice_Reference#Roll_Queries
Choice
?{Which |Charm, #Charm |Fear, #Fear |}
Ref: https://app.roll20.net/forum/post/5220046/macro-with-choices
There is a "Visible To" setting to share Macros with players. (Have to scroll down in the Macro edit).
Calculator Macro
Popup to do some calculations. Only slightly cooler than just typing them in the chat window directly.
**=** [[?{Calculator}}]]
note: the double asterisks simply make the = bold. The only Part you really need is in the brackets.
ref: [1]
True False Macro
On a character sheet,
Create an ability:
[Do I Like It?](~selected|bool[[ 1d2 ]])
Create a "bool1" with "True" and a "bool2" with "False" ability.
Ref: [2]
Templates
Default Template
Works on any character sheet
&{template:default} {{name=Fey Presence}} {{Charm = [Roll20 Logo](gif)}} {{Effect= A charmed creature can’t Attack the charmer or target the charmer with harmful Abilities or magical effects. The charmer has advantage on any ability check to interact socially with the creature.}}
1d20
&{template:default} {{name=Rolls a 1d20 [[1d20]]}} &{template:default} {{name=Player Name}} {{Rolls a 1d20=[[1d20]]}}
Roll Some Dice
&{template:default} {{name=Roll Some Dice}} {{1d4 = [[1d4]]}} {{1d6 = [[1d6]]}} {{1d10 = [[1d10]]}} {{1d12 = [[1d12]]}} {{1d20 = [[1d20]]}} {{1d100 = [[1d100]]}}
DnD Templates
WARNING: TEMPLATES ARE CHARACTER SHEET SPECIFIC!
Roll Stats
&{template:default} {{name= Ability Scores}} {{[[4d6kh3]][[4d6kh3]][[4d6kh3]][[4d6kh3]][[4d6kh3]][[4d6kh3]]}}
Other
&{template:default} {{name= Ability Scores}} {{[[4d6kh3]][[4d6kh3]][[4d6kh3]][[4d6kh3]][[4d6kh3]][[4d6kh3]]}}
&{template:desc} {{desc=desc}}
&{template:simple} {{rname=rname}} {{mod=mod}} {{r1=r1}} {{always=1}} {{r2=r2}} {{charname=charname}}
&{template:spell} {{level=school level}} {{name=name}} {{castingtime=castingtime}} {{range=range}} {{target=target}} {{v=1}} {{s=1}} {{m=1}} {{material=material}} {{duration=duration}} {{description=description}} {{athigherlevels=athigherlevels}} {{ritual=1}} {{concentration=1}} {{charname=charname}}
&{template:npcaction} {{attack=1}} {{damage=1}} {{dmg1flag=1}} {{dmg2flag=1}} {{name=name}} {{rname=rname}} {{r1=r1}} {{always=1}} {{r2=r2}} {{dmg1=dmg1}} {{dmg1type=dmg1type}} {{crit1=crit1}} {{dmg2=dmg2}} {{dmg2type=dmg2type}} {{crit2=crit2}} {{description=description}}
&{template:npcatk} {{attack=1}} {{name=name}} {{rname=rname}} {{rnamec=rnamec}} {{r1=r1}} {{always=1}} {{r2=r2}} {{description=description}}
For more templates: https://wiki.roll20.net/D%26D_5e_by_Roll20_Roll_Templates
My Template Creations
Character Initiative:
&{template:simple} {{rname=INITIATIVE}} {{mod= @{selected|initiative_bonus} }} {{r1= [[ 1d20 + @{selected|initiative_bonus} &{tracker} ]] }} {{normal=Hello World}}
NPC Initiative:
&{template:npcaction} {{rname=Initiative}} {{description=Initiative: [[ 1d20 + @{selected|initiative_bonus} &{tracker} ]] }}
CoC Templates
Call of Cthulhu Initative
@{selected|token_name} has [[ @{selected|dexterity} &{tracker} ]] for initiative.
With readied weapon:
@{selected|token_name} has [[ 50+@{selected|dexterity} &{tracker} ]] for initiative.
Old one I used:
/me rolls [[ @{selected|dexterity_mod}+1d20 &{tracker} ]] for initiative.
Call of Cthulhu Sheet
&{template:callofcthulhu} {{name=Some test...}}
Roll Stats
&{template:default} {{name=ATTRS}} {{STR=[[3d6*5]]}} {{CON=[[3d6*5]]}} {{POW=[[3d6*5]]}} {{DEX=[[3d6*5]]}} {{APP=[[3d6*5]]}} {{SIZ=[[(2d6+6)*5]]}} {{INT=[[(2d6+6)*5]]}} {{EDU=[[(2d6+6)*5]]}} {{LCK=[[3d6*5]]}}
ref: [3]
Roll 1d100 and 1d10
&{template:default} {{name=Roll 1d10}} {{Result = [[1d10]]}} &{template:default} {{name=Roll 1d100}} {{Result = [[1d100]]}} &{template:default} {{name=Roll 1d4: ?{For|}}} {{Result = [[1d4]]}} &{template:default} {{name=Roll 1d6: ?{For|}}} {{Result = [[1d6]]}} &{template:default} {{name=Roll 1d10: ?{For|}}} {{Result = [[1d10]]}} &{template:default} {{name=Roll 1d12: ?{For|}}} {{Result = [[1d12]]}} &{template:default} {{name=Roll 1d20: ?{For|}}} {{Result = [[1d20]]}} &{template:default} {{name=Roll 1d100: ?{For|}}} {{Result = [[1d100]]}}
Hard vs Extreme
/roll 1d100 vs [[@{selected|accounting}]]/[[floor(@{selected|accounting}/2)]]/[[floor(@{selected|accounting}/5)]]
/roll 1d100 vs [[@{str}]]/[[floor(@{str}/2)]]/[[floor(@{str}/5)]]
General Dice Roller
&{template:callofcthulhu} {{roll_type=General Dice Roller}} {{title=?{Source|Something Strange}}} {{roll=[[?{Dice to Roll|2d6/1d3/3d10}]]}} {{text=Notes: ?{Notes|Put notes here for future reference.}}}
Note: can skipp "roll_type", but keep title.
Firing Damage
&{template:callofcthulhu} {{roll_type="Little" Jimmy Foster}} {{title=Wild Tommy Gun Fire}} {{roll=[[1d6]] Damage}} {{text=For more information, see ***[Starting The Action](http://journal.roll20.net/handout/-LyjjADrc7rY7Swfqdz_)***.}}
Sanity Rewards
&{template:callofcthulhu} {{roll_type=Conclusion}} {{title=Sanity Rewards}} {{roll=[[?{Stopped Turner without killing him|Yes,2d6|No,0|Killed Turner,-1d6}+?{Stole or secured the trumpet|Yes,1|No,0}+?{Turned in Boss Bonato|Yes,1d3|No,0}]] Sanity Points}} {{text=For more information, see ***[Conclusion](http://journal.roll20.net/handout/-Lyji5w0exosX92Auwdb)***.}}
Percentile Dice Roller
&{template:callofcthulhu} {{roll_type=Percentile Dice Roller}} {{title=?{Source|Something Strange}}} {{roll=[[1d100]] vs **?{Comparison|0}**}} {{text=Notes: ?{Notes|Put notes here for future reference.}}}
Note: can skipp "roll_type", but keep title.
Armor
&{template:callofcthulhu} {{name=@{character_name}}} {{title=Armor + Shields + Death Bringer Cloak Absorbs}} {{roll=[[1d8+1d6+1d4]]}}
Delta Green Templates
&{template:rolls} {{header=bob}} {{subheader=50}} {{dice=[[1d2]]}}
&{template:rolls} {{header=bob}} {{desc=hello}}
Script Examples
Ray of Frost damage
Ray of Frost damage 1d8 per 1st, 5th, 11th, 17th
[[round((@{level} + 1) / 6 + 0.5)]]d8
Magic Missile Damage
?{MissleCount|3}d4+?{MissleCount}
Import DnD Beyond Characters
https://github.com/RobinKuiper/Roll20APIScripts
Raw source of script:
https://raw.githubusercontent.com/RobinKuiper/Roll20APIScripts/master/BeyondImporter_5eOGL/BeyondImporter.js
DnD Beyond character add /json, copy and paste into chat:
!beyond --import [JSON.....]
Initiative Roll Macro
WARNING: None of these auto handle advantage initiative...
Initative Template:
&{template:simple} {{rname=INITIATIVE}} {{mod= @{selected|initiative_bonus} }} {{r1= [[ 1d20 + @{selected|initiative_bonus} &{tracker} ]] }} {{normal=1}}
Force Initiative Advantage:
&{template:simple} {{rname=INITIATIVE ADV}} {{mod= @{selected|initiative_bonus} }} {{r1= [[ {1d20,1d20}kh1 + @{selected|initiative_bonus} &{tracker} ]] }} {{normal=1}}
ref: [4]
// @{selected|token_name} rolls [[ @{selected|dex_mod}+1d20 &{tracker} ]] for initiative. @{selected|token_name} rolls [[ 1d20 + @{selected|initiative_bonus} &{tracker} ]] for initiative.
or
Rolling Initiative for @{selected|token_name}: [[ 1d20+?{Initiative Bonus|0} &{tracker} ]]
NPC Macro: (doesn't work with player characters)
%{selected|npc_init}
Call of Cthulhu Initative
@{selected|token_name} has [[ @{selected|dexterity} &{tracker} ]] for initiative.
With readied weapon:
@{selected|token_name} has [[ 50+@{selected|dexterity} &{tracker} ]] for initiative.
Old one I used:
/me rolls [[ @{selected|dexterity_mod}+1d20 &{tracker} ]] for initiative.
Delta Green Initiative
@{selected|token_name} Initiative Roll [[@{selected|dexterity_score} [dexterity_score] &{tracker}]]
What's My Luck
@{selected|token_name} has [[ @{selected|luck} ]] luck
Fog of War and Dynamic Lighting
Fog of War - Forced Darkness layer by DM
Advanced Fog of War - Gray Darkness layer
- Show Grid - Show grid through fog of war and shadows
- Dim Light Reveals -
- All Tokens Reveal (GM) -
Dynamic Lighting
- Enforce Line of Sight - Players can only see light that they can directly see
- Only Update on Drop - Update areas only drop (good to keep players from sneaking around walls and back)
- Restrict Movement - Can't cross DL lines (must have sight)
- Global Illumination - No shadows (only when you only want restrict only)
Campaign Settings
Allow players to import their own Characters? Yes
ROLL QUERIES: Advantage Toggle WHISPER ROLLS TO GM: Whisper Toggle
My preferred for Compendium Monster drops:
BAR 1 VALUE: npc_challenge BAR 2 VALUE: npc_ac BAR 3 VALUE: hp_max BAR 3 MAX: hp_max * all others are blank
Sanity Score: On
5e.tools
Import Monster Manual
https://5e.tools/roll20.html
https://wiki.5e.tools/index.php/Better20_User_Guide
Advanced Keyboard Shortcuts
m Switch to @ Map & Background Layer o Switch to b Object & Tokens Layer k Switch to E GM Info Layer , Switch to r Dynamic Lighting Layer
l m Move selected object(s) to @ Map & Background Layer l o Move selected object(s) to b Object & Tokens Layer l k Move selected object(s) to E GM Info Layer l , Move selected object(s) to r Dynamic Lighting Layer
ref: https://wiki.roll20.net/Advanced_Shortcuts
Tips and Tricks
Community Forums: Stupid Roll20 Tricks (and some clever ones) | Roll20: Online virtual tabletop
https://app.roll20.net/forum/post/5899495/stupid-roll20-tricks-and-some-clever-ones/
Auto Racking Ammunition
- Add "5th Edition OGL by Roll20 Companion" API script (Pro only)
- Character sheet (or default in game settings) - set "Ammo Tracking" to "On"
- Edit equipment to "Use as a resource"
- Edit Weapon and set "Ammunition" to name of resource
D&D 5E by Roll20: How to setup Ammunition and Resource tracker - Roll20 Wiki
https://wiki.roll20.net/OGL_5e_DnD:_How_to_setup_Ammunition_and_Resource_tracker
Addons
- Roll20/The Sunless Citadel (Tales from the Yawning Portal)
- Roll20/Rrakkma - Mordenkainen's Tome of Foes Introductory Adventure
- Roll20/Roll20 Pro Map Pack
- Roll20/Pathfinder Playtest Flip-Mat Multi-Pack
Bloodied and Dead Status Markers
bloodied.js:
on("change:graphic", function(obj) { // Settings: //var lifeBarNumber = 3; // 3:red; 2:blue; 1:green var lifeBarNumber = 0; // 3:red; 2:blue; 1:green var percentForRedmark = 50; // Write for example 50 for 50% var totalKillThreshold = -10; // As soon as a tokens life goes bellow this value // it gets an additional (killed) symbol. // Auto select bar1 or bar3 // Is life bar set at all? // If not simply escape the function. if(obj.get("bar1_max") === "") { if(obj.get("bar3_max") === "") { return; } else { lifeBarNumber = 3; } } else { lifeBarNumber = 1; } // Back from the dead? if((obj.get("status_dead") == true || obj.status_skull == true) && obj.get("bar" + lifeBarNumber + "_value") > 0){ SetStatuSymbolById(obj,3,1); } // Total-kill if(obj.get("bar" + lifeBarNumber + "_value") <= totalKillThreshold){ SetStatuSymbolById(obj,0,0); SetStatuSymbolById(obj,1,1); SetStatuSymbolById(obj,2,1); SetStatuSymbolById(obj,3,0); } // Dead else if(obj.get("bar" + lifeBarNumber + "_value") <= 0){ SetStatuSymbolById(obj,0,0); SetStatuSymbolById(obj,1,1); SetStatuSymbolById(obj,2,0); SetStatuSymbolById(obj,3,0); } // Bellow x% life else if(obj.get("bar" + lifeBarNumber + "_value") <= obj.get("bar" + lifeBarNumber + "_max") / 100 * percentForRedmark) { SetStatuSymbolById(obj,0,1); SetStatuSymbolById(obj,1,0); SetStatuSymbolById(obj,2,0); } else{ ResetDeathSymbols(obj); // Back from the dead but now again with full (or beyond that) health? // TODO: >= not working..? if(obj.get("bar" + lifeBarNumber + "_value") == obj.get("bar" + lifeBarNumber + "_max")){ SetStatuSymbolById(obj,3,0); } } }); /* Reset the following symboles redmarker, dead & skull */ function ResetDeathSymbols(obj){ SetStatuSymbolById(obj,0,0); SetStatuSymbolById(obj,1,0); SetStatuSymbolById(obj,2,0); } /* Sets the value of a given tokens symbol by the symbols id symbolid: 0:redmarker 1:dead 2:skull 3:death-zone x:y value: true/1 or false/0 */ function SetStatuSymbolById(obj, symbolid, value) { switch(symbolid){ case 0: SetStatusSymbolByName(obj, "redmarker", value); break; case 1: SetStatusSymbolByName(obj, "dead", value); break; case 2: SetStatusSymbolByName(obj, "skull", value); break; case 3: SetStatusSymbolByName(obj, "death-zone", value); break; default: // Something is wrong so log it and exit. log("Error: SetStatuSymbolById - There was no usable number for symbolid given!"); log(" Object name: " + obj.get("name") + "; symbolid: " + symbolid + "; value: " + value); return; } } /* Sets the value of a given tokens symbol by the symbols name value: true/1 or false/0 */ function SetStatusSymbolByName(obj, symbolname, value){ value = CheckForTrueOrFalse(value); // Set the symbols value. obj.set("status_" + symbolname, value); } /* Checks if a given value is true or false. value: 0:false 1:true default:false */ function CheckForTrueOrFalse(value){ if (value === 0){value = false;} else if (value === 1){value = true;} else if (value === true || value === false){ // Nothing to do, these are valid values. } // The input for value is not known, therefore we set it to false. else{ value = false; log("Error: CheckForTrueOrFalse - An unhandled value has been used!"); log(" value has been set to de default value " + value); } return value; } /* Debug function Place where ever you would like to see the actual values. */ function DebugMe(obj,msg){ log("--- DEBUG: " + msg + "---"); log("obj name: " + obj.get("name")); log("status values:"); log("redmarker: " + obj.get("status_redmarker")); log("dead: " + obj.get("status_dead")); log("skull: " + obj.get("status_skull")); log("death: " + obj.get("status_death")); }
Original:
- Community Forums: [Script] Bloodied and Dead Status Markers - Extended | Roll20: Online virtual tabletop - https://app.roll20.net/forum/permalink/725584/
Cuerpo ref: https://app.roll20.net/users/389397/cuerpo
ref: https://wiki.roll20.net/API:Cookboox
:Bloodied_and_Dead_Status_Markers
https://wiki.roll20.net/Script:Bloodied_and_Dead_Status_Markers
Scripts moved to: https://github.com/Roll20/roll20-api-scripts/tree/44c583189173bd5cfb68031f6b1a6a869c0b24a4/Bloodied%20and%20Dead%20Status%20Markers
bloodied.js
var barValue = "bar1"; var acceptedValues = ["bar1", "bar2", "bar3"]; on('chat:message', function (msg) { if (msg.type == 'api' && msg.content.indexOf('!ChangeBar') !== -1) { var message = msg.content.split(" ")[1]; log("Message: " + message); if (acceptedValues.includes(message)) { barValue = message; log("Blood and Dead bar value changed to " + message); } } }); on("change:graphic:bar1_value", function(obj) { if(obj.get("bar1_max") === "") return; if(obj.get("bar1_value") <= obj.get("bar1_max") / 2) { obj.set({ status_redmarker: true }); } else{ obj.set({ status_redmarker: false }) } if(obj.get("bar1_value") <= 0) { obj.set({ status_dead: true }); } else { obj.set({ status_dead: false }); } });
Roll20 Scripts Collection
https://github.com/Roll20/roll20-api-scripts/
Puzzle Packs
https://marketplace.roll20.net/browse/publisher/91/paul-camp
Escape the Room: Fantasy Edition | Roll20 Marketplace: Digital goods for online tabletop gaming https://marketplace.roll20.net/browse/gameaddon/359/escape-the-room-fantasy-edition
DnDBeyond Integration
Beyond 20 - Chrome Web Store https://chrome.google.com/webstore/detail/beyond-20/gnblbpbepfbfmoobegdogkglpbhcjofh?hl=en
Forums
Colored Text
"I do all of my editing in office [Word], then copy/paste into Roll20."
Community Forums: Colored text | Roll20: Online virtual tabletop https://app.roll20.net/forum/post/2069398/colored-text
Status Page
503 Service Unavailable
There was not a server available to handle your request. Most of the time this is a temporary error -- try reloading. If you are consistently seeing this error, then there may be an issue with the site. See the status page: http://status.roll20.net
http://status.roll20.net
Long Rest
The "5th Edition OGL by Roll20 Companion" includes a !longrest command.
If you want to call a list of characters in a super macro:
!longrest @{Bob|character_name} !longrest @{Sue|character_name}
or by Character ID:
!longrest @{Bob's character id|character_name} !longrest @{Sue's character id|character_name}
If you add in the ChatSetAttr you can also reset Resources too..
!longrest @{selected|character_name} !setattr --silent --sel --hp|@{selected|hp|max} !setattr --silent --sel --class_resource|@{selected|class_resource|max} !setattr --silent --sel --other_resource|@{selected|other_resource|max} &{template:npcaction} {{name=@{selected|character_name}}} {{rname=Long Rest}} {{description=Reset HP, Spell Slots, @{selected|class_resource_name}, @{selected|other_resource_name}}}
If you have other resources:
&{template:npcaction} {{name=@{selected|character_name}}} {{rname=Long Rest}} {{description=Reset HP, Spell Slots, @{selected|class_resource_name}, @{selected|other_resource_name}, @{selected|repeating_resource_$0_resource_left_name}, @{selected|repeating_resource_$0_resource_right_name}}} !setattr --silent --sel --repeating_resource_$0_resource_left|@{selected|repeating_resource_$0_resource_left|max} !setattr --silent --sel --repeating_resource_$0_resource_right|@{selected|repeating_resource_$0_resource_right|max}
If you don't want HP to reset on Long Rest: (as the values are all calculated prior to the script running)
!setattr --silent --sel --hp|@{selected|hp}
API Scripts
Category:User API Scripts - Roll20 Wiki https://wiki.roll20.net/Category:User_API_Scripts
My Custom Favorites
Bloodied and Dead Status Markers
World Map Discovery (I like my custom version better)
My 1st Favorites
- 5th Edition OGL by Roll20 Companion
- Token Fate
- True Page Copy
My 2st Favorites
- DeathTracker
- DryErase
- DLEllipseDrawer
- Hourglass
- It's a Trap!
- Path Splitter
- PublicSheet
- Marking Conditions
- One-Way Dynamic Lighting
- TokenNameNumber
- Torch
- TurnClock
- World Map Discovery (I like my custom version better)
Dependencies
- Character Sheet Utils
- HTML Builder
- MatrixMath
- Path Math
- splitArgs
- Token Collisions
- Vector Math
Call of Cthulhu Sheet
&{template:callofcthulhu} {{name=Some test...}}