campaign update
This commit is contained in:
parent
fe50c52a7f
commit
b0e81bc80d
@ -12,14 +12,14 @@
|
|||||||
<li class="dayName">Saedo</li>
|
<li class="dayName">Saedo</li>
|
||||||
|
|
||||||
<li class="firstDay">1</li>
|
<li class="firstDay">1</li>
|
||||||
<li class="currDay">2</li>
|
<li>2</li>
|
||||||
<li>3</li>
|
<li>3</li>
|
||||||
<li>4</li>
|
<li>4</li>
|
||||||
<li>5</li>
|
<li>5</li>
|
||||||
<li>6</li>
|
<li>6</li>
|
||||||
<li>7</li>
|
<li>7</li>
|
||||||
<li>8</li>
|
<li>8</li>
|
||||||
<li>9</li>
|
<li class="currDay">9</li>
|
||||||
<li>10</li>
|
<li>10</li>
|
||||||
<li>11</li>
|
<li>11</li>
|
||||||
<li>12</li>
|
<li>12</li>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<div class="todayWrapper">
|
<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>
|
</div>
|
||||||
|
@ -21,11 +21,13 @@ export default (() => {
|
|||||||
document.documentElement.className.replace('no-js', 'js');
|
document.documentElement.className.replace('no-js', 'js');
|
||||||
|
|
||||||
// Enable cached fonts ASAP
|
// Enable cached fonts ASAP
|
||||||
|
/*
|
||||||
if (!!Cookies.get('fonts_loaded')) {
|
if (!!Cookies.get('fonts_loaded')) {
|
||||||
document.documentElement.className += ' js-hasFontsLoaded';
|
document.documentElement.className += ' js-hasFontsLoaded';
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
docReady(() => {
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
// Lazy-Load Media
|
// Lazy-Load Media
|
||||||
if (typeof loadMedia === 'function') {
|
if (typeof loadMedia === 'function') {
|
||||||
|
@ -19,6 +19,46 @@ const getRandomValue = (max = 1, min = 1) =>
|
|||||||
const vals = [...Array(count).keys()].map(() => getRandomValue(sides)),
|
const vals = [...Array(count).keys()].map(() => getRandomValue(sides)),
|
||||||
total = vals.reduce((v, a) => a + v, 0);
|
total = vals.reduce((v, a) => a + v, 0);
|
||||||
return [total, ...vals];
|
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
|
// Die Roller script
|
||||||
@ -28,6 +68,7 @@ const addRollerForm = () => {
|
|||||||
rollerOutput = document.getElementById('js-rollerOutput'),
|
rollerOutput = document.getElementById('js-rollerOutput'),
|
||||||
isExpressionRE =
|
isExpressionRE =
|
||||||
/(?:(?:^|[-+_*/])(?:\s*-?\d*d?\d+(\.\d+)?(?:[+-]\s*\d*d?\d+)?\s*))+$/i;
|
/(?:(?:^|[-+_*/])(?:\s*-?\d*d?\d+(\.\d+)?(?:[+-]\s*\d*d?\d+)?\s*))+$/i;
|
||||||
|
if (!rollerForm) return;
|
||||||
|
|
||||||
// double-click [x] to clear list
|
// double-click [x] to clear list
|
||||||
rollerForm.addEventListener('reset', (e) => {
|
rollerForm.addEventListener('reset', (e) => {
|
||||||
@ -47,12 +88,6 @@ const addRollerForm = () => {
|
|||||||
.map((roll) => {
|
.map((roll) => {
|
||||||
const result = dice.roll(roll),
|
const result = dice.roll(roll),
|
||||||
stringifiedResult = dice.stringify(result);
|
stringifiedResult = dice.stringify(result);
|
||||||
/*
|
|
||||||
console.log(
|
|
||||||
{ roll, result, stringifiedResult },
|
|
||||||
isExpressionRE.test(roll)
|
|
||||||
);
|
|
||||||
*/
|
|
||||||
return `${stringifiedResult.replaceAll(
|
return `${stringifiedResult.replaceAll(
|
||||||
'!!!mods listing not yet complete!!!',
|
'!!!mods listing not yet complete!!!',
|
||||||
''
|
''
|
||||||
@ -96,6 +131,8 @@ const RoomTypes = {
|
|||||||
const roomForm = document.getElementById('js-roomForm'),
|
const roomForm = document.getElementById('js-roomForm'),
|
||||||
roomOutput = document.getElementById('js-roomOutput');
|
roomOutput = document.getElementById('js-roomOutput');
|
||||||
|
|
||||||
|
if (!roomForm) return;
|
||||||
|
|
||||||
roomForm?.addEventListener('submit', (e) => {
|
roomForm?.addEventListener('submit', (e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
||||||
@ -130,6 +167,9 @@ const shuffleContainer = (parentId) => {
|
|||||||
addComplicationForm = () => {
|
addComplicationForm = () => {
|
||||||
const complicationForm = document.getElementById('js-complicationForm'),
|
const complicationForm = document.getElementById('js-complicationForm'),
|
||||||
formControls = document.createElement('div');
|
formControls = document.createElement('div');
|
||||||
|
|
||||||
|
if (!complicationForm) return;
|
||||||
|
|
||||||
formControls.innerHTML = [
|
formControls.innerHTML = [
|
||||||
'<button id="js-btnSetDungeon">Dungeon</button>',
|
'<button id="js-btnSetDungeon">Dungeon</button>',
|
||||||
'<button id="js-btnSetWilderness">Wilderness</button>',
|
'<button id="js-btnSetWilderness">Wilderness</button>',
|
||||||
@ -185,6 +225,8 @@ const shuffleContainer = (parentId) => {
|
|||||||
const complicationForm = document.getElementById(
|
const complicationForm = document.getElementById(
|
||||||
'js-astralComplicationForm'
|
'js-astralComplicationForm'
|
||||||
);
|
);
|
||||||
|
if (!complicationForm) return;
|
||||||
|
|
||||||
complicationForm?.addEventListener('submit', (e) => {
|
complicationForm?.addEventListener('submit', (e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
shuffleContainer('js-astralComplicationList');
|
shuffleContainer('js-astralComplicationList');
|
||||||
@ -247,19 +289,25 @@ const reactionButtonVal = [
|
|||||||
|
|
||||||
// combine monster roll total + surprise + roll data
|
// combine monster roll total + surprise + roll data
|
||||||
const monsterRollText = `<strong>${monsterTotal}${surpriseText}</strong><br /><em>[${monsterRolls}]</em>`;
|
const monsterRollText = `<strong>${monsterTotal}${surpriseText}</strong><br /><em>[${monsterRolls}]</em>`;
|
||||||
|
outputTable.innerHTML = `
|
||||||
outputTable.innerHTML = [
|
<thead>
|
||||||
`<thead><th colspan="2">${
|
<th colspan="2">
|
||||||
type === 'W' ? 'Wilderness' : 'Dungeon'
|
${type === 'W' ? 'Wilderness' : 'Dungeon'} Encounter<br />
|
||||||
} Encounter<br />(3d${sides}): ${dayjs().format(
|
${dayjs().format('YYYY-MM-DD HH:mm:ss')}
|
||||||
'YYYY-MM-DD HH:mm:ss'
|
</th>
|
||||||
)}</th></thead>`,
|
</thead>
|
||||||
'<tbody>',
|
<tbody>
|
||||||
`<tr><th>Monster</th><td>${monsterRollText}</td></tr>`,
|
<tr>
|
||||||
`<tr><th>Distance</th><td>${distanceText}</td></tr>`,
|
<th>Monster</th><td>${monsterRollText}</td>
|
||||||
`<tr><th>Reaction</th><td>${reactionText}</td></tr>`,
|
</tr>
|
||||||
'</tbody>',
|
<tr>
|
||||||
].join('\n');
|
<th>Distance</th><td>${distanceText}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>Reaction</th><td>${reactionText}</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
`;
|
||||||
outputTable.classList.add('encounterResultTable');
|
outputTable.classList.add('encounterResultTable');
|
||||||
|
|
||||||
encounterOutput.prepend(outputTable);
|
encounterOutput.prepend(outputTable);
|
||||||
@ -267,19 +315,24 @@ const reactionButtonVal = [
|
|||||||
addEncounterRoller = () => {
|
addEncounterRoller = () => {
|
||||||
const complicationForm = document.getElementById('js-encounterForm'),
|
const complicationForm = document.getElementById('js-encounterForm'),
|
||||||
formControls = document.createElement('div');
|
formControls = document.createElement('div');
|
||||||
formControls.innerHTML = [
|
if (!complicationForm) return;
|
||||||
'<div class="encounterButtonsWrapper">',
|
|
||||||
'<div class="encounterButtonsDungeonWrapper"><em>Dungeon</em><br />',
|
formControls.innerHTML = `
|
||||||
'<button id="js-btnRollDungeonEncounter3d4">3d4</button>',
|
<div class="encounterButtonsWrapper">
|
||||||
'<button id="js-btnRollDungeonEncounter3d6">3d6</button>',
|
<div class="encounterButtonsDungeonWrapper">
|
||||||
'<button id="js-btnRollDungeonEncounter3d8">3d8</button>',
|
<em>Dungeon</em><br />
|
||||||
'</div>',
|
<button id="js-btnRollDungeonEncounter3d4">3d4</button>
|
||||||
'<div class="encounterButtonsWildernessWrapper"><em>Wilderness</em><br />',
|
<button id="js-btnRollDungeonEncounter3d6">3d6</button>
|
||||||
'<button id="js-btnRollWildernessEncounter3d4">3d4</button>',
|
<button id="js-btnRollDungeonEncounter3d8">3d8</button>
|
||||||
'<button id="js-btnRollWildernessEncounter3d6">3d6</button>',
|
</div>
|
||||||
'<button id="js-btnRollWildernessEncounter3d8">3d8</button>',
|
<div class="encounterButtonsWildernessWrapper">
|
||||||
'</div></div>',
|
<em>Wilderness</em><br />
|
||||||
].join('\n');
|
<button id="js-btnRollWildernessEncounter3d4">3d4</button>
|
||||||
|
<button id="js-btnRollWildernessEncounter3d6">3d6</button>
|
||||||
|
<button id="js-btnRollWildernessEncounter3d8">3d8</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
complicationForm?.appendChild(formControls);
|
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 (() => {
|
export default (() => {
|
||||||
addRollerForm();
|
addRollerForm();
|
||||||
addRoomForm();
|
addRoomForm();
|
||||||
addComplicationForm();
|
addComplicationForm();
|
||||||
addAstralComplicationForm();
|
addAstralComplicationForm();
|
||||||
addEncounterRoller();
|
addEncounterRoller();
|
||||||
|
addMagicItemConceptRoller();
|
||||||
})();
|
})();
|
||||||
|
|
||||||
// @license-end
|
// @license-end
|
||||||
|
@ -472,6 +472,21 @@ a.licenseLink:hover {
|
|||||||
border-color: #e94e5c;
|
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 {
|
.menu-icon {
|
||||||
display: block;
|
display: block;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@ -1219,10 +1234,6 @@ a.pageTitle-sublink {
|
|||||||
box-shadow: rgba(0, 0, 0, 0.35) 0px 50px 36px 28px inset;
|
box-shadow: rgba(0, 0, 0, 0.35) 0px 50px 36px 28px inset;
|
||||||
}
|
}
|
||||||
|
|
||||||
.zineIssue-wrapper .table-of-contents {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* JS Overrides
|
* 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**.
|
- 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]_
|
- 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]_
|
- 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.
|
- **Panitube**, met chief **Lufa**, traded some stuff for the services of **Daas**, a young male guide.
|
||||||
- **Burowao**, met chief **Belz**.
|
- **Burowao**, met chief **Belz**.
|
||||||
@ -58,28 +58,28 @@ While in **Blacktyde Bay**, the party answers a job posting from local merchant
|
|||||||
|
|
||||||
- Beyond the Wall
|
- Beyond the Wall
|
||||||
|
|
||||||
- 1st day over wall: saw dragon over eastern bay. _[Fendo, 23rd of Trama]_
|
- 5th day overall (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]_
|
- 6th day: fought off some lizard men in the hills. _[Saedo, 24th of Trama]_
|
||||||
- While sleeping that night, attacked by 13 skeletons.
|
- While sleeping that night, attacked by 13 skeletons.
|
||||||
- After attack, found blood symbol, Truplea realized it was a name: **Melfora**
|
- After attack, found blood symbol, Truplea realized it was a name: **Melfora**
|
||||||
- 3rd day was uneventful, camped near the lake. _[Undo, 25th of Trama]_
|
- 7th day was uneventful, camped near the lake. _[Undo, 25th of Trama]_
|
||||||
- 4th day was uneventful, got stuck in a swamp. _[Tudo, 26th of Trama]_
|
- 8th 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]_
|
- 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
|
- Camped in hills overnight.
|
||||||
- 6th day, rested in cave, saw elephant come through near them. _[Pordo - 2th of Trama]_
|
- 10th 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]_
|
- 11th day: Parted from Bumo, found the dragon bone bridge, arrived as night fell. _[Fendo, 29th of Trama]_
|
||||||
|
|
||||||
- The Central Plateau
|
- 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.
|
- 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)
|
- 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.
|
- Arrived only to find Isling's puppies waiting on the other side.
|
||||||
|
|
||||||
- Inside the crater
|
- 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.
|
- Natives weren't very welcome, at first.
|
||||||
- Village had a notable lack of men.
|
- Village had a notable lack of men.
|
||||||
- The party met:
|
- 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..."
|
- 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.
|
- 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.
|
- 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.
|
- 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
|
### Links
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ An adventurer with a special bond with one (or more) animal companions.
|
|||||||
### Animal Companions
|
### Animal Companions
|
||||||
|
|
||||||
- To establish a connection, must make a peaceful approach towards a single animal.
|
- 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 wild or domestic.
|
||||||
- Companions may be magical or giant, at the referee's discretion.
|
- Companions may be magical or giant, at the referee's discretion.
|
||||||
- May have up to one animal companion per level.
|
- 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.
|
- If a companion is dismissed or dies, may establish connection with new animal.
|
||||||
- Companions follow everywhere.
|
- Companions follow everywhere.
|
||||||
- Companions can understand and execute basic commands.
|
- 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.
|
- Companions do not check morale.
|
||||||
|
|
||||||
### Speak with Animals
|
### 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.
|
After 9th level, may construct a stronghold in the wilderness.
|
||||||
|
|
||||||
- Automatically befriends all creatures within 5 mile radius.
|
- Automatically befriends all creatures within 5 mile radius.
|
||||||
- They may perform simple tasks for animist (carry messages, warn about intruders, etc).
|
- They may perform simple tasks for beast walker (carry messages, warn about intruders, etc).
|
||||||
- In exchange, they expect to be protected from harm by animist.
|
- In exchange, they expect to be protected from harm by beast walker.
|
||||||
|
|
||||||
### Advancement
|
### Advancement
|
||||||
|
|
||||||
|
@ -10,4 +10,4 @@ short_code: m10n
|
|||||||
Silver-framed spectacles with mirrored lenses.
|
Silver-framed spectacles with mirrored lenses.
|
||||||
|
|
||||||
- While worn, wearer can see undead and ethereal beings within 30 feet, even when invisible or hidden.
|
- 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>
|
<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>
|
<p class="rollerLink">Powered by <a href="https://github.com/lordnull/dice.js" target="_blank">Dice.js</a></p>
|
||||||
</details>
|
</details>
|
||||||
<details class="toolDetails" open>
|
<details class="toolDetails" open>
|
||||||
<summary>
|
<summary>
|
||||||
<h3>Encounter Roller</h3>
|
<h3>Encounter Roller</h3>
|
||||||
</summary>
|
</summary>
|
||||||
|
Loading…
Reference in New Issue
Block a user