This commit is contained in:
TheGiddyLimit
2024-01-01 19:34:49 +00:00
parent 332769043f
commit 8117ebddc5
1748 changed files with 2544409 additions and 1 deletions

26
.dockerignore Normal file
View File

@@ -0,0 +1,26 @@
*
!docker
!manifest.webmanifest
!sw.js
!sw-injector.js
!*.html
!*.png
!*.svg
!*.xml
!audio
!css
!data
!fonts
!homebrew
!icon
!image
!img
!js
!lib
!pdf
!prerelease
!search

7
.editorconfig Normal file
View File

@@ -0,0 +1,7 @@
[*]
charset=utf-8
end_of_line=lf
trim_trailing_whitespace=true
insert_final_newline=true
indent_style=tab
indent_size=3

16
.eslintignore Normal file
View File

@@ -0,0 +1,16 @@
# Generated
sw.js
sw-injector.js
# Libraries
lib
node_modules
# Scratches
scratch
trash
trash_in
# Homebrew/prerelease
homebrew
prerelease

185
.eslintrc.cjs Normal file
View File

@@ -0,0 +1,185 @@
module.exports = {
"extends": "eslint:recommended",
"env": {
"browser": true,
"es6": true,
"jquery": true,
},
"parserOptions": {
"ecmaVersion": "latest",
"sourceType": "module",
},
"rules": {
"accessor-pairs": "off",
"arrow-spacing": ["error", {"before": true, "after": true}],
"block-spacing": ["error", "always"],
"brace-style": ["error", "1tbs", {"allowSingleLine": true}],
"comma-dangle": ["error", {
"arrays": "always-multiline",
"objects": "always-multiline",
"imports": "always-multiline",
"exports": "always-multiline",
"functions": "always-multiline",
}],
"comma-spacing": ["error", {"before": false, "after": true}],
"comma-style": ["error", "last"],
"constructor-super": "error",
"curly": ["error", "multi-line"],
"dot-location": ["error", "property"],
"eqeqeq": ["error", "always", {"null": "ignore"}],
"func-call-spacing": ["error", "never"],
"generator-star-spacing": ["error", {"before": false, "after": true}],
"handle-callback-err": ["error", "^(err|error)$"],
"indent": [
"error",
"tab",
{
"SwitchCase": 1,
},
],
"key-spacing": ["error", {"beforeColon": false, "afterColon": true}],
"keyword-spacing": ["error", {"before": true, "after": true}],
"new-cap": ["error", {"newIsCap": true, "capIsNew": false}],
"new-parens": "error",
"no-array-constructor": "error",
"no-caller": "error",
"no-class-assign": "error",
"no-compare-neg-zero": "error",
"no-cond-assign": "error",
"no-const-assign": "error",
"no-constant-condition": ["error", {"checkLoops": false}],
"no-control-regex": "error",
"no-debugger": "error",
"no-delete-var": "error",
"no-dupe-args": "error",
"no-dupe-class-members": "error",
"no-dupe-keys": "error",
"no-duplicate-case": "error",
"no-empty-character-class": "error",
"no-empty-pattern": "error",
"no-eval": "error",
"no-ex-assign": "error",
"no-extra-bind": "error",
"no-extra-boolean-cast": "error",
"no-extra-parens": ["error", "functions"],
"no-fallthrough": "error",
"no-floating-decimal": "error",
"no-func-assign": "error",
"no-global-assign": "error",
"no-implied-eval": "error",
"no-inner-declarations": ["error", "functions"],
"no-invalid-regexp": "error",
"no-irregular-whitespace": "error",
"no-iterator": "error",
"no-label-var": "error",
"no-labels": ["error", {"allowLoop": true, "allowSwitch": false}],
"no-lone-blocks": "error",
"no-mixed-operators": ["error", {
"groups": [
["==", "!=", "===", "!==", ">", ">=", "<", "<="],
["&&", "||"],
["in", "instanceof"],
],
"allowSamePrecedence": true,
}],
"no-mixed-spaces-and-tabs": "error",
"no-multi-spaces": "error",
"no-multi-str": "error",
"no-multiple-empty-lines": ["error", {"max": 1, "maxEOF": 0}],
"no-negated-in-lhs": "error",
"no-new": "error",
"no-new-func": "error",
"no-new-object": "error",
"no-new-require": "error",
"no-new-symbol": "error",
"no-new-wrappers": "error",
"no-obj-calls": "error",
"no-octal": "error",
"no-octal-escape": "error",
"no-path-concat": "error",
"no-proto": "error",
"no-redeclare": "error",
"no-regex-spaces": "error",
"no-return-await": "error",
"no-self-assign": "error",
"no-self-compare": "error",
"no-sequences": "error",
"no-shadow-restricted-names": "error",
"no-sparse-arrays": "error",
"no-template-curly-in-string": "error",
"no-this-before-super": "error",
"no-throw-literal": "error",
"no-trailing-spaces": "error",
"no-undef": "off",
"no-undef-init": "error",
"no-unexpected-multiline": "error",
"no-unmodified-loop-condition": "error",
"no-unneeded-ternary": ["error", {"defaultAssignment": false}],
"no-unreachable": "error",
"no-unsafe-finally": "error",
"no-unsafe-negation": "error",
"no-unused-expressions": ["error", {
"allowShortCircuit": true,
"allowTernary": true,
"allowTaggedTemplates": true,
}],
"no-unused-vars": "off",
"no-use-before-define": ["error", {"functions": false, "classes": false, "variables": false}],
"no-useless-call": "error",
"no-useless-computed-key": "error",
"no-useless-constructor": "error",
"no-useless-escape": "error",
"no-useless-rename": "error",
"no-useless-return": "error",
"no-whitespace-before-property": "error",
"no-with": "error",
"object-property-newline": ["error", {"allowMultiplePropertiesPerLine": true}],
"one-var": ["error", {"initialized": "never"}],
"operator-linebreak": ["error", "after", {
"overrides": {
"?": "before",
":": "before",
"+": "before",
"-": "before",
"*": "before",
"/": "before",
"||": "before",
"&&": "before",
},
}],
"padded-blocks": ["error", {"blocks": "never", "switches": "never", "classes": "never"}],
"prefer-promise-reject-errors": "error",
"rest-spread-spacing": ["error", "never"],
"semi": ["warn", "always"],
"semi-spacing": ["error", {"before": false, "after": true}],
"space-before-blocks": ["error", "always"],
"space-before-function-paren": ["error", "always"],
"space-in-parens": ["error", "never"],
"space-infix-ops": "error",
"space-unary-ops": ["error", {"words": true, "nonwords": false}],
"spaced-comment": ["error", "always", {
"line": {"markers": ["*package", "!", "/", ",", "="]},
"block": {
"balanced": true,
"markers": ["*package", "!", ",", ":", "::", "flow-include"],
"exceptions": ["*"],
},
}],
"symbol-description": "error",
"template-curly-spacing": ["error", "never"],
"template-tag-spacing": ["error", "never"],
"unicode-bom": ["error", "never"],
"use-isnan": "error",
"valid-typeof": ["error", {"requireStringLiterals": true}],
"wrap-iife": ["error", "any", {"functionPrototypeMethods": true}],
"yield-star-spacing": ["error", "both"],
"yoda": ["error", "never"],
"no-prototype-builtins": "off",
"require-atomic-updates": "off",
"no-console": "error",
"prefer-template": "error",
"quotes": ["error", "double", {"allowTemplateLiterals": true}],
"no-var": "error",
"no-constant-binary-expression": "error",
},
};

26
.gitattributes vendored Normal file
View File

@@ -0,0 +1,26 @@
*.js text eol=lf
*.cjs text eol=lf
*.mjs text eol=lf
*.json text eol=lf
*.html text eol=lf
*.scss text eol=lf
*.md text eol=lf
*.yml text eol=lf
*.sh text eol=lf
*.css text eol=lf
*.xml text eol=lf
*.svg text eol=lf
*.hbs text eol=lf
*.txt text eol=lf
.dockerignore text eol=lf
.editorconfig text eol=lf
.gitattributes text eol=lf
.gitignore text eol=lf
.eslintignore text eol=lf
.eslintrc.cjs text eol=lf
.gitmodules text eol=lf
.node-version text eol=lf
manifest.webmanifest text eol=lf
docker/*.conf text eol=lf
Dockerfile text eol=lf

6
.github/create-rsync-filter.sh vendored Normal file
View File

@@ -0,0 +1,6 @@
#!/bin/bash
set -e
sed -e '/^\*/d' -e 's/^!/+ /' .dockerignore > .rsync-filter
echo -e "\n- /*" >> .rsync-filter

47
.github/generate-release-notes.sh vendored Normal file
View File

@@ -0,0 +1,47 @@
#!/bin/bash
set -e
if [[ $# -eq 0 ]]; then
echo "No arguments provided. Usage: generate-release-notes.sh <version>"
exit 1
fi
version=$1
# Release version number without "v" prefix to match the format of changelog.json.
version_number="${version#v}"
# This parses the JSON blob for this specific version from changelog.json.
changelog="$(
jq --arg version "$version_number" --compact-output \
'.[] | select(.ver == $version)' \
data/changelog.json
)"
if [[ -z "$changelog" ]]; then
echo "_No changelogs are available for $version._"
exit 1
fi
{
# The "gh" tool reads all text up to the first empty line as the release
# title.
# * For changelog entries with a title, this is formatted as
# '<version>, "<title>" Edition' to match the format of the site's
# changelog page.
#
# * For changelog entries without a title, this is formatted as simply
# '<version>'.
echo -n "$version"
jq -r 'if has("title") then ", \(.title | tojson) Edition\n" else "\n" end' <<< "$changelog"
# Some changelogs include an alternate title. This is included in the body
# of the release notes and formatted as 'AKA "<altTitle>" Edition' to match
# the site's changelog page.
jq -j 'if has("titleAlt") then "AKA \(.titleAlt | tojson) Edition\n" else "" end' <<< "$changelog"
# Changelog text is already markdown-formatted, so no additional formatting
# needs to be done here.
jq -r '.txt' <<< "$changelog"
}

15
.github/set-deployed-flag.sh vendored Normal file
View File

@@ -0,0 +1,15 @@
#!/bin/bash
set -e
if [[ $# -eq 0 ]]; then
echo "No arguments provided. Usage: set-deployed-flag.sh <version>"
exit 1
fi
version=$1
# Set the IS_DEPLOYED variable for production.
sed -i 's/IS_DEPLOYED\s*=\s*undefined/IS_DEPLOYED='"\"${version}\""'/g' js/utils.js
sed -i 's#DEPLOYED_IMG_ROOT\s*=\s*undefined#DEPLOYED_IMG_ROOT='"\"https://raw.githubusercontent.com/5etools-mirror-2/5etools-img/main/\""'#g' js/utils.js

133
.github/workflows/main.yml vendored Normal file
View File

@@ -0,0 +1,133 @@
name: Build and Upload Release
on:
push:
tags:
- 'v**'
# Allow running manually from the actions tab
workflow_dispatch:
env:
# See: https://docs.github.com/en/packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions#upgrading-a-workflow-that-accesses-ghcrio
IMAGE_NAME: 5etools
# Used to force a clean (i.e., non-incremental) Docker build
DO_CLEAN_BUILD: 1
concurrency:
group: "release"
cancel-in-progress: true
jobs:
create-release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: Generate Release Notes
run: bash ./.github/generate-release-notes.sh ${{ github.ref_name }} | tee RELEASE_NOTES.md
- name: Archive Release
run: |
zip -r 5etools-${{ github.ref_name }}.zip . -x '*.git*' '*node_modules*' '*.github*'
- name: Upload Release
run: |
gh release create "${{github.ref_name}}" --title "${{github.ref_name}}" --notes-file RELEASE_NOTES.md 5etools-${{ github.ref_name }}.zip
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
create-image:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
# See: https://stackoverflow.com/a/58178121
- name: Set Env
run: |
IMAGE_VERSION=${{ github.ref_name }}
# Strip "v" prefix from tag name
[[ "${{ github.ref }}" == "refs/tags/"* ]] && IMAGE_VERSION=$(echo $IMAGE_VERSION | sed -e 's/^v//')
echo "IMAGE_VERSION=$IMAGE_VERSION" >> $GITHUB_ENV
echo "IMAGE_ID=$(echo ghcr.io/${{ github.repository_owner }}/$IMAGE_NAME | tr '[A-Z]' '[a-z]')" >> $GITHUB_ENV
- name: Set Deployed Flag
run: |
bash ./.github/set-deployed-flag.sh ${{ github.ref_name }}
# Remove entries from the `.gitignore` so the gh-pages action can correctly add+commit them to the pages branch
- name: Build Service Worker
run: |
node --version
npm --version
npm i
npm run build:sw:prod
sed -i 's/sw.js//g' .gitignore
sed -i 's/sw-injector.js//g' .gitignore
- name: Build SEO Pages
env:
VET_SEO_IS_DEV_MODE: true
VET_BASE_SITE_URL: https://5etools-mirror-2.github.io/
VET_SEO_IS_SKIP_UA_ETC: true
run: |
npm run build:seo -- ${{ github.ref_name }}
# region See: https://docs.github.com/en/packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions#upgrading-a-workflow-that-accesses-ghcrio
- name: Build Image
run: |
if [[ "${{ github.ref }}" == "refs/tags/"* ]]
then
VERSION_ARRAY=( ${IMAGE_VERSION//./ } )
MAJOR=${VERSION_ARRAY[0]}
MINOR=${VERSION_ARRAY[1]}
POINT=${VERSION_ARRAY[2]}
# Create a clean docker image every 4 minor version.
if [[ $(echo "$MINOR % 4" | bc) == 0 && $POINT == 0 ]]
then
DO_CLEAN_BUILD=1
fi
fi
if [[ $DO_CLEAN_BUILD == 1 ]]
then
# Build a clean image
echo "Version is ${{ github.ref_name }}, doing a clean docker build"
docker build -t $IMAGE_NAME .
else
# Build an incremental image...
echo "Version is ${{ github.ref_name }}, doing an incremental docker build"
# Pull the old image
docker pull $IMAGE_ID:latest
# Save the current CMD from the image
SAVE_CMD=$(docker inspect --format='{{json .Config.Cmd}}' $IMAGE_ID:latest)
# Convert .dockerignore to .rsync-filter
bash ./.github/create-rsync-filter.sh
# Run up the previous container, and rsync the current new of files into it
CONTAINER_ID=$(docker run -d -v "$(pwd)":/tmp/5et-new $IMAGE_ID:latest rsync -rlcvF --delete-excluded /tmp/5et-new/ /var/www/localhost/htdocs/)
docker logs -f $CONTAINER_ID
# Commit the changes
docker commit -c "CMD $SAVE_CMD" $CONTAINER_ID $IMAGE_NAME
fi
- name: Log In to Registry
run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
- name: Push Image
run: |
echo IMAGE_ID=$IMAGE_ID
echo IMAGE_VERSION=$IMAGE_VERSION
docker tag $IMAGE_NAME $IMAGE_ID:$IMAGE_VERSION
# Always tag latest when pushing a tag, as we don't expect to ever merge old tags
[[ "${{ github.ref }}" == "refs/tags/"* ]] && docker tag $IMAGE_NAME $IMAGE_ID:latest
docker push $IMAGE_ID:$IMAGE_VERSION
docker push $IMAGE_ID:latest
# endregion

83
.github/workflows/pages.yml vendored Normal file
View File

@@ -0,0 +1,83 @@
name: Build and Deploy Pages
on:
push:
tags:
- 'v**'
# Allow running manually from the actions tab
workflow_dispatch:
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
contents: read
pages: write
id-token: write
concurrency:
group: "pages"
cancel-in-progress: true
jobs:
# Single deploy job since we're just deploying
deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@master
- name: Set Deployed Flag
run: |
bash ./.github/set-deployed-flag.sh ${{ github.ref_name }}
# Notably: remove anything which should not be added to the service worker manifest:
# - `homebrew`
# - `prerelease`
- name: Cleanup
run: |
rm -rf .gitmodules *.md *.zip scss spellcheck homebrew prerelease
ls -lah
# Remove entries from the `.gitignore` so the gh-pages action can correctly add+commit them to the pages branch
- name: Build Service Worker
run: |
node --version
npm --version
npm i
npm run build:sw:prod
sed -i 's/sw.js//g' .gitignore
sed -i 's/sw-injector.js//g' .gitignore
- name: Build SEO Pages
env:
VET_SEO_IS_DEV_MODE: true
VET_BASE_SITE_URL: https://5etools-mirror-2.github.io/
VET_SEO_IS_SKIP_UA_ETC: true
run: |
npm run build:seo -- ${{ github.ref_name }}
- name: Cleanup
run: |
rm -rf node_modules node
ls -lah
- name: Setup Pages
uses: actions/configure-pages@master
- name: Upload artifact
uses: actions/upload-pages-artifact@master
with:
path: '.'
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@master
with:
# Timeout in millis (10 mins)
timeout: 600000

26
.gitignore vendored Normal file
View File

@@ -0,0 +1,26 @@
desktop.ini
node_modules
//
# IntelliJ project files
.idea/
*.iml
# Visual Studio Code project files
.vscode/
# Misc dev/scripting files
trash
trash_in
# Generated files
sitemap.xml
*.DS_Store
.rsync-filter
# Generated service worker files
sw.js
sw-injector.js
# Log files
*.log

4
.gitmodules vendored Normal file
View File

@@ -0,0 +1,4 @@
[submodule "img"]
path = img
url = ssh://git@git.develop.5etools.com:2222/5etools/5etools_img.git
branch = master

1
.node-version Normal file
View File

@@ -0,0 +1 @@
17.1.0

40
.stylelintrc.json Normal file
View File

@@ -0,0 +1,40 @@
{
"extends": "stylelint-config-sass-guidelines",
"rules": {
"indentation": "tab",
"order/properties-order": [
"position",
"z-index",
"top",
"right",
"bottom",
"left",
"margin",
"margin-top",
"margin-right",
"margin-bottom",
"margin-left",
"padding",
"padding-top",
"padding-right",
"padding-bottom",
"padding-left"
],
"order/properties-alphabetical-order": null,
"color-named": "always-where-possible",
"string-quotes": "double",
"selector-no-qualifying-type": null,
"selector-max-compound-selectors": null,
"selector-max-id": null,
"selector-class-pattern": null,
"max-nesting-depth": null,
"scss/at-mixin-pattern": null,
"scss/dollar-variable-pattern": null,
"function-url-quotes": [
"always",
{
"except": ["empty"]
}
]
}
}

62
5etools.html Normal file
View File

@@ -0,0 +1,62 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="description" content="A suite of browser-based tools for 5th Edition Dungeons &amp; Dragons players and Dungeon Masters.">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<meta name="apple-mobile-web-app-capable" content="yes">
<title>5etools</title>
<link rel="stylesheet" href="css/bootstrap.css">
<link rel="stylesheet" href="css/main.css">
<!-- Favicons -->
<link rel="icon" type="image/svg+xml" href="favicon.svg">
<link rel="icon" type="image/png" sizes="256x256" href="favicon-256x256.png">
<link rel="icon" type="image/png" sizes="144x144" href="favicon-144x144.png">
<link rel="icon" type="image/png" sizes="128x128" href="favicon-128x128.png">
<link rel="icon" type="image/png" sizes="64x64" href="favicon-64x64.png">
<link rel="icon" type="image/png" sizes="48x48" href="favicon-48x48.png">
<link rel="icon" type="image/png" sizes="32x32" href="favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="favicon-16x16.png">
<!-- Chrome Web App Icons -->
<link rel="manifest" href="manifest.webmanifest">
<meta name="application-name" content="5etools">
<meta name="theme-color" content="#006bc4">
<!-- Windows Start Menu tiles -->
<meta name="msapplication-config" content="browserconfig.xml"/>
<meta name="msapplication-TileColor" content="#006bc4">
<!-- Apple Touch Icons -->
<link rel="apple-touch-icon" sizes="180x180" href="apple-touch-icon-180x180.png">
<link rel="apple-touch-icon" sizes="360x360" href="apple-touch-icon-360x360.png">
<link rel="apple-touch-icon" sizes="167x167" href="apple-touch-icon-167x167.png">
<link rel="apple-touch-icon" sizes="152x152" href="apple-touch-icon-152x152.png">
<link rel="apple-touch-icon" sizes="120x120" href="apple-touch-icon-120x120.png">
<meta name="apple-mobile-web-app-title" content="5etools">
<!-- macOS Safari Pinned Tab and Touch Bar -->
<link rel="mask-icon" href="safari-pinned-tab.svg" color="#006bc4">
<!-- OpenSearch -->
<link rel="search" href="open-search.xml" title="Search 5etools" type="application/opensearchdescription+xml">
<script type="text/javascript" src="sw-injector.js"></script>
<script type="text/javascript" src="js/styleswitch.js"></script>
<meta http-equiv="refresh" content="0; URL=index.html"/>
</head>
<body>
<main class="container ve-flex-vh-center w-100w h-100h">
<h3>
Click <a href="index.html">here</a> to be redirected to the homepage.
</h3>
</main>
</body>
</html>

160
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,160 @@
# Contributing
## Homebrew
Homebrew contributions (conversions, original content) should be made against the [homebrew repository](https://github.com/TheGiddyLimit/homebrew/). See the guidance there for more information.
## Typo Fixes/Etc.
Small fixes and tweaks, especially typos, should be reported via the "typos etc." channel in our [Discord](https://discord.gg/5etools). If you do not use Discord, opening an issue on GitHub is acceptable.
## Feature Requests and New Features
All feature requests should be done via the `/featurerequest` bot command in our [Discord](https://discord.gg/5etools).
Should you wish to directly contribute code towards a new feature, preferably get in touch via [Discord](https://discord.gg/5etools) first. If the feature is deemed acceptable, and significant/distinct enough that it makes sense for a third party to undertake the work, then a pull request can be opened on GitHub.
In general, the following should be noted:
- Features which place an additional long-term maintenance burden on the project will not be accepted.
- Features which significantly deviate from the D&D 5e canon (for example, complex custom random generators; support for system forks or significant homebrew) will not be accepted.
## Bug Reports
Bugs should be reported via the `/bugreport` bot command in our [Discord](https://discord.gg/5etools).
---
## Developer Notes
### Data Sources and Versioning
Only "official" (that is, published by WotC) data is to be included in the site. Anything else should be added to the homebrew repository. Some exceptions to this rule are:
- All Adventurers League (AL) -specific content is to be kept in the homebrew repository. While much of this content broadly falls under the "published by WotC" umbrella, a good deal of it doesn't. For the sake of consistency/cleanliness, all AL content is to be considered homebrew.
- Anything published in the Dragon+ magazine.
- Anything veto'd by the maintainers of this repository.
Prioritise RAW above all else. Aim to provide a 1:1 copy of the original data. Obvious typos (for instance, mathematical errors in creature stat blocks) may be corrected at the discretion of the maintainer(s).
Aim to use the latest version of any published material. Older versions which are sufficiently different (and relevant to community interests) can be moved to the homebrew repository.
The primary source for an entity should be that under which it was first released. Exceptions to this rule include:
- The entity was originally released in a "partial" or "pre-release" form. For example, races from WGE were later re-released in ERLW.
- The entity was originally released in a published adventure, but was later re-printed in a generic supplement. For example, the demon lords in OotA were re-printed in MTF, or the Haunted One background in CoS was re-printed in VRGR.
#### Page-Specific Notes
*Languages page.* As there is no well-defined RAW format for language data, the languages page collects together information from several disjoint places. A priority list of sources to be considered is:
- The "Languages" section on PHB p123
- official sources, in order of:
- PHB > (DMG) > MM
- Other "official" (i.e. published) products in release-date order
- "Unofficial" products (i.e. Unearthed Arcana; Plane Shift) in release-date order
Within this ordering, the following prioritisation should be made:
- text that directly refers to or describes a language, in order of first appearance in the product (i.e. if a language is mentioned on page 2 and 10 of a book, the entry on page 2 should be taken as the primary source)
- text that is given for player use (e.g. the "Druidic" feature of the Druid class) (the text of which may have to be adapted to fit a reference format; i.e. changing "You can understand..." to "A speaker or X language can understand...).
### Target JavaScript Version
Any language feature which is available in both main-line Chrome and main-line Firefox, and has been available for at least six months, may be used.
### Style Guidelines
#### Code
- Use tabs over spaces.
#### CSS
- The [BEM](http://getbem.com/) ("Block Element Modifier") naming strategy should be used where possible.
#### Data/Text
- Format JSON to match the default output of JavaScript's `JSON.stringify` (using tabs for indentation), i.e. one line per bracket and one line per value. JSON files programmatically generated from other JSON files (i.e. those stored in `data/generated`) should be minified, however.
- When "tagging" references in data (e.g. `{@creature goblin}`), the following rules apply:
- Only tag references which are _intended as references_. For example, the Wizard class in `You gain one cantrip of your choice from the wizard spell list` should be tagged, whereas the Wizard class in `Together, a group of seven powerful wizards sought to contain the demon` should not be tagged. One is a reference to the mechanical class, one is merely the casual usage of the word "wizard."
- In a similar vein, never tag anything within a `quote`-type block. Even if the quote directly refers to a specific creature, we can assume the quote is from a universe/perspective in which (for example) stat blocks don't exist, and therefore the tag should be omitted to maintain the flavor of the quote.
- Within data from a source, avoid referencing content from a source printed after the publication of that source. For example, MTF content might reference SCAG deities, but SCAG deities should refrain from referencing MTF content.
### JSON Cleaning
#### Trailing commas
To remove trailing commas in JSON:
Find: `(.*?)(,)(:?\s*]|\s*})`
Replace: `$1$3`
#### Character replacement
- `` should be replaced with `'`
- `“` and `”` should be replaced with `"`
- `—` (em dash) should be replaced with `\u2014` (Unicode for em dash)
- `` should be replaced with `\u2013` (Unicode for en dash)
- `` should be replaced with `\u2212` (Unicode for minus sign)
- `•` should be not be used unless the JSON in question is not yet covered by the entryRenderer, i.e. should be encoded as a list
- the only Unicode escape sequences allowed are `\u2014`, `\u2013`, and `\u2212`; all other characters (unless noted above) should be stored as-is
#### Convention for dashes
- `-` (hyphen) should **only** be used to hyphenate words, e.g. `60-foot` and `18th-level`
- `\u2014` should be used for parenthetical dash pairs, or for marking empty table rows.
- `\u2013` should be used for joining numerical ranges, e.g. `1-5` should become `1\u20135`.
- `\u2212` should be used for unary minus signs, in the case of penalties. For example, `"You have a -5 penalty to..."` should become `"You have a \u22125 penalty to..."`.
- any whitespace on any side of a `\u2014` should be removed
#### Convention for measurement
- Adjectives: a hyphen and the full name of the unit of measure should be used, e.g. dragon exhales acid in a `60-foot line`
- Nouns: a space and the short name of the unit of measure (including the trailing period) should be used, e.g. `blindsight 60 ft.`, `darkvision 120 ft.`
- Time: a slash, `/`, with no spaces on either side followed by the capitalised unit of time, e.g. `2/Turn`, `3/Day`
#### Convention for Dice
Dice should be written as `[X]dY[ <+|-|×> Z]`, i.e. with a space between dice and operator, and a space between operator and modifier. Some examples of acceptable formatting are: `d6`, `2d6`, or `2d6 + 1`.
#### Convention for Item Names
Item names should be title-case, with the exception of units in parentheses, which should be sentence-case. Items who's volume or amount is specified by container (e.g. `(vial)`) treat the container as a unit.
### Mouse/Keyboard Events
Avoid binding ALT-modified events, as these are not available under MacOS or various Linux flavors. Binding SHIFT-/CTRL-modified events is preferred.
### Dev Server
Do `npm run serve:dev` to launch a local dev server that serves the project files on [`http://localhost:5000/index.html`](http://localhost:8080/index.html).
### Version bump
Do `npm run version-bump -- [OPTION]`, where `[OPTION]` is one of the following:
- `major` to increment the major version (`1.2.3` will become `2.0.0`)
- `minor` to increment the minor version (`1.2.3` will become `1.3.0`)
- `patch` to increment the patch version (`1.2.3` will become `1.2.4`)
- a version number (like `1.2.3`)
It will first run the tests and fail to increase the version if the tests fail.
It will then automatically replace the version in the files where it needs to be replaced, create a commit with the message `chore(version): bump` and create a tag (in the form `v1.2.3`) at the commit.
This feature can be easily disabled by doing `npm config set git-tag-version false`.
### Service Worker
The service worker--which adds a client-side network caching layer, improving performance and allowing offline use--is not committed to the repository, and so must (optionally) be built locally. This can be done using either:
- `npm run build:sw`, to build a development version which outputs useful log messages
- `npm run build:sw:prod`, to build a production version
Both versions handle caching for the same files, which is an index of your local files on disk.
Note that building the service worker is optional.
Note that while using the service worker, some files are served cache-first (see the comments in the service worker files for more information). Care should be taken to either disable or work around the service worker when developing locally, as local changes may not otherwise be visible when refreshing a page.
### Images
Images are generally stored as `.webp` at 85% quality. Token images, and a handful of other small images (for example, UI elements), are stored as lossless `.webp`.

3
Dockerfile Normal file
View File

@@ -0,0 +1,3 @@
FROM ghcr.io/5etools-mirror-2/5etools-img:latest
COPY . /var/www/localhost/htdocs/

15
ISSUE_TEMPLATE.md Normal file
View File

@@ -0,0 +1,15 @@
Please fill out as much of this template as possible/is applicable.
Is this a bug or a feature request:
Issue:
Page(s) affected:
Reproduction steps:
Additional information:
Browser (Chromium, Firefox, Edge, etc):
Platform (Windows, iOS, Android, etc):

21
LICENSE.md Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2017 TheGiddyLimit and contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

24
NOTES_AUTOMATION.md Normal file
View File

@@ -0,0 +1,24 @@
# Automation
The following is a list of non-automated or semi-automated (i.e. handled with manually-run-once scripts) procedures or data additions that must be maintained. Some the items on this list may be automation-friendly and simply as-yet un-automated, others are impractical or near-impossible to meaningfully automate. This list exist to serve as a reminder/checklist to any maintainer, but also as a gauge of how much manual upkeep is currently required to better judge whether adding to this list with new features is a good idea or not.
Note that this list is being created retroactively, and is as-yet incomplete.
#### All Data
- Page numbers (`page`)
- Data "tagging" (render `@tag` syntax)
- This is partially automated, see `node/tag-json.js` (although many false positives are generated, e.g. "Sneak Attack" being tagged as the Attack action)
- Some tags are too specific to automate, such as many of those using `@filter`
- Instances where `_copy` could be utilised, e.g. by converting adventure NPCs which are "commoner with X attributes" to a `_copy` of "commoner" with the appropriate modifications
#### Spells
- JSON `spell[].miscTags`
#### Items
- JSON `item[].ability`
- Any and all item data contained in natural language (e.g. specific weapons in adventures)

66
NOTES_FAVICON.md Normal file
View File

@@ -0,0 +1,66 @@
## Favicon update - 1.114.2 (probably)
Website favicons have been subtly redone by jpcranford (aka ldsmadman), based on the original logo by Fantom and Cyanomouss.
Here's a quick breakdown of what the new icons look like:
![](./favicon-128x128.png)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;![](./favicon_preview.png)
*New favicon and preview*
![](./android-chrome-192x192.png)
*App icon*
![](./safari_pin_preview.png)
*Safari Pinned Tab*
![](./touch_bar_preview.png)
*MacBook Touch Bar Bookmark*
_**Not pictured, but updated:** Android splash screen, Windows Start Menu tiles, standalone app mode_
SVG designs were completed within Illustrator, and final sizes generated with Sketch. All source files have been included in a ZIP file [here](./favicon_source_files.zip), with the changes detailed below for the curious.
### New HTML code
This is the code that should now be in every page's `<head>` section.
```html
<!-- Favicons -->
<link rel="icon" type="image/svg+xml" href="favicon.svg">
<link rel="icon" type="image/png" sizes="256x256" href="favicon-256x256.png">
<link rel="icon" type="image/png" sizes="144x144" href="favicon-144x144.png">
<link rel="icon" type="image/png" sizes="128x128" href="favicon-128x128.png">
<link rel="icon" type="image/png" sizes="64x64" href="favicon-64x64.png">
<link rel="icon" type="image/png" sizes="48x48" href="favicon-48x48.png">
<link rel="icon" type="image/png" sizes="32x32" href="favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="favicon-16x16.png">
<!-- Chrome Web App Icons -->
<link rel="manifest" href="manifest.webmanifest">
<meta name="application-name" content="5etools">
<meta name="theme-color" content="#006bc4">
<!-- Windows Start Menu tiles -->
<meta name="msapplication-config" content="browserconfig.xml"/>
<meta name="msapplication-TileColor" content="#006bc4">
<!-- Apple Touch Icons -->
<link rel="apple-touch-icon" sizes="180x180" href="apple-touch-icon-180x180.png">
<link rel="apple-touch-icon" sizes="360x360" href="apple-touch-icon-360x360.png">
<link rel="apple-touch-icon" sizes="167x167" href="apple-touch-icon-167x167.png">
<link rel="apple-touch-icon" sizes="152x152" href="apple-touch-icon-152x152.png">
<link rel="apple-touch-icon" sizes="120x120" href="apple-touch-icon-120x120.png">
<meta name="apple-mobile-web-app-title" content="5etools">
<!-- macOS Safari Pinned Tab and Touch Bar -->
<link rel="mask-icon" href="safari-pinned-tab.svg" color="#006bc4">
```
### More changes
- **Favicon:** The stroke color has been changed to match the app icon. This has the added benefit of making it easier to see while in dark mode.
- **App icon:** The text has been resized within the app icon to give more spacing around edge. (Apple's "official" app icon design grid came in handy here.) Also, a *slight* gradient was applied to give it some almost-imperceptible pop.
- **Goodbye, pirate hat:** The icon with the pirate hat has been replaced. It was cheeky, but definitely not the impression we want to give off. <!-- TODO: Delete the /icon folder, wherever it is, since it's not used anymore -->
- **Android splash screen:** When launching it from the home screen on Android, 5etools now gets a fancy splash screen.
- **Better standalone mode:** After adding 5etools to your device's home screen (or installing it in your browser as an app), it now behaves like its own app, including showing up in your app switcher as "5etools." It did this before, but now it should behave a little nicer. Depending on your platform, it might even show a back button now.

View File

@@ -1 +1,17 @@
# README
# 5e.tools
Visit the [main site](https://5e.tools/index.html) or go to the unofficial GitHub [mirror](index.html).
[Join the 5etools Discord here!](https://discord.gg/5etools)
## Help and Support
Please see [our wiki](https://wiki.tercept.net/) for FAQs, installation guides, supported integrations, and more.
## Contributing
See [CONTRIBUTING.md](CONTRIBUTING.md).
## License
This project is licensed under the terms of the MIT license.

BIN
SVGs.zip Normal file

Binary file not shown.

158
actions.html Normal file
View File

@@ -0,0 +1,158 @@
<!DOCTYPE html>
<html lang="en">
<head>
<!--5ETOOLS_CMP-->
<!--5ETOOLS_ANALYTICS-->
<!--5ETOOLS_ADCODE-->
<meta charset="utf-8">
<meta name="description" content="">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<meta name="apple-mobile-web-app-capable" content="yes">
<title>Actions - 5etools</title>
<link rel="stylesheet" href="css/bootstrap.css">
<link rel="stylesheet" href="css/main.css">
<!-- Favicons -->
<link rel="icon" type="image/svg+xml" href="favicon.svg">
<link rel="icon" type="image/png" sizes="256x256" href="favicon-256x256.png">
<link rel="icon" type="image/png" sizes="144x144" href="favicon-144x144.png">
<link rel="icon" type="image/png" sizes="128x128" href="favicon-128x128.png">
<link rel="icon" type="image/png" sizes="64x64" href="favicon-64x64.png">
<link rel="icon" type="image/png" sizes="48x48" href="favicon-48x48.png">
<link rel="icon" type="image/png" sizes="32x32" href="favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="favicon-16x16.png">
<!-- Chrome Web App Icons -->
<link rel="manifest" href="manifest.webmanifest">
<meta name="application-name" content="5etools">
<meta name="theme-color" content="#006bc4">
<!-- Windows Start Menu tiles -->
<meta name="msapplication-config" content="browserconfig.xml"/>
<meta name="msapplication-TileColor" content="#006bc4">
<!-- Apple Touch Icons -->
<link rel="apple-touch-icon" sizes="180x180" href="apple-touch-icon-180x180.png">
<link rel="apple-touch-icon" sizes="360x360" href="apple-touch-icon-360x360.png">
<link rel="apple-touch-icon" sizes="167x167" href="apple-touch-icon-167x167.png">
<link rel="apple-touch-icon" sizes="152x152" href="apple-touch-icon-152x152.png">
<link rel="apple-touch-icon" sizes="120x120" href="apple-touch-icon-120x120.png">
<meta name="apple-mobile-web-app-title" content="5etools">
<!-- macOS Safari Pinned Tab and Touch Bar -->
<link rel="mask-icon" href="safari-pinned-tab.svg" color="#006bc4">
<!-- OpenSearch -->
<link rel="search" href="open-search.xml" title="Search 5etools" type="application/opensearchdescription+xml">
<script type="text/javascript" src="sw-injector.js"></script>
<script type="text/javascript" src="js/styleswitch.js"></script>
<script type="text/javascript" src="js/navigation.js"></script>
<script type="text/javascript" src="js/browsercheck.js"></script>
</head>
<body>
<div class="cancer__wrp-sidebar-rhs cancer__anchor"><div class="cancer__disp-cancer"></div><div class="cancer__sidebar-rhs-inner cancer__sidebar-rhs-inner--top"><!--5ETOOLS_AD_RIGHT_1--></div><div class="cancer__sidebar-rhs-inner cancer__sidebar-rhs-inner--bottom"><!--5ETOOLS_AD_RIGHT_2--></div></div>
<div class="viewport-wrapper">
<div class="cancer__wrp-leaderboard cancer__anchor"><div class="cancer__disp-cancer"></div><div class="cancer__wrp-leaderboard-inner"><!--5ETOOLS_AD_LEADERBOARD--></div></div>
<header class="hidden-xs hidden-sm page__header">
<div class="container ve-flex-v-baseline">
<h1 class="page__title no-wrap my-0">Actions</h1>
<p class="page__subtitle no-wrap my-0" id="page__subtitle">Search by name on the left, click a name to display on the right.</p>
</div>
</header>
<nav class="container page__nav" id="navigation">
<ul class="nav nav-pills page__nav-inner" id="navbar"></ul>
</nav>
<div class="view-col-group--cancer h-100 mh-0">
<div class="container view-col-wrapper view-col-wrapper--cancer">
<div class="view-col" id="listcontainer">
<div class="lst__form-top" id="filter-search-group">
<div class="w-100 relative">
<input type="search" id="lst__search" autocomplete="off" autocapitalize="off" spellcheck="false" class="search form-control lst__search lst__search--no-border-h">
<div id="lst__search-glass" class="lst__wrp-search-glass no-events ve-flex-vh-center"><span class="glyphicon glyphicon-search"></span></div>
<div class="lst__wrp-search-visible no-events ve-flex-vh-center"></div>
</div>
<button class="btn btn-default" id="reset">Reset</button>
</div>
<div id="filtertools" class="input-group input-group--bottom ve-flex no-shrink">
<button class="col-0-3 btn btn-default btn-xs p-0 lst__btn-collapse-all-previews" name="list-toggle-all-previews">[+]</button>
<button class="col-5-7 sort btn btn-default btn-xs" data-sort="name">Name</button>
<button class="col-4 sort btn btn-default btn-xs" data-sort="time">Time</button>
<button class="sort btn btn-default btn-xs ve-grow" data-sort="source">Source</button>
</div>
<div id="list" class="list list--stats"></div>
</div>
<div class="cancer__wrp-mobile-1 cancer__anchor"><div class="cancer__disp-cancer"></div><!--5ETOOLS_AD_MOB_PLAYER_1--></div>
<div id="contentwrapper" class="view-col">
<div id="sublistcontainer" class="sublist sublist--resizable no-print">
<div id="sublistsort" class="btn-group sublist__wrp-cols">
<button class="col-8 sort btn btn-default btn-xs" data-sort="name">Name</button>
<button class="col-4 sort btn btn-default btn-xs" data-sort="time">Time</button>
</div>
<div id="sublist" class="list"></div>
</div>
<div class="wrp-stat-tab" id="stat-tabs">
<div id="tabs-right"></div>
</div>
<div id="wrp-pagecontent" class="wrp-stats-table">
<table id="pagecontent" class="w-100 stats">
<tr><th class="border" colspan="6"></th></tr>
<tr><td colspan="6" class="initial-message">Select an entry from the list to view it here</td></tr>
<tr><th class="border" colspan="6"></th></tr>
</table>
</div>
<div class="ve-text-center mt-2 no-print">
<button class="btn btn-xs btn-info" id="manage-brew">Manage Homebrew</button>
</div>
</div>
</div>
</div>
</div>
<!--5ETOOLS_SCRIPT_ANCHOR-->
<!--5ETOOLS_AD_ADHESION-->
<script type="text/javascript" src="lib/jquery.js"></script>
<script type="text/javascript" src="js/parser.js"></script>
<script type="text/javascript" src="js/utils.js"></script>
<script type="text/javascript" src="js/utils-ui.js"></script>
<script type="text/javascript" src="js/utils-list.js"></script>
<script type="text/javascript" src="lib/localforage.js"></script>
<script type="text/javascript" src="js/omnidexer.js"></script>
<script type="text/javascript" src="js/omnisearch.js"></script>
<script type="text/javascript" src="js/filter.js"></script>
<script type="text/javascript" src="js/utils-dataloader.js"></script>
<script type="text/javascript" src="js/utils-brew.js"></script>
<script type="text/javascript" src="js/render.js"></script>
<script type="text/javascript" src="js/render-dice.js"></script>
<script type="text/javascript" src="js/render-markdown.js"></script>
<script type="text/javascript" src="js/render-actions.js"></script>
<script type="text/javascript" src="js/scalecreature.js"></script>
<script type="text/javascript" src="js/hist.js"></script>
<script type="text/javascript" src="js/listpage.js"></script>
<script type="text/javascript" src="js/filter-common.js"></script>
<script type="text/javascript" src="js/filter-actions.js"></script>
<script type="text/javascript" src="js/actions.js"></script>
<script type="text/javascript" src="js/list2.js"></script>
<script type="text/javascript" src="lib/elasticlunr.js"></script>
</body>
</html>

122
adventure.html Normal file
View File

@@ -0,0 +1,122 @@
<!DOCTYPE html>
<html lang="en">
<head>
<!--5ETOOLS_CMP-->
<!--5ETOOLS_ANALYTICS-->
<!--5ETOOLS_ADCODE-->
<meta charset="utf-8">
<meta name="description" content="">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<meta name="apple-mobile-web-app-capable" content="yes">
<title>Adventure - 5etools</title>
<link rel="stylesheet" href="css/bootstrap.css">
<link rel="stylesheet" href="css/main.css">
<!-- Favicons -->
<link rel="icon" type="image/svg+xml" href="favicon.svg">
<link rel="icon" type="image/png" sizes="256x256" href="favicon-256x256.png">
<link rel="icon" type="image/png" sizes="144x144" href="favicon-144x144.png">
<link rel="icon" type="image/png" sizes="128x128" href="favicon-128x128.png">
<link rel="icon" type="image/png" sizes="64x64" href="favicon-64x64.png">
<link rel="icon" type="image/png" sizes="48x48" href="favicon-48x48.png">
<link rel="icon" type="image/png" sizes="32x32" href="favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="favicon-16x16.png">
<!-- Chrome Web App Icons -->
<link rel="manifest" href="manifest.webmanifest">
<meta name="application-name" content="5etools">
<meta name="theme-color" content="#006bc4">
<!-- Windows Start Menu tiles -->
<meta name="msapplication-config" content="browserconfig.xml"/>
<meta name="msapplication-TileColor" content="#006bc4">
<!-- Apple Touch Icons -->
<link rel="apple-touch-icon" sizes="180x180" href="apple-touch-icon-180x180.png">
<link rel="apple-touch-icon" sizes="360x360" href="apple-touch-icon-360x360.png">
<link rel="apple-touch-icon" sizes="167x167" href="apple-touch-icon-167x167.png">
<link rel="apple-touch-icon" sizes="152x152" href="apple-touch-icon-152x152.png">
<link rel="apple-touch-icon" sizes="120x120" href="apple-touch-icon-120x120.png">
<meta name="apple-mobile-web-app-title" content="5etools">
<!-- macOS Safari Pinned Tab and Touch Bar -->
<link rel="mask-icon" href="safari-pinned-tab.svg" color="#006bc4">
<!-- OpenSearch -->
<link rel="search" href="open-search.xml" title="Search 5etools" type="application/opensearchdescription+xml">
<script type="text/javascript" src="sw-injector.js"></script>
<script type="text/javascript" src="js/styleswitch.js"></script>
<script type="text/javascript" src="js/navigation.js"></script>
<script type="text/javascript" src="js/browsercheck.js"></script>
</head>
<body>
<div class="cancer__wrp-leaderboard cancer__anchor"><div class="cancer__disp-cancer"></div><div class="cancer__wrp-leaderboard-inner"><!--5ETOOLS_AD_LEADERBOARD--></div></div>
<header class="hidden-xs hidden-sm page__header">
<div class="container ve-flex-v-baseline">
<h1 class="page__title no-wrap my-0 book-head-header">Adventure Details</h1>
<p class="book-head-message page__subtitle no-wrap my-0">Loading...</p>
</div>
</header>
<nav class="container page__nav" id="navigation">
<ul class="nav nav-pills page__nav-inner" id="navbar"></ul>
</nav>
<div class="cancer__wrp-sidebar-rhs cancer__wrp-sidebar-rhs--scrolling-page cancer__anchor"><div class="cancer__disp-cancer"></div><div class="cancer__sidebar-rhs-inner cancer__sidebar-rhs-inner--top"><!--5ETOOLS_AD_RIGHT_1--></div><div class="cancer__sidebar-rhs-inner cancer__sidebar-rhs-inner--bottom"><!--5ETOOLS_AD_RIGHT_2--></div></div>
<div class="container view-col-wrapper">
<div class="view-col book-contents view-col--wrp-book-contents" id="listcontainer">
<div class="list contents ve-flex-col">
<!-- populate with JS -->
</div>
</div>
<div class="view-col linked-titles book-view">
<table id="pagecontent" class="w-100 stats stats--book stats--book-large">
<!-- populate with JS -->
<tr><th class="border" colspan="6"></th></tr>
<tr><td colspan="6" class="initial-message book-loading-message">Loading...</td></tr>
<!-- (Placeholder text until page loads) -->
<tr><td colspan="6" class="text-muted">Did you ever hear the tragedy of Darth Plagueis The Wise? I thought not. It's not a story the Jedi would tell you. It's a Sith legend. Darth Plagueis was a Dark Lord of the Sith, so powerful and so wise he could use the Force to influence the midichlorians to create life… He had such a knowledge of the dark side that he could even keep the ones he cared about from dying. The dark side of the Force is a pathway to many abilities some consider to be unnatural. He became so powerful… the only thing he was afraid of was losing his power, which eventually, of course, he did. Unfortunately, he taught his apprentice everything he knew, then his apprentice killed him in his sleep. Ironic. He could save others from death, but not himself.</td></tr>
<tr><th class="border" colspan="6"></th></tr>
</table>
<div class="bk__overlay-loading">
<div class="h-100 w-100 ve-flex-vh-center"><span class="initial-message">Loading...</span></div>
</div>
<div class="cancer__footer-pad w-100"></div>
</div>
</div>
<!--5ETOOLS_SCRIPT_ANCHOR-->
<!--5ETOOLS_AD_ADHESION-->
<script type="text/javascript" src="js/parser.js"></script>
<script type="text/javascript" src="js/utils.js"></script>
<script type="text/javascript" src="js/utils-ui.js"></script>
<script type="text/javascript" src="lib/localforage.js"></script>
<script type="text/javascript" src="js/omnidexer.js"></script>
<script type="text/javascript" src="js/omnisearch.js"></script>
<script type="text/javascript" src="js/filter.js"></script>
<script type="text/javascript" src="js/utils-dataloader.js"></script>
<script type="text/javascript" src="js/utils-brew.js"></script>
<script type="text/javascript" src="js/render.js"></script>
<script type="text/javascript" src="js/render-dice.js"></script>
<script type="text/javascript" src="js/render-markdown.js"></script>
<script type="text/javascript" src="js/render-map.js"></script>
<script type="text/javascript" src="js/scalecreature.js"></script>
<script type="text/javascript" src="js/hist.js"></script>
<script type="text/javascript" src="js/bookutils.js"></script>
<script type="text/javascript" src="js/adventure.js"></script>
<script type="text/javascript" src="js/list2.js"></script>
<script type="text/javascript" src="lib/jquery.js"></script>
<script type="text/javascript" src="lib/elasticlunr.js"></script>
</body>
</html>

127
adventures.html Normal file
View File

@@ -0,0 +1,127 @@
<!DOCTYPE html>
<html lang="en">
<head>
<!--5ETOOLS_CMP-->
<!--5ETOOLS_ANALYTICS-->
<!--5ETOOLS_ADCODE-->
<meta charset="utf-8">
<meta name="description" content="">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<meta name="apple-mobile-web-app-capable" content="yes">
<title>Adventures - 5etools</title>
<link rel="stylesheet" href="css/bootstrap.css">
<link rel="stylesheet" href="css/main.css">
<!-- Favicons -->
<link rel="icon" type="image/svg+xml" href="favicon.svg">
<link rel="icon" type="image/png" sizes="256x256" href="favicon-256x256.png">
<link rel="icon" type="image/png" sizes="144x144" href="favicon-144x144.png">
<link rel="icon" type="image/png" sizes="128x128" href="favicon-128x128.png">
<link rel="icon" type="image/png" sizes="64x64" href="favicon-64x64.png">
<link rel="icon" type="image/png" sizes="48x48" href="favicon-48x48.png">
<link rel="icon" type="image/png" sizes="32x32" href="favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="favicon-16x16.png">
<!-- Chrome Web App Icons -->
<link rel="manifest" href="manifest.webmanifest">
<meta name="application-name" content="5etools">
<meta name="theme-color" content="#006bc4">
<!-- Windows Start Menu tiles -->
<meta name="msapplication-config" content="browserconfig.xml"/>
<meta name="msapplication-TileColor" content="#006bc4">
<!-- Apple Touch Icons -->
<link rel="apple-touch-icon" sizes="180x180" href="apple-touch-icon-180x180.png">
<link rel="apple-touch-icon" sizes="360x360" href="apple-touch-icon-360x360.png">
<link rel="apple-touch-icon" sizes="167x167" href="apple-touch-icon-167x167.png">
<link rel="apple-touch-icon" sizes="152x152" href="apple-touch-icon-152x152.png">
<link rel="apple-touch-icon" sizes="120x120" href="apple-touch-icon-120x120.png">
<meta name="apple-mobile-web-app-title" content="5etools">
<!-- macOS Safari Pinned Tab and Touch Bar -->
<link rel="mask-icon" href="safari-pinned-tab.svg" color="#006bc4">
<!-- OpenSearch -->
<link rel="search" href="open-search.xml" title="Search 5etools" type="application/opensearchdescription+xml">
<script type="text/javascript" src="sw-injector.js"></script>
<script type="text/javascript" src="js/styleswitch.js"></script>
<script type="text/javascript" src="js/navigation.js"></script>
<script type="text/javascript" src="js/browsercheck.js"></script>
</head>
<body>
<div class="cancer__wrp-leaderboard cancer__anchor"><div class="cancer__disp-cancer"></div><div class="cancer__wrp-leaderboard-inner"><!--5ETOOLS_AD_LEADERBOARD--></div></div>
<header class="hidden-xs hidden-sm page__header">
<div class="container ve-flex-v-baseline">
<h1 class="page__title no-wrap my-0">Adventures</h1>
<p class="page__subtitle no-wrap my-0" id="page__subtitle">Browse adventures by name and contents</p>
</div>
</header>
<nav class="container page__nav" id="navigation"><ul class="nav nav-pills page__nav-inner" id="navbar"></ul></nav>
<div class="cancer__wrp-sidebar-rhs cancer__wrp-sidebar-rhs--scrolling-page cancer__anchor"><div class="cancer__disp-cancer"></div><div class="cancer__sidebar-rhs-inner cancer__sidebar-rhs-inner--top"><!--5ETOOLS_AD_RIGHT_1--></div><div class="cancer__sidebar-rhs-inner cancer__sidebar-rhs-inner--bottom"><!--5ETOOLS_AD_RIGHT_2--></div></div>
<div class="container view-col-wrapper">
<div class="view-col" id="listcontainer">
<div class="lst__form-top">
<input type="search" id="search" autocomplete="off" autocapitalize="off" spellcheck="false" class="search form-control" placeholder="Find adventure...">
<button class="btn btn-default" id="reset">Reset</button>
</div>
<div id="filtertools" class="input-group input-group--bottom ve-flex no-shrink">
<button class="col-1-3 sort btn btn-default btn-xs" data-sort="group">Type</button>
<button class="col-5-5 sort btn btn-default btn-xs" data-sort="name">Name</button>
<button class="col-2-5 sort btn btn-default btn-xs" data-sort="storyline">Storyline</button>
<button class="col-1 sort btn btn-default btn-xs" data-sort="level">Levels</button>
<button class="col-1-7 sort btn btn-default btn-xs" data-sort="published">Published</button>
<button class="btn btn-default btn-xs w-30p mobile__hidden" disabled></button>
</div>
<div class="list list--stats books">
<!-- populate with JS -->
</div>
<div class="ve-text-center mt-3 no-print">
<button class="btn btn-xs btn-info" id="manage-brew">Manage Homebrew</button>
</div>
<hr class="hr-3 mt-4">
<div class="books--alt ve-flex-h-center ve-flex-wrap bks__wrp-bookshelf">
<!-- populate with JS -->
</div>
</div>
</div>
<!--5ETOOLS_SCRIPT_ANCHOR-->
<!--5ETOOLS_AD_ADHESION-->
<script type="text/javascript" src="js/parser.js"></script>
<script type="text/javascript" src="js/utils.js"></script>
<script type="text/javascript" src="js/utils-ui.js"></script>
<script type="text/javascript" src="lib/localforage.js"></script>
<script type="text/javascript" src="js/omnidexer.js"></script>
<script type="text/javascript" src="js/omnisearch.js"></script>
<script type="text/javascript" src="js/filter.js"></script>
<script type="text/javascript" src="js/utils-dataloader.js"></script>
<script type="text/javascript" src="js/utils-brew.js"></script>
<script type="text/javascript" src="js/render.js"></script>
<script type="text/javascript" src="js/render-dice.js"></script>
<script type="text/javascript" src="js/scalecreature.js"></script>
<script type="text/javascript" src="js/hist.js"></script>
<script type="text/javascript" src="js/bookutils.js"></script>
<script type="text/javascript" src="js/bookslist.js"></script>
<script type="text/javascript" src="js/adventures.js"></script>
<script type="text/javascript" src="js/list2.js"></script>
<script type="text/javascript" src="lib/jquery.js"></script>
<script type="text/javascript" src="lib/elasticlunr.js"></script>
</body>
</html>

BIN
android-chrome-192x192.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
android-chrome-256x256.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

BIN
android-chrome-384x384.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

BIN
android-chrome-512x512.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

BIN
audio/bestiary/abjurer.mp3 Normal file

Binary file not shown.

BIN
audio/bestiary/aboleth.mp3 Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
audio/bestiary/acolyte.mp3 Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
audio/bestiary/alhoon.mp3 Normal file

Binary file not shown.

BIN
audio/bestiary/alkilith.mp3 Normal file

Binary file not shown.

BIN
audio/bestiary/allip.mp3 Normal file

Binary file not shown.

Binary file not shown.

BIN
audio/bestiary/amnizu.mp3 Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
audio/bestiary/ankeg.mp3 Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
audio/bestiary/ape.mp3 Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
audio/bestiary/archer.mp3 Normal file

Binary file not shown.

BIN
audio/bestiary/archmage.mp3 Normal file

Binary file not shown.

BIN
audio/bestiary/armanite.mp3 Normal file

Binary file not shown.

BIN
audio/bestiary/assassin.mp3 Normal file

Binary file not shown.

Binary file not shown.

BIN
audio/bestiary/aurochs.mp3 Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
audio/bestiary/axe-beak.mp3 Normal file

Binary file not shown.

BIN
audio/bestiary/azer.mp3 Normal file

Binary file not shown.

BIN
audio/bestiary/babau.mp3 Normal file

Binary file not shown.

BIN
audio/bestiary/baboon.mp3 Normal file

Binary file not shown.

BIN
audio/bestiary/badger.mp3 Normal file

Binary file not shown.

BIN
audio/bestiary/bael.mp3 Normal file

Binary file not shown.

Binary file not shown.

BIN
audio/bestiary/balor.mp3 Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
audio/bestiary/bandit.mp3 Normal file

Binary file not shown.

BIN
audio/bestiary/banshee.mp3 Normal file

Binary file not shown.

Binary file not shown.

BIN
audio/bestiary/bard.mp3 Normal file

Binary file not shown.

BIN
audio/bestiary/barghest.mp3 Normal file

Binary file not shown.

BIN
audio/bestiary/barlgura.mp3 Normal file

Binary file not shown.

BIN
audio/bestiary/basilisk.mp3 Normal file

Binary file not shown.

BIN
audio/bestiary/bat.mp3 Normal file

Binary file not shown.

Binary file not shown.

BIN
audio/bestiary/behir.mp3 Normal file

Binary file not shown.

Binary file not shown.

BIN
audio/bestiary/beholder.mp3 Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More