Add Referee's Tools

Update JS, add versioning (for cache-busting updates)
Clean up a bunch of unused files
Add Rivertail community
Add some new races
This commit is contained in:
Eric Woodward 2023-08-27 23:54:42 -04:00
parent 65e2b6ecb2
commit 5c58d7d051
66 changed files with 1875 additions and 2449 deletions

29
.eslintrc.cjs Normal file
View File

@ -0,0 +1,29 @@
module.exports = {
"env": {
"browser": true,
"es2021": true
},
"extends": [
"eslint:recommended",
"prettier" // Make sure this is the last
],
"overrides": [
{
"env": {
"node": true
},
"files": [
".eslintrc.{js,cjs}"
],
"parserOptions": {
"sourceType": "script"
}
}
],
"parserOptions": {
"ecmaVersion": "latest",
"sourceType": "module"
},
"rules": {
}
}

View File

@ -1,6 +1,6 @@
{
"trailingComma": "es5",
"tabWidth": 4,
"semi": false,
"semi": true,
"singleQuote": true
}

View File

@ -1,6 +1,6 @@
The MIT License (MIT)
Copyright © 2023 Eric Woodward
Copyright (c) 2023 Eric Woodward
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

18
README.md Normal file
View File

@ -0,0 +1,18 @@
# The Planar Vagabond's Guide to the Multiverse
A custom-built static site generator in Node.js used to create the website https://planarvagabond.com/.
## Setup
```console
$ npm i
$ npm run build
$ npm run serve
$ npm run watch
```
Go to http://localhost:5000 to see the generated site.
## How to use
If you want to use this as the basis for generating your own site, just fork this repository and update the content in the `src` folder.

7
jsconfig.json Normal file
View File

@ -0,0 +1,7 @@
{
"compilerOptions": {
"module": "commonjs",
"target": "es6"
},
"exclude": ["node_modules"]
}

View File

@ -1,6 +1,6 @@
{
"name": "planar-vagabond",
"version": "0.11.5",
"version": "0.11.6",
"description": "",
"main": "index.js",
"scripts": {
@ -11,7 +11,7 @@
"watch": "node app.js watch"
},
"keywords": [],
"author": "",
"author": "Eric Woodward (https://www.itsericwoodward.com)",
"license": "MIT",
"dependencies": {
"chalk": "^4.1.2",
@ -21,7 +21,6 @@
"json5": "^2.1.3",
"markdown-it": "^13.0.1",
"markdown-it-anchor": "^8.6.7",
"markdown-it-auto-crosslinker": "^1.0.1",
"markdown-it-emoji": "^2.0.0",
"markdown-it-footnote": "^3.0.3",
"markdown-it-implicit-figures": "^0.11.0",

View File

@ -1,26 +1,26 @@
{
site: {
title: "The Planar Vagabond's Guide to the Multiverse",
author: {
name: "Eric Woodward",
email: "redacted@planarvagabond.com", // not used
photo: "/images/eric-8bit.gif",
site: "https://itsericwoodward.com",
},
site: {
title: "The Planar Vagabond's Guide to the Multiverse",
author: {
name: 'Eric Woodward',
email: 'redacted@planarvagabond.com', // not used
photo: '/images/eric-8bit.gif',
site: 'https://itsericwoodward.com',
},
base_uri: "",
robots: "index,follow",
language: "en-us",
copyright: "Copyright 2023 Eric Woodward, licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.",
basePath: "",
uri: "https://www.planarvagabond.com",
search_uri: "www.planarvagabond.com",
},
build: {
srcPath: "src",
outputPath: "out",
},
serve: {
port: 4997,
},
base_uri: '',
robots: 'index,follow',
language: 'en-us',
copyright: 'Copyright 2023 Eric Woodward, licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.',
basePath: '',
uri: 'https://www.planarvagabond.com',
search_uri: 'www.planarvagabond.com',
},
build: {
srcPath: 'src',
outputPath: 'out',
},
serve: {
port: 4998,
},
}

View File

@ -1,5 +1 @@
<!---
date_pub: 2023-06-12T08:54:00-04:00
-->
As of last session, it is the **middle of the 2nd phase of the 1st Warday of Urtson-Nu, in year 5023 of the Common Astral Calendar**.
As of last session, it is **near the end of the 1st shift of the 1st phase of 2nd Warday of Urtson-Nu, in year 5023 of the Common Astral Calendar**.

File diff suppressed because one or more lines are too long

View File

@ -1,10 +0,0 @@
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
/*
Font Face Observer v2.3.0
https://github.com/bramstein/fontfaceobserver
The BSD 3-Clause License
Copyright Bram Stein. All rights reserved.
*/
(function(){"use strict";var f,g=[];function l(a){g.push(a);1==g.length&&f()}function m(){for(;g.length;){g[0](),g.shift()}}f=function(){setTimeout(m)};function n(a){this.a=p;this.b=void 0;this.f=[];var b=this;try{a(function(a){q(b,a)},function(a){r(b,a)})}catch(c){r(b,c)}}var p=2;function t(a){return new n(function(b,c){c(a)})}function u(a){return new n(function(b){b(a)})}function q(a,b){if(a.a==p){if(b==a){throw new TypeError()}var c=!1;try{var d=b&&b.then;if(null!=b&&"object"==typeof b&&"function"==typeof d){d.call(b,function(b){c||q(a,b);c=!0},function(b){c||r(a,b);c=!0});return}}catch(e){c||r(a,e);return}a.a=0;a.b=b;v(a)}}function r(a,b){if(a.a==p){if(b==a){throw new TypeError()}a.a=1;a.b=b;v(a)}}function v(a){l(function(){if(a.a!=p){for(;a.f.length;){var b=a.f.shift(),c=b[0],d=b[1],e=b[2],b=b[3];try{0==a.a?"function"==typeof c?e(c.call(void 0,a.b)):e(a.b):1==a.a&&("function"==typeof d?e(d.call(void 0,a.b)):b(a.b))}catch(h){b(h)}}}})}n.prototype.g=function(a){return this.c(void 0,a)};n.prototype.c=function(a,b){var c=this;return new n(function(d,e){c.f.push([a,b,d,e]);v(c)})};function w(a){return new n(function(b,c){function d(c){return function(d){h[c]=d;e+=1;e==a.length&&b(h)}}var e=0,h=[];0==a.length&&b(h);for(var k=0;k<a.length;k+=1){u(a[k]).c(d(k),c)}})}function x(a){return new n(function(b,c){for(var d=0;d<a.length;d+=1){u(a[d]).c(b,c)}})}window.Promise||((window.Promise=n),(window.Promise.resolve=u),(window.Promise.reject=t),(window.Promise.race=x),(window.Promise.all=w),(window.Promise.prototype.then=n.prototype.c),(window.Promise.prototype["catch"]=n.prototype.g))})();
(function(){function p(a,c){document.addEventListener?a.addEventListener("scroll",c,!1):a.attachEvent("scroll",c)}function u(a){document.body?a():document.addEventListener?document.addEventListener("DOMContentLoaded",function b(){document.removeEventListener("DOMContentLoaded",b);a()}):document.attachEvent("onreadystatechange",function g(){if("interactive"==document.readyState||"complete"==document.readyState){document.detachEvent("onreadystatechange",g),a()}})}function w(a){this.g=document.createElement("div");this.g.setAttribute("aria-hidden","true");this.g.appendChild(document.createTextNode(a));this.h=document.createElement("span");this.i=document.createElement("span");this.m=document.createElement("span");this.j=document.createElement("span");this.l=-1;this.h.style.cssText="max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;";this.i.style.cssText="max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;";this.j.style.cssText="max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;";this.m.style.cssText="display:inline-block;width:200%;height:200%;font-size:16px;max-width:none;";this.h.appendChild(this.m);this.i.appendChild(this.j);this.g.appendChild(this.h);this.g.appendChild(this.i)}function x(a,c){a.g.style.cssText="max-width:none;min-width:20px;min-height:20px;display:inline-block;overflow:hidden;position:absolute;width:auto;margin:0;padding:0;top:-999px;white-space:nowrap;font-synthesis:none;font:"+c+";"}function B(a){var c=a.g.offsetWidth,b=c+100;a.j.style.width=b+"px";a.i.scrollLeft=b;a.h.scrollLeft=a.h.scrollWidth+100;return a.l!==c?((a.l=c),!0):!1}function C(a,c){function b(){var e=g;B(e)&&null!==e.g.parentNode&&c(e.l)}var g=a;p(a.h,b);p(a.i,b);B(a)}function D(a,c,b){c=c||{};b=b||window;this.family=a;this.style=c.style||"normal";this.weight=c.weight||"normal";this.stretch=c.stretch||"normal";this.context=b}var E=null,F=null,G=null,H=null;function I(a){null===F&&(M(a)&&/Apple/.test(window.navigator.vendor)?((a=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))(?:\.([0-9]+))/.exec(window.navigator.userAgent)),(F=!!a&&603>parseInt(a[1],10))):(F=!1));return F}function M(a){null===H&&(H=!!a.document.fonts);return H}function N(a,c){var b=a.style,g=a.weight;if(null===G){var e=document.createElement("div");try{e.style.font="condensed 100px sans-serif"}catch(q){}G=""!==e.style.font}return[b,g,G?a.stretch:"","100px",c].join(" ")}D.prototype.load=function(a,c){var b=this,g=a||"BESbswy",e=0,q=c||3e3,J=new Date().getTime();return new Promise(function(K,L){if(M(b.context)&&!I(b.context)){var O=new Promise(function(r,t){function h(){new Date().getTime()-J>=q?t(Error(""+q+"ms timeout exceeded")):b.context.document.fonts.load(N(b,'"'+b.family+'"'),g).then(function(n){1<=n.length?r():setTimeout(h,25)},t)}h()}),P=new Promise(function(r,t){e=setTimeout(function(){t(Error(""+q+"ms timeout exceeded"))},q)});Promise.race([P,O]).then(function(){clearTimeout(e);K(b)},L)}else{u(function(){function r(){var d;if((d=(-1!=k&&-1!=l)||(-1!=k&&-1!=m)||(-1!=l&&-1!=m))){(d=k!=l&&k!=m&&l!=m)||(null===E&&((d=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent)),(E=!!d&&(536>parseInt(d[1],10)||(536===parseInt(d[1],10)&&11>=parseInt(d[2],10))))),(d=E&&((k==y&&l==y&&m==y)||(k==z&&l==z&&m==z)||(k==A&&l==A&&m==A)))),(d=!d)}d&&(null!==f.parentNode&&f.parentNode.removeChild(f),clearTimeout(e),K(b))}function t(){if(new Date().getTime()-J>=q){null!==f.parentNode&&f.parentNode.removeChild(f),L(Error(""+q+"ms timeout exceeded"))}else{var d=b.context.document.hidden;if(!0===d||void 0===d){(k=h.g.offsetWidth),(l=n.g.offsetWidth),(m=v.g.offsetWidth),r()}e=setTimeout(t,50)}}var h=new w(g),n=new w(g),v=new w(g),k=-1,l=-1,m=-1,y=-1,z=-1,A=-1,f=document.createElement("div");f.dir="ltr";x(h,N(b,"sans-serif"));x(n,N(b,"serif"));x(v,N(b,"monospace"));f.appendChild(h.g);f.appendChild(n.g);f.appendChild(v.g);b.context.document.body.appendChild(f);y=h.g.offsetWidth;z=n.g.offsetWidth;A=v.g.offsetWidth;t();C(h,function(d){k=d;r()});x(h,N(b,'"'+b.family+'",sans-serif'));C(n,function(d){l=d;r()});x(n,N(b,'"'+b.family+'",serif'));C(v,function(d){m=d;r()});x(v,N(b,'"'+b.family+'",monospace'))})}})};"object"===typeof module?(module.exports=D):((window.FontFaceObserver=D),(window.FontFaceObserver.prototype.load=D.prototype.load))})();
// @license-end

View File

@ -1,8 +0,0 @@
// @license magnet:?xt=urn:btih:e95b018ef3580986a04669f1b5879592219e2a7a&dn=public-domain.txt Unlicense
/*
classList.js v1.2.20171210
https://github.com/eligrey/classList.js
The Unlicense
*/
"document"in self&&("classList"in document.createElement("_")&&(!document.createElementNS||"classList"in document.createElementNS("http://www.w3.org/2000/svg","g"))||!function(t){"use strict";if("Element"in t){var e="classList",n="prototype",i=t.Element[n],s=Object,r=String[n].trim||function(){return this.replace(/^\s+|\s+$/g,"")},o=Array[n].indexOf||function(t){for(var e=0,n=this.length;n>e;e++)if(e in this&&this[e]===t)return e;return-1},c=function(t,e){this.name=t,this.code=DOMException[t],this.message=e},a=function(t,e){if(""===e)throw new c("SYNTAX_ERR","The token must not be empty.");if(/\s/.test(e))throw new c("INVALID_CHARACTER_ERR","The token must not contain space characters.");return o.call(t,e)},l=function(t){for(var e=r.call(t.getAttribute("class")||""),n=e?e.split(/\s+/):[],i=0,s=n.length;s>i;i++)this.push(n[i]);this._updateClassName=function(){t.setAttribute("class",this.toString())}},u=l[n]=[],h=function(){return new l(this)};if(c[n]=Error[n],u.item=function(t){return this[t]||null},u.contains=function(t){return~a(this,t+"")},u.add=function(){var t,e=arguments,n=0,i=e.length,s=!1;do t=e[n]+"",~a(this,t)||(this.push(t),s=!0);while(++n<i);s&&this._updateClassName()},u.remove=function(){var t,e,n=arguments,i=0,s=n.length,r=!1;do for(t=n[i]+"",e=a(this,t);~e;)this.splice(e,1),r=!0,e=a(this,t);while(++i<s);r&&this._updateClassName()},u.toggle=function(t,e){var n=this.contains(t),i=n?e!==!0&&"remove":e!==!1&&"add";return i&&this[i](t),e===!0||e===!1?e:!n},u.replace=function(t,e){var n=a(t+"");~n&&(this.splice(n,1,e),this._updateClassName())},u.toString=function(){return this.join(" ")},s.defineProperty){var f={get:h,enumerable:!0,configurable:!0};try{s.defineProperty(i,e,f)}catch(p){void 0!==p.number&&-2146823252!==p.number||(f.enumerable=!1,s.defineProperty(i,e,f))}}else s[n].__defineGetter__&&i.__defineGetter__(e,h)}}(self),function(){"use strict";var t=document.createElement("_");if(t.classList.add("c1","c2"),!t.classList.contains("c2")){var e=function(t){var e=DOMTokenList.prototype[t];DOMTokenList.prototype[t]=function(t){var n,i=arguments.length;for(n=0;i>n;n++)t=arguments[n],e.call(this,t)}};e("add"),e("remove")}if(t.classList.toggle("c3",!1),t.classList.contains("c3")){var n=DOMTokenList.prototype.toggle;DOMTokenList.prototype.toggle=function(t,e){return 1 in arguments&&!this.contains(t)==!e?e:n.call(this,t)}}"replace"in document.createElement("_").classList||(DOMTokenList.prototype.replace=function(t,e){var n=this.toString().split(" "),i=n.indexOf(t+"");~i&&(n=n.slice(i),this.remove.apply(this,n),this.add(e),this.add.apply(this,n.slice(1)))}),t=null}());
// @license-end

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,64 +1,67 @@
// @license magnet:?xt=urn:btih:90dc5c0be029de84e523b9b3922520e79e0e6f08&dn=cc0.txt CC0-1.0
/****************************************************************************
* It's Eric Woodward's Site
* Planar Vagabond's Guide to the Multiverse (planarvagabond.com)
*
* Copyright 2014-2023 Eric Woodward
* Copyright 2023 Eric Woodward
* Source released under CC0 Public Domain License v1.0
* https://www.itsericwoodward.com/licenses/cc0
* http://creativecommons.org/publicdomain/zero/1.0/
****************************************************************************/
const onLoad = () => {
if (window.dayjs) dayjs.extend(window.dayjs_plugin_relativeTime);
export default (() => {
// we load this library via "module" to guarantee baseline ES6 functionality
console.log('boot!', window.Cookies);
// Indicate JS is loaded
document.documentElement.className =
document.documentElement.className.replace("no-js", "js");
// check for loaded libraries
if (!window.Cookies) return;
// Enable cached fonts ASAP
if (window.Cookies && !!Cookies.get("fonts_loaded")) {
document.documentElement.className += " js-hasFontsLoaded";
}
if (window.dayjs) dayjs.extend(window.dayjs_plugin_relativeTime);
docReady(() => {
setTimeout(() => {
if (!window.Cookies || !window.FontFaceObserver) return;
// Indicate JS is loaded
document.documentElement.className =
document.documentElement.className.replace('no-js', 'js');
// Lazy-Load Media
if (typeof loadMedia === "function") {
loadMedia(".js-lazyLoader", null, true);
}
// Enable cached fonts ASAP
if (!!Cookies.get('fonts_loaded')) {
document.documentElement.className += ' js-hasFontsLoaded';
}
// Add relative dates via dayjs
if (window.dayjs) {
const times = document.getElementsByTagName("time");
docReady(() => {
setTimeout(() => {
// Lazy-Load Media
if (typeof loadMedia === 'function') {
loadMedia('.js-lazyLoader', null, true);
}
[].forEach.call(times, function (the_time) {
let pub_time = the_time.getAttribute("datetime");
if (the_time.className.indexOf("js-noRelativeTime") === -1)
the_time.innerHTML +=
' <span class="js-momentTime">(' +
dayjs(pub_time).from(dayjs()) +
")</span>";
the_time.classList.add("isDone");
});
}
// Add relative dates via dayjs
if (window.dayjs) {
const times = document.getElementsByTagName('time');
if (document.documentElement.className.indexOf("is404") > -1) {
document.getElementById("searchQuery").value =
window.location.pathname
.replace(/\\.html?$/, "")
.replace(/\//g, " ");
}
[].forEach.call(times, (the_time) => {
let pub_time = the_time.getAttribute('datetime');
if (the_time.className.indexOf('js-noRelativeTime') === -1)
the_time.innerHTML +=
' <span class="js-momentTime">(' +
dayjs(pub_time).from(dayjs()) +
')</span>';
the_time.classList.add('isDone');
});
}
document
.getElementById("searchForm")
.addEventListener("submit", function (e) {
document.getElementById("searchQuery").value +=
" site:" + window.location.hostname;
});
}, 1);
});
};
if (document.documentElement.className.indexOf('is404') > -1) {
document.getElementById('searchQuery').value =
window.location.pathname
.replace(/\\.html?$/, '')
.replace(/\//g, ' ');
}
onLoad();
document
.getElementById('searchForm')
.addEventListener('submit', (e) => {
document.getElementById('searchQuery').value +=
' site:' + window.location.hostname;
});
}, 1);
});
})();
// @license-end

View File

@ -0,0 +1,76 @@
// @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT
/****************************************************************************
* Planar Vagabond's Guide to the Multiverse (planarvagabond.com)
* Referee Tools
*
* Copyright 2023 Eric Woodward
* Source released under MIT License
* https://www.itsericwoodward.com/licenses/mit
****************************************************************************/
const // Scripts for the Die Roller
addRollerForm = () => {
const rollerForm = document.getElementById('js-rollerForm'),
rollerInput = document.getElementById('js-rollerInput'),
rollerOutput = document.getElementById('js-rollerOutput');
// double-click [x] to clear list
rollerForm.addEventListener('reset', (e) => {
if (rollerInput.value === '') rollerOutput.replaceChildren();
});
// do the roll and show th (cleaned-up) result
rollerForm.addEventListener('submit', (e) => {
e.preventDefault();
if (!window.dice) return;
const newEl = document.createElement('li');
const result = dice.roll(rollerInput.value);
newEl.innerText = `${dice.stringify(result)
.replaceAll('!!!mods listing not yet complete!!!', '')} = ${+result}`;
rollerOutput.prepend(newEl);
});
// clear on escape key
rollerForm.addEventListener('keydown', (event) => {
if (event.key === 'Escape') rollerForm.reset();
});
},
// Scripts for the Complication Randomizers
shuffleContainer = (parent) => {
const container = document.getElementById(parent),
children = container.children,
length = children.length,
shuffled = [...children];
for (let i = 0; i < length * length; i++)
shuffled.sort(() => 0.5 - Math.random());
for (let i = 0; i < length; i++) container.appendChild(shuffled[i]);
},
addComplicationForm = () => {
const complicationForm = document.getElementById('js-complicationForm');
complicationForm.addEventListener('submit', (e) => {
e.preventDefault();
shuffleContainer('js-complicationList');
});
},
addAstralComplicationForm = () => {
const complicationForm = document.getElementById(
'js-astralComplicationForm'
);
complicationForm.addEventListener('submit', (e) => {
e.preventDefault();
shuffleContainer('js-astralComplicationList');
});
};
export default (() => {
addRollerForm();
addComplicationForm();
addAstralComplicationForm();
})();
// @license-end

View File

@ -1,4 +1,13 @@
@font-face {
/****************************************************************************
* Planar Vagabond's Guide to the Multiverse (planarvagabond.com)
*
* Copyright 2023 Eric Woodward
* Source released under CC0 Public Domain License v1.0
* https://www.itsericwoodward.com/licenses/cc0
* http://creativecommons.org/publicdomain/zero/1.0/
****************************************************************************/
@font-face {
font-family: "raleway";
src: local("Raleway"),
url("/fonts/raleway/raleway-regular-webfont.woff2") format("woff2"),

View File

@ -1,8 +1,9 @@
/****************************************************************************
* It's Eric Woodward (dotcom)
* Planar Vagabond's Guide to the Multiverse (planarvagabond.com)
*
* Copyright 2015-2018 Eric Woodward
* Copyright 2023 Eric Woodward
* Source released under CC0 Public Domain License v1.0
* https://www.itsericwoodward.com/licenses/cc0
* http://creativecommons.org/publicdomain/zero/1.0/
****************************************************************************/

View File

@ -3,22 +3,12 @@
*
* Copyright 2023 Eric Woodward
* Source released under CC0 Public Domain License v1.0
* https://www.itsericwoodward.com/licenses/cc0
* http://creativecommons.org/publicdomain/zero/1.0/
****************************************************************************/
/*
Old New Palette
color: #e7a07f
bg: #252837
link: #38B1B6
border: #C33F3D
big-font: #C33F3D
black: #1A0608
other: #E8A384
visited: #3d81a5
blockquote: #04778f
New New Palette
Palette
color: #FADBB0
bg: #2C0F2A
link: #44FCFC
@ -33,8 +23,10 @@
html {
font-size: 16px;
}
body {
background: #2c0f2a; /* Old browsers */
background: #2c0f2a;
/* Old browsers */
background: url("/images/site-bg.jpg") bottom fixed;
background-size: cover;
color: #fadbb0;
@ -100,7 +92,7 @@ kbd {
background-color: rgba(13, 24, 82, 0.5);
color: #ccc;
font-size: 0.9em;
padding: 0.25em;
padding: 0;
}
details {
@ -112,7 +104,7 @@ details[open] {
max-height: 100rem;
}
details > summary {
details>summary {
cursor: pointer;
display: block;
font-weight: bold;
@ -122,7 +114,7 @@ details > summary {
user-select: none;
}
details[open] > summary::before {
details[open]>summary::before {
transform: rotate(90deg);
}
@ -154,18 +146,19 @@ figure {
text-align: center;
}
figure[data-type="image"] > a {
figure[data-type="image"]>a {
position: relative;
}
figure[data-type="image"] > a[target="_blank"]::after {
figure[data-type="image"]>a[target="_blank"]::after {
position: absolute;
bottom: 1rem;
right: 1rem;
}
figure img {
width: 100%; /* Scale down */
width: 100%;
/* Scale down */
}
h1 {
@ -265,7 +258,7 @@ pre {
color: #ccc;
font-size: 0.9em;
overflow: auto;
padding: 0.25em;
padding: 0.25em 0.5em;
}
pre code,
@ -357,13 +350,13 @@ a.hiddenLink:hover {
z-index: 0;
}
.imgWrapper figure > a {
.imgWrapper figure>a {
border-color: transparent;
display: inline-block;
padding: 0.5rem 0.5rem 0.25rem;
}
.imgWrapper figure > a:hover {
.imgWrapper figure>a:hover {
border-color: #e94e5c;
}
@ -391,9 +384,10 @@ a.licenseLink:hover {
cursor: pointer;
z-index: 9;
}
.menu-icon > span,
.menu-icon > span::before,
.menu-icon > span::after {
.menu-icon>span,
.menu-icon>span::before,
.menu-icon>span::after {
display: block;
position: absolute;
width: 100%;
@ -401,11 +395,13 @@ a.licenseLink:hover {
background-color: #616161;
transition-duration: 0.25s;
}
.menu-icon > span::before {
.menu-icon>span::before {
content: "";
top: -8px;
}
.menu-icon > span::after {
.menu-icon>span::after {
content: "";
top: 8px;
}
@ -447,36 +443,36 @@ a.licenseLink:hover {
margin-top: -1rem;
}
#menu-toggle:checked + .menu-label {
#menu-toggle:checked+.menu-label {
position: fixed;
}
#menu-toggle:checked + .menu-label .menu-icon > span {
#menu-toggle:checked+.menu-label .menu-icon>span {
transform: rotate(45deg);
}
#menu-toggle:checked + .menu-label .menu-icon > span::before {
#menu-toggle:checked+.menu-label .menu-icon>span::before {
top: 0;
transform: rotate(0deg);
}
#menu-toggle:checked + .menu-label .menu-icon > span::after {
#menu-toggle:checked+.menu-label .menu-icon>span::after {
top: 0;
transform: rotate(90deg);
}
#menu-toggle:checked ~ .navMenu {
#menu-toggle:checked~.navMenu {
left: 0;
}
#menu-toggle:checked + .menu-label .menu-text {
#menu-toggle:checked+.menu-label .menu-text {
transform: rotate(90deg);
left: -1rem;
top: 4rem;
}
/* Prevents close toggle from scrolling offscreen */
#menu-toggle:checked + .menu__btn {
#menu-toggle:checked+.menu__btn {
position: fixed;
top: 1rem;
}
@ -563,7 +559,7 @@ a.licenseLink:hover {
white-space: nowrap;
}
.navMenu > ul > li.hasSubMenu:hover > a {
.navMenu>ul>li.hasSubMenu:hover>a {
border: 1px solid #e94e5c;
}
@ -615,16 +611,19 @@ a.licenseLink:hover {
padding-left: 0;
}
.navMenu > ul {
.navMenu>ul {
padding: 1rem 2rem 1rem 4rem;
overflow-y: auto;
}
.navMenu > ul > li {
.navMenu>ul>li {
margin-top: 1rem;
}
.navMenu > ul > li:first-child {
.navMenu>ul>li:first-child {
margin-top: 0;
}
.navMenu ul li ul {
align-items: stretch;
display: flex;
@ -652,7 +651,7 @@ a.licenseLink:hover {
padding-left: 2rem;
}
.navMenu ul li.hasSubMenu > a {
.navMenu ul li.hasSubMenu>a {
padding-left: 1rem;
}
@ -666,7 +665,7 @@ a.licenseLink:hover {
padding-left: 1rem;
}
.navMenu ul li.hasSubMenu > a::before {
.navMenu ul li.hasSubMenu>a::before {
content: ">";
margin-left: -1rem;
padding-right: 0.5rem;
@ -785,6 +784,23 @@ a.pageTitle-sublink {
margin-top: 0.5rem;
}
.refereeTools {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
}
.rollerForm input[type=reset] {
font-size: small;
margin-left: -1.5rem;
margin-right: .5rem;
vertical-align: text-top;
}
.rollerForm input[type=text] {
padding-right: 1.5rem;
}
.rulesMenu {
/* border: 1px solid #fadbb0; */
align-items: center;
@ -848,78 +864,6 @@ a.pageTitle-sublink {
margin-top: 2rem;
}
.siteTitle-text {
max-width: 60%;
}
.timelineTableWrapper td:first-child {
white-space: nowrap;
}
.siteTitle-text {
text-align: left;
}
.table-of-contents {
backdrop-filter: blur(2rem);
border: 1px dashed #f6bc43;
display: block;
float: right;
margin-left: 2rem;
margin-bottom: 1rem;
}
.table-of-contents ul {
display: flex;
flex-direction: column;
list-style: none;
margin: 0 0 0.5rem 0;
padding: 0;
}
.table-of-contents ul li {
display: flex;
flex-direction: column;
margin: 0;
}
.table-of-contents ul li a {
border-bottom: 0;
padding: 0 0.5rem;
text-decoration: none;
width: 100%;
}
.table-of-contents ul li ul {
margin: 0;
}
.table-of-contents ul li ul li a {
padding: 0 0.5rem 0 1.5rem;
font-size: smaller;
}
.toc-container-header {
text-align: center;
background-color: rgba(37, 40, 55, 0.6);
color: rgba(195, 63, 61, 1);
font-weight: bold;
}
/****************************************************************************
* JS Overrides
****************************************************************************/
.js .pubDate.isDone {
-webkit-transition: 0.3s visibility;
transition: 0.3s visibility;
visibility: visible;
}
.no-js .pubDate {
visibility: visible;
}
/*
.searchBox {
margin-left: auto;
@ -985,6 +929,81 @@ a.pageTitle-sublink {
max-width: 48rem;
}
.siteTitle-text {
text-align: left;
}
.table-of-contents {
backdrop-filter: blur(2rem);
border: 1px dashed #f6bc43;
display: block;
float: right;
margin-left: 2rem;
margin-bottom: 1rem;
}
.table-of-contents ul {
display: flex;
flex-direction: column;
list-style: none;
margin: 0 0 0.5rem 0;
padding: 0;
}
.table-of-contents ul li {
display: flex;
flex-direction: column;
margin: 0;
}
.table-of-contents ul li a {
border-bottom: 0;
padding: 0 0.5rem;
text-decoration: none;
width: 100%;
}
.table-of-contents ul li ul {
margin: 0;
}
.table-of-contents ul li ul li a {
padding: 0 0.5rem 0 1.5rem;
font-size: smaller;
}
.timelineTableWrapper td:first-child {
white-space: nowrap;
}
.toc-container-header {
text-align: center;
background-color: rgba(37, 40, 55, 0.6);
color: rgba(195, 63, 61, 1);
font-weight: bold;
}
.toolDetails {
border: 1px dashed;
display: none;
margin-bottom: 4%;
overflow-y: auto;
padding: .5rem 2rem;
width: 100%;
}
.toolDetails[open] {
max-height: 25rem;
}
.toolDetails p {
margin-left: -1rem;
}
.toolDetails summary {
margin-left: -2rem;
}
.topAnchor {
border: none;
height: 0;
@ -1005,6 +1024,26 @@ a.pageTitle-sublink {
display: none;
}
/****************************************************************************
* JS Overrides
****************************************************************************/
.js .pubDate.isDone {
-webkit-transition: 0.3s visibility;
transition: 0.3s visibility;
visibility: visible;
}
.js .toolDetails {
display: block;
}
.no-js .pubDate {
visibility: visible;
}
/****************************************************************************
* Media Queries
****************************************************************************/
@ -1091,11 +1130,11 @@ a.pageTitle-sublink {
font-size: 1em;
}
#menu-toggle:checked + .menu-label {
#menu-toggle:checked+.menu-label {
position: absolute;
}
#menu-toggle:checked + .menu-label .menu-text {
#menu-toggle:checked+.menu-label .menu-text {
transform: none;
left: 2.25rem;
top: 0.75rem;
@ -1105,7 +1144,7 @@ a.pageTitle-sublink {
display: block;
}
.navMenu > ul {
.navMenu>ul {
padding: 4rem 2rem 1rem 2rem;
}
@ -1137,10 +1176,14 @@ a.pageTitle-sublink {
.siteTitle {
margin-top: 3rem;
}
.toolDetails {
width: 48%;
}
}
@media all and (min-width: 1200px) {
#menu-toggle:checked + .menu-label .menu-text {
#menu-toggle:checked+.menu-label .menu-text {
background: rgba(37, 40, 55, 0.9);
border-radius: 0.3rem;
padding: 0.5rem;
@ -1155,4 +1198,4 @@ a.pageTitle-sublink {
a {
transition-duration: 0.1s;
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,15 +1,27 @@
<!-- BOTTOM BEGIN -->
</div>
<script type="text/javascript" src="/scripts/1-docready.min.js"></script>
<script type="text/javascript" src="/scripts/2-es6-promise.auto.min.js"></script>
<script type="text/javascript" src="/scripts/3-lazy-progressive-enhancement.min.js"></script>
<script type="text/javascript" src="/scripts/4-js.cookie.min.js"></script>
<script type="text/javascript" src="/scripts/6-classlist.min.js"></script>
<script type="text/javascript" src="/scripts/7-dayjs.min.js"></script>
<script type="module" src="/scripts/scripts.js"></script>
</div>
<script crossorigin="anonymous" integrity="sha256-vFJF6miPDNSrafNXVTnhlyLp9aVv/tH5xjVBsXjhp3s=
sha384-oFDC2zCaOoiM9ShzquOEMnrv+YV6bdMWRtV+K6mfX9AFQ7RqJImN37BUchETbFs7
sha512-db4RL1xfLIIz9aHBKt8iIIbjR71P/P/A7wJCFyX+6l7pjrI2lY4Tr39H5CCP8JlgxgFAl+z/SCuGoA10AJvLrg=="
src="/scripts/lib/docready.min.js"></script>
<script crossorigin="anonymous" integrity="sha256-Jl381t7wjzoQ7DTNqN9Ko9odx+qhrjHJ5hUAh3ayHLU=
sha384-DtH/PMBA3EihIE5kC9UY95+osT3LhrAsz5VsOBeD+yY58AfHiJL7lSJv4Cv+3eIf
sha512-MA6ECmtSXbabx1WTNbADChNg37W4Kv5v4QoYGJxLXMyGeHeVFNkGmq+N6eXcae2VILXoGPfQhhteah1o+AAgng=="
src="/scripts/lib/lazy-progressive-enhancement-v1.0.0.min.js"></script>
<script crossorigin="anonymous" integrity="sha256-N9kDcQOI10TmPdJb11rrKwy2N6QHE/ohbUlwS6qaqiw=
sha384-K2qIMEVr41uI5AFZUBPyhTJ19jfLKSfZyrdepavmCyqbsu8d9txrnxY3VyLU3xHb
sha512-tC3K0pJ3N9gF4cWObuc4ihAyc3S3ZOI7LdzMxFEsQKHKacCi7ASb2VJe/QF5qoFNHupP4GGhskJKkOoiHNDiIQ=="
src="/scripts/lib/js-cookie-v3.0.1.min.js"></script>
<script crossorigin="anonymous" integrity="sha256-R5qUOf0mNqdalMuAEzZYbQHNrwPVjy1bavIqUOJa+JE=
sha384-cqadmreOTb8xFReIp9D4aXHl+DQyz9VbLFjtkzMn9aNNyuKOORQhhqotECvZZ7/a
sha512-X0kqlFnZim1wkOvQwpyWe88L0OZCkOkVJ4jRIoakJNVCqFsoZi+3xY56NnY/AWc1+UGBF94BocpncDgd0aieLA=="
src="/scripts/lib/dayjs-v1.11.9.min.js"></script>
<!-- We load this library via "module" script-tag to guarantee ES6 minimum functionality -->
<script type="module" src="/scripts/scripts.js"></script>
</body>
</html>
<!-- BOTTOM END -->
<!-- BOTTOM END -->

View File

@ -1,88 +1,83 @@
<!-- TOP BEGIN -->
<%
const
getPageField = (field_name) => {
return page[field_name] || site[field_name] || '';
},
getUrl = () => site.base_uri + (site.base_uri.endsWith('/') ? '' : '/') + page.path;
-%>
<!doctype html>
<!--[if lt IE 7]> <html class="no-js ie lt-ie10 lt-ie9 lt-ie8 lt-ie7" lang="en" xmlns:fb="http://ogp.me/ns/fb#"> <![endif]-->
<!--[if IE 7]> <html class="no-js ie lt-ie10 lt-ie9 lt-ie8" lang="en" xmlns:fb="http://ogp.me/ns/fb#"> <![endif]-->
<!--[if IE 8]> <html class="no-js ie lt-ie10 lt-ie9" lang="en" xmlns:fb="http://ogp.me/ns/fb#"> <![endif]-->
<!--[if IE 9]> <html class="no-js ie lt-ie10" lang="en" xmlns:fb="http://ogp.me/ns/fb#"> <![endif]-->
<!--[if gt IE 9]> <html class="no-js ie" lang="en" xmlns:fb="http://ogp.me/ns/fb#"> <![endif]-->
<!--[if !IE]>--> <html class="no-js" lang="en" xmlns:fb="http://ogp.me/ns/fb#"> <!--<![endif]-->
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<base href="<%= getUrl() %>" />
<title><%= page.title ? page.title + ' | ' : ''%><%= page.sub_title ? page.sub_title + ' | ' : ''%><%= site.title %></title>
<% const getPageField=(field_name)=> {
return page[field_name] || site[field_name] || '';
},
getUrl = () => site.base_uri + (site.base_uri.endsWith('/') ? '' : '/') + page.path;
-%>
<!doctype html>
<!--[if lt IE 7]> <html class="no-js ie lt-ie10 lt-ie9 lt-ie8 lt-ie7" lang="en" xmlns:fb="http://ogp.me/ns/fb#"> <![endif]-->
<!--[if IE 7]> <html class="no-js ie lt-ie10 lt-ie9 lt-ie8" lang="en" xmlns:fb="http://ogp.me/ns/fb#"> <![endif]-->
<!--[if IE 8]> <html class="no-js ie lt-ie10 lt-ie9" lang="en" xmlns:fb="http://ogp.me/ns/fb#"> <![endif]-->
<!--[if IE 9]> <html class="no-js ie lt-ie10" lang="en" xmlns:fb="http://ogp.me/ns/fb#"> <![endif]-->
<!--[if gt IE 9]> <html class="no-js ie" lang="en" xmlns:fb="http://ogp.me/ns/fb#"> <![endif]-->
<!--[if !IE]>-->
<html class="no-js" lang="en" xmlns:fb="http://ogp.me/ns/fb#"> <!--<![endif]-->
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="manifest" href="/site.webmanifest">
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#f03733">
<meta name="msapplication-TileColor" content="#8fffff">
<meta name="theme-color" content="#8fffff">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<base href="<%= getUrl() %>" />
<title>
<%= page.title ? page.title + ' | ' : '' %>
<%= page.sub_title ? page.sub_title + ' | ' : '' %>
<%= site.title %>
</title>
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="192x192" href="/android-chrome-192x192.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="manifest" href="/site.webmanifest">
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#f03733">
<meta name="msapplication-TileColor" content="#8fffff">
<meta name="theme-color" content="#ffffff">
<meta http-equiv="Content-Security-Policy"
content="default-src 'self'; img-src 'self' https://*; media-src 'self' https://*;" />
<meta name="description" content="<%= getPageField('description') %>">
<meta name="author" content="<%= (page.author || site.author).name %>">
<meta name="generator" content="Gulp" />
<meta name="keywords" content="<%= getPageField('keywords') %>">
<meta name="robots" content="<%= getPageField('robots') %>">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="192x192" href="/android-chrome-192x192.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="manifest" href="/site.webmanifest">
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#f03733">
<meta name="msapplication-TileColor" content="#8fffff">
<meta name="theme-color" content="#ffffff">
<!-- Open Graph -->
<meta property="og:type" content="website" />
<meta property="og:url" content="<%= site.base_uri %><%= page.path %>" />
<meta property="og:site_name" content="<%= site.title %>" />
<meta property="og:title" content="<%= getPageField('title') %>" />
<% if (page.image) { %>
<meta property="og:image" content="<%= page.image %>" />
<% } %>
<% if (page.description) { %>
<meta property="og:description" content="<%= page.description %>" />
<% } %>
<meta name="description" content="<%= getPageField('description') %>">
<meta name="author" content="<%= (page.author || site.author).name %>">
<meta name="generator" content="Gulp"/>
<meta name="keywords" content="<%= getPageField('keywords') %>">
<meta name="robots" content="<%= getPageField('robots') %>">
<!-- Twitter Card -->
<% if (page.image) { %>
<meta name="twitter:card" content="summary_large_image" />
<% } else { %>
<meta name="twitter:card" content="summary" />
<% } %>
<meta name="twitter:url" content="<%= site.base_uri %><%= page.path %>" />
<meta name="twitter:title" content="<%= getPageField('title') %>" />
<meta name="twitter:description" content="<%= getPageField('description') %>" />
<meta name="twitter:image:src" content="<%= getPageField('image') %>" />
<% if (page.author && page.author.twitter) { %>
<meta name="twitter:creator" content="<%= page.author.twitter %>" />
<% } else if (site.author && site.author.twitter) { %>
<meta name="twitter:creator" content="<%= site.author.twitter %>" />
<% } %>
<link rel="start" href="<%= site.base_uri %>/" />
<link rel="contents" href="/sitemap.xml" title="Sitemap" />
<link rel="alternate" type="application/rss+xml" title="Recent Changes" href="/feed" />
<link rel="canonical" href="<%= site.base_uri %><%= page.path %>" />
<!-- Open Graph -->
<meta property="og:type" content="website" />
<meta property="og:url" content="<%= site.base_uri %><%= page.path %>" />
<meta property="og:site_name" content="<%= site.title %>" />
<meta property="og:title" content="<%= getPageField('title') %>" />
<% if (page.image) { %>
<meta property="og:image" content="<%= page.image %>"/>
<% } %>
<% if (page.description) { %>
<meta property="og:description" content="<%= page.description %>" />
<% } %>
<link rel="stylesheet" href="/styles/imports.css" type="text/css" />
<link rel="stylesheet" href="/styles/fonts.css" type="text/css" />
<link rel="stylesheet" href="/styles/styles.css" type="text/css" />
</head>
<!-- Twitter Card -->
<% if (page.image) { %>
<meta name="twitter:card" content="summary_large_image" />
<% } else { %>
<meta name="twitter:card" content="summary" />
<% } %>
<meta name="twitter:url" content="<%= site.base_uri %><%= page.path %>" />
<meta name="twitter:title" content="<%= getPageField('title') %>" />
<meta name="twitter:description" content="<%= getPageField('description') %>" />
<meta name="twitter:image:src" content="<%= getPageField('image') %>" />
<% if (page.author && page.author.twitter) { %>
<meta name="twitter:creator" content="<%= page.author.twitter %>" />
<% } else if (site.author && site.author.twitter) { %>
<meta name="twitter:creator" content="<%= site.author.twitter %>" />
<% } %>
<link rel="start" href="<%= site.base_uri %>/"/>
<link rel="contents" href="/sitemap.xml" title="Sitemap"/>
<link rel="alternate" type="application/rss+xml" title="Recent Changes" href="/feed"/>
<link rel="canonical" href="<%= site.base_uri %><%= page.path %>"/>
<link rel="stylesheet" href="/styles/imports.css" type="text/css" />
<link rel="stylesheet" href="/styles/fonts.css" type="text/css" />
<link rel="stylesheet" href="/styles/styles.css" type="text/css" />
</head>
<!-- TOP END -->
<!-- TOP END -->

View File

@ -18,15 +18,15 @@ short_code: a1
The Guide was started in year 5022 CAC as a series of small, (mostly) hand-produced pamphlets sold for a few silvers each at a handful of ports, and has quickly grown to be a wholly remarkable tome, possibly the most remarkable tome ever to be published by a halfling (although some may disagree).
It is also a highly successful one more popular than the Idiot's Guide to Running an Astral Business, better selling than Fifty More Things to do in Subjective Gravity, and more controversial than Malyx Malator's trilogy of metaphysical blockbusters: Where the Gods Went Wrong, Infernus: Fairy-tale or Fiction?, and The Lie of Alignment.
It is also a highly successful one more popular than the _Idiot's Guide to Running an Astral Business_, better selling than _Fifty More Things to do in Subjective Gravity_, and more controversial than Balyx Balator's trilogy of metaphysical blockbusters: _Where the Gods Went Wrong_, _Infernus: Fairy-tale or Fiction?_, and _The Lie of Alignment_.
In many of the more relaxed civilizations on the Outer Koronin Rim of <abbr title="Astral Trade Union">ATU</abbr>-space, the Guide has already supplanted the great Encyclopedia of the University Eternal as the standard repository of all knowledge and wisdom, for though it is perpetually incomplete and has many omissions and apocrypha, it scores over the more established work in two important respects:
In many of the more relaxed civilizations on the Outer Koronin Rim of <abbr title="Astral Trade Union">ATU</abbr>-space, the Guide has already supplanted the great _Encyclopedia of the University Eternal_ as the standard repository of all knowledge and wisdom, for though it is perpetually incomplete and has many omissions and apocrypha, it scores over the more established work in two important respects:
First, it is slightly cheaper (not surprising, given that the University demands a child as payment for a copy of their weighty tomes); and secondly it has the words _Feare Naught!_ inscribed in large friendly letters on its cover.
### About the Planar Vagabond
One day, a halfling named Drogo Wanderfoot, while trying to evade some unscrupulous characters, stepped into a glowing portal, and found himself in the Astral Plane. Since then, he's passed through dozens of ports, and is believed to have visited _37_ different planes, including the 4 accessible elemental planes (although some insist he's visited all 6). Not bad for a little fella from a broken home on a backwater world.
One day, while trying to evade some rather unscrupulous characters, a halfling named Drogo Wanderfoot stepped into a glowing portal and found himself in the Astral Plane. Since then, he's passed through dozens of ports, and is believed to have visited _37_ different planes, including the 4 accessible [elemental planes](/planes/elemental/index.html) (although some insist he's visited all 6). Not bad for a little fella from a broken home on a backwater world.
He can usually be found drinking at the seediest dive in a port, gambling for his soul in a back alley on some distant plane, sailing on the astral currents, or even working on the next issue of his Guide to the Multiverse.

View File

@ -25,32 +25,33 @@ The steps to take for each phase of astral travel:
Roll 1d6, ignoring results of 4+ for the first 2 checks.
- An encounter check is typically rolled once every other day, but the referee may choose to make more checks (ex: when near a [port](#portals) or [outpost](#outposts)), up to 1 per day (or even 1 per phase).
- The chance of encountering a wandering creature is typically 1-in-6 in the deep astral, 2-in-6 near other ports or outposts.
**Distance**: Wandering creatures are encountered 4d6 × 10 yards away. If either side is surprised (see Encounters), this is reduced to 1d4 × 10 yards.
**Location**: Astral encounters may occur either in the open astral plane or on land (such as a fragment, island, or dock), if the party lands or docks at some point during the day.
1. **Encounter**: Wandering creature, social encounter, or some other random interaction.
2. **Signs**: Indications of possible encounter nearby - could be a clue, indications of a creature nearby, etc.
1. **Encounter**: Wandering creature or vessel, social encounter, or some other random interaction.
2. **Signs / Portents**: Indications of possible encounter nearby - could be a clue, indications of a creature nearby, etc.
3. **Locality**: Some environmental or external event that affects the PCs - psychic storm, fragment, etc.
4. **Pilot / Ship Issue**: Pilot / power source exhaustion or some other ship complication, takes 1d6 shifts to resolve and resume travel (50% chance the ship will have to remain in dock for 1d6 phases to make additional repairs).
5. **Lose Direction**: Each phase spent moving in the wrong direction adds 1d4-1 additional phases of travel.
6. **No Complications**
**Distance**
- Astral encounters between ships usually start 1400 + (1d6 x 100) yards out (about a mile, the distance at which two ships will pull each other out of travel speed).
- Wandering creatures are encountered 4d6 × 10 yards away, and are usually not surprised by astral vessels.
- If either side is surprised (see [Encounter procedure](/rules/adventuring.html#encounter-procedure)), this is reduced to 1d4 × 10 yards.
**Location**: Astral encounters may occur either in the open astral plane or on land (such as a fragment, island, or dock), if the party lands or docks at some point during the day.
**Frequency of Check**
- In the deep astral, check once every other day (once per every 6 phases).
- Near an outpost or port (within 1-2 days travel), check once per day, or even once per phase (for busy outposts).
- In the deep astral, check once every other day (once every 6 phases, roll 1d6 to determine which phase).
- Near a [port](#portals) or [outpost](#outposts) (within 1-2 days travel), check once per day, or even once per phase (for busy outposts).
### Calendar
!!!include(today.md)!!!
- Each day on the astral plane is broken up into 3 phases of 24 astral-hours (to keep the astral calendars in sync with the material planes).
- Additionally, each phase while travelling on an astral cruiser is broken up into 3 shifts.
- There are 3 shifts in a phase, 3 phases in a day, 6 days in a week, 5 weeks in a month, 3 months in a season, and 4 season in a year.
- Additionally, each phase while traveling on an astral vessel is broken up into 3 shifts.
- There are 3 shifts in a phase, 3 phases in a day, 6 days in a week, 5 weeks in a month, 3 months in a season, and 4 seasons in a year.
- Each day is named after one of the elements:
- Urtday (Earth)
- Aerday (Air)
@ -71,7 +72,7 @@ Invisible flows of psychic energy that permeate and swirl around the astral plan
- Creatures move up to 10x faster when moving with the current (or faster).
- Vessels designed to ride on these currents are called **astral cruisers**.
- They can use the currents to move at [travel](#travel) speed.
- They can use the currents to move at [travel speed](/astral/vessels#travel-speedl).
### Distance and Measurement
@ -87,6 +88,7 @@ Invisible flows of psychic energy that permeate and swirl around the astral plan
- -4 to attack rolls.
- Range is 1 mile.
<!--
### Chases
#### Evading
@ -122,22 +124,7 @@ Evasion chance is determined by difference between the movement rates of the two
[Astralborne Evasion Chance]
</div>
### Encounters
- An encounter check is typically rolled once every other day, but the referee may choose to make more checks (ex: when near a [port](#portals) or [outpost](#outposts)), up to 1 or 2 per day.
- The chance of encountering a wandering creature is typically 1-in-6 in the deep astral, 2-in-6 near other ports or outposts.
#### Distance
Encounters between ships usually start 1400 + (1d6\*100) yards out (about a mile apart).
- Wandering creatures are encountered 4d6 × 10 yards away.
- If any side is stealthy, this is reduced to 1d4 × 10 yards.
- Astral encounters between ships usually start 1400 + (1d6\*100) yards out (about a mile, the distance that ships auto drop out of slipstream / travel speed when they encounter something )
**Location**: Astral encounters may occur either in the open astral plane or on land (such as a fragment, island, or dock), if the party lands or docks at some point during the day.
-->
### Fragments
@ -151,7 +138,7 @@ Pieces of other planes (usually floating) in the astral plane. The shape is typi
- **Chaos**: Fragments from [the elemental plane of chaos](/planes/elemental.html) are usually jet black globes, and tend to function as spheres of annihilation.
- **Law**: Fragments from [the elemental plane of law](/planes/elemental.html) are usually globes of crackling, radiant energy.
- It's believed that these arise spontaneously when a fragment from the plane of chaos appears, and are equal in size to the chaos ones.
- When a fragment of law and chaos are combined, the resulting release of energy looks like white and black ligthning, and can be seen for thousands of miles around.
- When a fragment of law and chaos are combined, the resulting release of energy looks like white and black lightning, and can be seen for thousands of miles around.
### Gravity
@ -198,11 +185,11 @@ Wandering astral creatures are not usually surprised by traveling vessels. Speci
### Temperature
The ambient temperature in the astral plane tends towards the tepid side for most humans and demihumanas, being roughly equivalent to a warm spring day in a temperate climate.
The ambient temperature in the astral plane tends towards the tepid side for most humans and demihumans, being roughly equivalent to a warm spring day in a temperate climate.
### Time
- Time is quckened: 3 rounds pass in the astral plane for each round that passes in a Material Plane.
- Time is quickened: 3 rounds pass in the astral plane for each round that passes in a Material Plane.
- Spells cast in the Astral plane appear to last 3 times as long as listed
- The effects of time don't happen while on the astral plane. This means that characters in the Astral Plane:
- do not age,
@ -215,11 +202,13 @@ The ambient temperature in the astral plane tends towards the tepid side for mos
Travel by astral cruiser (via the [astral currents](#astral-currents)) to any known location within the astral plane usually takes 3-30 days.
- Travel between most ports under the control of the Astral Trade Union only takes 1d6+2 days.
- Without a ship, the vast distances between landmarks means one could fall for weeks, months, or even years before coming across any other creatures.
- Without a ship, the vast distances between landmarks means one could go for weeks, months, or even years before coming across anyone (or anything) else.
- It takes 1 turn for a ship to dock, and 1 turn for it to disembark.
- An astral cruiser cannot travel by currents while within 1 mile of another active vessel or large astral body (like an island).
- If a cruiser comes within a mile of a large astral object while traveling. it will automatically reduce its speed to normal movement (in yards).
### Visibility
- An astral body (such as a [fragment](#fragments), island, or even a dead god) may be spotted at a distance of hundreds of miles (based on its size).
- Vesssels (and large creatures) may be sighted at great distances by the contrails they leave behind in the psychic clouds that permeate the plane.
- Identification is usually limited to tactical range (approxmiately 1 mile) in the open astral plane, or as little as 100 yards in a psychic storm.
- Vessels (and large creatures) may be sighted at great distances by the contrails they leave behind in the psychic clouds that permeate the plane.
- Identification is usually limited to tactical range (approximately 1 mile) in the open astral plane, or as little as 100 yards in a psychic storm.

View File

@ -15,14 +15,18 @@ short_code: av1
- Often shaped like a high-backed chair.
- Controlled by a **Pilot**.
- It takes one round to activate a console, and one round to deactivate a console.
- It takes one round to activate a console.
- This process may be sped up by a successful CHA check.
- It takes one round to deactivate a console.
- If this process is cut short (ex: by forcibly removing the pilot from the console), the pilot must **Save vs Spells** or suffer -2 to all rolls for 1d6 rounds.
- While active, the pilot:
- can sense the astral currents that surround the ship,
- may move the ship in any direction at tactical speed (INT x 30 yards / round),
- may move the ship in any direction at [tactical speed](#tactical-speed) (INT x 30 yards / round),
- can see currents and (subtly) move ship between them (although turning the ship at traveling speed can't be done without using the sails),
- can see as if standing on the bow of the ship (typically facing forward, but can be turned 90 degrees left or right to see off of the port and starboard decks, respectively).
- Note that directly behind the ship can be seen, but only peripherally.
- It can take up to 1 turn to find a suitable current to ride at [travel speed](./adventuring.html#travel).
- It takes 1 turn for a ship to dock, and 1 turn for it to disembark.
- It can take up to 1 turn to find a suitable current to ride at [travel speed](#travel-speed).
- Once a console has been installed on a vessel, it cannot be forcibly removed (without using the "release" word) until the integrity of the vessel itself has been compromised.
- The pilot can be any character class.
- Piloting a ship via a console requires concentration, and shouldn't be done for more than 8 hours in a row.
@ -38,37 +42,44 @@ short_code: av1
- For two consoles (or similar devices), make a contested CHA check between the two pilots, with the loser being locked-out of controlling the ship.
- For one console and an inert device (like a Fire Engine), the pilot should make a CHA check to override the device and take control of the vessel.
##### Usage with a Planar Compass
#### Usage with a Planar Compass
- Using an astral console while wearing a planar compass provides the pilot with an enhanced ability to see the ship, its surrounding area, and even distant targets.
- The compass can be focused on any ship or location within one day's travel of the wearer at their current speed.
- The compass can be focused on any ship or location within one day's travel of the wearer at their current speed, providing a 360-degree view.
### Other Types of Engines
- **Fire Engines**: A large thruster, built (and usually controlled) by Dwarves, and powered by elemental fire. Rumored to be capable of propelling even the largest vessels at traveling speeds.
- **Life Engines**: Some evil-aligned races use the life energy from slaves and captives to power their vessels.
- **Mind Engines**: Some psychic races use their psychic energy to power and control their vessels.
<!--
- **Orbipods (Tyrant Ships)**: Eye Tyrant ships are powered by one or more orbi (singular orbus), a mutant eye tyrant bred solely for this purpose.
-->
### Engine Speed
Most engines caan move at two speeds: **tactical speed** and **travel speed**.
Most engines can move at two speeds: **tactical speed** and **travel speed**.
#### Tactical Speed
For astral cruisers that aren't riding currents, or any ship within 1 mile of another:
- **Console** = Pilot's INT x 30 yards / round
- **Fire Engine** = 300 yards / round
<!--
- **Orbipod** = 300 yards / round for a single one, each additional adds a 20% (60 yards / round) boost
- 2 orbipods = 360 yards / round
- 3 orbipods = 420 yards / round
-->
#### Travel Speed
So fast that distance becomes meaningless, and only time is specified (ex: 2 days travel).
- Astral cruisers (including those powered by consoles) need to ride on the astral currents to attain this speed.
- Ships powered by fire engines are alleged to be able to reach this speed without using currents (although it takes a full phase of travel to reach that speed).
- Ships powered by fire engines are alleged to be able to move at this speed without using currents (although it takes a full phase of travel to reach it).
- Travel between most ports under the control of the Astral Trade Union only takes 1d6+2 days.
### Roles
@ -101,18 +112,18 @@ During each round of pursuit or combat, PCs occupying these roles may attempt to
| Vessel | Cost (gp) | Cargo Capacity (coins) | Length | Beam | Crew | Weapons | Ram | Landing Types | AC | HP |
| --------------------- | :-------: | :--------------------: | :-------: | :-------: | :--: | :------: | :-: | :-------------: | :---------: | :-----: |
| Caravel | 10,000 | 100,000 | 60'-80' | 20'-30' | 10 | 1 | N | Water | 8&nbsp;[11] | 60-90 |
| Galleon | 20,000 | 300,000 | 100'-150' | 25'-30' | 20 | 3 | N | Water | 7 [12] | 120-180 |
| Warship, Sm | 6,600 | 100,000 | 60'-80' | 20'-30' | 10 | 1/2 | Y | Water | 8 [11] | 60-90 |
| Warship, Lg | 26,600 | 300,000 | 100'-150' | 25'-30' | 20 | 2/4 | Y | Water | 7 [12] | 150-210 |
| Ghyffan Corvette | 15,000 | 250,000 | 100'-150' | 25'-35' | 10 | 1/2 | N | Water | 7 [12] | 90-150 |
| Ghyffan Battlecruiser | 45,000 | 450,000 | 220'-280' | 20'-30' | 24 | 3/4 | Y | None | 7 [12] | 180-240 |
| Stral Destroyer | 40,000 | 350,000 | 150'-200' | 25'-35' | 10 | 5 lg | Y | None | 7 [12] | 150-210 |
| Stral Dreadnought | 50,000 | 600,000 | 220'-280' | 20'-30' | 24 | 3 lg | Y | None | 7 [12] | 180-240 |
| Dwarven Fortress | 100,000 | 3,000,000 | 200'-300' | 150'-250' | 10 | 10 lg | Y | Land | 7 [12] | 360-720 |
| Gnomish SteamJammer | 40,000 | 300,000 | 100'-150' | 20'-30' | 20 | 1 lg | N | Land, Water[^1] | 7 [12] | 90-120 |
| Drahki Dragonship, Sm | 60,000 | 150,000 | 80'-120' | 10'-15' | 10 | 1 lg[^2] | Y | Water | 7 [12] | 120-180 |
| Drahki Dragonship, Lg | 60,000 | 450,000 | 150'-200' | 15'-20' | 20 | 3 lg[^2] | Y | Water | 7 [12] | 180-240 |
| Caravel | 10,000 | 100,000 | 60'-80' | 20'-30' | 10 | 1 | N | Water | 8&nbsp;[11] | 90-120 |
| Galleon | 20,000 | 300,000 | 100'-150' | 25'-30' | 20 | 3 | N | Water | 7 [12] | 180-240 |
| Warship, Sm | 6,600 | 100,000 | 60'-80' | 20'-30' | 10 | 1/2 | Y | Water | 8 [11] | 90-120 |
| Warship, Lg | 26,600 | 300,000 | 100'-150' | 25'-30' | 20 | 2/4 | Y | Water | 7 [12] | 210-270 |
| Lyffan Corvette | 15,000 | 250,000 | 100'-150' | 25'-35' | 10 | 1/2 | N | Water | 7 [12] | 120-180 |
| Lyffan Battlecruiser | 45,000 | 450,000 | 220'-280' | 20'-30' | 24 | 3/4 | Y | None | 7 [12] | 270-330 |
| Stral Destroyer | 40,000 | 350,000 | 150'-200' | 25'-35' | 10 | 5 lg | Y | None | 7 [12] | 210-270 |
| Stral Dreadnought | 50,000 | 600,000 | 220'-280' | 20'-30' | 24 | 3 lg | Y | None | 7 [12] | 270-330 |
| Dwarven Fortress | 100,000 | 3,000,000 | 200'-300' | 150'-250' | 10 | 10 lg | Y | Land | 7 [12] | 480-960 |
| Gnomish SteamJammer | 40,000 | 300,000 | 100'-150' | 20'-30' | 20 | 1 lg | N | Land, Water[^1] | 7 [12] | 120-150 |
| Drahki Dragonship, Sm | 60,000 | 150,000 | 80'-120' | 10'-15' | 10 | 1 lg[^2] | Y | Water | 7 [12] | 180-240 |
| Drahki Dragonship, Lg | 60,000 | 450,000 | 150'-200' | 15'-20' | 20 | 3 lg[^2] | Y | Water | 7 [12] | 270-330 |
[Ship Statistics]
@ -129,7 +140,7 @@ Fire large bolts (arrows) of wood and iron.
**Cargo Space**: A medium ballista plus twenty bolts requires 6,000 coins of cargo space, and a heavy ballista plus twenty bolts occupies 12,000 coins worth (both subtracted from the ships cargo allowance).
**Attack modifiers**: May be applied for environmental conditions, manoeuvrability, etc.
**Attack modifiers**: May be applied for environmental conditions, maneuverability, etc.
##### Medium Ballista
@ -140,7 +151,7 @@ Fire large bolts (arrows) of wood and iron.
- 2 crew (minimum): Attacks with THAC0 15 [+4]. Fires every 3 rounds.
- 3 crew (maximum): Attacks with THAC0 14 [+5]. Fires every 2 rounds.
**Damage**: 3d6 hit points or 3d2 hull points.
**Damage**: 3d6 hit points.
##### Heavy Ballista
@ -151,7 +162,7 @@ Fire large bolts (arrows) of wood and iron.
- 4 crew (minimum): Attacks with THAC0 15 [+4]. Fires every 4 rounds.
- 5 crew (maximum): Attacks with THAC0 14 [+5]. Fires every 3 rounds.
**Damage**: 3d10 hit points or 3d6 hull points.
**Damage**: 3d10 hit points.
#### Bombards (Cannons)
@ -161,14 +172,14 @@ Fire magically-propelled large balls of iron.
**Range**: 1,000 yards.
**Attack modifiers**: May be applied for environmental conditions, manoeuvrability, etc.
**Attack modifiers**: May be applied for environmental conditions, maneuverability, etc.
**Attack rolls and rate of fire**: Depend on the number of crew manning the bombards:
- 3 crew (minimum): Attacks with THAC0 17 [+2]. Fires every 3 rounds.
- 4 crew (maximum): Attacks with THAC0 16 [+3]. Fires every 2 rounds.
**Damage**: 2d10 hit points or hull points.
**Damage**: 2d10 hit points.
#### Drahki Fire Cannons
@ -187,7 +198,7 @@ Fire dragon's flame. Can be tuned to fire in a cloud, cone, or line. Requires a
- 2 crew (minimum): Attacks with THAC0 15 [+4]. Fires every 2 rounds.
- 3 crew (maximum): Attacks with THAC0 14 [+5]. Fires each round.
**Damage**: 1d6+5 x 10 hit points or 1d6+5 x 5 hull points
**Damage**: 1d6+5 x 10 hit points
<!--
@ -201,7 +212,7 @@ Fire energy bolts that function like magic missiles. Requires 2 common Eye Tyran
**Attack rolls and rate of fire**: Attacks with THAC0 15 [+4]. Fires three bolts every round, roll for each bolt.
**Damage**: 1d6+1 hit points or hull points per bolt. Bolts that hit a ship only have a 2-in-6 chance of failing to do damage (scorching the surface).
**Damage**: 1d6+1 hit points per bolt. Bolts that hit a ship only have a 2-in-6 chance of failing to do damage (scorching the surface).
-->
@ -211,11 +222,11 @@ Can be used against ships or giant creatures. Small individuals cannot be target
**Attack rolls**: Are made using a THAC0 of 19 [0] and occur at the same point in the combat sequence as missile fire.
**Attack modifiers**: May be applied for environmental conditions, manoeuvrability, etc.
**Attack modifiers**: May be applied for environmental conditions, maneuverability, etc.
**Large ships**: Deals 1d6+5 x 10 hull points damage against ships and 6d6 hit points damage against creatures.
**Large ships**: Deals 1d10+5 x 10 hit points damage against ships and 6d6 hit points damage against creatures.
**Small ships**: Deals 1d4+4 x 10 hull points damage against ships and 3d8 hit points damage against creatures.
**Small ships**: Deals 1d8+4 x 10 hit points damage against ships and 3d8 hit points damage against creatures.
### Determining Crew
@ -264,12 +275,12 @@ Roll 1d10 and consult the Crew Makeup Table to determine how many times to roll
<div class="dividedTableWrapper">
| 1d6 | Type |
| --- | --------- |
| 1-2 | Merchant |
| 3-4 | Military |
| 5 | Religious |
| 6 | Other |
| 1d6 | Type |
| --- | ------------- |
| 1-2 | Merchant |
| 3-4 | Military |
| 5 | Religious |
| 6 | Mixed / Other |
[Ship Purpose Table]

View File

@ -1,27 +0,0 @@
---
title: Whale, Astral
description: TBD
date_pub: 2023-02-17T00:26:00-05:00
section: bestiary
content_type: feature
short_code: maw
status: draft
---
Gargantuan whales up to 170 long that roam the astral plane.
<div class='headlessTableWrapper'>
| | |
| --------------- | ---------------------------------------------- |
| **Hit Dice** | 36 (234hp) |
| **Armor Class** | 13 |
| **Movement** | Float 60 |
| **Attacks** | 1 (+14) @ bite (3d20) or ram (6d6 hull damage) |
| **Morale** | 7 |
| **Alignment** | Neutral |
| **XP** | 6,250 |
</div>
**Riders** - 50% chance to have 1d20 riders.

View File

@ -25,17 +25,20 @@ Holy (or unholy) warrior-priests on a quest for their deity.
</div>
- **Leader**: Groups of 4+ are led by a higher level priest or cleric (1d4 HD higher). Roll or determine spells as needed.
- **Weapon Restrictions**: Lawful clerics may only use [weapons](/rules/combat.html#weapons) with the _Blunt_ trait.
#### At Higher Levels
<div class="dividedTableWrapper">
| HD | HP | AC | MV | Atk Mod | Damage | Morale |
| :-: | :-: | :-: | :-: | :-----: | :----: | :----: |
| 3 | 13 | 17 | 20' | +1 | 1d6 | 8 |
| 5 | 22 | 18 | 20' | +2 | 1d6+1 | 8 |
| 7 | 31 | 19 | 30' | +3 | 1d6+1 | 9 |
| 9 | 40 | 19 | 30' | +4 | 1d6+1 | 10 |
| 11 | 49 | 20 | 30' | +6 | 1d6+2 | 11 |
| 13 | 58 | 20 | 40' | +8 | 1d6+2 | 12 |
| 3 | 13 | 17 | 20' | +2 | 1d6 | 8 |
| 5 | 22 | 18 | 20' | +4 | 1d6+1 | 8 |
| 7 | 31 | 19 | 30' | +6 | 1d6+1 | 9 |
| 9 | 40 | 19 | 30' | +7 | 1d6+1 | 10 |
| 11 | 49 | 20 | 30' | +8 | 1d6+2 | 11 |
| 13 | 58 | 20 | 40' | +9 | 1d6+2 | 12 |
[Higher-Level Clerics]
@ -45,10 +48,10 @@ Holy (or unholy) warrior-priests on a quest for their deity.
```
> HD 1 (4 hp), AC 17; MV 20'; Atk 1 (0) @ 1d6 (mace); AL Any; ML 7
> HD 3 (13 hp), AC 17; MV 20'; Atk 1 (+1) @ 1d6 (mace); AL Any; ML 8
> HD 5 (22 hp), AC 18; MV 20'; Atk 1 (+2) @ 1d6+1 (mace); AL Any; ML 8
> HD 7 (31 hp), AC 19; MV 30'; Atk 1 (+3) @ 1d6+1 (mace); AL Any; ML 9
> HD 9 (40 hp), AC 19; MV 30'; Atk 1 (+4) @ 1d6+1 (mace); AL Any; ML 10
> HD 11 (49 hp), AC 20; MV 30'; Atk 1 (+6) @ 1d6+2 (mace); AL Any; ML 11
> HD 13 (58 hp), AC 20; MV 40'; Atk 1 (+8) @ 1d6+2 (mace); AL Any; ML 12
> HD 3 (13 hp), AC 17; MV 20'; Atk 1 (+2) @ 1d6 (mace); AL Any; ML 8
> HD 5 (22 hp), AC 18; MV 20'; Atk 1 (+4) @ 1d6+1 (mace); AL Any; ML 8
> HD 7 (31 hp), AC 19; MV 30'; Atk 1 (+6) @ 1d6+1 (mace); AL Any; ML 9
> HD 9 (40 hp), AC 19; MV 30'; Atk 1 (+7) @ 1d6+1 (mace); AL Any; ML 10
> HD 11 (49 hp), AC 20; MV 30'; Atk 1 (+8) @ 1d6+2 (mace); AL Any; ML 11
> HD 13 (58 hp), AC 20; MV 40'; Atk 1 (+9) @ 1d6+2 (mace); AL Any; ML 12
```

View File

@ -12,30 +12,35 @@ An adventurer that specializes in combat.
<div class='headlessTableWrapper'>
| | |
| --------------- | -------------------------------------------- |
| **Hit Dice** | 1d10 (5hp) |
| **Armor Class** | 13 (leather) |
| **Movement** | 40' |
| **Attacks** | 1(0) @ 1d6 (weapon) |
| **Alignment** | Any |
| **Save As** | [Fighter](/classes/fighter.html#advancement) |
| **Morale** | 7 |
| | |
| --------------- | ---------------------------------------------------------------------------------------------- |
| **Hit Dice** | 1d10 (5hp) |
| **Armor Class** | 13 (leather) |
| **Movement** | 40' |
| **Attacks** | 1(0) @ 1d8 ([sword or other weapon](https://www.planarvagabond.com/rules/combat.html#weapons)) |
| **Alignment** | Any |
| **Save As** | [Fighter](/classes/fighter.html#advancement) |
| **Morale** | 7 |
</div>
**Leader**: 50% chance groups of 4+ are led by a higher level fighter (1d4 HD higher).
- **Leader**: 50% chance groups of 4+ are led by a higher level fighter (1d4 HD higher).
- **Weapon Versatility**: May be found wielding various types of [weapons](https://www.planarvagabond.com/rules/combat.html#weapons).
#### At Higher Levels
<div class="dividedTableWrapper">
| HD | HP | AC | Atk Mod | Damage | Morale |
| :-: | :-: | :-: | :-----: | :----: | :----: |
| 3 | 16 | 14 | +2 | 1d6 | 7 |
| 5 | 27 | 15 | +4 | 1d6+1 | 8 |
| 7 | 38 | 16 | +6 | 1d6+1 | 8 |
| 9 | 49 | 17 | +7 | 1d6+1 | 9 |
| 11 | 53 | 18 | +9 | 1d6+2 | 9 |
| 13 | 66 | 19 | +10 | 1d6+2 | 10 |
<!-- Designer's Note: trades 1 point of attack mod for a base d8 damage and d10 HD -->
| HD | HP | AC | Atk Mod | Damage | Morale |
| :---: | :-: | :-: | :-----: | :----: | :----: |
| 3d10 | 17 | 14 | +1 | 1d8 | 7 |
| 5d10 | 28 | 15 | +3 | 1d8+1 | 8 |
| 7d10 | 39 | 16 | +5 | 1d8+1 | 8 |
| 9d10 | 50 | 17 | +6 | 1d8+1 | 9 |
| 11d10 | 61 | 18 | +7 | 1d8+2 | 9 |
| 13d10 | 72 | 19 | +8 | 1d8+2 | 10 |
[Higher-Level Fighters]
@ -44,11 +49,11 @@ An adventurer that specializes in combat.
#### Short Stat Blocks
```
> HD 1+1 (5 hp), AC 13; MV 40'; Atk 1 (0) @ 1d6 (weapon); AL Any; ML 7
> HD 3+3 (16 hp), AC 14; MV 40'; Atk 1 (+1) @ 1d6 (weapon); AL Any; ML 7
> HD 5+5 (27 hp), AC 15; MV 40'; Atk 1 (+3) @ 1d6+1 (weapon); AL Any; ML 8
> HD 7+7 (38 hp), AC 16; MV 40'; Atk 1 (+5) @ 1d6+1 (weapon); AL Any; ML 8
> HD 9+9 (49 hp), AC 17; MV 40'; Atk 1 (+7) @ 1d6+1 (weapon); AL Any; ML 9
> HD 11+11 (53 hp), AC 18; MV 40'; Atk 1 (+9) @ 1d6+2 (weapon); AL Any; ML 9
> HD 13+13 (66 hp), AC 19; MV 40'; Atk 1 (+11) @ 1d6+2 (weapon); AL Any; ML 10
> HD 1d10 (6 hp), AC 13; MV 40'; Atk 1 (0) @ 1d8 (weapon); AL Any; ML 7
> HD 3d10 (17 hp), AC 14; MV 40'; Atk 1 (+1) @ 1d8 (weapon); AL Any; ML 7
> HD 5d10 (28 hp), AC 15; MV 40'; Atk 1 (+3) @ 1d8+1 (weapon); AL Any; ML 8
> HD 7d10 (39 hp), AC 16; MV 40'; Atk 1 (+5) @ 1d8+1 (weapon); AL Any; ML 8
> HD 9d10 (50 hp), AC 17; MV 40'; Atk 1 (+6) @ 1d8+1 (weapon); AL Any; ML 9
> HD 11d10 (61 hp), AC 18; MV 40'; Atk 1 (+7) @ 1d8+2 (weapon); AL Any; ML 9
> HD 13d10 (72 hp), AC 19; MV 40'; Atk 1 (+8) @ 1d8+2 (weapon); AL Any; ML 10
```

View File

@ -7,23 +7,54 @@ If you want to use one of the player races to modify an NPC, use the rules below
- +1 AC
- +2 to save vs poisons
### Bugbear
- +2 to saves vs poison, spells, and wielded items.
- Can wield any two-handed melee weapon with only one hand.
- Infravision 60'
### Dracokin
- Determine [draconic ancestry](/races/dracokin.html#draconic-ancestry) and breath weapon
- +1 to melee damage
- Infravision
- +2 to all saves vs Blasts of the same type as breath weapon.
### Drow
- Can cast _darkness_ from 2nd level and _detect magic_ from 4th level (once each per day).
- +1 to missile and sneak attacks.
- Infravision
- HD 2+ can cast [Darkness](/spells/light.html#darkness) once per day.
- HD 4+ can cast [Detect Magic](/spells/detect-magic.html) once per day
- Infravision 60'
- Light Sensitivity: -2 to attacks and -1 AC in bright light (daylight, _Continual Light_, etc).
### Dwarf
- +2 to saves vs poison, spells, and wielded items.
- Can't use longbows or 2-handed weapons.
- +1 AC
- Infravision 60'
### Elekin
- +2 bonus to saves vs poison, spells, and wielded items.
- Can wield any two-handed melee weapon with only one hand.
- Trunk: Can be used for unarmed attack or for simple object manipulation.
### Elf
- HD 2+ can cast [Light](/spells/light.html) once per day.
- HD 4+ can cast [Detect Magic](/spells/detect-magic.html) once per day.
- Infravision 60'
### Elfaye
- HD 2+ can cast [Hidden Step](/spells/hiddenlight.html) once per day.
- HD 4+ can cast [Detect Magic](/spells/detect-magic.html) once per day.
- Infravision 60'
### Felinar
- +1d2 damage on unarmed attacks from claws.
- +1 AC
- Infravision
- Infravision 60'
### Firfolk
@ -31,14 +62,37 @@ If you want to use one of the player races to modify an NPC, use the rules below
- Can wield any two-handed melee weapon with only one hand.
- Can cast _glamour_ from 2nd level and _invisibility_ from 4th level (once each per day).
### Gnome
- +2 to saves vs spells and wielded items.
- Can't use longbows or 2-handed weapons.
- Infravision 60'
- 30% have burrowing mammal pet (badger, mole, etc.)
### Halfling
- Luck: 1d3 times per day, can reroll a missed attack or failed saving throw.
- +1 AC
### Mimikin
- May be pretending to be another race.
### Rhinokin
- +2 bonus to saves vs poison, spells, and wielded items.
- Can wield any two-handed melee weapon with only one hand.
- Horn: Can be used for attack as mace (1d6 blunt).
### Stral
- Each carries at least one magical weapon or item with an elemental bound to it.
- Infravision 60'
### Tortokin
- +1d2 damage on unarmed attacks from claws.
- Replace AC:
- Determine AC:
<div class="dividedTableWrapper">

View File

@ -14,7 +14,7 @@ Someone skilled at stealth-based retrieval.
| | |
| ------------------- | ---------------------------------------- |
| **Hit Dice** | 1-1 (3hp) |
| **Hit Dice** | 1d6 (4hp) |
| **Armor Class** | 13 (leather) |
| **Movement** | 40' |
| **Attacks** | 1 @ weapon (1d6) |
@ -28,17 +28,18 @@ Someone skilled at stealth-based retrieval.
- **Guild**: 30% chance of being affiliated with a guild, increasing to 90% near major urban centers.
- **Leader**: 50% chance groups of 4+ are led by a higher level thief (1d4 HD higher).
- **Sneaky**: Use disguise or trickery to surprise victims.
- **Weapon Versatility**: May be found wielding various types of [weapons](https://www.planarvagabond.com/rules/combat.html#weapons).
<div class="dividedTableWrapper">
| HD | HP | AC | Atk Mod | Damage | Morale |
| :---: | :-: | :-: | :-----: | :----: | :----: |
| 3-3 | 10 | 14 | +1 | 1d6 | 7 |
| 5-5 | 17 | 14 | +2 | 1d6+1 | 8 |
| 7-7 | 24 | 15 | +4 | 1d6+1 | 8 |
| 9-9 | 31 | 15 | +6 | 1d6+1 | 9 |
| 11-11 | 38 | 16 | +8 | 1d6+2 | 9 |
| 13-13 | 45 | 17 | +10 | 1d6+2 | 10 |
| HD | HP | AC | Atk Mod | Damage | Morale |
| :--: | :-: | :-: | :-----: | :----: | :----: |
| 3d6 | 11 | 14 | +2 | 1d6 | 7 |
| 5d6 | 18 | 14 | +4 | 1d6+1 | 8 |
| 7d6 | 25 | 15 | +6 | 1d6+1 | 8 |
| 9d6 | 32 | 15 | +7 | 1d6+1 | 9 |
| 11d6 | 39 | 16 | +8 | 1d6+2 | 9 |
| 13d6 | 46 | 17 | +9 | 1d6+2 | 10 |
[Higher-Level Fighters]
@ -47,11 +48,11 @@ Someone skilled at stealth-based retrieval.
#### Short Stat Blocks
```
> HD 1-1 (3 hp), AC 13; MV 40'; Atk 1 (0) @ 1d6 (weapon); AL Any; ML 7
> HD 3-3 (10 hp), AC 14; MV 40'; Atk 1 (+1) @ 1d6 (weapon); AL Any; ML 7
> HD 5-5 (17 hp), AC 14; MV 40'; Atk 1 (+2) @ 1d6+1 (weapon); AL Any; ML 8
> HD 7-7 (24 hp), AC 15; MV 40'; Atk 1 (+4) @ 1d6+1 (weapon); AL Any; ML 8
> HD 9-9 (31 hp), AC 15; MV 40'; Atk 1 (+6) @ 1d6+1 (weapon); AL Any; ML 9
> HD 11-11 (38 hp), AC 16; MV 40'; Atk 1 (+8) @ 1d6+2 (weapon); AL Any; ML 9
> HD 13-13 (45 hp), AC 17; MV 40'; Atk 1 (+10) @ 1d6+2 (weapon); AL Any; ML 10
> HD 1d6 (4 hp), AC 13; MV 40'; Atk 1 (0) @ 1d6 (weapon); AL Any; ML 7
> HD 3d6 (11 hp), AC 14; MV 40'; Atk 1 (+2) @ 1d6 (weapon); AL Any; ML 7
> HD 5d6 (18 hp), AC 14; MV 40'; Atk 1 (+4) @ 1d6+1 (weapon); AL Any; ML 8
> HD 7d6 (25 hp), AC 15; MV 40'; Atk 1 (+6) @ 1d6+1 (weapon); AL Any; ML 8
> HD 9d6 (32 hp), AC 15; MV 40'; Atk 1 (+7) @ 1d6+1 (weapon); AL Any; ML 9
> HD 11d6 (39 hp), AC 16; MV 40'; Atk 1 (+8) @ 1d6+2 (weapon); AL Any; ML 9
> HD 13d6 (46 hp), AC 17; MV 40'; Atk 1 (+9) @ 1d6+2 (weapon); AL Any; ML 10
```

View File

@ -5,6 +5,7 @@ date_pub: 2023-07-04T18:21:00-04:00
section: campaign
content_type: feature
short_code: cfr
status: hidden
---
### Townsfolk
@ -26,7 +27,7 @@ short_code: cfr
- [Edmund, his manservant (human)]
-->
- [Stig'ee Zar'duss and the Spy'dars from Talar](/images/rivertail/stigee-zarduss.jpg)
- [Stig'ee Zar'duss and the Spy'dars from Thalor](/images/rivertail/stigee-zarduss.jpg)
### Locations

View File

@ -2,7 +2,6 @@
title: Campaign Timeline
description: A timeline of events from the sessions.
date_pub: 2023-02-12T01:52:00-05:00
date_upd: 2023-04-24T17:59:00-04:00
section: campaign
content_type: feature
short_code: ct1
@ -17,5 +16,7 @@ The following is a list of significant dates on the [astral calendar](/astral/ad
- **Stayed in port (Sapphire Cove)**: 2nd phase of 5th Warday of Urtson-Law.
- **Left with Tobart to find Ravager**: 3rd phase of 5th Warday of Urtson-Law.
- **Arrived at the Ravager, killed Horan, met Princess Lofkin**: 3rd phase of the 1st Aerday of Urtson-Nu.
- **Destroyed the Ravager, met Zenopus and the Bronze Robs**: 1st phase of the 1st Fyday of Urtson-Nu.
- **Destroyed the Ravager, met Zenopus and the Bronze Robes**: 1st phase of the 1st Fyday of Urtson-Nu.
- **Found the wreck of Hadley's Hippogriff**: 2nd phase of the 1st Warday of Urtson-Nu.
- **Saved Whurll from Pirates, Captured the _Queen Ayn's Wrath_**: 2nd phase of the 2nd Aerday of Urtson-Nu
- **Arrived Back in Sapphire Cove, Acquired First Eye of Jund**: 1st phase of 2nd Warday of Urtson-Nu

View File

@ -7,10 +7,12 @@ content_type: feature
short_code: cmp
---
[[toc]]
**Concentration**: Powers with concentration in their durations are subject to the following restrictions:
- Can't act or attack while using this power.
- When damaged by spell or attack, must succeed on a CHA check or concentration ends.
- When damaged by spell or attack, must succeed on a Willpower check (highest of CHA or CON) or concentration (and the power's effect) ends.
### Boost Speed
@ -33,6 +35,18 @@ short_code: cmp
</div>
### Burn
**Duration: Concentration, up to 1 round / level**
**Range: Sight**
Subject a creature or object within sight to a scorching heat.
- Takes one round to activate, breaking concentration during this round prevents power from being used.
- Target may **Save vs Spells** to prevent damage.
- Causes paper and cloth to burn, liquids to boil, and metals to glow.
- Inflicts 1d4 damage per round to target or any creature in contact with target (ex: heating metal armor).
### Change Density
**Duration: 1 round / level**
@ -43,105 +57,9 @@ Alter body density, with choice of effect:
- **Lighter**: Barely touch the ground, leave no footsteps and can walk on water
- **Heavier**: Root in place, immune to attacks or effects that would knock down or move.
### Life Squeeze
**Duration: Concentration, up to 1 round / level**
**Range: 30'**
Apply excessive pressure to target creature's vital organs.
- Cause 1d3 damage each round.
- Target must **Save vs Paralyze** each round or be stunned, unable to move or act.
- Doesn't affect non-living creatures (constructs, undead, etc.).
### Power Fists
**Duration: 1 round / level**
**Range: Self**
Charge fists with mystical energy.
- Unarmed attacks count as magical and deal increased damage:
<div class="dividedTableWrapper">
| Level | Unarmed Damage |
| :---: | :------------: |
| 1-4 | 2d4 |
| 5-8 | 2d6 |
| 9-12 | 2d8 |
| 13+ | 2d12 |
[Power Fists Effect]
</div>
### Super Leap
**Duration: Instant**
**Range: 10' + (10' / level)**
Leap anywhere within range (including vertically).
### Power Shield
**Duration: Concentration, up to 1 round / level**
**Range: Self**
Surround body with a shield of energy.
- Immune to small, non-magical missiles (arrows, slings, etc.).
- Opponents have -2 to attacks against.
- +2 on saves vs Wielded, Blasts, and Spells.
### Push
**Duration: Instant**
**Range: 30'**
Fire a wave of force at a target.
- Target must **Save vs Paralyze** or take 1d6 damage and be thrown away 10' / level.
### Hurl
**Duration: Instant**
**Range: 10' / level**
Telekinetically throw object at target.
- Can throw object weighing up to 200 coins / level.
- Target must be within 60' of object.
- Target must **Save vs Wielded** or take damage:
<div class="dividedTableWrapper">
| Object's Weight (Coins) | Damage |
| :---------------------: | :----: |
| Up to 200 | 2d4 |
| 201-400 | 2d6 |
| 401-800 | 3d6 |
| 801-1500 | 4d6 |
| 1501+ | 5d6 |
[Hurl Effect]
</div>
### Flying Weapon
**Duration: Instant**
**Range: 10' / level**
Control melee weapon thrown at target.
- Treat as a missile attack with +4 bonus.
- Any damage dealt is doubled.
- Hit or miss, weapon returns to hand.
### Enlargement
**Duration: Focus, up to 1 round / level**
**Duration: Concentration, up to 1 round / level**
**Range: Self**
Double body, clothing, and armor size
@ -161,6 +79,17 @@ _Unwilling targets_: May _save vs spells_ to resist.
_Concentration_: Being distracted (e.g. attacked) or performing any other action (except moving) causes the power to end.
-->
### Flying Weapon
**Duration: Instant**
**Range: 10' / level**
Control melee weapon thrown at target.
- Treat as a missile attack with +4 bonus.
- Any damage dealt is doubled.
- Hit or miss, weapon returns to hand.
### Freeze
**Duration: Up to 1 round / level**
@ -204,46 +133,30 @@ Enter a meditative state for the duration.
</div>
### Burn
**Duration: Focus, up to 1 round / level**
**Range: Sight**
Subject a creature or object within sight to a scorching heat.
- Takes one round to activate, breaking concentration during this round prevents power from being used.
- Target may **Save vs Spells** to prevent damage.
- Causes paper and cloth to burn, liquids to boil, and metals to glow.
- Inflicts 1d4 damage per round to target or any creature in contact with target (ex: heating metal armor).
### Invisibility
**Duration: Concentration, up to 1 round / level**
**Range: Self**
Disappear from the sight of one or more creatures (selected when the power is activated).
- Up to 1 HD of creatures / level are affected.
- Affected opponents attack with a 4 penalty.
### Power Blast
### Hurl
**Duration: Instant**
**Range: 10' / level**
Fire a blast of energy at a target in range.
Telekinetically throw object at target.
- Target must **Save vs Spells** or take 2d4 damage.
- Can throw object weighing up to 200 coins / level.
- Target must be within 60' of object.
- Target must **Save vs Wielded** or take damage:
### Pull
<div class="dividedTableWrapper">
**Duration: Instant**
**Range: 10 / level**
| Object's Weight (Coins) | Damage |
| :---------------------: | :----: |
| Up to 200 | 2d4 |
| 201-400 | 2d6 |
| 401-800 | 3d6 |
| 801-1500 | 4d6 |
| 1501+ | 5d6 |
Fire a wave of force at a target that grabs them and pulls them in.
[Hurl Effect]
- Target must **Save vs Paralyze** or take 1d6 damage and be pulled in.
- Target may be released anywhere along the way.
</div>
### Instant Step
@ -255,6 +168,16 @@ Instantly teleport to any location in sight within range.
- May be used before or after making an action (ex: attacking).
- Breaks engagement without allowing for free attack.
### Invisibility
**Duration: Concentration, up to 1 round / level**
**Range: Self**
Disappear from the sight of one or more creatures (selected when the power is activated).
- Up to 1 HD of creatures / level are affected.
- Affected opponents attack with a 4 penalty.
### Life Drain
**Duration: Concentration, 1 round**
@ -265,9 +188,62 @@ Draw vital energy out of a living target via touch, absorbing target's life forc
- Target must **Save vs Spells** or suffer 1d4 points of damage.
- Heal an amount of HP equal to damage done.
### Life Squeeze
**Duration: Concentration, up to 1 round / level**
**Range: 30'**
Apply excessive pressure to target creature's vital organs.
- Cause 1d3 damage each round.
- Target must **Save vs Paralyze** each round or be stunned, unable to move or act.
- Doesn't affect non-living creatures (constructs, undead, etc.).
### Power Blast
**Duration: Instant**
**Range: 10' / level**
Fire a blast of energy at a target in range.
- Target must **Save vs Spells** or take 2d4 damage.
### Power Fists
**Duration: 1 round / level**
**Range: Self**
Charge fists with mystical energy.
- Unarmed attacks count as magical and deal increased damage:
<div class="dividedTableWrapper">
| Level | Unarmed Damage |
| :---: | :------------: |
| 1-4 | 2d4 |
| 5-8 | 2d6 |
| 9-12 | 2d8 |
| 13+ | 2d12 |
[Power Fists Effect]
</div>
### Power Shield
**Duration: Concentration, up to 1 round / level**
**Range: Self**
Surround body with a shield of energy.
- Immune to small, non-magical missiles (arrows, slings, etc.).
- Opponents have -2 to attacks against.
- +2 on saves vs Wielded, Blasts, and Spells.
### Psychic Wall
**Duration: Focus, 2 turns**
**Duration: Concentration, 2 turns**
**Range: Self**
Enhance mental defense.
@ -275,9 +251,28 @@ Enhance mental defense.
- Takes one round to activate, breaking concentration during this round prevents power from being used.
- Gain +4 bonus to saves vs mental powers and mind-affecting spells and magic items.
### Pull
**Duration: Instant**
**Range: 10 / level**
Fire a wave of force at a target that grabs them and pulls them in.
- Target must **Save vs Paralyze** or take 1d6 damage and be pulled in.
- Target may be released anywhere along the way.
### Push
**Duration: Instant**
**Range: 30'**
Fire a wave of force at a target.
- Target must **Save vs Paralyze** or take 1d6 damage and be thrown away 10' / level.
### Shrinking
**Duration: Focus, up to 2 turns**
**Duration: Concentration, up to 2 turns**
**Range: Self**
Shrink to 6" tall, reducing clothing and armor appropriately (but not other equipment).
@ -290,9 +285,16 @@ Effects while shrunk:
- 90% chance of going unnoticed while remaining motionless.
- Cannot harm creatures larger than 1 tall.
### Super Leap
**Duration: Instant**
**Range: 10' + (10' / level)**
Leap anywhere within range (including vertically).
### Telepathy
**Duration: Focus, 1 turn**
**Duration: Concentration, 1 turn**
**Range: Sight**
Establish bidirectional mental communication with one other willing, living, intelligent creature.

View File

@ -17,6 +17,6 @@ A finely-crafted silver longsword, acid-etched with moon iconography and the nam
- +1 to attack and damage rolls (1d8+1 / 1d10+1), +3 vs Lycanthropes (1d8+3 / 1d10+3).
- When unsheathed in darkness, or the command word ("Lu'ar") is spoken, illuminates a 15 foot radius with moonlight.
- Functions as per the [Moonlight spell](/spells/moonlight).
- Functions as per the [Moonlight spell](/spells/moonlight.html).
!!!include(weapons/longsword-properties.md)!!!

View File

@ -72,13 +72,14 @@ short_code: n1
### The Skyrunner
#### Jon Tobart / Shazzogrox
#### Jon Tobart / Shazzogrox (DECEASED)
- Eye Tyrant Mage disguised as a human ship captain
- Tobart's eye color kept changing
- Presumed-known spells
- Petrify (Flesh-to-stone)
- Polymorph
- Polymorph Others
- Polymorph Self
- Wizard Lock
#### Stonecrop (DECEASED)
@ -86,17 +87,16 @@ short_code: n1
- An Eye Tyrant experiment into making bipedal flesh golems
- Fought with Rocky and the party and was killed.
<!--
### The Ravager
- Princess Lofkin
-
-->
### Others
#### Azir
#### Azir, The Demon Prince of Desire
- Strange, handsome man with dark skin
- Appeared on the Skyrunner and spoke briefly to Mezric, giving her dagger before disappearing.
<!--
- Princess Lofkin and her people
- Bronze Robes
- Linny & Korb
- Update Rocky & Azir
-->

View File

@ -0,0 +1,60 @@
---
title: Amylee Mouserel
description: NPCs the party has met on their adventures in the Faewolde.
date_pub: 2023-07-04T23:11:00-04:00
section: npcs
content_type: feature
short_code: nram
---
<div class="imgWrapper">
![Amylee Mouserel, created with [DALL-E](https://labs.openai.com/) and released under a [CC0](/licenses/cc0) license.](/images/rivertail/amylee-mouserel.jpg 'Amylee Mouserel')
</div>
### A Timid Mouse
_by Amylee Moserel_
A timid mouse, amidst enchanted boughs,<br />
In this mystic forest, where silence allows,<br />
I scuttle through the shadows, unseen and small,<br />
A creature of grace, within nature's thrall.
With whiskers quivering, I explore the unknown,<br />
An observer of secrets, a world of my own.<br />
In hidden nooks, I find solace and peace,<br />
A humble poet, seeking nature's release.
Amongst the mossy floor, I pen my prose,<br />
In solitude's embrace, my verses compose.<br />
In whispers soft, like the rustle of leaves,<br />
My words find flight, in a language that breathes.
The enchanted forest, my sanctuary divine,<br />
A tapestry of wonder, where dreams intertwine.<br />
I observe the dance of sunlight and shade,<br />
In the delicate balance, my heart is swayed.
Each tremor of fern, each whisper of tree,<br />
A symphony of nature, unseen by most eyes that see.<br />
I dwell in the margins, a humble poetess,<br />
Translating the beauty that many fail to express.
Oh, gentle petals and dew-kissed blooms,<br />
I gather your essence, your fragrant perfumes.<br />
Through tiny windows, I glimpse nature's soul,<br />
And capture its essence, in my verses' fold.
In the hushed stillness of this enchanted domain,<br />
I seek truths whispered, unburdened by strain.<br />
A field mouse's voice, tender and discreet,<br />
In the heart of this forest, my poetry shall meet.
So, let the meadows be my canvas pure,<br />
Where verses unfurl, gentle and demure.<br />
For in this enchanted realm, where secrets reside,<br />
I, a field mouse poet, find solace and abide.
_Created with [ChatGPT](https://chat.openai.com/) and released under a [CC0](/licenses/cc0) license._

View File

@ -0,0 +1,16 @@
---
title: Benjen Beaverdere
description: NPCs the party has met on their adventures in the Faewolde.
date_pub: 2023-07-04T23:11:00-04:00
section: npcs
content_type: feature
short_code: nrbb
---
<div class="imgWrapper">
![Benjen Beaverdere, created with [DALL-E](https://labs.openai.com/) and released under a [CC0](/licenses/cc0) license.](/images/rivertail/benjen-beaverdere.jpg 'Benjen Beaverdere')
</div>
Head barista and proprietor of the Bark & Brew.

View File

@ -0,0 +1,60 @@
---
title: Brae Badgerton
description: NPCs the party has met on their adventures in the Faewolde.
date_pub: 2023-07-04T23:11:00-04:00
section: npcs
content_type: feature
short_code: nrbb1
---
<div class="imgWrapper">
![Brae Badgerton, created with [DALL-E](https://labs.openai.com/) and released under a [CC0](/licenses/cc0) license.](/images/rivertail/brae-badgerton.jpg 'Brae Badgerton')
</div>
### With Paws Digging Deep
_by Brae Badgerton_
The badger, wild and untamed, roams the enchanted forest,<br />
A solitary wanderer, embracing the rhythm of the wild,<br />
In the midst of tangled thickets and moonlit shadows,<br />
A beatnik spirit, a rebel with nature's call.<br />
With paws digging deep into the fertile earth,<br />
A nomad's heart, pulsating with freedom's beat,<br />
Through tangled roots and secret burrows,<br />
The badger weaves tales, a tapestry of the unseen.<br />
On the open stage of the enchanted forest's canvas,<br />
The badger recites verses in the language of the night,<br />
Whispers of moonbeams and starlit musings,<br />
Echoing in the stillness, igniting the mystic fire.<br />
With every snuffle, a rhythm, a syncopated dance,<br />
In the twilight's haze, the badger finds its trance,<br />
Its fur, an ink-stained coat, a symbol of nonconformity,<br />
An outlaw poet, a troubadour of the wild fraternity.<br />
The badger's eyes, like burning embers,<br />
Hold secrets of ancient wisdom, untamed desires,<br />
Through the veil of twilight, it roams, it prowls,<br />
Searching for truths in the depths of the forest's soul.<br />
In the silence of the night, the badger's voice emerges,<br />
A primal howl, a poetic rebellion,<br />
It sings of forgotten dreams and forgotten fears,<br />
Words scribbled in earthy ink on the parchment of the years.<br />
Oh, wanderer, listen to the badger's beat,<br />
The rhythm of the road less taken, the untrodden path,<br />
For in the heart of the enchanted forest's wild embrace,<br />
The badger's poetry pulses, a fearless, untamed aftermath.<br />
In the realm of ancient woods, where dreams collide,<br />
The badger wanders, a free spirit's guide,<br />
And in its wake, a trail of words and wonder,<br />
A testament to the wild, where poets dance and ponder.<br />
_Created with [ChatGPT](https://chat.openai.com/) and released under a [CC0](/licenses/cc0) license._

View File

@ -0,0 +1,11 @@
---
title: Amylee Mouserel
description: NPCs the party has met on their adventures in the Faewolde.
date_pub: 2023-07-04T23:11:00-04:00
section: npcs
content_type: feature
short_code: nra
status: draft
---
- [Buckwyn "Bucky" Bushtail (squirrel)](/images/rivertail/bucky-bushtail.jpg)

View File

@ -0,0 +1,162 @@
---
title: Frobyrt Frogimus
description: NPCs the party has met on their adventures in the Faewolde.
date_pub: 2023-07-04T23:11:00-04:00
section: npcs
content_type: feature
short_code: nrf1
---
<div class="imgWrapper">
![Frobyrt Frogimus, created with [DALL-E](https://labs.openai.com/) and released under a [CC0](/licenses/cc0) license.](/images/rivertail/frobyrt-frogimus.jpg 'Frobyrt Frogimus')
</div>
### The Song Unheard
_by Frobyrt Frogimus_
a<br />
frog<br />
sits<br />
by<br />
the<br />
mossy<br />
pond<br />
croaking<br />
a<br />
song<br />
unheard<br />
a<br />
little<br />
green<br />
voice<br />
whispering<br />
secrets<br />
to<br />
the<br />
ancient<br />
trees<br />
its<br />
eyes<br />
like<br />
glimmers<br />
of<br />
starry<br />
night<br />
reflecting<br />
the<br />
mystery<br />
within<br />
leaping<br />
from<br />
lily<br />
pad<br />
to<br />
lily<br />
pad<br />
with<br />
a<br />
bounce<br />
and<br />
a<br />
splash<br />
a<br />
poet<br />
in<br />
disguise<br />
scribbling<br />
in<br />
the<br />
air<br />
with<br />
each<br />
leap<br />
words<br />
scatter<br />
like<br />
water<br />
drops<br />
ripples<br />
of<br />
language<br />
unleashed<br />
its<br />
tongue<br />
curled<br />
with<br />
letters<br />
forming<br />
syllables<br />
that<br />
dance<br />
a<br />
solitary<br />
poet<br />
in<br />
a<br />
mosaic<br />
forest<br />
of<br />
emerald<br />
hues<br />
whispering<br />
odes<br />
to<br />
the<br />
moon<br />
and<br />
the<br />
midnight<br />
sky<br />
for<br />
in<br />
this<br />
enchanted<br />
realm<br />
of<br />
whispers<br />
and<br />
wonder<br />
the<br />
frog<br />
unveils<br />
its<br />
poetry<br />
with<br />
each<br />
ribbit<br />
a<br />
fragile<br />
serenade<br />
to<br />
the<br />
night<br />
breathing<br />
life<br />
into<br />
the<br />
silence<br />
and<br />
the<br />
enchanted<br />
forest<br />
listens<br />
in<br />
silent<br />
reverie<br />
_Created with [ChatGPT](https://chat.openai.com/) and released under a [CC0](/licenses/cc0) license._

View File

@ -0,0 +1,36 @@
---
title: Rivertail
description:
date_pub: 2023-07-04T18:21:00-04:00
section: campaign
content_type: feature
short_code: cfr
status: hidden
---
### Townsfolk
- [Amylee Mouserel](./amylee-mouserel.html)
- [Brae Badgerton](./brae-badgerton.html)
- [Buckwyn "Bucky" Bushtail](./bucky-bushtail.html)
- [Frobyrt Frogimus](./frobyrt-frogimus.html)
- [Omyt Ottermore](./omyt-ottermore.html)
- [Talla Toadington](./talla-toadington.html)
- [Benjen Beaverdere](./benjen-beaverdere.html)
- [Mala Molemun](./mala-molemun.html)
- [Syndee Slothig](./syndee-slothig.html)
- [Kakaron and Edmund](/images/rivertail/kakaron-and-edmund.jpg)
<!--
- [Kakaron, the wizard (Dreamlands cat)]
- [Edmund, his manservant (human)]
-->
- [Stig'ee Zar'duss and the Spy'dars from Thalor](/images/rivertail/stigee-zarduss.jpg)
### Locations
- [The Bark and Brew](/images/rivertail/bark-and-brew.jpg)

View File

@ -0,0 +1,11 @@
---
title: Amylee Mouserel
description: NPCs the party has met on their adventures in the Faewolde.
date_pub: 2023-07-04T23:11:00-04:00
section: npcs
content_type: feature
short_code: nra
status: draft
---
- [Mala Molemun (mole)](/images//rivertail/mala-molemun.jpg)

View File

@ -0,0 +1,63 @@
---
title: Omyt Ottermore
description: NPCs the party has met on their adventures in the Faewolde.
date_pub: 2023-07-04T23:11:00-04:00
section: npcs
content_type: feature
short_code: nr01
---
<div class="imgWrapper">
![Omyt Ottermore, created with [DALL-E](https://labs.openai.com/) and released under a [CC0](/licenses/cc0) license.](/images/rivertail/omyt-ottermore.jpg 'Omyt Ottermore')
</div>
### Growl
_by Omyt Ottermore_
I saw the best otters of my generation destroyed by madness, starving hysterical naked,<br />
swimming through the enchanted streams at dawn looking for a morsel of truth,<br />
flowing with the currents of the wild and the unseen,<br />
who bared their souls to the moonlit skies under the canopy of dreams,<br />
and were dragged by the currents of darkness down to the depths of despair,<br />
who dived into the depths of the subconscious, seeking revelation and solace,<br />
surfacing with pearls of wisdom, glistening in their wet fur.<br />
These otters, poets of the river, champions of the flow,<br />
they chattered their verses to the ancient trees, the whispering winds,<br />
their playful splashes, a symphony of untamed spirits,<br />
they knew the secret rhythm, the heartbeat of the water,<br />
in each splash, a stanza, in each dive, a verse.<br />
Their eyes, like mirrors of the cosmic dance,<br />
reflecting the moon's glow, the stars' enchantment,<br />
they dived through dimensions, beyond time's illusion,<br />
seeking liberation, embracing the eternal.<br />
Oh, otters of enlightenment, seekers of the infinite,<br />
your playful frolic, a dance of cosmic bliss,<br />
you swam through the mysteries, unbound by earthly shackles,<br />
your fur, anointed with moonlight, shimmering with divine ecstasy.<br />
In the enchanted forest, your poetry echoed,<br />
a howl of joy, a sigh of longing,<br />
the river was your canvas, the currents your ink,<br />
and you painted verses with each stroke of your tail.<br />
But now, I see you, my brethren, lost in the shadows,<br />
struggling against the tides of despair,<br />
your playful spirit dampened, your poetry muted,<br />
trapped in the nets of indifference and greed.<br />
Oh, otters of the enchanted forest, I mourn your plight,<br />
your innocence tarnished, your souls burdened,<br />
but still, I hold onto hope, the flicker of a flame,<br />
that one day you will rise, resplendent in your glory,<br />
swimming through the rivers of consciousness,<br />
reciting Ginsburgian verses of liberation and love,<br />
reclaiming your place as poets of the wild,<br />
in the enchanted forest's eternal symphony.<br />
_Created with [ChatGPT](https://chat.openai.com/) and released under a [CC0](/licenses/cc0) license._

View File

@ -0,0 +1,65 @@
---
title: Syndee Slothig
description: NPCs the party has met on their adventures in the Faewolde.
date_pub: 2023-07-04T23:11:00-04:00
section: npcs
content_type: feature
short_code: nrs1
---
<div class="imgWrapper">
![Syndee Slothig, created with [DALL-E](https://labs.openai.com/) and released under a [CC0](/licenses/cc0) license.](/images/rivertail/syndee-slothig.jpg 'Syndee Slothig')
</div>
### The Poetry of the Forest
_by Syndee Slothig_
In the realm of ancient woods, where moonlight gleams,<br />
Where creatures dance and weave enchanting dreams,<br />
An enchanted forest, where harmony reigns,<br />
Where poetry resonates through nature's veins.<br />
The owl hoots a rhythm, wise and profound,<br />
His eyes like stars, casting a spell around.<br />
Feathers soft as velvet, carrying secrets untold,<br />
Whispered melodies in the night, the owl's poetry unfolds.<br />
The fox, sly and sleek, with a cunning glance,<br />
With poetry of mischief, he starts his dance.<br />
In shadows he prowls, weaving tales untamed,<br />
A mischievous ode, where truth and lies are maimed.<br />
The deer, elegant and graceful, leaps with grace,<br />
A sonnet in motion, a poem in every chase.<br />
With gentle steps, she treads the forest floor,<br />
Her lyrical whispers, the symphony of galore.<br />
The gentle stream, flowing with gentle ease,<br />
A murmured verse, in its watery release.<br />
Its words like ripples, caressing the stones,<br />
A liquid sonnet, where silence atones.<br />
The butterfly, adorned in colors so bright,<br />
With poetry on wings, it takes to flight.<br />
In elegant flutters, its verses take form,<br />
A mosaic of words, in a delicate swarm.<br />
The ancient trees stand tall, rooted deep,<br />
Their branches reach up, secrets they keep.<br />
In their murmured verses, wisdom takes flight,<br />
Whispered ballads of the day and the night.<br />
In this enchanted forest, where animals play,<br />
Poetry blossoms in nature's own way.<br />
Each creature recites, with passion and zest,<br />
A symphony of words, in this forest blessed.<br />
So, wanderer, enter this mystical domain,<br />
Listen closely, let the poetry reign.<br />
In the heart of nature's magical chorus,<br />
Discover the beat of the enchanted forest's poets.<br />
_Created with [ChatGPT](https://chat.openai.com/) and released under a [CC0](/licenses/cc0) license._

View File

@ -0,0 +1,70 @@
---
title: Talla Toadington
description:
date_pub: 2023-07-04T23:11:00-04:00
section: npcs
content_type: feature
short_code: nrt1
---
<div class="imgWrapper">
![Talla Toadington, created with [DALL-E](https://labs.openai.com/) and released under a [CC0](/licenses/cc0) license.](/images/rivertail/talla-toadington.jpg 'Talla Toadington')
</div>
### Ode to a Lost Swamp
_by Talla Toadington_
In the forgotten depths of a bygone time,<br />
Where whispers linger and memories chime,<br />
I mourn for a swamp, now lost and forlorn,<br />
Where I, a toad, was once reborn.<br />
Oh, the beauty that once adorned its grace,<br />
A tranquil haven, a sacred space,<br />
Where lily pads floated in emerald hue,<br />
And sunlight danced upon waters so true.<br />
But now, the swamp lies abandoned and still,<br />
Its spirit silenced, a void to fill,<br />
The reeds stand lonely, their whispers ceased,<br />
A requiem plays for the serenity deceased.<br />
No more do dragonflies flutter and dart,<br />
No more do frogs serenade from the heart,<br />
The chorus of life has faded away,<br />
Leaving a void, a somber display.<br />
I reminisce of those balmy nights,<br />
Where fireflies flickered like distant lights,<br />
Their luminescence, a mystical guide,<br />
In a symphony of life, side by side.<br />
The moonlit trails, where shadows would dance,<br />
The rustle of leaves in a nocturnal trance,<br />
Echoes of creatures, their nocturne embrace,<br />
Now swallowed by silence, a desolate space.<br />
Oh, lost swamp, your memory I keep,<br />
In the depths of my soul, where echoes seep,<br />
Though you've faded, like a forgotten dream,<br />
Your essence lingers, a flickering gleam.<br />
I, a toad, bear witness to your demise,<br />
With tearful eyes and mournful cries,<br />
But in my heart, your legacy remains,<br />
A testament to the beauty that once reigned.<br />
So, I sing this ode to the lost swamp's plight,<br />
In hopes that one day, it'll be brought to light,<br />
That nature's respite may once again thrive,<br />
And the swamp's spirit, forever revive.<br />
For in this lament, a plea I express,<br />
To honor and cherish this watery caress,<br />
May the lost swamp find solace and peace,<br />
As its story echoes, refusing to cease.<br />
_Created with [ChatGPT](https://chat.openai.com/) and released under a [CC0](/licenses/cc0) license._

View File

@ -1,8 +1,7 @@
---
title: Planar Cosmology
title: Cosmology of the Multiverse
description: A overview of the various planes of existence.
date_pub: 2023-02-15T00:26:00-05:00
date_upd: 2023-04-23T15:04:00-04:00
section: planes
content_type: feature
short_code: p1

View File

@ -50,7 +50,7 @@ Can see heat signatures up to 60', even in total darkness.
### Fortitude
Gets a bonus to saving throws vs poison, spells, and wielded items (wand, rods, staves, etc.), based on CON.
Natural fortitude and resistance to magic grants bonus to saves vs poison, spells, and wielded items (wand, rods, staves, etc.), based on CON:
<div class="dividedTableWrapper">

View File

@ -59,9 +59,9 @@ Sees heat signatures up to 60', even in total darkness.
### Innate Magic
- From 2nd level, can cast [darkness](/spells/light.html#darkness) once per day.
- From 4th level, can cast [detect magic](/spells/detect-magic.html) once per day.
- From 2nd level, can cast [Darkness](/spells/light.html#darkness) once per day.
- From 4th level, can cast [Detect Magic](/spells/detect-magic.html) once per day.
### Light Sensitivity
-2 to attack rolls and -1 to AC when in bright light (daylight, _continual light_, etc.).
-2 to attack rolls and -1 to AC when in bright light (daylight, _Continual Light_, etc.).

View File

@ -1,6 +1,6 @@
---
title: Drow (Race)
description: The Drow race for DAGGR / OSR gaming.
title: Dwarf (Race)
description: The Dwarf race for OSR gaming.
date_pub: 2023-04-01T21:06:00-04:00
section: races
content_type: feature
@ -54,9 +54,9 @@ Can see heat signatures up to 60', even in total darkness.
2-in-6 chance (ex: when listening at a door).
### Resiliance
### Resilience
Natural constitution and resistance to magic grants bonus to saves vs poison, spells, and wielded items:
Natural fortitude and resistance to magic grants bonus to saves vs poison, spells, and wielded items (wand, rods, staves, etc.), based on CON:
<div class="dividedTableWrapper">

View File

@ -19,7 +19,7 @@ short_code: rek
</div>
Large, elephant-like humanoids with four digits and long trunks.
Large, elephant-like humanoids with four digits and 5' long trunks.
### Available Classes and Max Level
@ -54,7 +54,7 @@ Grants +2 AC while not wearing armor. Can be combined with a shield.
- 5' long
- Can carry weight equivalent to 10 x STR score in coins.
- Can be used for simple tasks (ex: hold, lift, drop, push, or pull an object or a creature; open or close a container or door; swing for an unarmed attack, etc).
- Can be used for simple tasks (ex: hold, lift, drop, push, or pull an object or a creature; open or close a container or door; swing for an unarmed attack; etc).
- Can't hold weapons or shields.
- Can't make precision movements (for castings spells or using tools).
- Can't make precision movements (ex: for casting spells or using tools).
- Can be used as a snorkel.

View File

@ -1,6 +1,6 @@
---
title: Elf (Race)
description:
description: Thin, fey demihumans with sharp features and sensitivity to strong magic.
date_pub: 2023-04-02T00:22:00-04:00
section: races
content_type: feature
@ -19,7 +19,7 @@ short_code: ref
</div>
Thin, fey demihumans with sharp features.
Thin, fey demihumans with sharp features and sensitivity to strong magic.
### Available Classes and Max Level
@ -59,8 +59,8 @@ Sees heat signatures up to 60', even in total darkness.
### Innate Magic
- From 2nd level, can cast [light](/spells/light.html) once per day.
- From 4th level, can cast [detect magic](/spells/detect-magic.html) once per day.
- From 2nd level, can cast [Light](/spells/light.html) once per day.
- From 4th level, can cast [Detect Magic](/spells/detect-magic.html) once per day.
### Sensitive to Evil

View File

@ -1,6 +1,6 @@
---
title: Elfaye (Race)
description: Thin, fey demihumans, related to elves, with the ability to project their seasonal temperaments.
description: Thin, fey demihumans, related to elves and native to the Faewolde, with the ability to project their seasonal temperaments.
date_pub: 2023-04-21T21:07:00-04:00
date_upd: 2023-05-31T23:04:00-04:00
section: races
@ -20,7 +20,7 @@ short_code: re1
</div>
Thin, fae demihumans, related to elves and native to the Faewolde, with the ability to project their seasonal temperaments.
Thin, fey demihumans, related to [elves](./elf.html) and native to the Faewolde, with the ability to project their seasonal temperaments.
### Available Classes and Max Level

View File

@ -0,0 +1,81 @@
---
title: Gnome (Race)
description: Short, stout demihumans with a fondness for burrowing mammals, contraptions, and red hats.
date_pub: 2023-07-30T19:33:00-04:00
section: races
content_type: feature
short_code: rgn
---
[[toc]]
<div class='headlessTableWrapper'>
| | |
| --------------------- | -------------------------------------------------------------------------------------- |
| **Requirements** | Minimums: CON 9, INT 9 |
| **Ability modifiers** | None |
| **Languages** | Alignment, Common, Dwarvish, Gnomish, Kobold, the secret language of burrowing mammals |
</div>
Short, stout demihumans with a fondness for burrowing mammals, contraptions, and red hats.
### Available Classes and Max Level
- **Assassin**: 6th
- **Barbarian**: 6th
- **Bard**: 7th
- **Bloodmage**: 6th
- **Cleric**: 7th
- **Corsair**: 6th
- **Druid**: 8th
- **Fighter**: 6th
- **Knight**: 6th
- **Mystic**: 7th
- **Paladin**: 6th
- **Priest**: 7th
- **Ranger**: 8th
- **Sorcerer**: 7th
- **Thief**: 8th
- **Warlock**: 7th
- **Wizard**: 8th
### Detect Secrets
2-in-6 chance of detecting construction tricks (secret doors, panels, etc.) while underground.
### Hear Noises
2-in-6 chance (ex: when listening at a door).
### Infravision
Can see heat signatures up to 90', even in total darkness.
### Tiny Stature
- Can only use small or normal sized-weapons.
- Cannot use longbows or 2-handed swords.
- Gain +2 to AC when attacked by opponents who are larger than humans.
### Magical Resistance
Natural resistance to magic grants bonus to saving throws vs spells and wielded items (wand, rods, staves, etc.), based on CON:
<div class="dividedTableWrapper">
| CON | Bonus |
| :--------: | :---: |
| 6 or lower | 0 |
| 7-10 | +2 |
| 11-14 | +3 |
| 15-17 | +4 |
| 18+ | +5 |
[Gnome Save Bonus]
### Speak with Burrowing Mammals
- Can freely converse with burrowing mammals.
- Often keep such animals (badgers, moles, etc.) as pets

View File

@ -0,0 +1,57 @@
---
title: Halfling (Race)
description: Short, stout demihumans with curly hair and furry feet, known for their friendliness and quiet, peaceful lifestyles.
date_pub: 2023-07-30T21:36:00-04:00
section: races
content_type: feature
short_code: rha
---
[[toc]]
<div class='headlessTableWrapper'>
| | |
| --------------------- | --------------------------- |
| **Requirements** | Minimums: CON 9, DEX 9 |
| **Ability modifiers** | +1 DEX, -1 STR |
| **Languages** | Alignment, Common, Halfling |
</div>
Short, stout demihumans with a fondness for burrowing mammals, contraptions, and red hats.
### Available Classes and Max Level
- **Assassin**: 7th
- **Barbarian**: 6th
- **Bard**: 7th
- **Bloodmage**: 6th
- **Cleric**: 6th
- **Corsair**: 7th
- **Druid**: 8th
- **Fighter**: 6th
- **Knight**: 6th
- **Mystic**: 7th
- **Paladin**: 6th
- **Priest**: 7th
- **Ranger**: 7th
- **Sorcerer**: 7th
- **Thief**: 8th
- **Warlock**: 7th
- **Wizard**: 6th
### Extraordinary Luck
- May be used a number of times per day equal to 1/2 level, rounded up.
- After any die roll, may force a re-roll taking either the highest or lowest result (player's choice).
### Hear Noises
2-in-6 chance (ex: when listening at a door).
### Tiny Stature
- Can only use small or normal sized-weapons.
- Cannot use longbows or 2-handed swords.
- Gain +2 to AC when attacked by opponents who are larger than humans.

View File

@ -12,8 +12,12 @@ short_code: r1
- [Dracokin](./dracokin.html): Lizardfolk with distant relations to dragons.
- [Drow](./drow.html): Dark-skinned, slender demihumans, possibly related to elves, who dwell deep underground.
- [Dwarf](./dwarf.html): Short and hairy demihumans with an affinity for mining and crafting.
- [Elfaye](./elfaye.html): Thin, fae demihumans, related to elves, with the ability to project their seasonal temperaments.
- [Elekin](./elekin.html): Large, elephant-like humanoids with four digits and long trunks.
- [Elf](./elf.html): Thin, fey demihumans with sharp features and sensitivity to strong magic.
- [Elfaye](./elfaye.html): Thin, fey demihumans, related to elves, with the ability to project their seasonal temperaments.
- [Felinar](./felinar.html): A race of anthropomorphic, catlike beings.
- [Firfolk](./firfolk.html): Magical, gray half-giants that live in harmony with nature.
- [Gnome](./gnome.html): Short, stout demihumans with a fondness for burrowing mammals, contraptions, and red hats.
- [Mimikin](./mimikin.html): A race of demihumans able to shift their physical forms at will.
- [Rhinokin](./rhinokin.html): Large, rhinoceros-like humanoids with four digits and a long horn protruding upwards from each one's face.
- [Tortokin](./tortokin.html): Anthropomorphic, upright turtles of roughly human stature.

View File

@ -0,0 +1,58 @@
---
title: Rhinokin
description: The Rhinokin race for OSR gaming.
date_pub: 2023-04-09T14:38:00-04:00
section: races
content_type: feature
short_code: rrh
---
[[toc]]
<div class='headlessTableWrapper'>
| | |
| --------------------- | ------------------------- |
| **Requirements** | CON 9 |
| **Ability modifiers** | +1 STR, -1 WIS |
| **Languages** | Alignment, Common, Greyok |
</div>
Large, rhinoceros-like humanoids with four digits and a long horn protruding upwards from each one's face.
### Available Classes and Max Level
- **Assassin**: 6th
- **Barbarian**: 10th
- **Bard**: 8th
- **Cleric**: 9th
- **Corsair**: 8th
- **Druid**: 10th
- **Fighter**: 11th
- **Knight**: 9th
- **Mystic**: 8th
- **Paladin**: 9th
- **Priest**: 7th
- **Ranger**: 10th
- **Sorcerer**: 9th
- **Thief**: 8th
- **Warlock**: 9th
- **Wizard**: 9th
### Horn
- Natural horn protruding upwards from tip of nose
- Can be used to make a melee attack, dealing damage as a mace (1d6 blunt) on a successful hit.
### Large Size
- Armor and weapons must be tailored to size.
- Can wield any two-handed melee weapon with only one hand.
- Open doors as next highest STR category.
### Natural Armor
Tough, leathery skin grants +2 AC while not wearing armor.
- Can be combined with a shield.

View File

@ -9,6 +9,186 @@ short_code: rha
[[toc]]
### Exploration Procedure
The general steps to take when exploring (dungeon, wilderness, etc.)
1. **Setup**: Referee describes the situation
2. **Marching Order**: Party determines general exploration process
3. **Complication Check**: Referee rolls the complication die to see what effect it has.
4. **Actions / Responses / Complications**: Party declares actions, referee describes the results (and any complications).
5. **End Turn / Watch**: When the party has gone far enough or combat has completed, the (dungeon) turn or (wilderness) watch ends.
- Dungeon: 240'
- Wilderness: 12 miles
6. **Repeat**: Return to step 2 and repeat until the adventuring ends.
#### Complication Check
Roll 1d6, ignoring results of 4+ for the first 4 turns in a session (or since they last occurred).
1. **Encounter**: Wandering creature, social encounter, or some other random interaction.
2. **Signs / Portents**: Indications of possible encounter nearby - could be a clue, monster tracks, etc.
3. **Locality**: Some environmental or external event that affects the PCs - water rises, the assassin gets closer to the target, doors lock behind the party, etc.
4. **Exhaustion**: Take a rest turn (short rest) or (additional) -1 to all rolls until you do.
5. **Light Source**: Torches go out, lanterns go out every third time.
6. **No Complications**
#### Darkness
- -4 to attack when unable to see
- Candles light 10' radius
- Torches / lanterns light 30' radius
#### Infravision
- Can see heat tones, even in the dark.
- Usually works to 60'.
#### Listening at Doors
Spend a minute listening at a door to have a base 1-in-6 chance of hearing a noise.
- Referee makes this roll.
#### Opening Doors
- Locked Doors can be picked or broken.
- Picking a lock takes 1d6 minutes.
- Stuck Doors can be unstuck or broken.
- Doors always break on a 1. Failure can affect stealth / surprise.
<div class="dividedTableWrapper">
| STR | Unstick | Break |
| :---: | :-----: | :----: |
| 3-8 | --- | 1-in-6 |
| 9-12 | 2-in-6 | 1-in-6 |
| 13-15 | 3-in-6 | 2-in-6 |
| 16-17 | 4-in-6 | 3-in-6 |
| 18+ | 5-in-6 | 4-in-6 |
[Forcing Door Chances]
</div>
#### Other Hazards
- Fall damage is 1d6 / 10'.
- Creatures are assumed to be able to swim at 1/2 their movement speed.
### Encounter Procedure
1. **Check Stealth**: Referee rolls for stealth, if applicable.
- Each side that's being relatively stealthy (quiet, douses torches, etc.) has a base 2-in-6 chance of not being spotted.
- Parties carrying an active light source typically can not have stealth.
- If only one side has stealth, they may usually make a free attack (or can pass unnoticed).
- If all sides have stealth, they miss each other.
2. **Determine Distance**: Referee determines how far away the characters are from the encounter.
- Often determined by the nature of the encounter itself, but may be determined randomly:
- Dungeon: 2d6 x 10'
- Wilderness: 4d6 x 10 yards (or 1d4 x 10 yards if either side is surprised).
3. **Roll Initiative**: Each side that has can has stealth rolls 1d20, highest roll moves first.
4. **Choose Actions**: Each side decides how they will respond in initiative order, and the encounter proceeds.
- Players decide how their characters will act.
- Creature actions are often determined by the nature of the encounter itself, but may be determined randomly.
- If creature / NPC reaction isn't obvious, roll 2d6 (+ CHA modifier, if someone tries to communicate).
<div class="dividedTableWrapper">
| 2d6 | Result |
| :-: | :-----: |
| 2- | Attack! |
| 3 | Hateful |
| 4 | Leery |
| 5 | Rude |
| 6 | Aloof |
| 7 | Neutral |
| 8 | Partial |
| 9 | Cordial |
| 10 | Amiable |
| 11 | Helpful |
| 12+ | Family! |
[Reaction Table]
</div>
<div class="dividedTableWrapper">
| CHA | Mod |
| :---: | :-: |
| 3 | -2 |
| 4-8 | -1 |
| 9-12 | +0 |
| 13-17 | +1 |
| 18+ | +2 |
[Charisma Modifier]
</div>
5. **End Turn**: Once the encounter has played out, the turn ends.
- Each encounter is assumed to take at least one full turn to complete.
- This includes time to regroup, bind wounds, clean weapons, rest, etc.
#### Typical Actions
While any action is possible, the following actions are the most common:
- **Combat**: If a side attacks, casts a spell, or makes a tactical movement, [combat](./combat.html) begins.
- **Evasion**: If a side decides to flee, another side may decide to pursue.
- **Talk**: One side may attempt to communicate with the other(s).
#### Evasion
Any side that wishes to avoid an encounter may attempt to flee.
- Only possible before combat begins.
- Each opposing side declares whether or not they want to pursue.
- Players decide freely if they wish to pursue fleeing creatures.
- Referee decides whether creatures pursue fleeing PCs (based on circumstances or roll).
- If all opposing sides decide not to pursue, the evasion attempt automatically succeeds and the encounter is avoided.
- If an opposing side decides to pursue, the chance of evading depends on the surrounding environment.
### Advancement
As the adventures continue, treasure is acquired and creatures are vanquished, all adding to the PCs XP total.
- Each standard coin worth of treasure gained is worth 1 XP, and each creature has an XP value awarded for beating them (one way or another).
- The total XP are then divided amongst the PCs and any hirelings they have (at 1/2 share per hireling).
- Players running multiple characters gets a full share for their first PC and a half-share for the second, although they choose how to distribute the points.
- Referees may increase the derived value arbitrarily.
- Once a PC acquires enough XP, they go up to the next level in their class.
#### Upon Gaining a Level
When a PC increases their level, the following actions may be performed:
- Roll a hit die (based on the PC's class), and add it to their maximum hit points.
- 1s and 2s may be re-rolled.
- Alternatively, roll the next die step down and add 2.
- Their player may pick one of the PC's abilities, and roll 3d6.
- If the resulting roll is higher than the ability score, increase the score by 1.
- Check the PC's [class](/classes/index.html) and [race](/races/index.html) to see if any new abilities are gained.
### Encumbrance
PCs can carry a number of "Important Items" equal to their strength (to a minimum of 10).
- Leather armor counts as 1 item, chain-mail counts as 2 items, plate counts as 3 items.
- 2-handed weapons count as 2 items.
- 1000 coins or 100 gems count as 1 item.
Carrying more items than allowed can be done, but movement is halved (or worse).
### Health, Damage and Dying
Starting HP is based class and race. When damage is taken, HP is lost.
@ -83,6 +263,7 @@ Most class languages are secret, known only to members of their class, and often
- **Halfling**: Native language of halflings.
- **Orcish**: Native language of ogres and orcs.
- **Pyrean**: Native language of fire elementals, dialect of elemental.
- **Strallan**: Native language of the Stral and official language of the Stral Empire.
- **Terrun**: Native language of earth elementals, dialect of elemental.
<div class="dividedTableWrapper">
@ -105,16 +286,6 @@ Most class languages are secret, known only to members of their class, and often
Generally, perception can be checked by rolling highest of INT or WIS.
### Encumbrance
PCs can carry a number of "Important Items" equal to their strength (to a minimum of 10).
- Leather armor counts as 1 item, chain-mail counts as 2 items, plate counts as 3 items.
- 2-handed weapons count as 2 items.
- 1000 coins or 100 gems count as 1 item.
Carrying more items than allowed can be done, but movement is halved (or worse).
### Time
Time is often represented at different scales:
@ -124,185 +295,4 @@ Time is often represented at different scales:
- A watch takes 4 hours.
- A long rest takes 8 hours.
### Exploration Procedure
The general steps to take when exploring (dungeon, wilderness, etc.)
1. **Setup**: Referee describes the situation
2. **Marching Order**: Party determines general exploration process
3. **Complication Check**: Referee rolls the complication die to see what effect it has.
4. **Actions / Responses / Complications**: Party declares actions, referee describes the results (and any complications).
5. **End Turn / Watch**: When the party has gone far enough or combat has completed, the (dungeon) turn or (wilderness) watch ends.
- Dungeon: 240'
- Wilderness: 12 miles
6. **Repeat**: Return to step 2 and repeat until the adventuring ends.
#### Complication Check
Roll 1d6, ignoring results of 4+ for the first 4 turns in a session (or since they last occurred).
1. **Encounter**: Wandering creature, social encounter, or some other random interaction.
2. **Signs**: Indications of possible encounter nearby - could be a clue, monster tracks, etc.
3. **Locality**: Some environmental or external event that affects the PCs - water rises, the assassin gets closer to the target, doors lock behind the party, etc.
4. **Exhaustion**: Take a rest turn (short rest) or (additional) -1 to all rolls until you do.
5. **Light Source**: Torches go out, lanterns go out every third time.
6. **No Complications**
#### Listening at Doors
Spend a minute listening at a door to have a base 1-in-6 chance of hearing a noise.
- Referee makes this roll.
#### Opening Doors
- Locked Doors can be picked or broken.
- Picking a lock takes 1d6 minutes.
- Stuck Doors can be unstuck or broken.
- Doors always break on a 1. Failure can affect stealth / surprise.
<div class="dividedTableWrapper">
| STR | Unstick | Break |
| :---: | :-----: | :----: |
| 3-8 | --- | 1-in-6 |
| 9-12 | 2-in-6 | 1-in-6 |
| 13-15 | 3-in-6 | 2-in-6 |
| 16-17 | 4-in-6 | 3-in-6 |
| 18+ | 5-in-6 | 4-in-6 |
[Forcing Door Chances]
</div>
#### Darkness
- -4 to attack when unable to see
- Candles light 10' radius
- Torches / lanterns light 30' radius
#### Infravision
- Can see heat tones, even in the dark.
- Usually works to 60'.
#### Other Hazards
- Fall damage is 1d6 / 10'.
- Characters are assumed to be able to swim at 1/2 their movement speed.
### Encounter Procedure
1. **Check Stealth**: Referee rolls for stealth, if applicable.
2. **Determine Distance**: Referee determines how far away the characters are from the encounter.
3. **Roll Initiative**: Each side that has can has stealth rolls 1d20, highest roll moves first.
4. **Choose Actions**: Each side decides how they will respond in initiative order, and the encounter proceeds.
5. **End Turn**: Once the encounter has played out, the turn ends.
#### Check Stealth
Each side that's being relatively stealthy (quiet, douses torches, etc.) has a base 2-in-6 chance of not being spotted.
- Parties carrying an active light source typically can not have stealth.
- If only one side has stealth, they may usually make a free attack (or can pass unnoticed).
- If all sides have stealth, they miss each other.
#### Encounter Distance
Often determined by the nature of the encounter itself, but may be determined randomly:
- Dungeon: 2d6 x 10'
- Wilderness: 4d6 x 10 yards (or 1d4 x 10 yards if either side is surprised).
#### Choose Actions
- Players decide how their characters will act.
- Creature actions are often determined by the nature of the encounter itself, but may be determined randomly.
#### Reaction Rolls
If creature / NPC reaction isn't obvious, roll 2d6 (+ CHA modifier, if someone tries to communicate).
<div class="dividedTableWrapper">
| 2d6 | Result |
| :-: | :-----: |
| 2- | Attack! |
| 3 | Hateful |
| 4 | Leery |
| 5 | Rude |
| 6 | Aloof |
| 7 | Neutral |
| 8 | Partial |
| 9 | Cordial |
| 10 | Amiable |
| 11 | Helpful |
| 12+ | Family! |
[Reaction Table]
</div>
<div class="dividedTableWrapper">
| CHA | Mod |
| :---: | :-: |
| 3 | -2 |
| 4-8 | -1 |
| 9-12 | +0 |
| 13-17 | +1 |
| 18+ | +2 |
[Charisma Modifier]
</div>
#### Common Actions
While any action is possible, the following actions are the most common:
- **Combat**: If a side attacks, casts a spell, or makes a tactical movement, [combat](./combat.html) begins.
- **Evasion**: If a side decides to flee, another side may decide to pursue.
- **Talk**: One side may attempt to communicate with the other(s).
#### Evasion
Any side that wishes to avoid an encounter may attempt to flee.
- Only possible before combat begins.
- Each opposing side declares whether or not they want to pursue.
- Players decide freely if they wish to pursue fleeing creatures.
- Referee decides whether creatures pursue fleeing PCs (based on circumstances or roll).
- If all opposing sides decide not to pursue, the evasion attempt automatically succeeds and the encounter is avoided.
- If an opposing side decides to pursue, the chance of evading depends on the surrounding environment.
#### End Turn
Each encounter is assumed to take at least one full turn to complete.
- This includes time to regroup, bind wounds, clean weapons, rest, etc.
### Advancement
As the adventures continue, treasure is acquired and creatures are vanquished, all adding to the PCs XP total.
- Each standard coin worth of treasure gained is worth 1 XP, and each creature has an XP value awarded for beating them (one way or another).
- The total XP are then divided amongst the PCs and any hirelings they have (at 1/2 share per hireling).
- Players running multiple characters gets a full share for their first PC and a half-share for the second, although they choose how to distribute the points.
- Referees may increase the derived value arbitrarily.
- Once a PC acquires enough XP, they go up to the next level in their class.
#### Upon Gaining a Level
When a PC increases their level, the following actions may be performed:
- Roll a hit die (based on the PC's class), and add it to their maximum hit points.
- 1s and 2s may be re-rolled.
- Alternatively, roll the next die step down and add 2.
- Their player may pick one of the PC's abilities, and roll 3d6.
- If the resulting roll is higher than the ability score, increase the score by 1.
- Check the PC's [class](/classes/index.html) and [race](/races/index.html) to see if any new abilities are gained.
!!!include(license/wotc-cc-by.md)!!!

View File

@ -17,6 +17,8 @@ When reality is altered this way, it's called magic, and the characters who can
Each spellcasting class has an associated type of magic: arcane or divine.
There's an additional class of spells known as rituals, which have their own requirements, and (in many cases) need not be performed by a spellcaster.
### Memorizing Spells
Takes one hour, can only be done once per day.
@ -38,8 +40,12 @@ Ritual spells may be cast by performing the ritual as described.
### Spell Effects
- Some spells affect multiple targets, either by area or by Hit Dice total. If the spell doesn't say how to select the targets, the referee decides.
- Some spells require the caster to concentrate to maintain the spell's effect. Performing any other action or being distracted (ex: attacked) causes concentration to end.
- Multiple spells cannot increase the same ability (e.g. bonuses to attack rolls, AC, damage rolls, saving throws, etc.). Spells that affect different abilities can be combined, just as spells can be combined with the effects of magical items.
- Some spells require the caster to concentrate to maintain the spell's effect.
- Performing any other action causes concentration to end.
- When distracted (ex: attacked) while concentrating, the spellcaster must make a Willpower check (highest of CHA or CON) or the spell ends.
- Multiple spells cannot increase the same ability (e.g. bonuses to attack rolls, AC, damage rolls, saving throws, etc.).
- Spells that affect different abilities can be combined.
- Spells can also be combined with the effects of magical items.
### Magical Research

68
src/pages/tools/index.md Normal file
View File

@ -0,0 +1,68 @@
---
title: Referee's Tools
description:
date_pub: 2023-08-23T21:01:00-04:00
section: tools
content_type: feature
short_code: dt1
---
<script crossorigin="anonymous" integrity="sha256-oTzJ337+krSUvt6QB4uj3ko3zlJBULbMdYxFgyYK6fc=
sha384-Jp3amSrLOinxKymki4BiCwi2qhSuGsCFUjp3pUIcTustcE6zNtO4Abs15kJItBw7
sha512-M5+Z/3zFT8rPTGzrvRGPrBvUYSsgqbTy4ZvnJqjW1jXvtfeMvGxZm6ZaQYSJSBSt8iz/WtnBdHQ/CuIy/nis2A=="
src="/scripts/lib/dice-v2.0.0.min.js"></script>
<script type="module" src="/scripts/tools.js"></script>
<noscript>
<p>Sorry, the Referee's Tools require JavaScript to work.</p>
<p>Please enable it or try using a different browser.</p>
</noscript>
<div class="refereeTools">
<details class="toolDetails" open>
<summary>
Die Roller
</summary>
<form id="js-rollerForm" class="rollerForm">
<input id="js-rollerInput" type="text" value="" />
<input type="reset" value="x" />
<input type="submit" value="Roll" />
</form>
<ul id="js-rollerOutput"></ul>
<p>Powered by <a href="https://github.com/lordnull/dice.js" target="_blank">Dice.js</a></p>
</details>
<details class="toolDetails" open>
<summary>
Exploration Complication Randomizer
</summary>
<form id="js-complicationForm">
<input type="submit" value="Randomize!" />
</form>
<ol id="js-complicationList">
<li>Encounter</li>
<li>Signs / Portents</li>
<li>Locality</li>
<li>Exhaustion</li>
<li>Light Source</li>
<li>No Complications</li>
</ol>
</details>
<details class="toolDetails" open>
<summary>
Astral Complication Randomizer
</summary>
<form id="js-astralComplicationForm">
<input type="submit" value="Randomize!" />
</form>
<ol id="js-astralComplicationList">
<li>Encounter</li>
<li>Signs / Portents</li>
<li>Locality</li>
<li>Pilot / Ship issue</li>
<li>Lose Direction</li>
<li>No Complications</li>
</ol>
</details>
</div>

View File

@ -1,17 +0,0 @@
---
{
"title": "Issue 1",
"content_type": "issue",
"description": "",
"date_pub": "2023-03-19T00:35:00-04:00",
"section": "zine",
"status": "hidden",
"short_code": "zi1",
"articles":
[
"/astral/adventuring.html",
"/races/automaton.html",
"/bestiary/drahki.html",
],
}
---

View File

@ -1,83 +0,0 @@
<%
/*
Not sure it's worth the effort for this ATM.
*/
var
generateSitemapList = function(the_head, the_tail) {
var
sortForIndex = function(a,b) {
if (a === 'index.html' || a<b) {
return -1;
}
if (b === 'index.html' || a>b) {
return 1;
}
return 0;
},
filter = /(\.html$)/,
replace = /(\.html$)|(^index\.html$)/,
tree = function (head, tail) {
var
output = '',
tree_output = '',
data, content;
for (var key in head) {
var
val = head[key];
if (key !== '.git') {
if (key == '_data') {
data = val;
} else if (key == '_contents') {
content = val;
} else {
tree_output += tree(val, tail + key + "/");
}
}
}
if (content && data) {
content
.sort(sortForIndex)
.forEach (function(file) {
var
slug = file.replace(filter, ""),
file_data = data && data[slug] ? data[slug] : {},
now = new Date(),
show_item = false,
title, date;
if (filter.test(file)) {
show_item = true;
if (file_data) {
var
is_draft = file_data.is_draft || false,
is_sys_file = file_data.is_sys_file || false,
title = (file_data.title || '').trim();
if (is_draft || is_sys_file || title === '') {
show_item = false;
} else {
date = file_data.date_last_mod ? new Date(file_data.date_last_mod) : '';
date = date !== '' && file_data.date_pub ? new Date(file_data.date_pub) : '';
if ((date && date.getTime() > now.getTime())) {
show_item = false;
}
}
}
}
if (show_item) {
output +=
(file === 'index.html' ? '\n<ul>' : '') +
'\n<li><a href="' + tail + file + '">' + title + '</a></li>\n';
}
});
output += '\n</ul>';
}
return output + tree_output;
};
return tree(the_head, the_tail);
};
%>
<h2>Site Map</h2>
<ul>
<%- generateSitemapList(public, "/") %>
</ul>

View File

@ -1,306 +0,0 @@
<!doctype html>
<!--[if lt IE 7]> <html class="no-js ie lt-ie10 lt-ie9 lt-ie8 lt-ie7" lang="en" xmlns:fb="http://ogp.me/ns/fb#"> <![endif]-->
<!--[if IE 7]> <html class="no-js ie lt-ie10 lt-ie9 lt-ie8" lang="en" xmlns:fb="http://ogp.me/ns/fb#"> <![endif]-->
<!--[if IE 8]> <html class="no-js ie lt-ie10 lt-ie9" lang="en" xmlns:fb="http://ogp.me/ns/fb#"> <![endif]-->
<!--[if IE 9]> <html class="no-js ie lt-ie10" lang="en" xmlns:fb="http://ogp.me/ns/fb#"> <![endif]-->
<!--[if gt IE 9]> <html class="no-js ie" lang="en" xmlns:fb="http://ogp.me/ns/fb#"> <![endif]-->
<!--[if !IE]>--> <html class="no-js" lang="en" xmlns:fb="http://ogp.me/ns/fb#"> <!--<![endif]-->
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<base href="https://itsericwoodward.com/" />
<title><%= site.title %></title>
<link rel="pgpkey" type="application/pgp-keys" title="PGP Public Key" href="/files/public.aexpk" />
<!-- Courtesy of https://www.favicon-generator.org/ -->
<link rel="apple-touch-icon" sizes="57x57" href="<%= site.base_uri %>/images/favicons/apple-icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="<%= site.base_uri %>/images/favicons/apple-icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="<%= site.base_uri %>/images/favicons/apple-icon-72x72.png">
<link rel="apple-touch-icon" sizes="76x76" href="<%= site.base_uri %>/images/favicons/apple-icon-76x76.png">
<link rel="apple-touch-icon" sizes="114x114" href="<%= site.base_uri %>/images/favicons/apple-icon-114x114.png">
<link rel="apple-touch-icon" sizes="120x120" href="<%= site.base_uri %>/images/favicons/apple-icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="<%= site.base_uri %>/images/favicons/apple-icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="<%= site.base_uri %>/images/favicons/apple-icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="<%= site.base_uri %>/images/favicons/apple-icon-180x180.png">
<link rel="icon" type="image/png" sizes="192x192" href="<%= site.base_uri %>/images/favicons/android-icon-192x192.png">
<link rel="icon" type="image/png" sizes="32x32" href="<%= site.base_uri %>/images/favicons/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="96x96" href="<%= site.base_uri %>/images/favicons/favicon-96x96.png">
<link rel="icon" type="image/png" sizes="16x16" href="<%= site.base_uri %>/images/favicons/favicon-16x16.png">
<meta name="msapplication-TileColor" content="#9aa8bc">
<meta name="msapplication-TileImage" content="<%= site.base_uri %>/images/favicons/ms-icon-144x144.png">
<meta name="theme-color" content="#9aa8bc">
<meta name="description" content="It's Eric Woodward's home page, the page of a geek, web developer, gamer, tinkerer, husband, father, and American cyborg, though not necessarily in that order.">
<meta name="author" content="<%= site.author.name %>">
<meta name="generator" content="Gulp"/>
<meta name="keywords" content="geek, web developer, gamer, tinkerer, husband, father, American cyborg">
<meta name="robots" content="">
<!-- Open Graph -->
<meta property="og:type" content="website" />
<meta property="og:url" content="https://itsericwoodward.com/" />
<meta property="og:site_name" content="<%= site.title %>" />
<meta property="og:title" content="<%= site.title %>" />
<meta property="og:image" content="<%= site.base_uri %>/images/eric-8bit.gif" />
<meta property="og:description" content="It's Eric Woodward's home page, the page of a geek, web developer, gamer, tinkerer, husband, father, and American cyborg, though not necessarily in that order." />
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:url" content="<%= site.base_uri %>/" />
<meta name="twitter:title" content="<%= site.title %>" />
<meta name="twitter:description" content="It's Eric Woodward's home page, the page of a geek, web developer, gamer, tinkerer, husband, father, and American cyborg, though not necessarily in that order." />
<meta name="twitter:image:src" content="<%= site.base_uri %>/images/eric-8bit.gif" />
<meta name="twitter:creator" content="<%= site.author.twitter %>" />
<link rel="canonical" href="https://itsericwoodward.com/"/>
<link rel="authorization_endpoint" href="https://indieauth.com/auth"/>
<style>
*, *:before, *:after {
box-sizing: inherit;
}
html {
box-sizing: border-box;
font-size: 16px;
height: 100%;
}
body {
background: #0d1852; /* Old browsers */
background: url('<%= site.uri %>/images/code-bg.jpg') top fixed;
color: #9aa8bc;
font-family: sans-serif;
font-size: 1em;
line-height: 1.5em;
}
a {
border: 1px solid transparent;
border-bottom: 1px dashed #25baba;
color: #049c74;
font-weight: bold;
padding: 0 .2rem;
text-decoration: none;
-webkit-transition: .3s background-color, .3s color, .3s border-radius;
transition: .3s background-color, .3s color, .3s border-radius;
}
a:hover {
border: 1px solid #25baba;
background-color: #25baba;
border-radius: .3rem;
color: #040308;
text-decoration: none;
}
a:visited {
color: #094192;
}
a:hover:visited {
color: #040308;
}
blockquote {
border-left: 2px solid #04778f;
margin: 1em 0;
padding: 0 1em;
}
h1 {
color: #25baba;
font-size: 2em;
}
h2 {
color: #25baba;
font-size: 1.5em;
}
h3 {
color: #25baba;
font-size: 1.22em;
}
h4 {
color: #25baba;
font-size: 1.12em;
}
h5 {
color: #25baba;
font-size: 1.06em;
}
h6 {
color: #25baba;
font-size: 1em;
}
li {
margin-bottom: .6em;
}
ol, ul {
padding-left: 1.2em;
}
code, kbd, pre, samp {
font-size: .9em;
}
code, kbd {
color: #aaa;
}
.avatar {
border-bottom: 1px solid transparent;
color: #9aa8bc;
display: block;
margin: 1em;
text-align: center;
}
.avatar:visited {
color: #9aa8bc;
}
.avatar-fig {
margin: 1.5em 0 0.5em 0;
padding: 0;
}
.avatar-figcaption {
background: #040308;
background: rgba(4,3,8,.8);
border: 1px solid #9aa8bc;
border-radius: .5em;
-webkit-transition: .3s background-color, .3s border-color;
transition: .3s background-color, .3s border-color;
}
.avatar:hover .avatar-figcaption {
background: transparent;
border-color: transparent;
}
.avatar-img {
max-width: 75%;
width: 14em;
}
.container {
align-items: center;
display: flex;
flex-wrap: wrap;
justify-content: space-evenly;
min-height: 90vh;
}
.dataDiv {
background: #040308;
background: rgba(4,3,8,.8);
border: 1px solid #9aa8bc;
border-radius: .5em;
display: inline-block;
margin: 1em;
max-width: 40em;
padding: .5em;
}
.webring {
font-size: .9em;
text-align: center;
}
.webring-link {
border: 1px solid #726f6a;
border-radius: .3em;
display: inline-block;
line-height: .25em;
padding: .25em;
}
@media all and (min-width: 35em) {
html {
font-size: 18px;
}
}
@media all and (min-width: 40em) {
html {
font-size: 20px;
}
}
</style>
</head>
<body>
<div class="container h-card vcard">
<a href="/"
class="avatar url fn u-url u-uid url icon-container"
rel="author">
<figure class="avatar-fig">
<img
class="photo u-photo avatar-img"
alt="It's Eric Woodward's avatar"
src="<%= site.uri %>/images/eric-8bit.gif"/>
<br />
<figcaption class="avatar-figcaption">It&apos;s <span class="p-name">Eric Woodward</span>!</figccaption>
</figure>
</a>
<div class="dataDiv">
<p class="p-role role p-note">
My name is <a class="p-name fn u-url u-uid url"
href="/">Eric Woodward</a>, and I am a
<span class="p-category category">geek</span>,
<span class="p-category category">coder</span>,
<span class="p-category category">gamer</span>,
<span class="p-category category">tinkerer</span>,
<span class="p-category category">husband</span>,
<span class="p-category category">father</span>,
<span class="p-category category">server admin</span>,
<span class="p-category category">web developer</span>,
and <span class="p-category category">American</span>
<span class="p-category category">cyborg</span>,
though not necessarily in that order.
</p>
<p>You can find out more
<a href="<%= site.uri %>/about.html">about me</a> by
checking out
<a rel="me" class="u-url url"
title="It's Eric Woodward's Website"
href="<%= site.uri %>/">my website</a>
or perusing
<a rel="me authn" class="u-url url"
title="It's Eric Woodward's Git Repos"
href="https://git.itsericwoodward.com/eric/">my code</a>.
If you want to reach me, you can send me an <a rel="me" class="u-url url u-email" title="&#69;&#109;&#97;&#105;&#108;"
href="&#109;&#x61;&#x69;&#108;&#116;&#x6f;&#58;&#x65;&#x72;&#x69;&#x63;&#64;&#x69;&#116;&#x73;&#x65;&#114;&#x69;&#x63;&#119;&#111;&#111;&#x64;&#x77;&#97;&#x72;&#100;&#x2e;&#99;&#111;&#109;">&#69;&#109;&#97;&#105;&#108;</a>,
<!-- (securely, if you want to use my
<a rel="pgpkey" type="application/pgp-keys" title="PGP Public Key" href="/files/public.aexpk">PGP Key</a>),-->
or you can find me on
<a rel="me" class="u-url url" title="itsericwoodward on LinkedIn"
href="https://www.linkedin.com/in/itsericwoodward">LinkedIn</a>,
<a rel="me authn" class="u-url url" title="ItsEricWoodward on GitHub"
href="https://github.com/ItsEricWoodward">GitHub</a>, or
<a rel="me" class="u-url url" title="EricPlaysGames on BoardGameGeek"
href="https://boardgamegeek.com/user/ericplaysgames">BoardGameGeek</a>.
Alternatively, you can grab my
<a href="http://h2vx.com/vcf/https%3A//itsericwoodward.com">vCard</a> and add me to your address book.
</p>
<p class="webring">
<a href="https://xn--sr8hvo.ws/1⃣🖲/previous" class="webring-link">←</a>
An IndieWeb Webring 🕸💍
<a href="https://xn--sr8hvo.ws/1⃣🖲/next" class="webring-link">→</a>
</p>
</div>
</div>
</body>
</html>

View File

@ -1,77 +0,0 @@
<%
/*
This is broken too, adds an unnecessary "undefine" to output.
*/
var
generateSitemapXML = function(the_head, the_tail, the_base) {
var
filter = /(\.html$)/,
replace = /(\.html$)|(^index\.html$)/,
tree = function (head, tail, base) {
var
output = '',
tree_output = '',
data, content;
for (var key in head) {
var
val = head[key];
if (key && val && key !== '.git') {
if (key == '_data') {
data = val;
} else if (key == '_contents') {
content = val;
} else {
tree_output += tree(val, tail + key + "/", base);
}
}
}
if (content) {
for (var i in content) {
var
file = content[i],
slug = file.replace(filter, ""),
file_data = data && data[slug] ? data[slug] : {},
now = new Date(),
show_item = false,
upd_date;
if (filter.test(file)) {
show_item = true;
if (file_data) {
var
is_draft = file_data.is_draft || false,
is_sys_file = file_data.is_sys_file || false,
title = (file_data.title || '').trim();
if (is_draft || is_sys_file || title === '') {
show_item = false;
} else {
upd_date = file_data.date_last_mod ? new Date(file_data.date_last_mod) : '';
upd_date = upd_date !== '' && file_data.date_pub ? new Date(file_data.date_pub) : '';
if ((upd_date && upd_date.getTime() > now.getTime())) {
show_item = false;
}
}
} else {
show_item = false;
}
}
if (show_item) {
output +=
'\n<url>\n <loc>' + the_base + tail + file + '</loc>\n' +
(upd_date ? '\n <lastmod>' + upd_date.toUTCString() + '</lastmod>' : '') + '\n</url>';
}
}
return output + (['','undefined'].indexOf(tree_output.trim()) == -1 ? tree_output : '');
}
};
return tree(the_head, the_tail, the_base)
.replace('undefined', ''); // hack, not sure where the extra "undefined" is coming from. TODO: Fix this
}
-%>
<?xml version="1.0" encoding="utf-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
<%- generateSitemapXML(public, "/", site.uri.production) %>
</urlset>