Skip to content

Commit 89ad00c

Browse files
Merge upstream PR seansbox#10: Implemented adversary and environment statblocks from seansbox/daggerheart-srd
2 parents aae24bc + 0721bf8 commit 89ad00c

File tree

301 files changed

+4141
-2741
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

301 files changed

+4141
-2741
lines changed

.build/json/environments.json

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,19 @@
1010
"feats": [
1111
{
1212
"name": "Overgrown Battlefield - Passive",
13-
"text": "There has been a battle here. A PC can make an Instinct Roll to identify evidence of that fight. On a success with Hope, learn all three pieces of information below. On a success with Fear, learn two. On a failure, a PC can mark 3 Stress to learn one and gain advantage on the next action roll to investigate this environment. A PC with an appropriate background or Experience can learn an additional detail and ask a follow-up question about the scene and get a truthful (if not always complete) answer.\n\n - Traces of a battle (broken weapons and branches, gouges in the ground) litter the ground.\n - A moss-covered tree trunk is actually the corpse of a treant.\n - Still-standing trees are twisted in strange ways, as if by powerful magic."
13+
"text": "There has been a battle here. A PC can make an Instinct Roll to identify evidence of that fight. On a success with Hope, learn all three pieces of information below. On a success with Fear, learn two. On a failure, a PC can mark 3 Stress to learn one and gain advantage on the next action roll to investigate this environment. A PC with an appropriate background or Experience can learn an additional detail and ask a follow-up question about the scene and get a truthful (if not always complete) answer.\n\n - Traces of a battle (broken weapons and branches, gouges in the ground) litter the ground.\n - A moss-covered tree trunk is actually the corpse of a treant.\n - Still-standing trees are twisted in strange ways, as if by powerful magic.\n\n*Why did these groups come to blows? Why is the grove unused now?*"
1414
},
1515
{
1616
"name": "Barbed Vines - Action",
17-
"text": "Pick a point within the grove. All targets within Very Close range of that point must succeed on an Agility Reaction Roll or take 1d8+3 physical damage and become Restrained by barbed vines. Restrained lasts until they’re freed with a successful Finesse or Strength roll or by dealing at least 6 damage to the vines."
17+
"text": "Pick a point within the grove. All targets within Very Close range of that point must succeed on an Agility Reaction Roll or take 1d8+3 physical damage and become Restrained by barbed vines. Restrained lasts until they’re freed with a successful Finesse or Strength roll or by dealing at least 6 damage to the vines.\n\n*How many vines are there? Where do they grab you? Do they pull you down or lift you off the ground?*"
1818
},
1919
{
2020
"name": "You Are Not Welcome Here - Action",
21-
"text": "A Young Dryad, two Sylvan Soldiers, and a number of Minor Treants equal to the number of PCs appear to confront the party for their intrusion."
21+
"text": "A Young Dryad, two Sylvan Soldiers, and a number of Minor Treants equal to the number of PCs appear to confront the party for their intrusion.\n\n*What are the grove guardians concealing? What threat to the forest could the PCs confront to appease the Dryad?*"
2222
},
2323
{
2424
"name": "Defiler - Action",
25-
"text": "Spend a Fear to summon a Minor Chaos Adversary drawn to the echoes of violence and discord. They appear within Far range of a chosen PC and immediately take the spotlight."
25+
"text": "Spend a Fear to summon a Minor Chaos Adversary drawn to the echoes of violence and discord. They appear within Far range of a chosen PC and immediately take the spotlight.\n\n*What color does the grass turn as the elemental appears? How does the chaos warp insects and small wildlife within the grove?*"
2626
}
2727
]
2828
},
@@ -37,11 +37,11 @@
3737
"feats": [
3838
{
3939
"name": "Relative Strength - Passive",
40-
"text": "The Difficulty of this environment equals that of the adversary with the highest Difficulty."
40+
"text": "The Difficulty of this environment equals that of the adversary with the highest Difficulty.\n\n*Who cues the ambush? What makes it clear they’re in charge?*"
4141
},
4242
{
4343
"name": "Surprise! - Action",
44-
"text": "The ambushers reveal themselves to the party, you gain 2 Fear, and the spotlight immediately shifts to one of the ambushing adversaries."
44+
"text": "The ambushers reveal themselves to the party, you gain 2 Fear, and the spotlight immediately shifts to one of the ambushing adversaries.\n\n*What do the ambushers want from the party? How do their tactics in the ambush reflect that?*"
4545
}
4646
]
4747
},
@@ -56,11 +56,11 @@
5656
"feats": [
5757
{
5858
"name": "Relative Strength - Passive",
59-
"text": "The Difficulty of this environment equals that of the adversary with the highest Difficulty."
59+
"text": "The Difficulty of this environment equals that of the adversary with the highest Difficulty.\n\n*Which adversary is the least prepared? Which one is the most?*"
6060
},
6161
{
6262
"name": "Where Did They Come From? - Reaction",
63-
"text": "When a PC starts the ambush on unsuspecting adversaries, you lose 2 Fear and the first attack roll a PC makes has advantage."
63+
"text": "When a PC starts the ambush on unsuspecting adversaries, you lose 2 Fear and the first attack roll a PC makes has advantage.\n\n*What are the adversaries in the middle of doing when the ambush starts? How does this impact their approach to the fight?*"
6464
}
6565
]
6666
},
@@ -490,7 +490,7 @@
490490
]
491491
},
492492
{
493-
"name": "Necromancers Ossuary",
493+
"name": "Necromancer's Ossuary",
494494
"tier": "4",
495495
"type": "Exploration",
496496
"description": "A dusty crypt with a library, twisting corridors, and abundant sarcophagi; spattered with the blood of ill-fated invaders.",
@@ -520,4 +520,4 @@
520520
}
521521
]
522522
}
523-
]
523+
]

.build/statblocks.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import json
2+
3+
adversaries = 0
4+
with open("json/adversaries.json", "r", encoding="utf-8-sig") as file:
5+
adversaries = json.load(file)
6+
environments = 0
7+
with open("json/environments.json", "r", encoding="utf-8-sig") as file:
8+
environments = json.load(file)
9+
10+
def convert_environment(json):
11+
md = """---
12+
statblock: inline
13+
---
14+
15+
```statblock
16+
layout: Daggerheart Environment
17+
"""
18+
for key, value in json.items():
19+
if key == "feats":
20+
md += "feats:\n"
21+
for name, desc in [feat.values() for feat in value]:
22+
desc_raw = repr(desc)[1:-1]
23+
md += f' - name: "{name}"\n desc: "{desc_raw}"\n'
24+
else:
25+
md += f'{key}: "{value}"\n'
26+
md += "```"
27+
return md
28+
29+
def convert_adversary(json):
30+
md = """---
31+
statblock: inline
32+
---
33+
34+
```statblock
35+
layout: Daggerheart Adversary
36+
"""
37+
for key, value in json.items():
38+
if key == "feats":
39+
md += "feats:\n"
40+
for name, desc in [feat.values() for feat in value]:
41+
md += f' - name: "{name}"\n desc: "{desc}"\n'
42+
else:
43+
md += f'{key}: "{value}"\n'
44+
md += "```"
45+
return md
46+
47+
def get_file(json):
48+
folder = "adversaries" if "atk" in json else "environments"
49+
name = json["name"]
50+
if ":" in name:
51+
name = name.replace(": ", " - ")
52+
return f"../{folder}/Tier {json['tier']}/{name}.md"
53+
54+
for adversary in adversaries:
55+
with open(get_file(adversary), "w") as file:
56+
file.write(convert_adversary(adversary))
57+
58+
for environment in environments:
59+
with open(get_file(environment), "w") as file:
60+
file.write(convert_environment(environment))
61+

README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
# Installation
2+
In order to use this content all that is needed is to download the zip file containing the source code (`Download ZIP` option under the big green `<> Code` button in the github repo), once downloaded you may simply extract the ZIP into your vault directly, but I would extract it somewhere else and then copy over the files that you want, since the repo contains some directories and files that you probably don't want (like the `.build`,`.github`,`.obsidian` as well as the licenses and README)
3+
4+
Once the content is downloaded and inside your vault, install the **[Fantasy Statblocks Plugin](https://github.com/javalent/fantasy-statblocks)**, enable it, go to the settings, go to the `Layouts` section and click `Import from JSON`, then import both of the layouts provided in this repository, in the [layouts](layouts) folder.
5+
I would also recommend to set the folder where you have stored your adversaries and environments in the `Bestiary Folder` section of the settings, under `Note Parsing`.
6+
7+
If all you want is working statblocks then you are done! However, you may find my plugin **[Daggerheart Combat Tracker](https://github.com/Batres3/daggerheart-tracker)** useful and it is integrated with the content provided in this repository, so setup should be simple.
18
# DAGGERHEART SRD
29

310
***Welcome to DAGGERHEART,*** *a collaborative fantasy tabletop roleplaying game of incredible magic and heroic, heartfelt adventure.*

adversaries/Acid Burrower.md

Lines changed: 0 additions & 19 deletions
This file was deleted.

adversaries/Adult Flickerfly.md

Lines changed: 0 additions & 24 deletions
This file was deleted.

adversaries/Apprentice Assassin.md

Lines changed: 0 additions & 15 deletions
This file was deleted.

adversaries/Arch-Necromancer.md

Lines changed: 0 additions & 21 deletions
This file was deleted.

adversaries/Archer Guard.md

Lines changed: 0 additions & 13 deletions
This file was deleted.

adversaries/Archer Squadron.md

Lines changed: 0 additions & 16 deletions
This file was deleted.

adversaries/Assassin Poisoner.md

Lines changed: 0 additions & 17 deletions
This file was deleted.

0 commit comments

Comments
 (0)