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 .
×

Advanced Dungeons and Dragons 1e Macros

I've worked on some macros for 1e in case anyone wants to use them. Getting Lost&nbsp; /w gm &amp;{template:general} {{name=Becoming Lost}} {{Modifier=[[?{Modifiers: /Featureless:-50/ /Darkness:-70/ /Overcast:-30/ /Navigator with group:+30/ /Landmark sighted:+15/ /Local guide: Variable/ /Poor trail:-10/ /Raining:-10/ /Directions: Variable/ /Fog or mist: -30|0}]]}} {{Roll=[[1d100 + ?{Modifiers: /Featureless:-50/ /Darkness:-70/ /Overcast:-30/ /Navigator with group:+30/ /Landmark sighted:+15/ /Local guide: Variable/ /Poor trail:-10/ /Raining:-10/ /Directions: Variable/ /Fog or mist: -30|0}]]%}} {{Result=?{Terrain Type| Plain,Lost on 1-10. Direction roll [[1d6]]| Scrub,Lost on 1-30. Direction roll [[1d6]]| Forest,Lost on 1-70. Direction roll [[1d6]]| Rough,Lost on 1-30. Direction roll [[1d6]]| Desert,Lost on 1-40. Direction roll [[1d6]]| Hills,Lost on 1-20. Direction roll [[1d6]]| Mountains,Lost on 1-50. Direction roll [[1d6]] | Marsh,Lost on 1-60. Direction roll [[1d6]] }}} {{Direction_Key=[x](<a href="https://files.d20.io/images/479852746/uiD6pT9Ve8y9n7YVm6EMxQ/original.png" rel="nofollow">https://files.d20.io/images/479852746/uiD6pT9Ve8y9n7YVm6EMxQ/original.png</a>) Miles Traveled Lost :&nbsp; &nbsp;[[1d8]] }} Fall Damage using system shock as a save.&nbsp; &amp;{template:general} {{name=Fall Damage}} {{Distance=?{Fall distance in feet|} ft}} {{Damage=[[(?{Fall distance in feet|}/10)d6]]}} }} &amp;{template:general} {{color=@{selected|color_option}}} {{name=@{selected|character_name}}} {{subtag=System Shock Survival}} {{roll_low=[[1d100]] %}} {{roll_target=[[@{selected|systemshock}]]%&nbsp; You Only Take Half Damage if Your Roll Succeeds}}&nbsp; }} Coin Converter /w gm &amp;{template:general} {{name=Monetary Conversion}} {{Copper Pieces (cp)=[[?{Coin Type?|Copper Pieces (cp),1|Silver Pieces (sp),10|Electrum Pieces (ep),100|Gold Pieces (gp),200|Platinum Pieces (pp),1000} * ?{Amount?|1}]]}} {{Silver Pieces (sp)=[[(?{Coin Type?|Copper Pieces (cp),1|Silver Pieces (sp),10|Electrum Pieces (ep),100|Gold Pieces (gp),200|Platinum Pieces (pp),1000} * ?{Amount?|1}) / 10]]}} {{Electrum Pieces (ep)=[[(?{Coin Type?|Copper Pieces (cp),1|Silver Pieces (sp),10|Electrum Pieces (ep),100|Gold Pieces (gp),200|Platinum Pieces (pp),1000} * ?{Amount?|1}) / 100]]}} {{Gold Pieces (gp)=[[(?{Coin Type?|Copper Pieces (cp),1|Silver Pieces (sp),10|Electrum Pieces (ep),100|Gold Pieces (gp),200|Platinum Pieces (pp),1000} * ?{Amount?|1}) / 200]]}} {{Platinum Pieces (pp)=[[(?{Coin Type?|Copper Pieces (cp),1|Silver Pieces (sp),10|Electrum Pieces (ep),100|Gold Pieces (gp),200|Platinum Pieces (pp),1000} * ?{Amount?|1}) / 1000]]}} /w gm [x](<a href="https://files.d20.io/images/479813853/rBdOpNDHvS-03SShmDroMg/original.png" rel="nofollow">https://files.d20.io/images/479813853/rBdOpNDHvS-03SShmDroMg/original.png</a>) Grenade Like Missiles &amp;{template:general} {{color=black}} {{name=**Grenade-like Missiles Damage** **Container Doesn't Break Chance 25% (&gt;74%)** [[1d100]] **Range: 10ft. Attacks 11- 20ft distant are made at -2, and 21-30ft distance are at -4, etc. A miss can be calculated by direction (1d8) [1d8], **Acid Flask** Damage from a direct hit is 2d4 [[2d4]] hit points of corrosive damage. Splash damage (creatures within 5ft of the impact) is 1 [[1]] hit point.&nbsp; **Holy Water**&nbsp; Damage from a direct hit to undead creatures unless otherwise stated is 2d4[[2d4]]&nbsp; hit points. Splash damage (undead creatures within 5ft of the impact) is 2 [[2]] hit points.&nbsp; **Oil**&nbsp; Damage from a direct hit is 2d6 [[2d6]] hit points of fire damage (starting from the point it is set alight), and 1d6 hit points in the second round. Splash damage (if set alight) is 1d3 [[1d3]] hit points. &nbsp; [You Missed Results](! #Miss-Results) }}&nbsp; Miss Results &amp;{template:general} {{color=black}} {{name=**Grenade-like Missiles Misses** [x](<a href="https://files.d20.io/images/479554739/tWyyQewq6oY-qM8R97OuUw/original.png" rel="nofollow">https://files.d20.io/images/479554739/tWyyQewq6oY-qM8R97OuUw/original.png</a>) [[1d6]] Distance [[1d8]] Direction }}
Magic Resistance Table /w gm &amp;{template:general} {{name=Magic Resistance Check}} {{Caster Level=?{Caster Level|1}}} {{Creature MR=?{Creature Magic Resistance|5}%}} {{Target=[[?{Creature Magic Resistance|5}+55-(5*?{Caster Level|1})]]}} {{Roll=[[1d100]]%}} {{Caster succeeds if= $[[1]]% &gt;= $[[0]]%}}&nbsp; /w gm &amp;{template:general} {{name=[x](<a href="https://files.d20.io/images/479817806/KQXod9KIO5xHeWJgWP4F0A/original.png" rel="nofollow">https://files.d20.io/images/479817806/KQXod9KIO5xHeWJgWP4F0A/original.png</a>)}}
1773720555
vÍnce
Pro
Sheet Author
Old school cool. Thanks for sharing Rotto.
Timekeeper API !time-menu (Needs ChatSetAtter API) Tracks time in your game by minute, Turns, Hours, and Days. Can add custom timers that alert chat when expired (i.e. torches). var Timekeeper = Timekeeper || (function () { &nbsp; &nbsp; 'use strict'; &nbsp; &nbsp; var checkInstall = function () { &nbsp; &nbsp; &nbsp; &nbsp; state.Timekeeper = state.Timekeeper || { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; now: 0, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; timers: [] &nbsp; &nbsp; &nbsp; &nbsp; }; &nbsp; &nbsp; &nbsp; &nbsp; log('Timekeeper ready'); &nbsp; &nbsp; }; &nbsp; &nbsp; var pad2 = function (n) { &nbsp; &nbsp; &nbsp; &nbsp; n = parseInt(n, 10) || 0; &nbsp; &nbsp; &nbsp; &nbsp; return (n &lt; 10 ? '0' : '') + n; &nbsp; &nbsp; }; &nbsp; &nbsp; var formatClock = function (totalMinutes) { &nbsp; &nbsp; &nbsp; &nbsp; totalMinutes = Math.max(0, parseInt(totalMinutes, 10) || 0); &nbsp; &nbsp; &nbsp; &nbsp; var day = Math.floor(totalMinutes / 1440), &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rem = totalMinutes % 1440, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hour24 = Math.floor(rem / 60), &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; minute = rem % 60, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; suffix = (hour24 &gt;= 12 ? 'PM' : 'AM'), &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hour12 = hour24 % 12; &nbsp; &nbsp; &nbsp; &nbsp; if (hour12 === 0) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hour12 = 12; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; return 'Day ' + day + ', ' + hour12 + ':' + pad2(minute) + ' ' + suffix; &nbsp; &nbsp; }; &nbsp; &nbsp; var unitToMinutes = function (amount, unit) { &nbsp; &nbsp; &nbsp; &nbsp; var a = parseInt(amount, 10), &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; u = String(unit || 'min').toLowerCase(); &nbsp; &nbsp; &nbsp; &nbsp; if (isNaN(a)) return null; &nbsp; &nbsp; &nbsp; &nbsp; if (/^(m|min|mins|minute|minutes|round|rounds)$/.test(u)) return a; &nbsp; &nbsp; &nbsp; &nbsp; if (/^(turn|turns)$/.test(u)) return a * 10; &nbsp; &nbsp; &nbsp; &nbsp; if (/^(hour|hours|hr|hrs)$/.test(u)) return a * 60; &nbsp; &nbsp; &nbsp; &nbsp; if (/^(day|days)$/.test(u)) return a * 1440; &nbsp; &nbsp; &nbsp; &nbsp; return null; &nbsp; &nbsp; }; &nbsp; &nbsp; var purgeExpired = function () { &nbsp; &nbsp; &nbsp; &nbsp; var now = state.Timekeeper.now, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; active = [], &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; expired = [], &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t; &nbsp; &nbsp; &nbsp; &nbsp; for (i = 0; i &lt; state.Timekeeper.timers.length; i++) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t = state.Timekeeper.timers[i]; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (t.expiresAt &lt;= now) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; expired.push(t.label); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; active.push(t); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; state.Timekeeper.timers = active; &nbsp; &nbsp; &nbsp; &nbsp; return expired; &nbsp; &nbsp; }; &nbsp; &nbsp; var showClock = function (changeText, expiredList) { &nbsp; &nbsp; &nbsp; &nbsp; var html = '', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; remaining; &nbsp; &nbsp; &nbsp; &nbsp; html += '&lt;div style="border:1px solid #444;background:#fff;padding:6px 8px;"&gt;'; &nbsp; &nbsp; &nbsp; &nbsp; html += '&lt;div style="font-weight:bold;font-size:1.1em;margin-bottom:4px;"&gt;Campaign Clock&lt;/div&gt;'; &nbsp; &nbsp; &nbsp; &nbsp; html += '&lt;div&gt;&lt;b&gt;Current:&lt;/b&gt; ' + formatClock(state.Timekeeper.now) + '&lt;/div&gt;'; &nbsp; &nbsp; &nbsp; &nbsp; if (changeText) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; html += '&lt;div&gt;&lt;b&gt;Change:&lt;/b&gt; ' + changeText + '&lt;/div&gt;'; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; if (state.Timekeeper.timers.length) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; html += '&lt;div style="margin-top:4px;"&gt;&lt;b&gt;Active Timers:&lt;/b&gt;&lt;/div&gt;'; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (i = 0; i &lt; state.Timekeeper.timers.length; i++) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; remaining = state.Timekeeper.timers[i].expiresAt - state.Timekeeper.now; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; html += '&lt;div&gt;- ' + state.Timekeeper.timers[i].label + ' (' + remaining + ' min remaining)&lt;/div&gt;'; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; } else { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; html += '&lt;div style="margin-top:4px;"&gt;&lt;b&gt;Active Timers:&lt;/b&gt; none&lt;/div&gt;'; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; if (expiredList &amp;&amp; expiredList.length) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; html += '&lt;div style="margin-top:4px;color:#8a1c1c;"&gt;&lt;b&gt;Expired:&lt;/b&gt; ' + expiredList.join(', ') + '&lt;/div&gt;'; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; html += '&lt;/div&gt;'; &nbsp; &nbsp; &nbsp; &nbsp; sendChat('Timekeeper', '/direct ' + html); &nbsp; &nbsp; }; &nbsp; &nbsp; var showMenu = function () { &nbsp; &nbsp; &nbsp; &nbsp; var html = ''; &nbsp; &nbsp; &nbsp; &nbsp; html += '&lt;div style="border:1px solid #444;background:#fff;padding:6px 8px;"&gt;'; &nbsp; &nbsp; &nbsp; &nbsp; html += '&lt;div style="font-weight:bold;font-size:1.1em;margin-bottom:6px;"&gt;Timekeeper Menu&lt;/div&gt;'; &nbsp; &nbsp; &nbsp; &nbsp; html += '&lt;div&gt;[Show Clock](!time-show)&lt;/div&gt;'; &nbsp; &nbsp; &nbsp; &nbsp; html += '&lt;div&gt;[+1 Round](!time-advance 1 rounds)&lt;/div&gt;'; &nbsp; &nbsp; &nbsp; &nbsp; html += '&lt;div&gt;[+1 Turn](!time-advance 1 turns)&lt;/div&gt;'; &nbsp; &nbsp; &nbsp; &nbsp; html += '&lt;div&gt;[+1 Hour](!time-advance 1 hours)&lt;/div&gt;'; &nbsp; &nbsp; &nbsp; &nbsp; html += '&lt;div&gt;[+1 Day](!time-advance 1 days)&lt;/div&gt;'; &nbsp; &nbsp; &nbsp; &nbsp; html += '&lt;div&gt;[+Custom Time](!time-advance ?{Amount?|10} ?{Unit?|Minutes,min|Rounds,round|Turns,turn|Hours,hour|Days,day})&lt;/div&gt;'; &nbsp; &nbsp; &nbsp; &nbsp; html += '&lt;div&gt;[Add Timer](!time-timer ?{Label?|Torch} | ?{Amount?|60} | ?{Unit?|Minutes,min|Rounds,round|Turns,turn|Hours,hour|Days,day})&lt;/div&gt;'; &nbsp; &nbsp; &nbsp; &nbsp; html += '&lt;div&gt;[Clear Timer](!time-clear ?{Exact timer label?|Torch})&lt;/div&gt;'; &nbsp; &nbsp; &nbsp; &nbsp; html += '&lt;div&gt;[Set Clock](!time-set ?{Day?|0} ?{Hour?|8} ?{Minute?|0})&lt;/div&gt;'; &nbsp; &nbsp; &nbsp; &nbsp; html += '&lt;div&gt;[Reset Clock](!time-reset)&lt;/div&gt;'; &nbsp; &nbsp; &nbsp; &nbsp; html += '&lt;/div&gt;'; &nbsp; &nbsp; &nbsp; &nbsp; sendChat('Timekeeper', '/w gm ' + html); &nbsp; &nbsp; }; &nbsp; &nbsp; var handleInput = function (msg) { &nbsp; &nbsp; &nbsp; &nbsp; var parts, amount, unit, rest, timerBits, timerLabel, expired; &nbsp; &nbsp; &nbsp; &nbsp; if (msg.type !== 'api') return; &nbsp; &nbsp; &nbsp; &nbsp; if (msg.content === '!time-menu') { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; showMenu(); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; if (msg.content === '!time-show') { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; showClock(); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; if (!playerIsGM(msg.playerid)) return; &nbsp; &nbsp; &nbsp; &nbsp; if (msg.content.indexOf('!time-advance ') === 0) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; parts = msg.content.split(/\s+/); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; amount = parts[1]; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; unit = parts[2]; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; amount = unitToMinutes(amount, unit); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (amount === null) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sendChat('Timekeeper', '/w gm Invalid time unit.'); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; state.Timekeeper.now += amount; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; expired = purgeExpired(); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; showClock('Advanced ' + amount + ' minutes', expired); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; if (msg.content.indexOf('!time-set ') === 0) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; parts = msg.content.split(/\s+/); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; state.Timekeeper.now = (parseInt(parts[1], 10) * 1440) + (parseInt(parts[2], 10) * 60) + parseInt(parts[3], 10); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; expired = purgeExpired(); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; showClock('Clock set', expired); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; if (msg.content.indexOf('!time-timer ') === 0) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rest = msg.content.replace('!time-timer ', ''); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; timerBits = rest.split(/\s*\|\s*/); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (timerBits.length &lt; 3) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sendChat('Timekeeper', '/w gm Use: !time-timer Label | Amount | Unit'); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; amount = unitToMinutes(timerBits[1], timerBits[2]); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (amount === null || amount &lt;= 0) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sendChat('Timekeeper', '/w gm Invalid timer duration.'); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; timerLabel = timerBits[0]; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; state.Timekeeper.timers.push({ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; label: timerLabel, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; expiresAt: state.Timekeeper.now + amount &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; showClock('Added timer: ' + timerLabel); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; if (msg.content.indexOf('!time-clear ') === 0) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; timerLabel = msg.content.replace('!time-clear ', ''); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; state.Timekeeper.timers = state.Timekeeper.timers.filter(function (t) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return t.label !== timerLabel; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; showClock('Cleared timer: ' + timerLabel); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; if (msg.content === '!time-reset') { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; state.Timekeeper.now = 0; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; state.Timekeeper.timers = []; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; showClock('Clock reset'); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; }; &nbsp; &nbsp; var registerEventHandlers = function () { &nbsp; &nbsp; &nbsp; &nbsp; on('chat:message', handleInput); &nbsp; &nbsp; }; &nbsp; &nbsp; return { &nbsp; &nbsp; &nbsp; &nbsp; CheckInstall: checkInstall, &nbsp; &nbsp; &nbsp; &nbsp; RegisterEventHandlers: registerEventHandlers &nbsp; &nbsp; }; }()); on('ready', function () { &nbsp; &nbsp; 'use strict'; &nbsp; &nbsp; Timekeeper.CheckInstall(); &nbsp; &nbsp; Timekeeper.RegisterEventHandlers(); });
Commands:&nbsp;&nbsp; !time-advance 1 rounds !time-advance 1 turns !time-advance 1 hours !time-advance 1 days !time-advance 30 min !time-advance 90 minutes !time-advance 2 hour !time-set DAY HOUR MINUTE !time-set 0 8 0 !time-set 2 3 45 !time-set 5 12 30 !time-timer LABEL | AMOUNT | UNIT !time-timer Torch | 6 | turns !time-timer Bless | 1 | hour !time-timer Wandering Monster Check | 30 | minutes !time-timer Poison | 3 | rounds Clear one timer !time-clear LABEL What the menu buttons are using The !time-menu command creates buttons for: !time-show !time-advance 1 rounds !time-advance 1 turns !time-advance 1 hours !time-advance 1 days !time-advance ?{Amount?...} ?{Unit?...} !time-timer ?{Label?...} | ?{Amount?...} | ?{Unit?...} !time-clear ?{Exact timer label?...} !time-set ?{Day?...} ?{Hour?...} ?{Minute?...} !time-reset