campaign update
This commit is contained in:
		| @@ -12,14 +12,14 @@ | ||||
| <li class="dayName">Saedo</li> | ||||
|      | ||||
| <li class="firstDay">1</li>     | ||||
| <li class="currDay">2</li> | ||||
| <li>2</li> | ||||
| <li>3</li> | ||||
| <li>4</li> | ||||
| <li>5</li> | ||||
| <li>6</li> | ||||
| <li>7</li> | ||||
| <li>8</li> | ||||
| <li>9</li> | ||||
| <li class="currDay">9</li> | ||||
| <li>10</li> | ||||
| <li>11</li> | ||||
| <li>12</li> | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <div class="todayWrapper"> | ||||
|  | ||||
| As of last session, it is **the night of Tudo, the 2nd day of Porma, in the 78th year since the Eradication of King Ranulf the Just and his court**. | ||||
| As of last session, it is the **early afternoon of Trado, the 9th day of Porma, in the 78th year since the Eradication of King Ranulf the Just and his court**. | ||||
|  | ||||
| </div> | ||||
|   | ||||
| @@ -21,11 +21,13 @@ export default (() => { | ||||
|         document.documentElement.className.replace('no-js', 'js'); | ||||
|  | ||||
|     // Enable cached fonts ASAP | ||||
|     /* | ||||
|     if (!!Cookies.get('fonts_loaded')) { | ||||
|         document.documentElement.className += ' js-hasFontsLoaded'; | ||||
|     } | ||||
|     */ | ||||
|  | ||||
|     docReady(() => { | ||||
|     document.addEventListener('DOMContentLoaded', () => { | ||||
|         setTimeout(() => { | ||||
|             // Lazy-Load Media | ||||
|             if (typeof loadMedia === 'function') { | ||||
|   | ||||
| @@ -19,6 +19,46 @@ const getRandomValue = (max = 1, min = 1) => | ||||
|         const vals = [...Array(count).keys()].map(() => getRandomValue(sides)), | ||||
|             total = vals.reduce((v, a) => a + v, 0); | ||||
|         return [total, ...vals]; | ||||
|     }, | ||||
|     getRandomValueFromArray = (array = []) => { | ||||
|         if (!array.length) return ''; | ||||
|         const roll = getRandomValue(array.length); | ||||
|         return `${array[roll - 1]} (${roll})`; | ||||
|     }, | ||||
|     elementBuilder = (tag) => { | ||||
|         const el = document.createElement(tag); | ||||
|         return { | ||||
|             // need to use `function` rather than `=>` to keep `this` intact | ||||
|             addEventListener: function (type, fn) { | ||||
|                 el.addEventListener(type, fn); | ||||
|                 return this; | ||||
|             }, | ||||
|             appendChild: function (child) { | ||||
|                 el.appendChild(child); | ||||
|                 return this; | ||||
|             }, | ||||
|             appendToId: function (targetId) { | ||||
|                 const target = document.getElementById(targetId); | ||||
|                 if (target) target.append(el); | ||||
|                 return this; | ||||
|             }, | ||||
|             getElement: function () { | ||||
|                 return el; | ||||
|             }, | ||||
|             prependToId: function (targetId) { | ||||
|                 const target = document.getElementById(targetId); | ||||
|                 if (target) target.prepend(el); | ||||
|                 return this; | ||||
|             }, | ||||
|             set: function (attr, val) { | ||||
|                 el[attr] = val; | ||||
|                 return this; | ||||
|             }, | ||||
|             setInnerHTML: function (val) { | ||||
|                 el.innerHTML = val; | ||||
|                 return this; | ||||
|             }, | ||||
|         }; | ||||
|     }; | ||||
|  | ||||
| // Die Roller script | ||||
| @@ -28,6 +68,7 @@ const addRollerForm = () => { | ||||
|         rollerOutput = document.getElementById('js-rollerOutput'), | ||||
|         isExpressionRE = | ||||
|             /(?:(?:^|[-+_*/])(?:\s*-?\d*d?\d+(\.\d+)?(?:[+-]\s*\d*d?\d+)?\s*))+$/i; | ||||
|     if (!rollerForm) return; | ||||
|  | ||||
|     // double-click [x] to clear list | ||||
|     rollerForm.addEventListener('reset', (e) => { | ||||
| @@ -47,12 +88,6 @@ const addRollerForm = () => { | ||||
|             .map((roll) => { | ||||
|                 const result = dice.roll(roll), | ||||
|                     stringifiedResult = dice.stringify(result); | ||||
|                 /* | ||||
|                 console.log( | ||||
|                     { roll, result, stringifiedResult }, | ||||
|                     isExpressionRE.test(roll) | ||||
|                 ); | ||||
|                 */ | ||||
|                 return `${stringifiedResult.replaceAll( | ||||
|                     '!!!mods listing not yet complete!!!', | ||||
|                     '' | ||||
| @@ -96,6 +131,8 @@ const RoomTypes = { | ||||
|         const roomForm = document.getElementById('js-roomForm'), | ||||
|             roomOutput = document.getElementById('js-roomOutput'); | ||||
|  | ||||
|         if (!roomForm) return; | ||||
|  | ||||
|         roomForm?.addEventListener('submit', (e) => { | ||||
|             e.preventDefault(); | ||||
|  | ||||
| @@ -130,6 +167,9 @@ const shuffleContainer = (parentId) => { | ||||
|     addComplicationForm = () => { | ||||
|         const complicationForm = document.getElementById('js-complicationForm'), | ||||
|             formControls = document.createElement('div'); | ||||
|  | ||||
|         if (!complicationForm) return; | ||||
|  | ||||
|         formControls.innerHTML = [ | ||||
|             '<button id="js-btnSetDungeon">Dungeon</button>', | ||||
|             '<button id="js-btnSetWilderness">Wilderness</button>', | ||||
| @@ -185,6 +225,8 @@ const shuffleContainer = (parentId) => { | ||||
|         const complicationForm = document.getElementById( | ||||
|             'js-astralComplicationForm' | ||||
|         ); | ||||
|         if (!complicationForm) return; | ||||
|  | ||||
|         complicationForm?.addEventListener('submit', (e) => { | ||||
|             e.preventDefault(); | ||||
|             shuffleContainer('js-astralComplicationList'); | ||||
| @@ -247,19 +289,25 @@ const reactionButtonVal = [ | ||||
|  | ||||
|         // combine monster roll total + surprise + roll data | ||||
|         const monsterRollText = `<strong>${monsterTotal}${surpriseText}</strong><br /><em>[${monsterRolls}]</em>`; | ||||
|  | ||||
|         outputTable.innerHTML = [ | ||||
|             `<thead><th colspan="2">${ | ||||
|                 type === 'W' ? 'Wilderness' : 'Dungeon' | ||||
|             } Encounter<br />(3d${sides}): ${dayjs().format( | ||||
|                 'YYYY-MM-DD HH:mm:ss' | ||||
|             )}</th></thead>`, | ||||
|             '<tbody>', | ||||
|             `<tr><th>Monster</th><td>${monsterRollText}</td></tr>`, | ||||
|             `<tr><th>Distance</th><td>${distanceText}</td></tr>`, | ||||
|             `<tr><th>Reaction</th><td>${reactionText}</td></tr>`, | ||||
|             '</tbody>', | ||||
|         ].join('\n'); | ||||
|         outputTable.innerHTML = ` | ||||
|             <thead> | ||||
|                 <th colspan="2"> | ||||
|                     ${type === 'W' ? 'Wilderness' : 'Dungeon'} Encounter<br /> | ||||
|                     ${dayjs().format('YYYY-MM-DD HH:mm:ss')} | ||||
|                 </th> | ||||
|             </thead> | ||||
|             <tbody> | ||||
|                 <tr> | ||||
|                     <th>Monster</th><td>${monsterRollText}</td> | ||||
|                 </tr> | ||||
|                 <tr> | ||||
|                     <th>Distance</th><td>${distanceText}</td> | ||||
|                 </tr> | ||||
|                 <tr> | ||||
|                     <th>Reaction</th><td>${reactionText}</td> | ||||
|                 </tr> | ||||
|             </tbody> | ||||
|         `; | ||||
|         outputTable.classList.add('encounterResultTable'); | ||||
|  | ||||
|         encounterOutput.prepend(outputTable); | ||||
| @@ -267,19 +315,24 @@ const reactionButtonVal = [ | ||||
|     addEncounterRoller = () => { | ||||
|         const complicationForm = document.getElementById('js-encounterForm'), | ||||
|             formControls = document.createElement('div'); | ||||
|         formControls.innerHTML = [ | ||||
|             '<div class="encounterButtonsWrapper">', | ||||
|             '<div class="encounterButtonsDungeonWrapper"><em>Dungeon</em><br />', | ||||
|             '<button id="js-btnRollDungeonEncounter3d4">3d4</button>', | ||||
|             '<button id="js-btnRollDungeonEncounter3d6">3d6</button>', | ||||
|             '<button id="js-btnRollDungeonEncounter3d8">3d8</button>', | ||||
|             '</div>', | ||||
|             '<div class="encounterButtonsWildernessWrapper"><em>Wilderness</em><br />', | ||||
|             '<button id="js-btnRollWildernessEncounter3d4">3d4</button>', | ||||
|             '<button id="js-btnRollWildernessEncounter3d6">3d6</button>', | ||||
|             '<button id="js-btnRollWildernessEncounter3d8">3d8</button>', | ||||
|             '</div></div>', | ||||
|         ].join('\n'); | ||||
|         if (!complicationForm) return; | ||||
|  | ||||
|         formControls.innerHTML = ` | ||||
|             <div class="encounterButtonsWrapper"> | ||||
|                 <div class="encounterButtonsDungeonWrapper"> | ||||
|                     <em>Dungeon</em><br /> | ||||
|                     <button id="js-btnRollDungeonEncounter3d4">3d4</button> | ||||
|                     <button id="js-btnRollDungeonEncounter3d6">3d6</button> | ||||
|                     <button id="js-btnRollDungeonEncounter3d8">3d8</button> | ||||
|                 </div> | ||||
|                 <div class="encounterButtonsWildernessWrapper"> | ||||
|                     <em>Wilderness</em><br /> | ||||
|                     <button id="js-btnRollWildernessEncounter3d4">3d4</button> | ||||
|                     <button id="js-btnRollWildernessEncounter3d6">3d6</button> | ||||
|                     <button id="js-btnRollWildernessEncounter3d8">3d8</button> | ||||
|                 </div> | ||||
|             </div> | ||||
|         `; | ||||
|  | ||||
|         complicationForm?.appendChild(formControls); | ||||
|  | ||||
| @@ -334,12 +387,145 @@ const reactionButtonVal = [ | ||||
|             }); | ||||
|     }; | ||||
|  | ||||
| // Magic Item Concept Roller | ||||
| // Based on http://recedingrules.blogspot.com/2010/03/spell-like-effect-spur.html | ||||
|  | ||||
| const modeOpts = ['Wielder', 'Touch', 'Distance', 'Area Effect'], | ||||
|     intentOpts = ['Attack', 'Defense', 'Utility', 'Transport', 2, 3], | ||||
|     rangeOpts = [10, 20, 30, 40, 50, 60, 70, 'Sight'], | ||||
|     durationOpts = [ | ||||
|         'Instant', | ||||
|         '1 round', | ||||
|         '1d6 rounds', | ||||
|         '1 turn', | ||||
|         '1d6 turns', | ||||
|         '1 hour', | ||||
|         '1d6 hours', | ||||
|         '1 day', | ||||
|         '1d6 days', | ||||
|         'Permanent', | ||||
|     ], | ||||
|     effectOpts = [ | ||||
|         'Alter', | ||||
|         'Animate', | ||||
|         'Charm / Compel', | ||||
|         'Conjure', | ||||
|         'Delude', | ||||
|         'Dispel / Disappear', | ||||
|         'Distort', | ||||
|         'Divine', | ||||
|         'Evoke', | ||||
|         'Shield', | ||||
|         'Summon', | ||||
|         'Transmute', | ||||
|     ], | ||||
|     mediumOpts = [ | ||||
|         'Animal', | ||||
|         'Vegetable', | ||||
|         'Mineral', | ||||
|         'Metal', | ||||
|         'Fire', | ||||
|         'Earth', | ||||
|         'Water', | ||||
|         'Air', | ||||
|         'Law', | ||||
|         'Chaos', | ||||
|         'Shadow', | ||||
|         'Light', | ||||
|         'Sound', | ||||
|         'Dead', | ||||
|         'Infernal', | ||||
|         'Time', | ||||
|         'Space / Dimension', | ||||
|         'Human', | ||||
|         'Demihuman', | ||||
|         'Humanoid', | ||||
|         'Monster', | ||||
|         'Terrain', | ||||
|     ], | ||||
|     getIntent = () => { | ||||
|         const roll = getRandomValue(intentOpts.length), | ||||
|             idx = roll - 1; | ||||
|         if (typeof intentOpts[idx] === 'number') { | ||||
|             const [total, ...rolls] = rollDice(4, intentOpts[idx]); | ||||
|             return `${rolls | ||||
|                 .map((r) => `${intentOpts[r - 1]} (${r})`) | ||||
|                 .join(' / ')}`; | ||||
|         } | ||||
|  | ||||
|         return `${intentOpts[idx]} (${roll})`; | ||||
|     }, | ||||
|     getRange = () => { | ||||
|         const roll = getRandomValue(rangeOpts.length), | ||||
|             idx = roll - 1; | ||||
|  | ||||
|         if (typeof rangeOpts[idx] === 'number') { | ||||
|             const val = rangeOpts[idx]; | ||||
|             return `${val}' / ${val * 2}' / ${val * 3}' (${roll})`; | ||||
|         } | ||||
|  | ||||
|         return `${rangeOpts[idx]} (${roll})`; | ||||
|     }, | ||||
|     getResultList = () => { | ||||
|         return ` | ||||
|             Magic Item Results | ||||
|             <em>(${dayjs().format('YYYY-MM-DD HH:mm:ss')})</em> | ||||
|             <ul> | ||||
|                 <li> | ||||
|                     Mode: | ||||
|                     <strong>${getRandomValueFromArray(modeOpts)}</strong> | ||||
|                 </li> | ||||
|                 <li> | ||||
|                     Intent:  | ||||
|                     <strong>${getIntent()}</strong> | ||||
|                 </li> | ||||
|                 <li> | ||||
|                     Range:  | ||||
|                     <strong>${getRange()}</strong> | ||||
|                 </li> | ||||
|                 <li> | ||||
|                     Duration:  | ||||
|                     <strong>${getRandomValueFromArray(durationOpts)}</strong> | ||||
|                 </li> | ||||
|                 <li> | ||||
|                     Effect:  | ||||
|                     <strong>${getRandomValueFromArray(effectOpts)}</strong> | ||||
|                 </li> | ||||
|                 <li> | ||||
|                     Medium:  | ||||
|                     <strong>${getRandomValueFromArray(mediumOpts)}</strong> | ||||
|                 </li> | ||||
|             </ul>                 | ||||
|         `; | ||||
|     }, | ||||
|     addMagicItemConceptRoller = () => { | ||||
|         const magicItemConceptForm = document.getElementById( | ||||
|             'js-magicItemConcept' | ||||
|         ); | ||||
|         if (!magicItemConceptForm) return; | ||||
|  | ||||
|         magicItemConceptForm?.appendChild( | ||||
|             elementBuilder('input') | ||||
|                 .set('type', 'submit') | ||||
|                 .set('value', 'Roll!') | ||||
|                 .getElement() | ||||
|         ); | ||||
|  | ||||
|         magicItemConceptForm?.addEventListener('submit', (e) => { | ||||
|             e.preventDefault(); | ||||
|             elementBuilder('li') | ||||
|                 .setInnerHTML(getResultList()) | ||||
|                 .prependToId('js-magicItemConcept-output'); | ||||
|         }); | ||||
|     }; | ||||
|  | ||||
| export default (() => { | ||||
|     addRollerForm(); | ||||
|     addRoomForm(); | ||||
|     addComplicationForm(); | ||||
|     addAstralComplicationForm(); | ||||
|     addEncounterRoller(); | ||||
|     addMagicItemConceptRoller(); | ||||
| })(); | ||||
|  | ||||
| // @license-end | ||||
|   | ||||
| @@ -472,6 +472,21 @@ a.licenseLink:hover { | ||||
| 	border-color: #e94e5c; | ||||
| } | ||||
|  | ||||
| .magicItemConcept-controls { | ||||
| 	align-items: center; | ||||
| 	display: flex; | ||||
| 	flex-direction: row; | ||||
| } | ||||
|  | ||||
| .magicItemConcept-controls p { | ||||
| 	margin: 0; | ||||
| } | ||||
|  | ||||
| .magicItemConcept-output { | ||||
| 	padding-left: 0; | ||||
|  | ||||
| } | ||||
|  | ||||
| .menu-icon { | ||||
| 	display: block; | ||||
| 	position: absolute; | ||||
| @@ -1219,10 +1234,6 @@ a.pageTitle-sublink { | ||||
| 	box-shadow: rgba(0, 0, 0, 0.35) 0px 50px 36px 28px inset; | ||||
| } | ||||
|  | ||||
| .zineIssue-wrapper .table-of-contents { | ||||
| 	display: none; | ||||
| } | ||||
|  | ||||
|  | ||||
| /**************************************************************************** | ||||
|  * JS Overrides | ||||
|   | ||||
| @@ -33,7 +33,7 @@ While in **Blacktyde Bay**, the party answers a job posting from local merchant | ||||
| -   Hired by merchant **Thoryio Barbarosa** to accompany him to **Isle of Dread**. | ||||
|     -   Set sail on the **Prosperity**, captained by **Mararo Sorris**. _[Fendo, 11th of Trama]_ | ||||
| -   7 days at sea, storm wreck, washed ashore on Isle of Dread. _[Saedo, 18th of Trama]_ | ||||
| -   Spent 3 days wandering around peninsula. | ||||
| -   Spent first 3 days wandering around peninsula. | ||||
|  | ||||
|     -   **Panitube**, met chief **Lufa**, traded some stuff for the services of **Daas**, a young male guide. | ||||
|     -   **Burowao**, met chief **Belz**. | ||||
| @@ -58,28 +58,28 @@ While in **Blacktyde Bay**, the party answers a job posting from local merchant | ||||
|  | ||||
| -   Beyond the Wall | ||||
|  | ||||
|     -   1st day over wall: saw dragon over eastern bay. _[Fendo, 23rd of Trama]_ | ||||
|     -   2nd day over wall: fought off some lizard men in the hills. _[Saedo, 24th of Trama]_ | ||||
|     -   5th day overall (1st day over wall): saw dragon over eastern bay. _[Fendo, 23rd of Trama]_ | ||||
|     -   6th day: fought off some lizard men in the hills. _[Saedo, 24th of Trama]_ | ||||
|         -   While sleeping that night, attacked by 13 skeletons. | ||||
|         -   After attack, found blood symbol, Truplea realized it was a name: **Melfora** | ||||
|     -   3rd day was uneventful, camped near the lake. _[Undo, 25th of Trama]_ | ||||
|     -   4th day was uneventful, got stuck in a swamp. _[Tudo, 26th of Trama]_ | ||||
|     -   5th day in hills, felt a tremor, heard some shouting, saw a couple of humanoid figures in furry skins chasing (or being chased by)... something. _[Trado - 27th of Trama]_ | ||||
|         -   camped in hills | ||||
|     -   6th day, rested in cave, saw elephant come through near them. _[Pordo - 2th of Trama]_ | ||||
|     -   7th day, parted from Bumo, found the dragon bone bridge, arrived as night fell. _[Fendo, 29th of Trama]_ | ||||
|     -   7th day was uneventful, camped near the lake. _[Undo, 25th of Trama]_ | ||||
|     -   8th day was uneventful, got stuck in a swamp. _[Tudo, 26th of Trama]_ | ||||
|     -   9th day, while traveling through hills: felt a tremor, heard some shouting, saw a couple of humanoid figures in furry skins chasing (or being chased by) something. _[Trado - 27th of Trama]_ | ||||
|         -   Camped in hills overnight. | ||||
|     -   10th day: Rested in cave, saw elephant come through near them. _[Pordo - 2th of Trama]_ | ||||
|     -   11th day: Parted from Bumo, found the dragon bone bridge, arrived as night fell. _[Fendo, 29th of Trama]_ | ||||
|  | ||||
| -   The Central Plateau | ||||
|  | ||||
|     -   8th day, crossed the dragon bone bridge and moved across the central plateau, made it to the volcanic crater by nightfall. _[Saedo, 30th of Trama]_ | ||||
|     -   12th day: Crossed the dragon bone bridge and moved across the central plateau, made it to the volcanic crater by nightfall. _[Saedo, 30th of Trama]_ | ||||
|         -   For dinner, the party used a powerful magic ring to "capture" an antelope. | ||||
|     -   9th day, climbed the volcanic crater. _[Undo, 1st of Porma]_ | ||||
|     -   13th day: Climbed the volcanic crater. _[Undo, 1st of Porma]_ | ||||
|         -   Had some close calls thanks to some slippage and an earthquake, extra long day (12 hours up, 8 hours down) | ||||
|         -   Arrived only to find Isling's puppies waiting on the other side. | ||||
|  | ||||
| -   Inside the crater | ||||
|  | ||||
|     -   10th day, slept late, went into nearby village of **Mantru**. _[Tudo, 2nd of Porma]_ | ||||
|     -   14th day: Slept late, went into nearby village of **Mantru**. _[Tudo, 2nd of Porma]_ | ||||
|         -   Natives weren't very welcome, at first. | ||||
|         -   Village had a notable lack of men. | ||||
|         -   The party met: | ||||
| @@ -96,8 +96,57 @@ While in **Blacktyde Bay**, the party answers a job posting from local merchant | ||||
|                 -   His dying words were: "In the boiling earth, the dread masters lie, dreaming..." | ||||
|                 -   He also wore a shiny ring with an (as-yet-undeciphered) inscription on it. | ||||
|             -   The fight was long and vicious, and left one of Isling's wolves dead. | ||||
|         -   Following the assault (and 27's near-death experience), they investigated the mouth on the wall. | ||||
|         -   Following the assault (and 27's near-death experience), they investigated the mouth on the wall and the surrounding rooms. | ||||
|             -   Truplea determined it could shoot flame, but wasn't sure about a trigger or source. | ||||
|             -   Toric found a trick sconce that opened a secret door to a cove behind the face statue (where Isling found the controls for the mouth). | ||||
|         -   In the hidden area, they found another secret door (synchronized to be in the opposite position of the first secret door) which lead to a hallway. | ||||
|         -   Further down the hallway, they found a room with a pedestal and a box. | ||||
|             -   Opening the box revealed a magical statue carved from a huge black pearl, which turned Lo, Truplea, and Isling into "Servants of the Darkness" | ||||
|             -   After a brief but brutal battle, the statue was broken, and everyone was restored to normal. | ||||
|         -   Believing they set the old masters back, the party decided to retreat and return in a few weeks with a larger force. | ||||
|             -   The group left the temple, closing all of the secret doors, and removing the trick sconce from the wall on their way out. | ||||
|         -   They returned to the village of Mantru | ||||
|             -   The natives were happy to see them, but confused, as no one has returned yet. | ||||
|             -   They spoke to the chief, via Umlatta, who requested they take the villagers back to the peninsula. | ||||
|                 -   Also did a weird healing ritual which appeared to make the chief glow momentarily. | ||||
|                 -   The chief said something about the watchers giving one of them "the power of the pride" | ||||
|                 -   "The old masters will turn many, but the towns that remain true will help, as will others - the barbarians on the plain, the keepers of the webs, even the necromancer in the cave.... unless the green death has his way." | ||||
|         -   Freed tribesmen started walking into camp a few hours later, kept arriving throughout the night. | ||||
|  | ||||
| -   Trip Back to Peninsula | ||||
|  | ||||
|     -   15th day: Traveling across Central Plateau _[Trado, 3rd of Porma]_ | ||||
|         -   They set out at dawn with most of the villagers, except for Umlatta (who stayed behind to send along the stragglers). | ||||
|             -   They acquired stragglers every so often, taking them up to 54 (at last count) | ||||
|         -   As they left via the collapsed entrance, they found tunnels in the crater wall. | ||||
|         -   Isling spent time training Ae'gu (pronounced yay-gu), a young warrior from Mantru | ||||
|     -   16th day: Dragon bridge crossing _[Pordo, 4th of Porma]_ | ||||
|         -   As they crossed the dragon bridge, 27 nearly fell (and was saved by Lo) before a pteronadon attacked. | ||||
|             -   Isling hit it with an arrow and it fled. | ||||
|         -   That night, while stopped at river crossing, Lo heard howling nearby. | ||||
|     -   17th day _[Fendo, 5th of Porma]_ | ||||
|         -   Heard scuffle near start of day, but avoided it. | ||||
|         -   About midday, some of the villagers got exhausted, so they took a rest. | ||||
|         -   6 more villagers have joined up over past few days (54 total). | ||||
|     -   18th day _[Saedo, 6th of Porma]_ | ||||
|         -   Saw a couple of pterodactyls flying overhead. | ||||
|         -   Camped (and fished) along lake's edge. | ||||
|     -   19th day _[Undo, 7th of Porma]_ | ||||
|         -   Heard some boars back in the woods from the lake's edge. | ||||
|         -   Isling sent wolf to investigate, ID'd by smell, but they had passed. | ||||
|     -   20th day: Mostly uneventful. _[Tudo, 8th of Porma]_ | ||||
|         -   That night, both Lo and Toric heard a weird "whooshing" sound come from above them during their watches. | ||||
|     -   21st day: Back to the wall _[Trado, 9th of Porma]_ | ||||
|         -   **Esun, Dead God and Ancient Green Dragon** arrived just as they were breaking camp | ||||
|             -   He told the party about his part in overthrowing the old masters. | ||||
|             -   He also told them about artifacts that they could use to fight the old masters in the "crypt of the first men", currently run by a necromancer. | ||||
|             -   After threatening the party, they reluctantly agreed to come back the next day to go to the crypt. | ||||
|         -   Arrived at wall around midday, allowed to pass through. | ||||
|         -   Arrived at Tanaroa shortly after midday | ||||
|             -   The party met with chief Koma, asked her to send messages to other villages about old masters. | ||||
|             -   The village kinda freaked out over old masters. | ||||
|             -   Chief Koma offers to call war council with other chiefs | ||||
|             -   Party decided to return to meet Esun. | ||||
|  | ||||
| ### Links | ||||
|  | ||||
|   | ||||
| @@ -30,7 +30,7 @@ An adventurer with a special bond with one (or more) animal companions. | ||||
| ### Animal Companions | ||||
|  | ||||
| -   To establish a connection, must make a peaceful approach towards a single animal. | ||||
|     -   Referee rolls reaction roll: On an 8 or higher, the animal is bonded to the animist. | ||||
|     -   Referee rolls reaction roll: On an 8 or higher, the animal is bonded to the beast walker. | ||||
| -   Companions may be wild or domestic. | ||||
|     -   Companions may be magical or giant, at the referee's discretion. | ||||
| -   May have up to one animal companion per level. | ||||
| @@ -38,7 +38,7 @@ An adventurer with a special bond with one (or more) animal companions. | ||||
| -   If a companion is dismissed or dies, may establish connection with new animal. | ||||
| -   Companions follow everywhere. | ||||
| -   Companions can understand and execute basic commands. | ||||
| -   Companions will fight to the death to defend their animist. | ||||
| -   Companions will fight to the death to defend their beast walker. | ||||
|     -   Companions do not check morale. | ||||
|  | ||||
| ### Speak with Animals | ||||
| @@ -53,8 +53,8 @@ An adventurer with a special bond with one (or more) animal companions. | ||||
| After 9th level, may construct a stronghold in the wilderness. | ||||
|  | ||||
| -   Automatically befriends all creatures within 5 mile radius. | ||||
|     -   They may perform simple tasks for animist (carry messages, warn about intruders, etc). | ||||
|     -   In exchange, they expect to be protected from harm by animist. | ||||
|     -   They may perform simple tasks for beast walker (carry messages, warn about intruders, etc). | ||||
|     -   In exchange, they expect to be protected from harm by beast walker. | ||||
|  | ||||
| ### Advancement | ||||
|  | ||||
|   | ||||
| @@ -10,4 +10,4 @@ short_code: m10n | ||||
| Silver-framed spectacles with mirrored lenses. | ||||
|  | ||||
| -   While worn, wearer can see undead and ethereal beings within 30 feet, even when invisible or hidden. | ||||
| -   Once per day, the wearer may ask three questions of the spirit of a deceased being within 30', as per the [Speak with Dead](/spells/speak-with-dead.html) spell. | ||||
| -   Once per day, the wearer may ask three questions of the spirit of a deceased being within 30', as per the [Speak with Dead](/spells/speak-with-dead.html) spell, but with no limit on the maximum deceased time. | ||||
|   | ||||
| @@ -32,7 +32,7 @@ short_code: t1 | ||||
|         <ul class="rollerOutput" id="js-rollerOutput"></ul> | ||||
|         <p class="rollerLink">Powered by <a href="https://github.com/lordnull/dice.js" target="_blank">Dice.js</a></p> | ||||
|     </details> | ||||
|         <details class="toolDetails" open> | ||||
|     <details class="toolDetails" open> | ||||
|         <summary> | ||||
|             <h3>Encounter Roller</h3> | ||||
|         </summary> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user