diff --git a/deadsands/content/bestiary/rolling-cactus.md b/deadsands/content/bestiary/rolling-cactus.md
new file mode 100644
index 0000000..9d30c7d
--- /dev/null
+++ b/deadsands/content/bestiary/rolling-cactus.md
@@ -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.
diff --git a/deadsands/content/dm/hooks.md b/deadsands/content/dm/hooks.md
new file mode 100644
index 0000000..8509253
--- /dev/null
+++ b/deadsands/content/dm/hooks.md
@@ -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 isn’t 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 people’s “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.
diff --git a/deadsands/content/images/gopher_gulch.png b/deadsands/content/images/gopher_gulch.png
new file mode 100644
index 0000000..2c77435
Binary files /dev/null and b/deadsands/content/images/gopher_gulch.png differ
diff --git a/deadsands/content/images/notes b/deadsands/content/images/notes
deleted file mode 120000
index 347f67a..0000000
--- a/deadsands/content/images/notes
+++ /dev/null
@@ -1 +0,0 @@
-../../../deadsands-notes/images/notes/
\ No newline at end of file
diff --git a/deadsands/content/images/overland_blooming_wastes.png b/deadsands/content/images/overland_blooming_wastes.png
index f6da5e9..aa26ab1 100644
Binary files a/deadsands/content/images/overland_blooming_wastes.png and b/deadsands/content/images/overland_blooming_wastes.png differ
diff --git a/deadsands/content/images/overland_calamity_ridge.png b/deadsands/content/images/overland_calamity_ridge.png
new file mode 100644
index 0000000..b9cbebe
Binary files /dev/null and b/deadsands/content/images/overland_calamity_ridge.png differ
diff --git a/deadsands/content/images/overland_dust_river_canyon.png b/deadsands/content/images/overland_dust_river_canyon.png
new file mode 100644
index 0000000..5c83773
Binary files /dev/null and b/deadsands/content/images/overland_dust_river_canyon.png differ
diff --git a/deadsands/content/images/overland_gopher_gulch.png b/deadsands/content/images/overland_gopher_gulch.png
new file mode 100644
index 0000000..e4956e1
Binary files /dev/null and b/deadsands/content/images/overland_gopher_gulch.png differ
diff --git a/deadsands/content/images/overland_map.png b/deadsands/content/images/overland_map.png
index 6d3d5e0..514c886 100644
Binary files a/deadsands/content/images/overland_map.png and b/deadsands/content/images/overland_map.png differ
diff --git a/deadsands/content/images/overland_map_thumbnail.png b/deadsands/content/images/overland_map_thumbnail.png
new file mode 100644
index 0000000..411f723
Binary files /dev/null and b/deadsands/content/images/overland_map_thumbnail.png differ
diff --git a/deadsands/content/images/tokens/rolling_cactus.png b/deadsands/content/images/tokens/rolling_cactus.png
new file mode 100644
index 0000000..18f457f
Binary files /dev/null and b/deadsands/content/images/tokens/rolling_cactus.png differ
diff --git a/deadsands/content/images/tokens/rolling_cactus.png~ b/deadsands/content/images/tokens/rolling_cactus.png~
new file mode 100644
index 0000000..ecccb6a
Binary files /dev/null and b/deadsands/content/images/tokens/rolling_cactus.png~ differ
diff --git a/deadsands/content/regions/blooming-wastes.md b/deadsands/content/locations/blooming-wastes.md
similarity index 84%
rename from deadsands/content/regions/blooming-wastes.md
rename to deadsands/content/locations/blooming-wastes.md
index c1fb688..324e2ac 100644
--- a/deadsands/content/regions/blooming-wastes.md
+++ b/deadsands/content/locations/blooming-wastes.md
@@ -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: Leads to Calamity Ridge, Dust River Canyon, 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 Calamity Ridge, Dust River Canyon, and Tano's Edge.**
+
diff --git a/deadsands/content/regions/calamity-ridge.md b/deadsands/content/locations/calamity-ridge.md
similarity index 94%
rename from deadsands/content/regions/calamity-ridge.md
rename to deadsands/content/locations/calamity-ridge.md
index cc37c5e..d58427a 100644
--- a/deadsands/content/regions/calamity-ridge.md
+++ b/deadsands/content/locations/calamity-ridge.md
@@ -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 Tano's Edge.**
diff --git a/deadsands/content/regions/dust-river-canyon.md b/deadsands/content/locations/dust-river-canyon.md
similarity index 89%
rename from deadsands/content/regions/dust-river-canyon.md
rename to deadsands/content/locations/dust-river-canyon.md
index 5fab4e7..bbbe96e 100644
--- a/deadsands/content/regions/dust-river-canyon.md
+++ b/deadsands/content/locations/dust-river-canyon.md
@@ -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 The Blooming Wastes and Gopher Gulcch.**
diff --git a/deadsands/content/regions/gopher-gulch.md b/deadsands/content/locations/gopher-gulch.md
similarity index 84%
rename from deadsands/content/regions/gopher-gulch.md
rename to deadsands/content/locations/gopher-gulch.md
index fee3838..e33ffc3 100644
--- a/deadsands/content/regions/gopher-gulch.md
+++ b/deadsands/content/locations/gopher-gulch.md
@@ -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 Dust River Canyon.**
diff --git a/deadsands/content/locations/tanos-edge.md b/deadsands/content/locations/tanos-edge.md
new file mode 100644
index 0000000..5c0f8cc
--- /dev/null
+++ b/deadsands/content/locations/tanos-edge.md
@@ -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.
diff --git a/deadsands/content/locations/the-haunted-hills.md b/deadsands/content/locations/the-haunted-hills.md
new file mode 100644
index 0000000..9bc64c4
--- /dev/null
+++ b/deadsands/content/locations/the-haunted-hills.md
@@ -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.
diff --git a/deadsands/content/mechanics/desert-travel-rules.md b/deadsands/content/mechanics/desert-travel-rules.md
index c628e75..186e619 100644
--- a/deadsands/content/mechanics/desert-travel-rules.md
+++ b/deadsands/content/mechanics/desert-travel-rules.md
@@ -26,8 +26,6 @@ For each half-day, the party will:
Resolve skill check successes / complications
-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.
diff --git a/deadsands/content/pages/index.md b/deadsands/content/pages/index.md
index 981671b..f48dacd 100644
--- a/deadsands/content/pages/index.md
+++ b/deadsands/content/pages/index.md
@@ -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).
diff --git a/deadsands/content/pages/maps.md b/deadsands/content/pages/maps.md
deleted file mode 100644
index 5f7dbb7..0000000
--- a/deadsands/content/pages/maps.md
+++ /dev/null
@@ -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"
----
-
diff --git a/deadsands/content/stores/angry-andoks-apothecary.md b/deadsands/content/stores/angry-andoks-apothecary.md
index 0b577ac..ca644ec 100644
--- a/deadsands/content/stores/angry-andoks-apothecary.md
+++ b/deadsands/content/stores/angry-andoks-apothecary.md
@@ -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!
--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**
@@ -34,4 +35,4 @@ Faction: **Unaligned**
| Uncommon | Andok's Elixir of Fire Resistence | Grants resistence to fire damage for a half-day. | 500 GP | 0.5 Lb |
| Uncommon | Andok's Elixir of Poison Resistence | Grants resistence to poison damage and advantage on saves against the Poisoned condition for a half-day. | 500 GP | 0.5 Lb |
| Uncommon | Andok's Elixir of the Berserker | Grants the Rage ability for 1 hour. | 800 GP | 0.5 Lb |
-| Very Rare | Andok's Fuckin' Great Elixir of Healing (Special Order) | Heals 10d4+20 | 200000 GP | 0.5 Lb |
\ No newline at end of file
+| Very Rare | Andok's Fuckin' Great Elixir of Healing (Special Order) | Heals 10d4+20 | 200000 GP | 0.5 Lb |
diff --git a/deadsands/content/stores/generals-store.md b/deadsands/content/stores/generals-store.md
index a1e0d24..2ae6b31 100644
--- a/deadsands/content/stores/generals-store.md
+++ b/deadsands/content/stores/generals-store.md
@@ -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**
diff --git a/deadsands/deadsands-theme/static/deadsands/css/style.css b/deadsands/deadsands-theme/static/deadsands/css/style.css
index 58a4b6d..0e42ee9 100644
--- a/deadsands/deadsands-theme/static/deadsands/css/style.css
+++ b/deadsands/deadsands-theme/static/deadsands/css/style.css
@@ -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;
}
diff --git a/deadsands/deadsands-theme/templates/base.html b/deadsands/deadsands-theme/templates/base.html
index 3d6e665..a0472c8 100644
--- a/deadsands/deadsands-theme/templates/base.html
+++ b/deadsands/deadsands-theme/templates/base.html
@@ -27,14 +27,18 @@
{% if self.is_dm() %}
DM
{% endif %}
+ {% if DISPLAY_CATEGORIES_ON_MENU %}
{% for category, articles in categories %}
{% if category != 'dm' %}
{{ category }}
{% endif %}
{% endfor %}
+ {% endif %}
+ {% if DISPLAY_PAGES_ON_MENU %}
{% for p in pages %}
{{ p.title }}
{% endfor %}
+ {% endif %}
{% for m in MENU_ITEMS %}{{ m[0] }}{% endfor %}
diff --git a/deadsands/deadsands-theme/templates/index.html b/deadsands/deadsands-theme/templates/index.html
index dc51305..6b6194b 100644
--- a/deadsands/deadsands-theme/templates/index.html
+++ b/deadsands/deadsands-theme/templates/index.html
@@ -6,7 +6,11 @@
{% else %}
{% if category %}
- {% with key='category', values=[category], title=category %}{% include "category-index.html" %}{% endwith %}
+ {% 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 %}
diff --git a/deadsands/deadsands-theme/templates/location.html b/deadsands/deadsands-theme/templates/location.html
new file mode 100644
index 0000000..5d7a610
--- /dev/null
+++ b/deadsands/deadsands-theme/templates/location.html
@@ -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 %}
+
+
+
+
+
+
{{ article.locale_date }} {% if article.tags %}{% for tag in article.tags %}
{{ tag }} {% endfor %}{% endif %}
+
+ {% if article.description or article.thumbnail %}
+
+
+
+ {{ article.description or '' }}
+
+
+ {% endif %}
+ {{ article.content }}
+ {% if article.location.type == 'settlement' %}
+ {% with article=article %}{% include "settlement.html" %}{% endwith %}
+ {% endif %}
+
+ {% include "bottom-nav.html" %}
+
+
+{% endif %}
+{% endblock content %}
diff --git a/deadsands/deadsands-theme/templates/locations-index.html b/deadsands/deadsands-theme/templates/locations-index.html
new file mode 100644
index 0000000..8536206
--- /dev/null
+++ b/deadsands/deadsands-theme/templates/locations-index.html
@@ -0,0 +1,36 @@
+{% set locations = articles | selectattr('category', 'in', ['locations']) | list | sort(attribute=date) %}
+
+
+
A Hopper's Guide To
The Dewa Q'Asos
+
Cites, Towns, and Settlements
+ {% for location in locations if 'region' not in location.tags %}
+
+
+
+
{{ location.summary }}
+
+ {% endfor %}
+
The Sahwat Desert
+
+
+ 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.
+
+
+ Travel in the Sahwat is governed by the rules for overland travel. Mind how you step, Hopper.
+
+
+
+ {% for location in locations if 'region' in location.tags %}
+
+
+
+
{{ location.summary }}
+
+ {% endfor %}
+
+
+
+
diff --git a/deadsands/deadsands-theme/templates/monster.html b/deadsands/deadsands-theme/templates/monster.html
new file mode 100644
index 0000000..29936e0
--- /dev/null
+++ b/deadsands/deadsands-theme/templates/monster.html
@@ -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 %}
+
+
+
+
+ {% import 'translations.html' as translations with context %}
+ {{ translations.translations_for(article) }}
+
+
+
{{ article.locale_date }} {% if article.tags %}{% for tag in article.tags %}
{{ tag }} {% endfor %}{% endif %}
+
+ {% if article.description %}
+
{{ article.description }}
+ {% endif %}
+
+ {% set target = article.title.replace(' ', '_') %}
+ {% if self.is_dm() or article.show_dm_content %}
+
+
{{ article.title }}
+
+
+ {{m.size}} {{m.type}}{% if m.alignment %}, {{m.alignment}}{%endif%}
+
+
+
+
+ Armor Class {{ m.AC }}
+
+
+ Hit Points {{ m.HP }}
+
+
+ Speed {{ m.speed }}
+
+
+
+
+ STR | DEX | CON | INT | WIS | CHA |
+
+
+ {{ m.STR }} |
+ {{ m.DEX }} |
+ {{ m.CON }} |
+ {{ m.INT }} |
+ {{ m.WIS }} |
+ {{ m.CHA }} |
+
+
+
+
+
+ {% if m.saving_throws %}
+
+ Saving Throws {{ m.saving_throws }}
+
+ {% endif %}
+
+ {% if m.skills %}
+
+ Skills {{ m.skills }}
+
+ {% endif %}
+
+ {% if m.resistances %}
+
+ Damage Resistances {{ m.resistances }}
+
+ {% endif %}
+
+ {% if m.vulnerabilities %}
+
+ Damage Vulnerabilities {{ m.vulnerabilities }}
+
+ {% endif %}
+
+ {% if m.damage_immunities %}
+
+ Damage Immunities {{ m.damage_immunities }}
+
+ {% endif %}
+
+ {% if m.condition_immunities %}
+
+ Condition Immunities {{ m.condition_immunities }}
+
+ {% endif %}
+
+ {% if m.saving_throws %}
+
+ Senses {{ m.senses }}
+
+ {% endif %}
+
+ {% if m.languages %}
+
+ Languages {{ m.languages }}
+
+ {% endif %}
+
+ {% if m.cr %}
+
+ Challenge {{ m.cr }}
+
+ {% endif %}
+
+
+
+ {% for (attr_name, attr_desc) in m.attributes.items() %}
+
{{ attr_name }}. {{attr_desc}}
+ {% 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 %}
+
{{ section }}
+ {% if trait.attributes %}
+ {% for (attr_name, attr_desc) in trait.attributes.items() %}
+
{{ attr_name }}. {{attr_desc}}
+ {% endfor %}
+ {% endif %}
+ {% if trait.options %}
+ {% for (attr_name, attr_desc) in trait.options.items() %}
+
{{ attr_name }}. {{attr_desc}}
+ {% endfor %}
+ {% endif %}
+ {% endif %}
+ {% endif %}
+ {% endfor %}
+
+ {% endif %}
+
+ {{ article.content }}
+
+
{{ m.dm_notes }}
+
+
+ {% include "bottom-nav.html" %}
+
+
+{% endblock %}
diff --git a/deadsands/deadsands-theme/templates/pages/index.html b/deadsands/deadsands-theme/templates/pages/index.html
index 27aca8e..17d5ed3 100644
--- a/deadsands/deadsands-theme/templates/pages/index.html
+++ b/deadsands/deadsands-theme/templates/pages/index.html
@@ -5,12 +5,6 @@
{{ page.content }}
-
- {% if page.show_recent %}
- Recent Posts
- {% with count=10, key='category', values=['lore', 'mechanics', 'regions'] %}{% include "recent.html" %}{% endwith %}
-
- {% endif %}
{% endblock %}
diff --git a/deadsands/deadsands-theme/templates/region.html b/deadsands/deadsands-theme/templates/region.html
index 30893b7..c5b0f26 100644
--- a/deadsands/deadsands-theme/templates/region.html
+++ b/deadsands/deadsands-theme/templates/region.html
@@ -15,8 +15,13 @@
{{ article.locale_date }} {% if article.tags %}{% for tag in article.tags %}
{{ tag }} {% endfor %}{% endif %}
- {% if article.description %}
- {{ article.description }}
+ {% if article.description or article.thumbnail %}
+
+
+
+ {{ article.description or '' }}
+
+
{% endif %}
{{ article.content }}
@@ -32,7 +37,7 @@
- Size
- {{ r.size }} sq. miles
- - Terrain
- {{ r.terrain }} (walking: {{ r.size / 10 if r.terrain == 'difficult' else 20 |round }} days)
+ - Terrain
- {{ r.terrain }} (walking: {{ r.size / (10 if r.terrain == 'difficult' else 20) |round }} days)
- Regional Effects
- {{ macros.table(r.regional_effects) }}
- Skill Challenges
- {{ macros.table(r.skills, ['Skills', 'DC', 'Notes']) }}
- Encounters (CR {{r.cr}})
- {{ macros.table(r.encounters, ['Roll', 'Difficulty']) }}
diff --git a/deadsands/deadsands-theme/templates/settlement.html b/deadsands/deadsands-theme/templates/settlement.html
new file mode 100644
index 0000000..30d9fc6
--- /dev/null
+++ b/deadsands/deadsands-theme/templates/settlement.html
@@ -0,0 +1,24 @@
+
+
+ Population |
+ Notable Races |
+ Economy |
+
+
+ {{ article.location.population }} |
+ {{ article.location.notable_races }} |
+ {{ article.location.economy }} |
+
+
+
+Stores
+{% set stores = articles |selectattr('tags', 'eq', ['store']) | selectattr('location', 'eq', article.title) | list %}
+{% if stores %}
+ {% for store in stores %}
+
+
+
{{ store.summary }}
+
+ {% endfor %}
+{% endif %}
+
diff --git a/deadsands/markdown-templates/location.md b/deadsands/markdown-templates/location.md
new file mode 100644
index 0000000..58d0a5b
--- /dev/null
+++ b/deadsands/markdown-templates/location.md
@@ -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 }}
diff --git a/deadsands/markdown-templates/monster.md b/deadsands/markdown-templates/monster.md
new file mode 100644
index 0000000..a7c8118
--- /dev/null
+++ b/deadsands/markdown-templates/monster.md
@@ -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.
diff --git a/deadsands/markdown-templates/store.md b/deadsands/markdown-templates/store.md
new file mode 100644
index 0000000..d76bc4a
--- /dev/null
+++ b/deadsands/markdown-templates/store.md
@@ -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 }}
diff --git a/deadsands/pelicanconf.py b/deadsands/pelicanconf.py
index 0f44063..30d91c9 100644
--- a/deadsands/pelicanconf.py
+++ b/deadsands/pelicanconf.py
@@ -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 = [
diff --git a/deadsands/site_tools/cli.py b/deadsands/site_tools/cli.py
index 65da8d7..dad4618 100644
--- a/deadsands/site_tools/cli.py
+++ b/deadsands/site_tools/cli.py
@@ -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 _:
diff --git a/deadsands/site_tools/content_manager.py b/deadsands/site_tools/content_manager.py
index 7a4eb6b..b9ad6d4 100644
--- a/deadsands/site_tools/content_manager.py
+++ b/deadsands/site_tools/content_manager.py
@@ -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,