Homebrew: How to
A general overview of ....
Contents
- 1 The Steps
- 2 General Formating
- 2.1 Structure Formatting
- 2.2 Parsable Tags inside Strings
- 2.3 Adventure
- 2.4 Background
- 2.5 Book
- 2.6 Boon
- 2.7 Class
- 2.8 Condition
- 2.9 Deity
- 2.10 Disease
- 2.11 Feat
- 2.12 Fluff
- 2.13 Hazzard
- 2.14 Item
- 2.15 Monster
- 2.16 Object
- 2.17 OptionsFeature
- 2.18 Psionic
- 2.19 Reward
- 2.20 Ship
- 2.21 Spells
- 2.22 Subclass
- 2.23 Table
- 2.24 Trap
- 2.25 VariantRules
- 3 Tools
- 4 Schema
The Steps
- Find the project (a book/supplement you wish to see inside of 5eTools).
- Check the repository listing to confirm its not being done, or has been done.
- Post a comment here or here or in Discord under #Brew-Conversions on what project you've chosen (and if you'll want or need help/tutoring)
- Get an editor like : Sublime Text or Notepad ++
- Open a new file within the editor and save it as as <Author's name>; <Project name>.JSON
- Examples:
- "Player's Handbook" by WotC would be
- `WotC; Player's Handbook.JSON`
- "How to DM" by Sly Fox would be
- `Sly Fox; How to DM.JSON`
- Break down the project into logical parts. Does it contain: Races, Classes, Items, Traps, Feats, Monsters, Magical Items; etc. (See a Full Section list below the JSON file will be organized by these parts.
- Separate those sections into simple text blocks where possible.
- Create your Meta heading for the file
- Using the Render Demo for formatting reference, and Sample file format create each section from its logical parts.
- Use JSONlit or another JSON validation application to verify basic structure issue. (Missing or extra commas, brackets, quotes and the like)
- Fix the JSON until it is deemed valid.
- Go to the Render Demo and check your project
- Go to the Manage Homebrew page
- Choose Upload File
- Navigate to your project's File
- Does the File show up under installed homebrew?
- No : There is a JSON validation error. See Troubleshooting your JSON validation
- Yes: Congrats move on
- Open the section(s) your project has included.
- If an alert message appears notifying you that the Corruption has been detected and the homebrew removed, you have a formating issue with the data and datatyping within the JSON for 5eTools' specific requirements in its schema.
- If no error occurs navigate to your entries and double check their appearance, content and graphics (if any).
- Go to the Discord Server and post in the #Brew-Conversion channel or, if using Git, issue a push request for the completed file.
General Formating
Structure Formatting
For a functional view of what each of these elements do, and how to play with them - see Renderer Demo .
"<string>"
Within the quotation mark you can input text content, within the strings the following commands modify the presentation of the text.
List
{
"type": "list",
"items": [
...
]
}
Quote
{
"type": "quote",
"entries": [
"Look, don't quote me on this, but"
],
"by": "Anon",
"from": "Archive of Lost Chats"
},
Parsable Tags inside Strings
For a functional view of what each of these elements do, and how to play with them - see Renderer Demo .
"<string>"
Within the quotation marks, you generally have the ability to include whatever text you'd like to do so. can input text content, within the strings the following tags modify the presentation of the text, triggering events, or f
- \"
produces a quotation mark within a string's content without closing the string.
- \"
{@bold
<string>} or{@b
<string>}
Makes the content that follows until the next closed braces bold.
{@italic
<string>} or{@i
<string>}
Makes the content that follows until the next closed braces in italics.
{@strike
<string>} or{@s
<string>}
Makes the content that follows until the next closed braces instrike-through.
{@note
<string>}
Makes the content that follows until the next closed braces italic and in a light gray color.
{@dice
<formula>}
Followed by a simple maths roller formula - ie. 2d6+8-1d4; makes that formula a clickable event that opens the roller application and generates the result of the dice formula.
{@dice
<formula> | <string>}
When you use the | character followed by a string, the dice roll is hidden behind text.
{@hit
<value> }
This assumes the dice formula of 1d20 + <vaule> provided.
Upon clicking the text it generates a single roll in the roller.
If you Shift-Click generates a roll with advantage
{@damage
<formula>}
This assumes the dice formula of 1d20 + <vaule> provided.
Click generates a single roll.
If you Shift-Click generates a roll with advantage.
{@d20
<value>}
This assumes the dice formula of 1d20 + <vaule> being rolled with disadvantage.
Click generates a single roll.
If you Shift-Click generates a roll with advantage.
{@scaledice
<formula>; |<range>|<>}
scaling damage dice{@chance
<value>} or{@chance
<value>|<display string>} or{@chance
<value>|<display string>|<Roller display text>}
This is similar to a dice result, but the response is boolean success/failure result upon click
Value is the percentage less 100% - ie a value of 20 would mean 1-79 is a failure; and 80-100 is a success.
{@chance
<value>} displays as <value> percent;
{@chance
<value>|<display string>} displays as <display string>
{@chance
<value>|<display string>|<Roller display text>} displays as <display string> and the roller includes the Roller display text.
{@recharge
<value>}
Rolls a d6 in the roller, and if of the <value> or above the roller responds with Success!{@skill
<skill name>}
Links to skills
{@action
<>}
Brings up a popup for the action.
{@sense
<name>}
Bring up a popup on mouse over to define the nature of the sense. (its not case sensitive)
Darkvision Blindsight Tremorsense Truesight (etc)
{@homebrew
<string>}
{@homebrew
<string>|<modifcation description>}
{@homebrew
| <retraction description>}
{@filter
This tag is more complicated. It's a way to link to a specifically defined search filter.
Adventure
Background
Book
Boon
Class
Condition
Deity
Disease
Feat
Fluff
Hazzard
Item
Monster
Object
OptionsFeature
Psionic
Reward
Ship
Spells
Subclass
Table
Trap
VariantRules
Tools
Editors (Sublime Text or Notepad ++)
Rendering Demo (https://5e.tools/demo.html)
A location for formating lookup
https://github.com/TheGiddyLimit/homebrew/ (the homebrew repository; read the README there for more info)
https://5e.tools/demo.html (a demo of the renderer and JSON format)
https://5e.tools/converter.html (a tool to convert text to stat blocks)
https://jsonlint.com/ (error-check your JSON)
http://json.parser.online.fr/
https://www.sublimetext.com/ (top-notch text editor)
https://jsoneditoronline.org/ (format for data entry)
- https://pdf2doc.com/
- http://pdf2md.morethan.io/
- https://github.com/jzillmann/pdf-to-markdown
- http://convertjson.com/xml-to-json.htmhttp://convertjson.com/xml-to-json.htm
- Fantasy Ground Engineer Suite
- FG Ripper
Badooga's Reddit to Markdown (https://github.com/badooga/Programs/blob/master/Dungeons%20and%20Dragons/reddit_to_markdown.py)
For Taking content from Reddit and coverting it into Markdown (helpful for the Stat block converter)
Schema
{
"$schema": "http://json-schema.org/draft-06/schema#",
"title": "Entry",
"id": "/Entry",
"description": "A recursively renderable object.",
"type": ["string", "integer", "object"],
"version": "1.2.2",
"definitions" : {
"entry": {
"properties": {
"name": {
"type": "string"
},
"type": {
"type": "string"
},
"source": {
"type": "string"
},
"data": {
"type": "object"
}
},
"required": [
"type"
]
},
"entrySection": {
"allOf" : [
{"$ref" : "#/definitions/entry"},
{
"properties": {
"type": {"const": "section"},
"name": {
"type": "string"
},
"alias": {
"type": "array",
"items": {
"type": "string"
}
},
"entries": {
"type": "array",
"items": {
"$ref": "/Entry"
}
},
"data": {
"type": "object"
}
},
"required": ["entries"],
"additionalProperties": false
}
]
},
"entryEntries": {
"allOf" : [
{"$ref" : "#/definitions/entry"},
{
"properties": {
"type": {"const": "entries"},
"name": {
"type": "string"
},
"alias": {
"type": "array",
"items": {
"type": "string"
}
},
"entries": {
"type": "array",
"items": {
"$ref": "/Entry"
}
},
"data": {
"type": "object"
}
},
"required": ["entries"],
"additionalProperties": false
}
]
},
"entryHomebrew": {
"allOf" : [
{"$ref" : "#/definitions/entry"},
{
"properties": {
"type": {"const": "homebrew"},
"name": {
"type": "string"
},
"entries": {
"type": "array",
"items": {
"$ref": "/Entry"
}
},
"movedTo": {
"$ref": "/Entry"
},
"oldEntries": {
"type": "array",
"items": {
"$ref": "/Entry"
}
},
"data": {
"type": "object"
}
},
"additionalProperties": false
}
]
},
"entryQuote": {
"allOf" : [
{"$ref" : "#/definitions/entry"},
{
"properties": {
"type": {"const": "quote"},
"entries": {
"type": "array",
"items": {
"$ref": "/Entry"
}
},
"by": {
"type": "string"
},
"from": {
"type": "string"
}
},
"required": ["entries"],
"additionalProperties": false
}
]
},
"entryInlineEntries": {
"allOf" : [
{"$ref" : "#/definitions/entry"},
{
"properties": {
"type": {"const": "inline"},
"entries": {
"type": "array",
"items": {
"$ref": "/Entry"
}
}
},
"required": ["entries"],
"additionalProperties": false
}
]
},
"entryEntriesInlineEntries": {
"allOf" : [
{"$ref" : "#/definitions/entry"},
{
"properties": {
"type": {"const": "inlineBlock"},
"entries": {
"type": "array",
"items": {
"$ref": "/Entry"
}
}
},
"required": ["entries"],
"additionalProperties": false
}
]
},
"entryOptions": {
"allOf" : [
{"$ref" : "#/definitions/entry"},
{
"properties": {
"type": {"const": "options"},
"name": {
"type": "string"
},
"entries": {
"type": "array",
"items": {
"$ref": "/Entry"
}
}
},
"required": ["entries"],
"additionalProperties": false
}
]
},
"entryTable": {
"allOf" : [
{"$ref" : "#/definitions/entry"},
{
"properties": {
"type": {"const": "table"},
"caption": {"type" : "string"},
"style": {"type" : "string"},
"colLabels": {
"type": "array",
"items": {"type" : "string"}
},
"colStyles": {
"type": "array",
"items": {"type" : "string"}
},
"rowLabels": {
"type": "array",
"items": {"type": "string"}
},
"rowStyles": {
"type": "array",
"items": {"type" : "string"}
},
"rows": {
"type": "array",
"items": {
"oneOf" : [
{
"type": "array",
"items": {
"$ref": "/Entry"
}
},
{
"$ref": "#/definitions/entryTableRow"
}
]
}
},
"footnotes": {
"type": "array",
"items": {
"$ref": "/Entry"
}
}
},
"required": ["rows"],
"additionalProperties": false
}
]
},
"entryTableRow": {
"allOf" : [
{"$ref" : "#/definitions/entry"},
{
"properties": {
"type": {
"const": "row"
},
"style": {
"type": "string"
},
"row": {
"type": "array",
"items": {
"$ref": "/Entry"
}
}
},
"required": [
"row"
],
"additionalProperties": false
}
]
},
"entryTableCell": {
"allOf" : [
{"$ref" : "#/definitions/entry"},
{
"properties": {
"type": {
"const": "cell"
},
"width": {
"type": "integer"
},
"roll": {
"type": "object",
"properties": {
"oneOf": [
{
"min": {
"type": "integer"
},
"max": {
"type": "integer"
}
},
{
"exact": {
"type": "integer"
}
}
],
"entry": {
"$ref": "/Entry"
},
"pad": {
"type": "boolean"
}
}
},
"entry": {
"$ref": "/Entry"
}
},
"additionalProperties": false
}
]
},
"entryList": {
"allOf" : [
{"$ref" : "#/definitions/entry"},
{
"properties": {
"type": {"const": "list"},
"style": {
"type": "string"
},
"name": {
"type": "string"
},
"items": {
"type": "array",
"items": {
"$ref": "/Entry"
}
}
},
"required": ["items"],
"additionalProperties": false
}
]
},
"entryBonus": {
"allOf" : [
{"$ref" : "#/definitions/entry"},
{
"properties": {
"type": {"const": "bonus"},
"value": {
"type": "integer"
}
},
"required": ["value"],
"additionalProperties": false
}
]
},
"entryBonusSpeed": {
"allOf" : [
{"$ref" : "#/definitions/entry"},
{
"properties": {
"type": {"const": "bonusSpeed"},
"value": {
"type": "integer"
}
},
"required": ["value"],
"additionalProperties": false
}
]
},
"entryDice": {
"allOf" : [
{"$ref" : "#/definitions/entry"},
{
"properties": {
"type": {"const": "dice"},
"toRoll": {
"type": "array",
"items": {
"type": "object",
"properties": {
"number": {
"type": "integer"
},
"faces": {
"type": "integer"
},
"modifier": {
"description": "(Warning: unused)",
"type": "integer"
},
"hideModifier": {
"description": "(Warning: unused)",
"type": "boolean"
}
},
"required": ["number", "faces"]
}
},
"rollable": {
"type": "boolean"
}
},
"additionalProperties": false
}
]
},
"entryAbilityDc": {
"allOf" : [
{"$ref" : "#/definitions/entry"},
{
"properties": {
"type": {"const": "abilityDc"},
"name": {
"type": "string"
},
"attributes": {
"type": "array",
"items": {
"type": "string",
"enum": ["str", "dex", "con", "int", "wis", "cha"]
}
}
},
"required": ["name", "attributes"],
"additionalProperties": false
}
]
},
"entryAbilityAttackMod": {
"allOf" : [
{"$ref" : "#/definitions/entry"},
{
"properties": {
"type": {"const": "abilityAttackMod"},
"name": {
"type": "string"
},
"attributes": {
"type": "array",
"items": {
"type": "string",
"enum": ["str", "dex", "con", "int", "wis", "cha"]
}
}
},
"required": ["name", "attributes"],
"additionalProperties": false
}
]
},
"abilityGeneric": {
"allOf" : [
{"$ref" : "#/definitions/entry"},
{
"properties": {
"type": {"const": "abilityGeneric"},
"name": {
"type": "string"
},
"text": {
"type": "string"
},
"attributes": {
"type": "array",
"items": {
"type": "string",
"enum": ["str", "dex", "con", "int", "wis", "cha"]
}
}
},
"required": ["text"],
"additionalProperties": false
}
]
},
"entryLink": {
"allOf" : [
{"$ref" : "#/definitions/entry"},
{
"properties": {
"type": {"const": "link"},
"text": {
"type": "string"
},
"href": {
"oneOf": [
{
"properties": {
"type": {"const": "internal"},
"path": {
"type": "string"
},
"hash": {
"type": "string"
},
"hashPreEncoded": {
"type": "boolean"
},
"subhashes": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"oneOf": [
{
"properties": {
"value": {
"type": "string"
}
},
"required": ["value"],
"additionalProperties": false
},
{
"properties": {
"values": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": ["values"],
"additionalProperties": false
}
]
},
"required": ["key"],
"additionalProperties": false
}
},
"hover": {
"type": "object",
"properties": {
"page": {
"type": "string"
},
"source": {
"type": "string"
}
},
"additionalProperties": false,
"required": ["page", "source"]
}
},
"required": ["path"],
"additionalProperties": false
},
{
"properties": {
"type": {"const": "external"},
"url": {
"type": "string"
}
},
"required": ["url"],
"additionalProperties": false
}
]
}
},
"required": ["text", "href"],
"additionalProperties": false
}
]
},
"entryOptFeature": {
"description": "For e.g. Eldritch Invocations which require prerequisite text",
"allOf" : [
{"$ref" : "#/definitions/entry"},
{
"properties": {
"name": {
"type": "string"
},
"type": {"const": "optfeature"},
"prerequisite": {
"type": "string"
}
},
"required": ["name"]
}
]
},
"entryPatron": {
"allOf" : [
{"$ref" : "#/definitions/entry"},
{
"properties": {
"name": {
"type": "string"
},
"type": {"const": "patron"}
},
"required": ["name"]
}
]
},
"entryInset": {
"allOf" : [
{"$ref" : "#/definitions/entry"},
{
"properties": {
"type": {"const": "inset"},
"name": {
"type": "string"
},
"entries": {
"type": "array",
"items": {
"$ref": "/Entry"
}
},
"data": {
"type": "object"
}
},
"required": ["entries"],
"additionalProperties": false
}
]
},
"entryInsetReadaloud": {
"allOf" : [
{"$ref" : "#/definitions/entry"},
{
"properties": {
"type": {"const": "insetReadaloud"},
"entries": {
"type": "array",
"items": {
"$ref": "/Entry"
}
}
},
"required": ["entries"]
}
]
},
"entryVariant": {
"allOf" : [
{"$ref" : "#/definitions/entry"},
{
"properties": {
"type": {"const": "variant"},
"name": {
"type": "string"
},
"entries": {
"type": "array",
"items": {
"$ref": "/Entry"
}
},
"variantSource": {
"type": "object",
"properties": {
"source": {
"type": "string"
},
"page": {
"type": "integer"
}
},
"required": ["source", "page"],
"additionalProperties": false
}
},
"required": ["name", "entries"]
}
]
},
"entryVariantSub": {
"allOf" : [
{"$ref" : "#/definitions/entry"},
{
"properties": {
"type": {"const": "variantSub"},
"name": {
"type": "string"
},
"entries": {
"type": "array",
"items": {
"$ref": "/Entry"
}
}
},
"required": ["name", "entries"],
"additionalProperties": false
}
]
},
"entryItem": {
"allOf" : [
{"$ref" : "#/definitions/entry"},
{
"oneOf": [
{
"properties": {
"type": {"const": "item"},
"name": {
"type": "string"
},
"entry": {
"$ref": "/Entry"
}
},
"required": ["name", "entry"],
"additionalProperties": false
},
{
"properties": {
"type": {"const": "item"},
"name": {
"type": "string"
},
"entries": {
"type": "array",
"items": {
"$ref": "/Entry"
}
}
},
"required": ["name", "entries"],
"additionalProperties": false
}
]
}
]
},
"entryItemSub": {
"allOf" : [
{"$ref" : "#/definitions/entry"},
{
"properties": {
"type": {"const": "itemSub"},
"name": {
"type": "string"
},
"entry": {
"$ref": "/Entry"
}
},
"required": ["name", "entry"],
"additionalProperties": false
}
]
},
"entryItemSpell": {
"allOf" : [
{"$ref" : "#/definitions/entry"},
{
"properties": {
"type": {"const": "itemSpell"},
"name": {
"type": "string"
},
"entry": {
"$ref": "/Entry"
}
},
"required": ["name", "entry"],
"additionalProperties": false
}
]
},
"entryImage": {
"allOf" : [
{"$ref" : "#/definitions/entry"},
{
"properties": {
"type": {"const": "image"},
"href": {
"oneOf": [
{
"properties": {
"type": {"const": "internal"},
"path": {
"type": "string"
}
},
"required": ["path"],
"additionalProperties": false
},
{
"properties": {
"type": {"const": "external"},
"url": {
"type": "string"
}
},
"required": ["url"],
"additionalProperties": false
}
]
},
"title": {
"type": "string"
},
"imageType": {
"type": "string",
"enum": [
"map"
]
}
},
"required": ["href"],
"additionalProperties": false
}
]
},
"entryGallery": {
"allOf" : [
{"$ref" : "#/definitions/entry"},
{
"properties": {
"type": {"const": "gallery"},
"images": {
"type": "array",
"items": {
"$ref": "#/definitions/entryImage"
}
}
},
"required": ["images"],
"additionalProperties": false
}
]
},
"entryActions": {
"allOf" : [
{
"properties": {
"type": {"const": "actions"},
"name": {
"type": "string"
},
"entries": {
"type": "array",
"items": {
"$ref": "/Entry"
}
}
},
"required": ["type", "name", "entries"],
"additionalProperties": false
}
]
},
"entryAttack": {
"allOf" : [
{"$ref" : "#/definitions/entry"},
{
"properties": {
"type": {"const": "attack"},
"attackType": {
"type": "string",
"enum": ["MW", "RW"]
},
"attackEntries": {
"type": "array",
"items": {
"$ref": "/Entry"
}
},
"hitEntries": {
"type": "array",
"items": {
"$ref": "/Entry"
}
}
},
"required": [
"type",
"attackType",
"attackEntries",
"hitEntries"
],
"additionalProperties": false
}
]
},
"entryDataCreature": {
"properties": {
"type": {"const": "dataCreature"},
"dataCreature": {
"$ref" : "/Bestiary#/definitions/creature"
}
},
"required": [
"type",
"dataCreature"
]
}
},
"anyOf": [
{"$ref": "#/definitions/entrySection"},
{"$ref": "#/definitions/entryEntries"},
{"$ref": "#/definitions/entryHomebrew"},
{"$ref": "#/definitions/entryQuote"},
{"$ref": "#/definitions/entryInlineEntries"},
{"$ref": "#/definitions/entryEntriesInlineEntries"},
{"$ref": "#/definitions/entryOptions"},
{"$ref": "#/definitions/entryTable"},
{"$ref": "#/definitions/entryTableRow"},
{"$ref": "#/definitions/entryTableCell"},
{"$ref": "#/definitions/entryList"},
{"$ref": "#/definitions/entryBonus"},
{"$ref": "#/definitions/entryBonusSpeed"},
{"$ref": "#/definitions/entryDice"},
{"$ref": "#/definitions/entryAbilityDc"},
{"$ref": "#/definitions/entryAbilityAttackMod"},
{"$ref": "#/definitions/abilityGeneric"},
{"$ref": "#/definitions/entryLink"},
{"$ref": "#/definitions/entryOptFeature"},
{"$ref": "#/definitions/entryPatron"},
{"$ref": "#/definitions/entryInset"},
{"$ref": "#/definitions/entryInsetReadaloud"},
{"$ref": "#/definitions/entryVariant"},
{"$ref": "#/definitions/entryVariantSub"},
{"$ref": "#/definitions/entryItem"},
{"$ref": "#/definitions/entryItemSub"},
{"$ref": "#/definitions/entryItemSpell"},
{"$ref": "#/definitions/entryImage"},
{"$ref": "#/definitions/entryGallery"},
{"$ref": "#/definitions/entryActions"},
{"$ref": "#/definitions/entryAttack"},
{"$ref": "#/definitions/entryAttack"},
{"$ref": "#/definitions/entryDataCreature"},
{"type": "string"},
{"type": "integer"}
]
}