adding sand strider, fixing statblock css

This commit is contained in:
evilchili 2023-12-15 20:20:24 -08:00
parent 7f07990f58
commit 1bd9dee29d
8 changed files with 146 additions and 142 deletions

View File

@ -7,7 +7,7 @@ tags: monster
date: 2023-05-27 14:43:16.001825 date: 2023-05-27 14:43:16.001825
template: monster template: monster
show_dm_content: True show_dm_content: True
status: published status: draft
monster: monster:
name: "Rolling Cactus" name: "Rolling Cactus"
size: medium size: medium

View File

@ -45,22 +45,6 @@ monster:
attributes: attributes:
options: options:
"Opportunity Attack": The Sand Bear makes one attack with its claws. "Opportunity Attack": The Sand Bear makes one attack with its claws.
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. Flavour text goes here.

View File

@ -0,0 +1,57 @@
---
# bestiary/sand-strider.md
title: Sand Strider
author: evilchili
tags: monster
date: 2023-12-15 17:05:35.445106
template: monster
show_dm_content: True
status: published
monster:
name: "Sand Strider"
size: medium
type: beast
alignment: unaligned
AC: 14
HP: 25 (4d10 + 3)
speed: 40ft, climbing 20ft
STR: 15, +2
DEX: 13, +1
CON: 12, +1
INT: 5, -3
WIS: 10, 0
CHA: 3, -4
skills: Athletics +5, Stealth +7
saving_throws:
resistances: Resistant to magical spell effects and damage.
damage_immunities:
condition_immunities:
senses: Passive Perception 10
languages: Lizardfolk
cr:
attributes:
"Lithe": Sand Striders ignore movement penalties due to difficult terrain while in the desert.
"Hardy": Sand Striders can survive for up to two weeks without water.
"Ornery": Unless given a command by its rider, a Sand Strider will use its movement to approach the nearest target and make a bite attack.
"Bonded": A bonded Sand Strider acts on its rider's initiative. As a bonus action, the rider can command the strider to use its Bite or Spit attacks.
traits:
Actions:
attributes:
options:
"Bite": "+5 to hit, reach 5 ft., one target. Hit: 8 (1d8+3) Piercing damage."
"Spit": "Recharge 5-6. The Sand Strider spits a jet of magical fluid in a straight line 5ft wide and 30ft long. Each creature in the line must make a DC13 Dexterity saving throw. A creature that fails the save takes 2d6 damage, or half that if it succeeds. The damage type depends on the Sand Strider's sub-species variant."
---
Sand Striders are 6-legged giant lizards evolved to survive in the harsh magical climates of the Sahwat Desert. Despite their large size, standing nearly 5 feet at the shoulder and up to 10ft long from snout to tail, striders are quick, silent predators that move with ease on difficult terrain. While experienced hoppers quickly learn to stay well clear of the beasts, Lizardfolk tribes have been known to ride Sand Striders. Just how they are able to tame the great lizards is unknown.
There are numerous sub-species, each with its own distinct coloration and elemental affinity, which determines the type of damage done by their spit:
| Sub-Species | Damage Type |
| ----------- | ----------- |
| Blue | Lightning |
| White | Frost |
| Red | Fire |
| Green | Poison |
| Black | Acid |

View File

@ -706,13 +706,19 @@ a.disabled:hover {
text-transform: capitalize; text-transform: capitalize;
text-align: left; text-align: left;
margin: 0; margin: 0;
margin-bottom: 1em;
} }
.statblock table { .statblock table {
margin: 0; margin: 2em 0;
}
.statblock table.stats {
border: 1px solid #000;
} }
.statblock table tr, .statblock table tr td { .statblock table tr, .statblock table tr td {
text-align: center;
background: inherit; background: inherit;
} }
.statblock table tr th, .statblock table tr th,
@ -720,17 +726,22 @@ a.disabled:hover {
vertical-align: top; vertical-align: top;
padding-right: 2em; padding-right: 2em;
} }
.statblock table tr td:first-of-type {
font-weight: bold; .statblock table.properties td {
white-space: nowrap; text-align: left
}
.statblock table tr td:first-of-type:last-of-type {
font-weight: normal;
white-space: wrap;
} }
.statblock table tr:last-child, .statblock table.properties tr td:first-of-type {
.statblock table tr:last-child { font-weight: bold;
width: 10%;
white-space: nowrap;
}
.statblock table.properties tr td:first-of-type:last-of-type {
font-weight: normal;
}
.statblock table.properties tr:last-child,
.statblock table.properties tr:last-child {
padding-right: 1em; padding-right: 1em;
} }
.statblock table tr:nth-child(even) { .statblock table tr:nth-child(even) {
@ -740,8 +751,6 @@ a.disabled:hover {
background: rgba(255,255,255, 0.3); background: rgba(255,255,255, 0.3);
} }
.statblock dl { .statblock dl {
display: flex; display: flex;
flex-flow: row; flex-flow: row;

View File

@ -22,117 +22,7 @@
{% set target = article.title.replace(' ', '_') %} {% set target = article.title.replace(' ', '_') %}
{% if self.is_dm() or article.show_dm_content %} {% if self.is_dm() or article.show_dm_content %}
<div class='statblock monster'> <div class='statblock monster'>
<h3>{{ article.title }}</h3> {% include "statblock.html" %}
<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> </div>
{% endif %} {% endif %}

View File

@ -0,0 +1,63 @@
{% set stats = ['STR', 'DEX', 'CON', 'INT', 'WIS', 'CHA'] %}
<h3>{{ article.title }}</h3>
<div class='monster-type'>
<em>
{{m.size}} {{m.type}}{% if m.alignment %}, {{m.alignment}}{%endif%}
</em>
</div>
<hr>
<table class='stats'>
<tr>
{% for stat in stats %}
<th>{{ stat }} </th>
{% endfor %}
</tr>
<tr>
{% for stat in ['STR', 'DEX', 'CON', 'INT', 'WIS', 'CHA'] %}
{% set score, bonus = m[stat].split(',') %}
<td><b>{{score}}</b><br>{{bonus}}</td>
{% endfor %}
</tr>
</table>
<table class='properties'>
<tr><td>Armor Class</td><td>{{ m.AC }}</td></tr>
<tr><td>Hit Points</td><td>{{ m.HP }}</td></tr>
<tr><td>Speed</td><td>{{ m.speed }}</td></tr>
{% if m.skills %}<tr><td>Skills</td><td>{{ m.skills }}</td></tr>{% endif %}
{% if m.saving_throws %}<tr><td>Saving Throws</td><td>{{ m.saving_throws }}</td></tr>{% endif %}
{% if m.resistances %}<tr><td>Resistances</td><td>{{ m.resistances }}</td></tr>{% endif %}
{% if m.vulnerabilities %}<tr><td>Vulnerabilities</td><td>{{ m.vulnerabilities }}</td></tr>{% endif %}
{% if m.damage_immunities %}<tr><td>Damage Immunities</td><td>{{ m.damage_immunities }}</td></tr>{% endif %}
{% if m.condition_immunities %}<tr><td>Condition Immunities</td><td>{{ m.condition_immunities }}</td></tr>{% endif %}
{% if m.senses %}<tr><td>Senses</td><td>{{ m.senses }}</td></tr>{% endif %}
{% if m.languages %}<tr><td>Languages</td><td>{{ m.languages }}</td></tr>{% endif %}
{% if m.cr %}<tr><td>Challenge Rating</td><td>{{ m.cr }}</td></tr>{% endif %}
</table>
<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 %}

View File

@ -4,6 +4,7 @@ from pathlib import Path
from jinja2 import Environment, FileSystemLoader from jinja2 import Environment, FileSystemLoader
from pelican.utils import sanitised_join, slugify from pelican.utils import sanitised_join, slugify
from pelican.writers import Writer from pelican.writers import Writer
from pprint import pprint as print
from site_tools import SETTINGS from site_tools import SETTINGS
@ -43,7 +44,7 @@ def create(
target_path = base_path / SETTINGS["PATH"] / relpath target_path = base_path / SETTINGS["PATH"] / relpath
dest = sanitised_join(str(target_path / target_filename)) dest = sanitised_join(str(target_path / target_filename))
SETTINGS["WRITE_SELECTED"].append(dest) #SETTINGS["WRITE_SELECTED"].append(dest)
writer = Writer(target_path, settings=SETTINGS) writer = Writer(target_path, settings=SETTINGS)
writer.write_file( writer.write_file(
name=target_filename, name=target_filename,

View File

@ -23,7 +23,7 @@ Effect:
- Why do we have to keep doing things? Doing things is hard. - Why do we have to keep doing things? Doing things is hard.
- Your movement speed is reduced by 10ft and you cannot use reactions. Advantage on saves against psychic effects. - Your movement speed is reduced by 10ft and you cannot use reactions. Advantage on saves against psychic effects.
- Horror: - Horror:
- You have stared into the abyss of your soul and only blackness awaits you. - You have stared into the abyss of your soul and found only blackness.
- Frightened by all creatures. Disadvantage on all saves against psychic effects. - Frightened by all creatures. Disadvantage on all saves against psychic effects.
- Mania: - Mania:
- You are possessed by feverish mania; ideas and words tumble out of as quickly as possible. You cannot stop them. - You are possessed by feverish mania; ideas and words tumble out of as quickly as possible. You cannot stop them.