site relaunch

This commit is contained in:
evilchili 2023-06-11 21:33:56 -07:00
parent a6c101b01b
commit b70e416a3f
38 changed files with 834 additions and 70 deletions

View File

@ -0,0 +1,65 @@
---
# bestiary/rolling-cactus.md
title: Rolling Cactus
author: evilchili
tags: monster
date: 2023-05-27 14:43:16.001825
template: monster
show_dm_content: True
status: published
monster:
name: "Rolling Cactus"
size: medium
type: beast
alignment: unaligned
AC: 10
HP: 100 (10d10 + 50)
speed: 30ft
STR: 10,0
DEX: 10,0
CON: 10,0
INT: 10,0
WIS: 10,0
CHA: 10,0
skills:
saving_throws:
resistances:
damage_immunities:
condition_immunities:
senses: Passive Perception 10
languages: Common
cr:
attributes:
"name1": description
"name2": description
traits:
Actions:
attributes:
"multiattack": description
options:
"name1": "+1 to hit, reach 5 ft., one target. Hit: 5 (2d4) DamageType damage."
"name2": "+1 to hit, reach 5 ft., one target. Hit: 5 (2d4) DamageType damage."
Reactions:
attributes:
options:
"Opportunity Attack": description
Legendary Actions:
attributes:
"count": 3
options:
"name1": description
"name2": description
Legendary Reactions:
options:
"name1": description
"name2": description
Lair and Actions:
attributes:
"name1": description
options:
"name1": description
"name2": description
---
Flavour text goes here.

View File

@ -0,0 +1,130 @@
---
title: PC Hooks
---
Player character hooks for plot etc...
### Krjn
##### 1. what is your secret reason for becoming an adventurer?
hoping to do enough to make up for what happened in the forest such that I put myself in exile, so that I can go home.
##### 2. who have you wronged?
my people and the forest they live in
##### 3. what would you kill to know?
who really is responsible for the devastation of my forest home. I took the blame upon myself, but was only an indirect cause
##### 4. what do you fear?
I fear I will never be able to atone for my sins. I also value propriety and am horrified whenever I set a toe out of line.
##### Goals
**STG**: just exist. go on quests, make money to survive. live with my guilt
**MTG**: eke out a life in exile that is satisfactory.
**LTG**: rejoin my brethren in the forest
### Rosney
##### 1. what is your secret reason for becoming an adventurer?
Find papa. to make my mark.
##### 2. who have you wronged?
Sanders, shady alchemist who sold bad potions. run off into the desert.
Liberty Sisters not happy she left?
##### 3. what would you kill to know?
Ways to survive.
Where is papa?
##### 4. what do you fear?
**STG**: Money and connections
**MTG**: make a name for myself
**LTG**: My own faction
### The Gaunt Traveler
##### 1. What is your secret reason for becoming an adventurer?
My secret is that I am FELURIUS MAGNUS MAGNUSSON PASHTUM, Magnus Stairwell, The Man Who Will Not Die.
I sent myself unknowingly into the past of Telisar to learn about Residium.
##### 2. Who have you wronged?
I sell high grade nitrogen fertilizer for gun powder and incendiaries.
My brand is FUNGUS MINERALS.
Minus a 'U', this is an anagram of Magnus Felurius.
The fertilizer bags' logo is a rainbow formed of the brand name, over a cartoon character.
The character is a smiling mushroom, giving a thumbs up of approval.
If you consider the rainbow an inverted 'U', his name is on every bag he sells.
Someone considers the sale of these materials a wrong.
##### 3. What would you kill to know?
I would kill to:
* know the fundamental secrets of how Residium works
* establish my hidden Myconid colony. (Know that my family is safe)
* keep the secrets of Residium for the colony. (Know that my future is assured)
##### 4. What do you fear?
I fear dying without understanding how Residium works.
##### Extra Credit Goals
###### Short-term
* find a safe place to reincarnate as a Myconid.
* secure the trust of folks to protect myself and the colony.
###### Medium-term
* found a new Myconid colony around the secrets of Residium crystals.
###### Long-term
* discover the secrets of the Residium waste and crystals.
* collect, protect, harvest and distribute Rresidium among an army of Myconids.
* found a distributed set of colonies.
* establish a store house of knowledge and equipment as a legacy for my future self, trusted travelers and companions.
### Evelina's Character
##### 1. What is your secret reason for becoming an adventurer?
- Was sent into exile after going against wishes of her tribe and saving an individual who then took advantage of the hospitality - causing harm to her tribe and perhaps even resulting in the death of some of her people.
##### 2. Who have you wronged
- Her own people, according to them. She is estranged from family for her choices to help “selfish” adventurers.
- Probably countless competing adventurers
##### 3. What would you kill to know
- How to restore the land and thus restore her people (she was raised in a “corrupted view” tribe)
- The location of the individual that wronged her and her people and led to her exile. But she isnt entirely sure what she would do when/if she ever found them.
##### 4. What do you fear
- Losing those she has grown close to, which perhaps has hindered her getting too close to anyone in the past
- Losing herself (her physiology being tied to the land - she was raised with a belief that she is corrupted and can succumb further to her peoples “curse” and become more and more savage)
##### What are your short, medium, and long-term goals
**STG**: Surviving and making a difference in the way she best can. Getting stronger and finding ways to adapt and market her skills. Collecting cool things + tattoos of her exploits.
**MTG**: Finding a place to belong. Filling the void of connection with her tribe.
**LTG**: Restoring the land to the legacy of her ancestors, and in turn hopefully restoring her people.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

View File

@ -1 +0,0 @@
../../../deadsands-notes/images/notes/

Binary file not shown.

Before

Width:  |  Height:  |  Size: 212 KiB

After

Width:  |  Height:  |  Size: 306 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 647 KiB

After

Width:  |  Height:  |  Size: 920 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -1,13 +1,14 @@
---
# /Users/evilchili/dnd/deadsands/www/content/region/blooming-wastes.md
# /Users/evilchili/dnd/deadsands/www/content/locations/blooming-wastes.md
title: The Blooming Wastes
author: evilchili
tags: region, homebrew
tags: region
date: 2022-07-20 17:54:47.286869
template: region
show_dm_content: True
description: <a href='/images/overland_blooming_wastes.png'><img class='region_map' alt="Detail of an overland map of the Sahwat Desert" src='/images/overland_blooming_wastes.png'></a> Leads to <a href='/regions/calamity-ridge/'>Calamity Ridge</a>, <a href='/regions/dust-river-canyon/'>Dust River Canyon</a>, and Tano's Edge.
thumbnail: /images/overland_blooming_wastes.png
description:
region:
name: The Blooming Wastes
size: 20
@ -69,5 +70,8 @@ region:
Rarity: Weird
Value: 5 GP
---
The Blooming Wastes stretch out before you: a mostly flat expanse of hard, cracked earth blanketed by some kind of sandy brown scrub. Small mesas dot the horizon, suggesting the possibility of shelter. As you approach you see that the scrub is covered in thick black thorns sharp enough to pierce boot leather; you will need to tread carefully.
**Leads to <a href='/locations/calamity-ridge/'>Calamity Ridge</a>, <a href='/locations/dust-river-canyon/'>Dust River Canyon</a>, and Tano's Edge.**

View File

@ -7,6 +7,8 @@ tags: region
date: 2022-08-07 13:59:35.261130
template: region
show_dm_content: False
thumbnail: /images/overland_calamity_ridge.png
description:
region:
name: Calamity Ridge
size: 25
@ -68,3 +70,5 @@ region:
---
Southwest of the Blooming Wastes lies an empty stretch of hard-packed stone, from which rises Calamity Ridge -- a sprawling mesa 15 miles long and 200 feet high. Sheltering at the base of the ridge is advised, as the otherwise empty land provides no cover from stalking predators. Legend has it that a tribe of lizardfolk once claimed the mesa but were wiped out by faction miners who descended on the region following rumours of veins of precious metals. Whether the rumours proved false or the veins were exhausted isn't clear, but the region is uninhabited today.
**Leads to <a href='/locations/tanos-edge'>Tano's Edge</a>.**

View File

@ -1,5 +1,5 @@
---
# regions/dust-river-canyon.md
# locations/dust-river-canyon.md
title: Dust River Canyon
status: published
@ -8,6 +8,8 @@ tags: region
date: 2022-08-07 13:21:31.543012
template: region
show_dm_content: True
thumbnail: /images/overland_dust_river_canyon.png
description:
region:
name: Dust River Canyon
size: 40
@ -69,3 +71,5 @@ region:
---
Dust River Canyon is a half-mile wide gash in the landscape, running forty miles southeast from the edge of the Blooming Wastes. A sheer, crumbling switchback leads to its base where thick clouds of red dust some 2 feet thick swirl, resisting all attempts to settle or disperse. Stalking predators move unseen within the dust, emerging from caves in the canyon walls.
**Leads to <a href='/locations/blooming-wastes/'>The Blooming Wastes</a> and <a href='/locations/gopher-gulch/'>Gopher Gulcch</a>.**

View File

@ -1,5 +1,5 @@
---
# regions/gopher-gulch.md
# locations/gopher-gulch.md
title: Gopher Gulch
status: published
@ -7,7 +7,9 @@ author: evilchili
tags: region
date: 2022-08-07 13:38:52.296672
template: region
show_dm_content: False
show_dm_content: True
thumbnail: /images/overland_gopher_gulch.png
description:
region:
name: Gopher Gulch
size: 30
@ -20,10 +22,10 @@ region:
Notes:
Forage:
DC: 18
Notes: no shelter; water harvestable from rolling cacti
Track:
DC: 15
Notes:
Track:
DC: 19
Notes: no shelter
Evade:
DC: 19
Notes:
@ -34,11 +36,11 @@ region:
encounters:
d1-d2:
Difficulty: Dangerous
d3-d4:
d3-d10:
Difficulty: Deadly
d5-d7:
d11-d15:
Difficulty: Easy
d8-d20:
d15-d20:
Difficulty: None
weather:
d1-d2:
@ -59,8 +61,7 @@ region:
Rarity: Uncommon
d6-d7:
Description: Sand Storm
Effect: Heavily obscured; visibility 5ft, disadvantage on WIS (Perception) checks
and INT (Investigation) checks
Effect: Heavily obscured; visibility 5ft, disadvantage on WIS (Perception) checks and INT (Investigation) checks
Rarity: Uncommon
d8:
Description: Inverted Bubble Rain
@ -81,10 +82,13 @@ region:
Rarity: Common
Value: 1 GP
d5-d8:
Name: Rolling Cactus
Description: A globular cactus that rolls and bounces freely in the wind. 1 gallon of water can be harvested from 10 cacti.
Name: Globe Cactus
Description: A globular cactus. 1 gallon of water can be harvested from 10 cacti.
Rarity: Common
Value: 5 GP
---
Gopher Gulch emerges from the southern edge of Dust River Canyon and turns east towards the rocky foothills at the base of the eastern range of Hoard's Vault. Heavy irregular stone cover the shallow riverbed which traverses a barren plain of cracked, broken ground. Shrub and small plants dot the area, but the most prominent flora is the Rolling Catci -- an odd species of globular cactus that rolls and bounces freely, pushed about by the desert winds.
**Leads to <a href='/locations/dust-river-canyon/'>Dust River Canyon</a>.**

View File

@ -0,0 +1,27 @@
---
# locations/tanos-edge.md
title: Tano's Edge
author: evilchili
tags: location
date: 2023-06-11 16:57:53.734985
template: location
show_dm_content: False
thumbnail: /images/tanos_edge_thumb.png
image: /images/tanos_edge.png
location:
type: settlement
name: Tano's Edge
population: 1000
notable_races: Humans, Halfings, Dragonborn
economy: Arcane research, enchantment, antiquities
dm_notes: |
DM's notes go here.
stores:
- angry-andoks-apothecary
- generals-store
status: published
---
Until recently, Tano's Edge was little more than a remote village on a ridge of the same name overlooking the Sahwat desert, catering to outcasts and the lawless. But with the discovery of ruins under the sands and the riches they contain, this town has become a powder keg of competing interests.

View File

@ -0,0 +1,86 @@
---
# regions/the-haunted-hills.md
title: The Haunted Hills
author: evilchili
tags: region
date: 2023-06-09 18:36:37.735366
template: region
show_dm_content: False
region:
name: The Haunted Hills
size: 20
terrain: normal
dm_notes: Talisman of Blightward required to avoid effects of weather.
skills:
Travel:
DC: 19
Notes:
Forage:
DC: 12
Notes:
Track:
DC: 10
Notes:
Evade:
DC: 13
Notes:
Survey:
DC: 10
Notes:
cr: 5
encounters:
d1:
Difficulty: Dangerous
d2-d3:
Difficulty: Deadly
d4-d6:
Difficulty: Difficult
d7-d14:
Difficulty: Easy
d15-d20:
Difficulty: None
weather:
d1-d2:
Rarity: Common
Description: Clear Skies
Effect: No effect
d3:
Rarity: Rare
Description: Howling Fantods
Effect: A phantasm appears and disappears at random. Anyone who can see it is frightened.
d4-d5:
Description: Ghostly Wailing
Effect: Disadvantage on CON checks for concentration checks
Rarity: Uncommon
d6-d7:
Rarity: Rare
Description: Breath of the Dead
Effect: 1d6 Necrotic damage per half-day
d8:
Rarity: Rare
Description: Soul Blight
Effect: Maximum HP is reduced by 1d4 per half-day unless wearing a Talisman of Blightward.
regional_effects:
- On a spell attack critical hit or miss, roll on the Wild Magic Table
forage_table:
d1-d2:
Rarity: Rare
Name: Deadbreath
Description: A tough black root that grows in cracks in the stone. When disturbed, the bark releases Breath of the Dead spores. DC 13 Nature, Survival, Constitution check or 1d4 Necrotic damage.
Value: 5 GP
d3:
Rarity: Uncommon
Name: Brightshrooms
Description: |
A grey, partially translucent mushroom that glows green in the presence of leaving creatures.
Value: 1 GP
d4:
Rarity: Common
Name: Water
Description: Cool, crisp, clear. Small pools and springs dot the caverns.
Value: 1 GP
status: draft
---
South of Gopher Gulch at the base of the eastern range of Hoard's Vault, lies a long series of rocky foothills carved through by howling winds; the interior of the hills is a vast network of tunnels that wail like the moaning of the dead, leading to the popular superstition that the land is cursed.

View File

@ -26,8 +26,6 @@ For each half-day, the party will:
<li> Resolve skill check successes / complications</li>
</ul>
</div>
The Sahwat is a vast desert region stretching some thousands of square miles, containing a variety of conditions: rocky mesas, scrub, cactus forests, empty bedrock, plateaus, valleys, caverns, salt flats, and endless dunes. At the heart of the desert lies an impenetrable whirlwind called the Heartstorm through which no one has passed and which is the subject of wild speculation.
Until recently traveling the Sahwat proper was an activity limited to the desparate and the outcast, and nearly none of it had been mapped. This is changing, though, with the discovery of buried wonders of the Yanrin Didan. Now every faction, bandit crew, hedge wizard and treasure hunter is descending on the desert and racing to uncover its secrets. When you undertake a journey into the desert, the party will need to contend with *Provisioning*, *Survival*, and *Regional Effects*; these are described below.

View File

@ -9,6 +9,12 @@ date: 2022-07-09 11:00
## Welcome to Telisar...
The Second Era ended in fire. The Empire of Yanrin Didan -- "Glowing Sands" in the common tongue -- spanned half the continent of Vosh, from the Sea of Storms in the south and across the jungles of Dewa Q'Asos to the peaks of Hoard's Vault. Its civilization stood unchallenged for an age, until a great power swept aside their magics, destroyed their cities, and scorched the earth leaving behind only dry, dead rock. No one knows just what caused destruction on such a scale, for it is said that not one soul survived the cataclysm and now, a thousand years later, their name and thousands of miles of desert are all that remain. The Empire's arcane wonders, their secrets, and their doom all lie buried under the dead sands of the Sahwat.
*The Second Era ended in fire. The Empire of Yanrin Didan -- "Glowing Sands" in the common tongue -- spanned half the continent of Vosh, from the Sea of Storms in the south and across the jungles of Dewa Q'Asos to the peaks of Hoard's Vault. Its civilization stood unchallenged for an age, until a great power swept aside their magics, destroyed their cities, and scorched the earth leaving behind only dry, dead rock. No one knows just what caused destruction on such a scale, for it is said that not one soul survived the cataclysm and now, a thousand years later, their name and thousands of miles of desert are all that remain. The Empire's arcane wonders, their secrets, and their doom all lie buried under the dead sands of the Sahwat.*
But there are whispers. Rumours of hoppers returning from the desert streaming gold from their packs and long-dead artifacts suddenly glowing with new enchantments. Sightings of strange, twisted creatures appearing on the dunes only to disappear like a mirage. And rumours that somewhere in the heart of the Sahwat, through the magical storms, across the dunes, at the very seat of that dead empire: history is stirring.
*But there are whispers. Rumours of hoppers returning from the desert streaming gold from their packs and long-dead artifacts suddenly glowing with new enchantments. Sightings of strange, twisted creatures appearing on the dunes only to disappear like a mirage. And rumours that somewhere in the heart of the Sahwat, through the magical storms, across the dunes, at the very seat of that dead empire: history is stirring.*
### The Dead Sands
The Dead Sands, our group's second campaign, is a **post-apocalyptic gold rush weird western** set in a realm of Telisar. Our first campaign explored the meaning of story and the interplay of myth, religion, and fate, and led to grand adventures on a huge scale with gods, demons, and the fey. For the Dead Sands I'd like to explore stories more grounded in local events: in civilized areas, the tension between magic and technology, the politics of factions, and the effects of a gold rush transforming societies. In the desert, exploration and survival will be key themes.
We'll dig into these themes using some new mechanics; [A Hopper's Guide to the Dewa Q'Asos](locations/) is the compendium of information unlocked by the party as they [explore the world](mechanics/desert-travel-rules).

View File

@ -1,15 +0,0 @@
---
# pages/maps.md
title: Maps
author: evilchili
tags: page
date: 2022-08-03 23:20:02.243922
key_image:
src: '/images/dewa_qasos.png'
alt: "Hand-drawn map of the Dewa Q'Asos"
gallery:
overland_map.png: "Overland map of the Sahwat Desert (so far)"
tanos_edge.png: "Old Town district of Tano's Edge"
---

View File

@ -4,21 +4,22 @@
title: Angry Andok's Apothecary
author: evilchili
show_dm_content: False
tags: post
location: Tano's Edge
tags: store
date: 2023-05-13 13:18:26.226450
description: Was that a short joke?! I'll gut you! See if I don't!<br>--Andok
status: published
---
Andok's is a cantankerous dwarf who specializes in nonmagical salves, potions, and reagants. He makes a killing
supplying hoppers who wisely avoid magical healing when in the desert, but is notorious for his quick, violent
temper and contempt for, well, pretty much everything and everyone. He remains stubbornly unaligned, but his wares
are so useful the Liberty Sisters don't dare chase him out of town.
Andok's is a cantankerous dwarf who specializes in nonmagical salves, potions,
and reagents. He makes a killing supplying hoppers who wisely avoid magical
healing when in the desert, but is notorious for his quick, violent temper and
contempt for, well, pretty much everything and everyone. He remains stubbornly
unaligned, but his wares are so useful the Liberty Sisters don't dare chase him
out of town.
"Andok's Elixirs" are reliable, if vile, substitutes for potions of healing, if you can afford them.
Location: **Tano's Edge**
Faction: **Unaligned**

View File

@ -4,7 +4,9 @@
title: General's Store
author: evilchili
show_dm_content: False
tags: post
location: Tano's Edge
faction: Liberty Sisters
tags: store
date: 2023-04-12 17:52:34.363950
description: Inventory subject to availability, prices subject to change, haggle at your own risk. -- The General
status: published
@ -18,8 +20,6 @@ The general supply is well-stocked with basic adventuring gear and a healthy cli
items high. The General has a reputation for being able to move just about anything, from random metal scraps to
gardening supplies to artifacts of historical interest.
Location: **Tano's Edge**
Faction: **Liberty Sisters**

View File

@ -136,13 +136,14 @@ h6 { font-size: 1.25em; }
color: #692F28;
}
.container .box article.recent p:first-of-type::first-letter {
font-family: inherit;
font-size: inherit;
float: inherit;
margin: inherit;
padding: inherit;
color: inherit;
.container .box article.recent p:first-of-type::first-letter,
.summary p:first-of-type::first-letter {
font-family: inherit !important;
font-size: inherit !important;
float: inherit !important;
margin: inherit !important;
padding: inherit !important;
color: inherit !important;
}
img {
@ -186,6 +187,19 @@ img {
text-justify: left;
}
.thumbnail {
float: right;
max-width: 150px;
margin-left: 1em;
}
.thumbnail img {
border: 1px solid black;
box-shadow: inset 0px 0px 4px 0px rgba(0,0,0,1);
max-width: 150px;
max-height: 150px;
height: auto;
}
article.recent {
font-style: italic;
margin-bottom: 1em;
@ -196,6 +210,7 @@ article.recent a.title {
font-style: normal;
}
article.recent .pull,
article.recent h3,
article.recent h4,
article.recent h5,
@ -753,6 +768,46 @@ a.disabled:hover {
display: none;
}
.statblock > .stat {
font-weight: bold;
}
.statblock > .stat > .value {
font-weight: normal;
margin-left: 0.5em;
}
.monster {
font-family: Roboto,Helvetica,sans-serif !important;
text-align: justify;
font-size: 0.9em;
column-count: 2;
-webkit-column-break-inside: avoid;
page-break-inside: avoid;
break-inside: avoid-column;
}
.monster h3, h4 {
margin-bottom: 0;
}
.monster h4 {
margin-top: 1em;
border-bottom: 1px solid #000;
}
.monster hr {
content: "";
display: block;
width: 100%;
margin: 10px 0px;
}
.monster-type {
text-align: center;
}
.pull {
float: right;
max-width: 40%;
@ -810,6 +865,19 @@ a.disabled:hover {
text-align: left;
}
div.location {
display: block;
clear: both;
}
div.location:hover, div.location:active {
background: rgba(244,241,232, 0.5);
cursor: pointer;
}
div.location:hover h4 a, div.location:active h4 a {
color:#cca138;
}
.container .box p:first-of-type::first-letter {
margin-bottom: -0.5em;
}

View File

@ -27,14 +27,18 @@
{% if self.is_dm() %}
<li><a href="{{ SITEURL }}/dm">DM</a></li>
{% endif %}
{% if DISPLAY_CATEGORIES_ON_MENU %}
{% for category, articles in categories %}
{% if category != 'dm' %}
<li><a href="{{ SITEURL }}/{{ category.name }}">{{ category }}</a></li>
{% endif %}
{% endfor %}
{% endif %}
{% if DISPLAY_PAGES_ON_MENU %}
{% for p in pages %}
<li{% if p == page %} class="active"{% endif %}><a href="{{ SITEURL }}/{{ p.url }}">{{ p.title }}</a></li>
{% endfor %}
{% endif %}
{% for m in MENU_ITEMS %}<li><a href="{{ SITEURL }}/{{ m[1] }}">{{ m[0] }}</a></li>{% endfor %}
</ul>
</div>

View File

@ -6,7 +6,11 @@
{% else %}
<section id="content" class="content">
{% if category %}
{% if category.name in ('locations', ) %}
{% include category.name + "-index.html" %}
{% else %}
{% with key='category', values=[category], title=category %}{% include "category-index.html" %}{% endwith %}
{% endif %}
{% elif tag %}
{% include "tag-index.html" %}
{% endif %}

View File

@ -0,0 +1,33 @@
{% extends "base.html" %}
{% import "macros.html" as macros %}
{% block title %}{{ article.title|capitalize }} - {{SITENAME}}{% endblock title %}
{% block summary %}{{ article.summary|striptags }}{% endblock %}
{% block key_image %}{{ macros.key_image(article) }}{% endblock key_image %}
{% block content %}
{% if not self.is_dm() and article.category == 'dm' %}
{% else %}
<section id="content">
<div class='box curled'>
<h2 class="entry-title"><a href="{{ SITEURL }}/{{ article.url }}" rel="bookmark" title="Permalink to {{ article.title|striptags }}">{{ article.title }}</a></h2>
<hr>
<div class='byline'>
<span class='date'>{{ article.locale_date }}</span>&nbsp;{% if article.tags %}{% for tag in article.tags %}<a href="{{ SITEURL }}/{{ tag.url }}">{{ tag }}</a> {% endfor %}{% endif %}
</div>
{% if article.description or article.thumbnail %}
<div class='scrap'>
<div class='note'>
<a href='{{article.image or article.thumbnail}}'><img src='{{article.thumbnail}}'></a>
{{ article.description or '' }}
</div>
</div>
{% endif %}
{{ article.content }}
{% if article.location.type == 'settlement' %}
{% with article=article %}{% include "settlement.html" %}{% endwith %}
{% endif %}
<hr>
{% include "bottom-nav.html" %}
</div>
</section>
{% endif %}
{% endblock content %}

View File

@ -0,0 +1,36 @@
{% set locations = articles | selectattr('category', 'in', ['locations']) | list | sort(attribute=date) %}
<img src='/images/dewa_qasos.png' class='key_image' alt="Hand-drawn map of the Dewa Q'Asos">
<div class='box curled'>
<h2>A Hopper's Guide To<br>The Dewa Q'Asos</h2>
<h3>Cites, Towns, and Settlements</h3>
{% for location in locations if 'region' not in location.tags %}
<div class='location' onclick="window.location.href='{{ SITEURL }}/{{ location.url }}'">
<h4><a class='title' href="{{ SITEURL }}/{{ location.url }}" rel="bookmark" title="{{location.title|striptags}}">{{ location.title }}</a></h4>
<div class='thumbnail'><a href='{{location.thumbnail}}'><img src='{{ location.thumbnail }}' alt='{{location.title}}'></a></div>
<span class="summary"> {{ location.summary }} </span>
</div>
{% endfor %}
<h3>The Sahwat Desert</h3>
<div class='thumbnail'><a href='/images/overland_map.png'><img src='/images/overland_map.png' alt="The known regions of the Sawhat Desert" /></a></div>
<span class='summary'>
The Sahwat Desert is a vast expanse covering thousands of miles of the Dewa Q'Asos region in southwestern Vosh, from
Tano's Edge to the Sea of Storms. It is comprised of a multitude of regions each with its own geography, weather,
and secrets, ranging from inhospitable to deadly. At the heart of the desert lies an impenetrable whirlwind called
the Heartstorm, through which no one has passed and which is the subject of wild speculation.
<p>
<br>
Travel in the Sahwat is governed by <a href='/mechanics/desert-travel-rules'>the rules for overland travel.</a> Mind how you step, Hopper.
</p>
</span>
{% for location in locations if 'region' in location.tags %}
<div class='location' onclick="window.location.href='{{ SITEURL }}/{{ location.url }}'">
<h4><a class='title' href="{{ SITEURL }}/{{ location.url }}" rel="bookmark" title="{{location.title|striptags}}">{{ location.title }}</a></h4>
<div class='thumbnail'><img src='{{ location.thumbnail }}' alt='{{location.title}}'></a></div>
<span class="summary"> {{ location.summary }} </span>
</div>
{% endfor %}
</div>
<hr>
</div>

View File

@ -0,0 +1,147 @@
{% extends "base.html" %}
{% import "macros.html" as macros %}
{% block title %}{{ article.title|capitalize }} - {{SITENAME}}{% endblock title %}
{% block summary %}{{ article.summary|striptags }}{% endblock %}
{% block key_image %}{{ macros.key_image(article) }}{% endblock key_image %}
{% block content %}
{% set m = article.metadata.monster %}
<section id="content">
<div class='box curled'>
<h2 class="entry-title"><a href="{{ SITEURL }}/{{ article.url }}" rel="bookmark" title="Permalink to {{ article.title|striptags }}">{{ article.title }}</a></h2>
{% import 'translations.html' as translations with context %}
{{ translations.translations_for(article) }}
<hr>
<div class='byline'>
<span class='date'>{{ article.locale_date }}</span>&nbsp;{% if article.tags %}{% for tag in article.tags %}<a href="{{ SITEURL }}/{{ tag.url }}">{{ tag }}</a> {% endfor %}{% endif %}
</div>
{% if article.description %}
<div class='scrap'><div class='note'>{{ article.description }}</div></div>
{% endif %}
{% set target = article.title.replace(' ', '_') %}
{% if self.is_dm() or article.show_dm_content %}
<div class='statblock monster'>
<h3>{{ article.title }}</h3>
<div class='monster-type'>
<em>
{{m.size}} {{m.type}}{% if m.alignment %}, {{m.alignment}}{%endif%}
</em>
</div>
<hr>
<div class='stat'>
Armor Class <span class='value'>{{ m.AC }}</span>
</div>
<div class='stat'>
Hit Points <span class='value'>{{ m.HP }}</span>
</div>
<div class='stat'>
Speed <span class='value'>{{ m.speed }}</span>
</div>
<hr>
<table>
<tr>
<th>STR</th><th>DEX</th><th>CON</th><th>INT</th><th>WIS</th><th>CHA</th>
</tr>
<tr>
<td>{{ m.STR }}</td>
<td>{{ m.DEX }}</td>
<td>{{ m.CON }}</td>
<td>{{ m.INT }}</td>
<td>{{ m.WIS }}</td>
<td>{{ m.CHA }}</td>
</tr>
</table>
<hr>
{% if m.saving_throws %}
<div class='stat'>
Saving Throws <span class='value'>{{ m.saving_throws }}</span>
</div>
{% endif %}
{% if m.skills %}
<div class='stat'>
Skills <span class='value'>{{ m.skills }}</span>
</div>
{% endif %}
{% if m.resistances %}
<div class='stat'>
Damage Resistances <span class='value'>{{ m.resistances }}</span>
</div>
{% endif %}
{% if m.vulnerabilities %}
<div class='stat'>
Damage Vulnerabilities <span class='value'>{{ m.vulnerabilities }}</span>
</div>
{% endif %}
{% if m.damage_immunities %}
<div class='stat'>
Damage Immunities <span class='value'>{{ m.damage_immunities }}</span>
</div>
{% endif %}
{% if m.condition_immunities %}
<div class='stat'>
Condition Immunities <span class='value'>{{ m.condition_immunities }}</span>
</div>
{% endif %}
{% if m.saving_throws %}
<div class='stat'>
Senses <span class='value'>{{ m.senses }}</span>
</div>
{% endif %}
{% if m.languages %}
<div class='stat'>
Languages <span class='value'>{{ m.languages }}</span>
</div>
{% endif %}
{% if m.cr %}
<div class='stat'>
Challenge <span class='value'>{{ m.cr }}</span>
</div>
{% endif %}
<hr>
{% for (attr_name, attr_desc) in m.attributes.items() %}
<div class='stat'>{{ attr_name }}. <span class='value'>{{attr_desc}}</span></div>
{% endfor %}
{% for section in ('Actions', 'Reactions', 'Legendary Actions', 'Legendary Reactions', 'Lair and Actions') %}
{% if section in m.traits %}
{% set trait = m.traits[section] %}
{% if 'attributes' in trait or 'options' in trait %}
<h4>{{ section }}</h4>
{% if trait.attributes %}
{% for (attr_name, attr_desc) in trait.attributes.items() %}
<div class='stat'>{{ attr_name }}. <span class='value'>{{attr_desc}}</span></div>
{% endfor %}
{% endif %}
{% if trait.options %}
{% for (attr_name, attr_desc) in trait.options.items() %}
<div class='stat'>{{ attr_name }}. <span class='value'>{{attr_desc}}</span></div>
{% endfor %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
</div>
{% endif %}
{{ article.content }}
<div class='read'>{{ m.dm_notes }}</div>
<hr>
{% include "bottom-nav.html" %}
</div>
</section>
{% endblock %}

View File

@ -5,12 +5,6 @@
<div class='box curled'>
<hr>
{{ page.content }}
<hr>
{% if page.show_recent %}
<h3>Recent Posts</h3>
{% with count=10, key='category', values=['lore', 'mechanics', 'regions'] %}{% include "recent.html" %}{% endwith %}
<hr>
{% endif %}
</div>
</section>
{% endblock %}

View File

@ -15,8 +15,13 @@
<div class='byline'>
<span class='date'>{{ article.locale_date }}</span>&nbsp;{% if article.tags %}{% for tag in article.tags %}<a href="{{ SITEURL }}/{{ tag.url }}">{{ tag }}</a> {% endfor %}{% endif %}
</div>
{% if article.description %}
<div class='scrap'><div class='note'>{{ article.description }}</div></div>
{% if article.description or article.thumbnail %}
<div class='scrap'>
<div class='note'>
<a href='{{article.thumbnail}}'><img src='{{article.thumbnail}}'></a>
{{ article.description or '' }}
</div>
</div>
{% endif %}
{{ article.content }}
@ -32,7 +37,7 @@
</div>
<dl>
<dt>Size</dt><dd>{{ r.size }} sq. miles </dd>
<dt>Terrain</dt><dd>{{ r.terrain }} (walking: {{ r.size / 10 if r.terrain == 'difficult' else 20 |round }} days)</dd>
<dt>Terrain</dt><dd>{{ r.terrain }} (walking: {{ r.size / (10 if r.terrain == 'difficult' else 20) |round }} days)</dd>
<dt>Regional Effects</dt><dd>{{ macros.table(r.regional_effects) }}</dd>
<dt>Skill Challenges</dt><dd>{{ macros.table(r.skills, ['Skills', 'DC', 'Notes']) }}</dd>
<dt>Encounters (CR {{r.cr}})</dt><dd>{{ macros.table(r.encounters, ['Roll', 'Difficulty']) }}</dd>

View File

@ -0,0 +1,24 @@
<table>
<tr>
<th>Population</th>
<th>Notable Races</th>
<th>Economy</th>
</tr>
<tr>
<td>{{ article.location.population }}</td>
<td>{{ article.location.notable_races }}</td>
<td>{{ article.location.economy }}</td>
</tr>
</table>
<h3>Stores</h3>
{% set stores = articles |selectattr('tags', 'eq', ['store']) | selectattr('location', 'eq', article.title) | list %}
{% if stores %}
{% for store in stores %}
<div class='location' onclick="window.location.href='{{ SITEURL }}/{{ store.url }}'">
<h4><a class='title' href="{{ SITEURL }}/{{ store.url }}" rel="bookmark" title="{{store.title|striptags}}">{{ store.title }}</a></h4>
<span class="summary"> {{ store.summary }} </span>
</div>
{% endfor %}
{% endif %}

View File

@ -0,0 +1,29 @@
---
# {{filename}}
title: {{ title }}
author: {{ author if author else 'evilchili' }}
tags: {{ tags or 'location'}}
{% if date %}
date: {{ date }}
{% endif %}
template: location
show_dm_content: False
thumbnail: /images/{{ title|slugify }}_thumb.png
image: /images/{{title|slugify}}.png
{% if summary %}
summary: {{summary}}
{% endif %}
location:
type: settlment
name: {{ title }}
population: 1000
notable_races: humans
economy: textiles
dm_notes: |
DM's notes go here.
stores:
status: {{ status if status else 'draft' }}
---
{{ description }}

View File

@ -0,0 +1,70 @@
---
# {{filename}}
title: {{ title }}
author: {{ author if author else 'evilchili' }}
tags: {{ tags or 'monster'}}
{% if date %}
date: {{ date }}
{% endif %}
template: monster
show_dm_content: True
{% if summary %}
summary: {{summary}}
{% endif %}
status: {{ status if status else 'draft' }}
monster:
name: "{{title}}"
size: medium
type: beast
alignment: unaligned
AC: 10
HP: 100 (10d10 + 50)
speed: 30ft
STR: 10,0
DEX: 10,0
CON: 10,0
INT: 10,0
WIS: 10,0
CHA: 10,0
skills:
saving_throws:
resistances:
damage_immunities:
condition_immunities:
senses: Passive Perception 10
languages: Common
cr:
attributes:
"name1": description
"name2": description
traits:
Actions:
attributes:
"multiattack": description
options:
"name1": "+1 to hit, reach 5 ft., one target. Hit: 5 (2d4) DamageType damage."
"name2": "+1 to hit, reach 5 ft., one target. Hit: 5 (2d4) DamageType damage."
Reactions:
attributes:
options:
"Opportunity Attack": description
Legendary Actions:
attributes:
"count": 3
options:
"name1": description
"name2": description
Legendary Reactions:
options:
"name1": description
"name2": description
Lair and Actions:
attributes:
"name1": description
options:
"name1": description
"name2": description
---
Flavour text goes here.

View File

@ -0,0 +1,27 @@
---
# {{filename}}
title: {{ title }}
author: {{ author if author else 'evilchili' }}
show_dm_content: False
tags: {{ tags }}
{% if date %}
date: {{ date }}
{% endif %}
{% if description %}
description: {{description}}
{% endif %}
status: {{ status if status else 'published' }}
---
{{ summary }}
Location: **{{location}}**
Faction: **{{faction}}**
### Current Stock
{{ inventory }}

View File

@ -30,6 +30,9 @@ LINKS = (('Pelican', 'https://getpelican.com/'),
SOCIAL = (('You can add links in your config file', '#'),
('Another social link', '#'),)
DISPLAY_PAGES_ON_MENU = False
DISPLAY_CATEGORIES_ON_MENU = False
ARTICLE_URL = '{category}/{slug}/'
CATEGORY_URL = "{slug}/index.html"
TAG_URL = "tags/{slug}/"
@ -52,12 +55,16 @@ ARCHIVE_SAVE_AS = "archives/{slug}.html"
ARCHIVES_SAVE_AS = "archives/index.html"
MENU_ITEMS = (
("A Hopper's Guide", "locations/"),
("Lore", "lore/"),
("Bestiary", "bestiary/"),
("Mechanics", "mechanics/"),
("Index", "archives/"),
)
SITEMAP = {
'format': 'xml',
"exclude": ["tag/"],
"exclude": ["tag/", "session0"],
}
PLUGINS = [

View File

@ -49,6 +49,7 @@ class ContentType(str, Enum):
lore = 'lore'
monster = 'monster'
region = 'region'
location = 'location'
page = 'page'
@ -226,9 +227,11 @@ def new(
print("You must specify a category for 'post' content.")
sys.exit()
case 'monster':
category = 'beastiary'
category = 'bestiary'
case 'region':
category = 'regions'
category = 'locations'
case 'location':
category = 'locations'
case 'page':
category = 'pages'
case _:

View File

@ -18,10 +18,10 @@ def create(content_type: str, title: str, template_dir: str,
return slugify(s, regex_subs=SETTINGS['SLUG_REGEX_SUBSTITUTIONS'])
template_path = Path(template_dir)
template_name = template + ".md"
template_name = f"{template or content_type}.md"
if not (template_path / template_name).exists():
print(f"Expected template {template_name} not found. Using default markdown template.")
template_name = 'default.md'
print("Not found. Using default markdown template.")
env = Environment(
loader=FileSystemLoader(template_path),
trim_blocks=True,