mirror of
https://github.com/Kornstalx/5etools-mirror-2.github.io.git
synced 2025-10-28 20:45:35 -05:00
v1.202.0
This commit is contained in:
12
.github/workflows/main.yml
vendored
12
.github/workflows/main.yml
vendored
@@ -13,7 +13,7 @@ env:
|
|||||||
IMAGE_NAME: 5etools
|
IMAGE_NAME: 5etools
|
||||||
|
|
||||||
# Used to force a clean (i.e., non-incremental) Docker build
|
# Used to force a clean (i.e., non-incremental) Docker build
|
||||||
DO_CLEAN_BUILD: 0
|
DO_CLEAN_BUILD: 1
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: "release"
|
group: "release"
|
||||||
@@ -52,6 +52,7 @@ jobs:
|
|||||||
echo "IMAGE_VERSION=$IMAGE_VERSION" >> $GITHUB_ENV
|
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
|
echo "IMAGE_ID=$(echo ghcr.io/${{ github.repository_owner }}/$IMAGE_NAME | tr '[A-Z]' '[a-z]')" >> $GITHUB_ENV
|
||||||
|
echo "IMAGE_ID_IMG=$(echo ghcr.io/${{ github.repository_owner }}/$IMAGE_NAME-img | tr '[A-Z]' '[a-z]')" >> $GITHUB_ENV
|
||||||
|
|
||||||
- name: Set Deployed Flag
|
- name: Set Deployed Flag
|
||||||
run: |
|
run: |
|
||||||
@@ -101,16 +102,21 @@ jobs:
|
|||||||
# Build an incremental image...
|
# Build an incremental image...
|
||||||
echo "Version is ${{ github.ref_name }}, doing an incremental docker build"
|
echo "Version is ${{ github.ref_name }}, doing an incremental docker build"
|
||||||
|
|
||||||
# Pull the old image
|
# Pull the old images
|
||||||
docker pull $IMAGE_ID:latest
|
docker pull $IMAGE_ID:latest
|
||||||
|
docker pull IMAGE_ID_IMG:latest
|
||||||
|
|
||||||
# Save the current CMD from the image
|
# Save the current CMD from the image
|
||||||
SAVE_CMD=$(docker inspect --format='{{json .Config.Cmd}}' $IMAGE_ID:latest)
|
SAVE_CMD=$(docker inspect --format='{{json .Config.Cmd}}' $IMAGE_ID:latest)
|
||||||
|
|
||||||
# Convert .dockerignore to .rsync-filter
|
# Convert .dockerignore to .rsync-filter
|
||||||
bash ./.github/create-rsync-filter.sh
|
bash ./.github/create-rsync-filter.sh
|
||||||
|
|
||||||
|
# Copy img files to host
|
||||||
|
docker run --rm -v "$(pwd)":/tmp/5et-new $IMAGE_ID_IMG:latest rsync -rlcv --filter='dir-merge /tmp/5et-new/.rsync-filter' /var/www/localhost/htdocs/img /tmp/5et-new/
|
||||||
|
docker rmi $(docker images -q $IMAGE_ID_IMG:*)
|
||||||
|
|
||||||
# Run up the previous container, and rsync the current new of files into it
|
# Run up the previous containers, 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/)
|
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
|
docker logs -f $CONTAINER_ID
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
"selector-id-pattern": null,
|
"selector-id-pattern": null,
|
||||||
|
|
||||||
"color-named": "never",
|
"color-named": "never",
|
||||||
|
"number-max-precision": 8,
|
||||||
"selector-no-qualifying-type": null,
|
"selector-no-qualifying-type": null,
|
||||||
"selector-max-compound-selectors": null,
|
"selector-max-compound-selectors": null,
|
||||||
"selector-max-id": null,
|
"selector-max-id": null,
|
||||||
|
|||||||
16
actions.html
16
actions.html
@@ -82,14 +82,14 @@
|
|||||||
<div id="lst__search-glass" class="lst__wrp-search-glass no-events ve-flex-vh-center"><span class="glyphicon glyphicon-search"></span></div>
|
<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 class="lst__wrp-search-visible no-events ve-flex-vh-center"></div>
|
||||||
</div>
|
</div>
|
||||||
<button class="btn btn-default" id="reset">Reset</button>
|
<button type="button" class="btn btn-default" id="reset">Reset</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="filtertools" class="input-group input-group--bottom ve-flex no-shrink">
|
<div id="filtertools" class="input-group input-group--bottom ve-flex no-shrink">
|
||||||
<button class="ve-col-0-3 btn btn-default btn-xs p-0 lst__btn-collapse-all-previews" name="list-toggle-all-previews">[+]</button>
|
<button type="button" class="ve-col-0-3 btn btn-default btn-xs p-0 lst__btn-collapse-all-previews" name="list-toggle-all-previews">[+]</button>
|
||||||
<button class="ve-col-5-7 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
<button type="button" class="ve-col-5-7 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
||||||
<button class="ve-col-4 sort btn btn-default btn-xs" data-sort="time">Time</button>
|
<button type="button" class="ve-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>
|
<button type="button" class="sort btn btn-default btn-xs ve-grow" data-sort="source">Source</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="list" class="list list--stats"></div>
|
<div id="list" class="list list--stats"></div>
|
||||||
@@ -100,8 +100,8 @@
|
|||||||
<div id="contentwrapper" class="view-col">
|
<div id="contentwrapper" class="view-col">
|
||||||
<div id="sublistcontainer" class="sublist sublist--resizable no-print">
|
<div id="sublistcontainer" class="sublist sublist--resizable no-print">
|
||||||
<div id="sublistsort" class="btn-group sublist__wrp-cols">
|
<div id="sublistsort" class="btn-group sublist__wrp-cols">
|
||||||
<button class="ve-col-8 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
<button type="button" class="ve-col-8 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
||||||
<button class="ve-col-4 sort btn btn-default btn-xs" data-sort="time">Time</button>
|
<button type="button" class="ve-col-4 sort btn btn-default btn-xs" data-sort="time">Time</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="sublist" class="list"></div>
|
<div id="sublist" class="list"></div>
|
||||||
@@ -120,7 +120,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="ve-text-center mt-2 no-print">
|
<div class="ve-text-center mt-2 no-print">
|
||||||
<button class="btn btn-xs btn-info" id="manage-brew">Manage Homebrew</button>
|
<button type="button" class="btn btn-xs btn-info" id="manage-brew">Manage Homebrew</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -82,13 +82,13 @@
|
|||||||
<div id="lst__search-glass" class="lst__wrp-search-glass no-events ve-flex-vh-center"><span class="glyphicon glyphicon-search"></span></div>
|
<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 class="lst__wrp-search-visible no-events ve-flex-vh-center"></div>
|
||||||
</div>
|
</div>
|
||||||
<button class="btn btn-default" id="reset">Reset</button>
|
<button type="button" class="btn btn-default" id="reset">Reset</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="filtertools" class="input-group input-group--bottom ve-flex no-shrink">
|
<div id="filtertools" class="input-group input-group--bottom ve-flex no-shrink">
|
||||||
<button class="ve-col-4 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
<button type="button" class="ve-col-4 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
||||||
<button class="ve-col-6 sort btn btn-default btn-xs" data-sort="skills">Skill Proficiencies</button>
|
<button type="button" class="ve-col-6 sort btn btn-default btn-xs" data-sort="skills">Skill Proficiencies</button>
|
||||||
<button class="sort btn btn-default btn-xs ve-grow" data-sort="source">Source</button>
|
<button type="button" class="sort btn btn-default btn-xs ve-grow" data-sort="source">Source</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="list" class="list list--stats"></div>
|
<div id="list" class="list list--stats"></div>
|
||||||
@@ -99,8 +99,8 @@
|
|||||||
<div id="contentwrapper" class="view-col">
|
<div id="contentwrapper" class="view-col">
|
||||||
<div id="sublistcontainer" class="sublist sublist--resizable no-print">
|
<div id="sublistcontainer" class="sublist sublist--resizable no-print">
|
||||||
<div id="sublistsort" class="btn-group sublist__wrp-cols">
|
<div id="sublistsort" class="btn-group sublist__wrp-cols">
|
||||||
<button class="ve-col-4 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
<button type="button" class="ve-col-4 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
||||||
<button class="ve-col-8 sort btn btn-default btn-xs" data-sort="skills">Skills</button>
|
<button type="button" class="ve-col-8 sort btn btn-default btn-xs" data-sort="skills">Skills</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="sublist" class="list"></div>
|
<div id="sublist" class="list"></div>
|
||||||
@@ -119,8 +119,8 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="ve-text-center mt-2 no-print">
|
<div class="ve-text-center mt-2 no-print">
|
||||||
<button class="btn btn-default btn-xs" id="btn-book">Printer View</button>
|
<button type="button" class="btn btn-default btn-xs" id="btn-book">Printer View</button>
|
||||||
<button class="btn btn-xs btn-info" id="manage-brew">Manage Homebrew</button>
|
<button type="button" class="btn btn-xs btn-info" id="manage-brew">Manage Homebrew</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -84,14 +84,14 @@
|
|||||||
<div id="lst__search-glass" class="lst__wrp-search-glass no-events ve-flex-vh-center"><span class="glyphicon glyphicon-search"></span></div>
|
<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 class="lst__wrp-search-visible no-events ve-flex-vh-center"></div>
|
||||||
</div>
|
</div>
|
||||||
<button class="btn btn-default" id="reset">Reset</button>
|
<button type="button" class="btn btn-default" id="reset">Reset</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="filtertools" class="input-group input-group--bottom ve-flex no-shrink">
|
<div id="filtertools" class="input-group input-group--bottom ve-flex no-shrink">
|
||||||
<button class="ve-col-4-2 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
<button type="button" class="ve-col-4-2 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
||||||
<button class="ve-col-4-1 sort btn btn-default btn-xs" data-sort="type">Type</button>
|
<button type="button" class="ve-col-4-1 sort btn btn-default btn-xs" data-sort="type">Type</button>
|
||||||
<button class="ve-col-1-7 sort btn btn-default btn-xs" data-sort="cr">CR</button>
|
<button type="button" class="ve-col-1-7 sort btn btn-default btn-xs" data-sort="cr">CR</button>
|
||||||
<button class="sort btn btn-default btn-xs ve-grow" data-sort="source">Source</button>
|
<button type="button" class="sort btn btn-default btn-xs ve-grow" data-sort="source">Source</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="list" class="list list--stats"></div>
|
<div id="list" class="list list--stats"></div>
|
||||||
@@ -106,11 +106,11 @@
|
|||||||
|
|
||||||
<div id="sublistcontainer" class="sublist sublist--resizable no-print">
|
<div id="sublistcontainer" class="sublist sublist--resizable no-print">
|
||||||
<div id="sublistsort" class="btn-group sublist__wrp-cols">
|
<div id="sublistsort" class="btn-group sublist__wrp-cols">
|
||||||
<button class="ve-col-5 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
<button type="button" class="ve-col-5 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
||||||
<button class="ve-col-3-8 sort btn btn-default btn-xs best-ecgen__hidden" data-sort="type">Type</button>
|
<button type="button" class="ve-col-3-8 sort btn btn-default btn-xs best-ecgen__hidden" data-sort="type">Type</button>
|
||||||
<button class="ve-col-3-8 sort btn btn-default btn-xs best-ecgen__visible" disabled> </button>
|
<button type="button" class="ve-col-3-8 sort btn btn-default btn-xs best-ecgen__visible" disabled> </button>
|
||||||
<button class="ve-col-1-2 sort btn btn-default btn-xs" data-sort="cr">CR</button>
|
<button type="button" class="ve-col-1-2 sort btn btn-default btn-xs" data-sort="cr">CR</button>
|
||||||
<button class="ve-col-2 sort btn btn-default btn-xs" data-sort="count">Number</button>
|
<button type="button" class="ve-col-2 sort btn btn-default btn-xs" data-sort="count">Number</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="sublist" class="list"></div>
|
<div id="sublist" class="list"></div>
|
||||||
@@ -136,15 +136,13 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="ve-text-center mt-2 no-print best-ecgen__hidden">
|
<div class="ve-text-center mt-2 no-print best-ecgen__hidden">
|
||||||
<button class="btn btn-success btn-xs" id="btn-encounterbuild">Encounter Builder</button>
|
<button type="button" class="btn btn-success btn-xs" id="btn-encounterbuild">Encounter Builder</button>
|
||||||
<div id="wrp-profbonusdice" class="ve-inline-block">
|
<div id="wrp-profbonusdice" class="ve-inline-block">
|
||||||
<button class="btn btn-default btn-xs" id="profbonusdice"
|
<button type="button" class="btn btn-default btn-xs" id="profbonusdice" title="See the Dungeon Master's Guide, p263.">Use Proficiency Dice</button>
|
||||||
title="See the Dungeon Master's Guide, p263.">Use Proficiency Dice
|
|
||||||
</button>
|
|
||||||
</div>
|
</div>
|
||||||
<button class="btn btn-default btn-xs" id="btn-book">Printer View</button>
|
<button type="button" class="btn btn-default btn-xs" id="btn-book">Printer View</button>
|
||||||
<button class="btn btn-default btn-xs" id="btn-show-table" title="View and Download Creatures in Tabular Format">Table View</button>
|
<button type="button" class="btn btn-default btn-xs" id="btn-show-table" title="View and Download Creatures in Tabular Format">Table View</button>
|
||||||
<button class="btn btn-xs btn-info" id="manage-brew">Manage Homebrew</button>
|
<button type="button" class="btn btn-xs btn-info" id="manage-brew">Manage Homebrew</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="best-ecgen__visible--flex-col best-ecgen__wrp pb-1 px-2" id="wrp-encounterbuild-group-and-difficulty"></div>
|
<div class="best-ecgen__visible--flex-col best-ecgen__wrp pb-1 px-2" id="wrp-encounterbuild-group-and-difficulty"></div>
|
||||||
|
|||||||
@@ -82,13 +82,13 @@
|
|||||||
<div id="lst__search-glass" class="lst__wrp-search-glass no-events ve-flex-vh-center"><span class="glyphicon glyphicon-search"></span></div>
|
<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 class="lst__wrp-search-visible no-events ve-flex-vh-center"></div>
|
||||||
</div>
|
</div>
|
||||||
<button class="btn btn-default" id="reset">Reset</button>
|
<button type="button" class="btn btn-default" id="reset">Reset</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="filtertools" class="input-group input-group--bottom ve-flex no-shrink">
|
<div id="filtertools" class="input-group input-group--bottom ve-flex no-shrink">
|
||||||
<button class="ve-col-5 sort btn btn-default btn-xs" data-sort="type">Type</button>
|
<button type="button" class="ve-col-5 sort btn btn-default btn-xs" data-sort="type">Type</button>
|
||||||
<button class="ve-col-5 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
<button type="button" class="ve-col-5 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
||||||
<button class="sort btn btn-default btn-xs ve-grow" data-sort="source">Source</button>
|
<button type="button" class="sort btn btn-default btn-xs ve-grow" data-sort="source">Source</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="list" class="list list--stats"></div>
|
<div id="list" class="list list--stats"></div>
|
||||||
@@ -99,8 +99,8 @@
|
|||||||
<div id="contentwrapper" class="view-col">
|
<div id="contentwrapper" class="view-col">
|
||||||
<div id="sublistcontainer" class="sublist sublist--resizable no-print">
|
<div id="sublistcontainer" class="sublist sublist--resizable no-print">
|
||||||
<div id="sublistsort" class="btn-group sublist__wrp-cols">
|
<div id="sublistsort" class="btn-group sublist__wrp-cols">
|
||||||
<button class="ve-col-5 sort btn btn-default btn-xs" data-sort="type">Type</button>
|
<button type="button" class="ve-col-5 sort btn btn-default btn-xs" data-sort="type">Type</button>
|
||||||
<button class="ve-col-7 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
<button type="button" class="ve-col-7 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="sublist" class="list"></div>
|
<div id="sublist" class="list"></div>
|
||||||
@@ -119,7 +119,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="ve-text-center mt-2 no-print">
|
<div class="ve-text-center mt-2 no-print">
|
||||||
<button class="btn btn-xs btn-info" id="manage-brew">Manage Homebrew</button>
|
<button type="button" class="btn btn-xs btn-info" id="manage-brew">Manage Homebrew</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -75,7 +75,7 @@
|
|||||||
<main class="container classes">
|
<main class="container classes">
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-sm-3" id="listcontainer">
|
<div class="col-md-3" id="listcontainer">
|
||||||
<div class="night__shadow-big">
|
<div class="night__shadow-big">
|
||||||
<div class="lst__form-top" id="filter-search-group">
|
<div class="lst__form-top" id="filter-search-group">
|
||||||
<div class="w-100 relative">
|
<div class="w-100 relative">
|
||||||
@@ -97,10 +97,10 @@
|
|||||||
<button class="btn btn-xs btn-info" id="manage-brew">Manage Homebrew</button>
|
<button class="btn btn-xs btn-info" id="manage-brew">Manage Homebrew</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-9" id="classtable"></div>
|
<div class="col-md-9" id="classtable"></div>
|
||||||
</div>
|
</div>
|
||||||
<hr class="mt-0">
|
<hr class="mt-0">
|
||||||
<div class="row ve-flex mobile__ve-flex-col">
|
<div class="row ve-flex mobile-md__ve-flex-col">
|
||||||
<div class="col-md-3">
|
<div class="col-md-3">
|
||||||
<div class="ve-flex-vh-center ve-text-center wrp-btn-readmode mb-3">
|
<div class="ve-flex-vh-center ve-text-center wrp-btn-readmode mb-3">
|
||||||
<button class="btn btn-default btn-xs no-print mr-1" id="btn-comparemode" title="A pop-up table which can be used to compare subclass features.">Subclass Comparison</button>
|
<button class="btn btn-default btn-xs no-print mr-1" id="btn-comparemode" title="A pop-up table which can be used to compare subclass features.">Subclass Comparison</button>
|
||||||
|
|||||||
@@ -82,14 +82,14 @@
|
|||||||
<div id="lst__search-glass" class="lst__wrp-search-glass no-events ve-flex-vh-center"><span class="glyphicon glyphicon-search"></span></div>
|
<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 class="lst__wrp-search-visible no-events ve-flex-vh-center"></div>
|
||||||
</div>
|
</div>
|
||||||
<button class="btn btn-default" id="reset">Reset</button>
|
<button type="button" class="btn btn-default" id="reset">Reset</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="filtertools" class="input-group input-group--bottom ve-flex no-shrink">
|
<div id="filtertools" class="input-group input-group--bottom ve-flex no-shrink">
|
||||||
<button class="ve-col-0-3 btn btn-default btn-xs p-0 lst__btn-collapse-all-previews" name="list-toggle-all-previews">[+]</button>
|
<button type="button" class="ve-col-0-3 btn btn-default btn-xs p-0 lst__btn-collapse-all-previews" name="list-toggle-all-previews">[+]</button>
|
||||||
<button class="ve-col-3 sort btn btn-default btn-xs" data-sort="type">Type</button>
|
<button type="button" class="ve-col-3 sort btn btn-default btn-xs" data-sort="type">Type</button>
|
||||||
<button class="ve-col-6-7 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
<button type="button" class="ve-col-6-7 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
||||||
<button class="sort btn btn-default btn-xs ve-grow" data-sort="source">Source</button>
|
<button type="button" class="sort btn btn-default btn-xs ve-grow" data-sort="source">Source</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="list" class="list list--stats"></div>
|
<div id="list" class="list list--stats"></div>
|
||||||
@@ -100,8 +100,8 @@
|
|||||||
<div id="contentwrapper" class="view-col">
|
<div id="contentwrapper" class="view-col">
|
||||||
<div id="sublistcontainer" class="sublist sublist--resizable no-print">
|
<div id="sublistcontainer" class="sublist sublist--resizable no-print">
|
||||||
<div id="sublistsort" class="btn-group sublist__wrp-cols">
|
<div id="sublistsort" class="btn-group sublist__wrp-cols">
|
||||||
<button class="ve-col-2 sort btn btn-default btn-xs" data-sort="type">Type</button>
|
<button type="button" class="ve-col-2 sort btn btn-default btn-xs" data-sort="type">Type</button>
|
||||||
<button class="ve-col-10 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
<button type="button" class="ve-col-10 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="sublist" class="list"></div>
|
<div id="sublist" class="list"></div>
|
||||||
@@ -120,7 +120,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="ve-text-center mt-2 no-print">
|
<div class="ve-text-center mt-2 no-print">
|
||||||
<button class="btn btn-xs btn-info" id="manage-brew">Manage Homebrew</button>
|
<button type="button" class="btn btn-xs btn-info" id="manage-brew">Manage Homebrew</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
@font-face{font-family:Convergence;font-style:normal;font-weight:400;src:local("Convergence-Regular"),url("../fonts/Convergence-Regular.woff2") format("woff2")}@font-face{font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),url("../fonts/Roboto-Regular.woff2") format("woff2")}@font-face{font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;src:local("glyphicons-halflings-regular"),url("../fonts/glyphicons-halflings-regular.woff2") format("woff2")}@font-face{font-family:"Blambot Casual";src:local("Blambot-Casual"),url("../fonts/Blambot-Casual-Regular.woff2") format("woff2")}@font-face{font-family:HPPHumblescratch;src:local("HPPHumblescratch"),url("../fonts/hpphumblescratch-webfont.woff2") format("woff2")}@keyframes kf-fade-out{from{opacity:1}to{opacity:0}}img.token{font-size:1.6em;right:.4em}#pagecontent .rnd-name .source{position:relative;margin-right:.2em}#pagecontent{background:url("../img/bestiary/stat-block-top-texture.webp") no-repeat,repeat top center,#fdf1dc}.night-mode #pagecontent{background:#222 !important}[data-proficiency-dice-mode=dice] .rd__dc--rollable{color:#337ab7;cursor:pointer}[data-proficiency-dice-mode=dice] .rd__dc--rollable-text,[data-proficiency-dice-mode=dice] .rd__roller--roll-prof-bonus{display:none}[data-proficiency-dice-mode=dice] .rd__dc--rollable-dice,[data-proficiency-dice-mode=dice] .rd__roller--roll-prof-dice{display:inline}[data-proficiency-dice-mode=bonus] .rd__dc--rollable-text,[data-proficiency-dice-mode=bonus] .rd__roller--roll-prof-bonus{display:inline}[data-proficiency-dice-mode=bonus] .rd__dc--rollable-dice,[data-proficiency-dice-mode=bonus] .rd__roller--roll-prof-dice{display:none}.night-mode [data-proficiency-dice-mode=dice] .rd__dc--rollable{color:#7db6e8}.best__ecgen-active .lst__row--bestiary-sublist{cursor:default}.best__ecgen-active .lst__row--bestiary-sublist:hover{background:initial}.best-ecgen__visible,.best-ecgen__visible--flex,.best-ecgen__visible--flex-col{display:none}.best-ecgen__btn-list{padding:0 2px;line-height:12px;font-size:9px;border-radius:3px}.best__ecgen-active .best-ecgen__visible{display:block}.best__ecgen-active .best-ecgen__visible--flex{display:flex}.best__ecgen-active .best-ecgen__visible--flex-col{display:flex;flex-direction:column}.best__ecgen-active .best-ecgen__hidden{display:none !important}.best__ecgen-active .best-ecgen__name{width:26.6667%}.best__ecgen-active .best-ecgen__name--sub{width:29.1667%}/*# sourceMappingURL=bestiary.css.map */
|
@font-face{font-family:Convergence;font-style:normal;font-weight:400;src:local("Convergence-Regular"),url("../fonts/Convergence-Regular.woff2") format("woff2")}@font-face{font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),url("../fonts/Roboto-Regular.woff2") format("woff2")}@font-face{font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;src:local("glyphicons-halflings-regular"),url("../fonts/glyphicons-halflings-regular.woff2") format("woff2")}@font-face{font-family:"Blambot Casual";src:local("Blambot-Casual"),url("../fonts/Blambot-Casual-Regular.woff2") format("woff2")}@font-face{font-family:HPPHumblescratch;src:local("HPPHumblescratch"),url("../fonts/hpphumblescratch-webfont.woff2") format("woff2")}@keyframes kf-fade-out{from{opacity:1}to{opacity:0}}.mon__wrp-size-type-align--token,.mon__wrp-avoid-token{max-width:calc(100% - 11rem)}.mon__wrp-token{display:block;position:absolute;z-index:10;top:0;right:.5rem;width:auto;max-width:11rem;height:auto;transition:opacity 34ms,max-width 34ms,right 34ms}.mon__wrp-token:hover{max-width:100%;right:0;opacity:1 !important;transition:opacity 34ms,max-width 34ms,right 34ms}.mon__wrp-token:hover .mon__btn-token-cycle{opacity:1;transition:opacity 34ms}.mon__wrp-token:hover .mon__wrp-token-footer{opacity:1;transition:opacity 34ms}.mon__token{width:100%;height:100%}.mon__btn-token-cycle{position:absolute;top:50%;bottom:50%;display:flex;align-items:center;justify-content:center;width:40px;height:40px;background:rgba(0,0,0,.475);cursor:pointer;color:#fff;border:1px solid rgba(204,204,204,.6274509804);opacity:0;transition:opacity 34ms}.mon__btn-token-cycle--left{left:0;border-top-left-radius:5px;border-bottom-left-radius:5px;border-right:1px solid rgba(204,204,204,.4)}.mon__btn-token-cycle--right{right:0;border-top-right-radius:5px;border-bottom-right-radius:5px;border-left:1px solid rgba(204,204,204,.4)}.mon__btn-token-cycle:hover{color:#ddd}.mon__wrp-token-footer{display:flex;position:absolute;height:22px;right:5px;bottom:0;left:5px;align-items:center;justify-content:center;opacity:0;transition:opacity 34ms}.mon__token-footer{background:rgba(0,0,0,.475);color:#fff;font-family:"Times New Roman",serif;font-variant:small-caps;font-size:16px;border-radius:5px;padding:1px 5px;border:1px solid rgba(204,204,204,.6274509804)}img.token{font-size:1.6em;right:.4em}#pagecontent .rnd-name .source{position:relative;margin-right:.2em}#pagecontent{background:url("../img/bestiary/stat-block-top-texture.webp") no-repeat,repeat top center,#fdf1dc}.night-mode #pagecontent{background:#222 !important}[data-proficiency-dice-mode=dice] .rd__dc--rollable{color:#337ab7;cursor:pointer}[data-proficiency-dice-mode=dice] .rd__dc--rollable-text,[data-proficiency-dice-mode=dice] .rd__roller--roll-prof-bonus{display:none}[data-proficiency-dice-mode=dice] .rd__dc--rollable-dice,[data-proficiency-dice-mode=dice] .rd__roller--roll-prof-dice{display:inline}[data-proficiency-dice-mode=bonus] .rd__dc--rollable-text,[data-proficiency-dice-mode=bonus] .rd__roller--roll-prof-bonus{display:inline}[data-proficiency-dice-mode=bonus] .rd__dc--rollable-dice,[data-proficiency-dice-mode=bonus] .rd__roller--roll-prof-dice{display:none}.night-mode [data-proficiency-dice-mode=dice] .rd__dc--rollable{color:#7db6e8}.best__ecgen-active .lst__row--bestiary-sublist{cursor:default}.best__ecgen-active .lst__row--bestiary-sublist:hover{background:initial}.best-ecgen__visible,.best-ecgen__visible--flex,.best-ecgen__visible--flex-col{display:none}.best-ecgen__btn-list{padding:0 2px;line-height:12px;font-size:9px;border-radius:3px}.best__ecgen-active .best-ecgen__visible{display:block}.best__ecgen-active .best-ecgen__visible--flex{display:flex}.best__ecgen-active .best-ecgen__visible--flex-col{display:flex;flex-direction:column}.best__ecgen-active .best-ecgen__hidden{display:none !important}.best__ecgen-active .best-ecgen__name{width:26.6667%}.best__ecgen-active .best-ecgen__name--sub{width:29.1667%}/*# sourceMappingURL=bestiary.css.map */
|
||||||
|
|||||||
6
css/bootstrap.css
vendored
6
css/bootstrap.css
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
@font-face{font-family:Convergence;font-style:normal;font-weight:400;src:local("Convergence-Regular"),url("../fonts/Convergence-Regular.woff2") format("woff2")}@font-face{font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),url("../fonts/Roboto-Regular.woff2") format("woff2")}@font-face{font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;src:local("glyphicons-halflings-regular"),url("../fonts/glyphicons-halflings-regular.woff2") format("woff2")}@font-face{font-family:"Blambot Casual";src:local("Blambot-Casual"),url("../fonts/Blambot-Casual-Regular.woff2") format("woff2")}@font-face{font-family:HPPHumblescratch;src:local("HPPHumblescratch"),url("../fonts/hpphumblescratch-webfont.woff2") format("woff2")}@keyframes kf-fade-out{from{opacity:1}to{opacity:0}}.inputArea,.outputArea{width:100%;height:100%}.select-inline{display:inline-block;width:initial}.conv__head{margin-top:0;margin-bottom:2px}.conv__out_control__wrp{padding:0 3rem 0 0;flex-shrink:0}.conv__disp-message{flex-shrink:0;font-size:13px;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px;margin-right:3rem}.conv__disp-message--warning{color:#df00ff}.conv__disp-message--error{color:red}.night-mode .conv__disp-message{background-color:#383838;border-color:#555}@media(width <= 991px){.view-col-wrapper{height:40vh}}/*# sourceMappingURL=converter.css.map */
|
@font-face{font-family:Convergence;font-style:normal;font-weight:400;src:local("Convergence-Regular"),url("../fonts/Convergence-Regular.woff2") format("woff2")}@font-face{font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),url("../fonts/Roboto-Regular.woff2") format("woff2")}@font-face{font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;src:local("glyphicons-halflings-regular"),url("../fonts/glyphicons-halflings-regular.woff2") format("woff2")}@font-face{font-family:"Blambot Casual";src:local("Blambot-Casual"),url("../fonts/Blambot-Casual-Regular.woff2") format("woff2")}@font-face{font-family:HPPHumblescratch;src:local("HPPHumblescratch"),url("../fonts/hpphumblescratch-webfont.woff2") format("woff2")}@keyframes kf-fade-out{from{opacity:1}to{opacity:0}}.inputArea,.outputArea{width:100%;height:100%}.select-inline{display:inline-block;width:initial}.conv__head{margin-top:0;margin-bottom:2px}.conv__out_control__wrp{padding:0 3rem 0 0;flex-shrink:0}.conv__disp-message{flex-shrink:0;font-size:13px;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px;margin-right:3rem}.conv__disp-message--warning{color:#df00ff}.conv__disp-message--error{color:red}.night-mode .conv__disp-message{background-color:#383838;border-color:#555}@media screen and (width <= 991px){.view-col-wrapper{height:40vh}}/*# sourceMappingURL=converter.css.map */
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
table.home-table{padding:0 10px 10px}table.home-table td{vertical-align:top;padding:0 5px;width:50%}#don-wrapper{position:relative;margin-bottom:7px;padding:5px 15px}#wrp-patreon{min-height:51px}.home__btn-page{border-width:2px;width:134px;height:110px;text-align:center;flex-shrink:0;padding:6px;display:flex;flex-direction:column;align-items:center;border-radius:0}@media only screen and (width <= 1200px){.home__btn-page{width:113px}}.home__btn-page,.home__btn-page:hover,.home__btn-page:active,.home__btn-page:focus{color:#444}.night-mode .home__btn-page,.night-mode .home__btn-page:hover,.night-mode .home__btn-page:active,.night-mode .home__btn-page:focus{color:inherit}.home__icn-page{font-size:50px;height:50px;width:65px;overflow:hidden;text-align:center}.home__lbl-page{height:34px;width:100%;display:flex;justify-content:center;align-items:center;margin-bottom:0;font-size:17px;color:#333}.home__h-player{text-decoration:underline;text-decoration-color:#1e90ff}.home__h-rule{text-decoration:underline;text-decoration-color:#33a5a5}.home__h-dm{text-decoration:underline;text-decoration-color:#9400d3}.home__btn-player,.home__btn-player:hover,.home__btn-player:active,.home__btn-player:focus,.night-mode .home__btn-player,.night-mode .home__btn-player:hover,.night-mode .home__btn-player:active,.night-mode .home__btn-player:focus{border-color:#1e90ff;color:#1e90ff}.home__btn-rule,.home__btn-rule:hover,.home__btn-rule:active,.home__btn-rule:focus,.night-mode .home__btn-rule,.night-mode .home__btn-rule:hover,.night-mode .home__btn-rule:active,.night-mode .home__btn-rule:focus{border-color:#33a5a5;color:#33a5a5}.home__btn-dm,.home__btn-dm:hover,.home__btn-dm:active,.home__btn-dm:focus,.night-mode .home__btn-dm,.night-mode .home__btn-dm:hover,.night-mode .home__btn-dm:active,.night-mode .home__btn-dm:focus{border-color:#9400d3;color:#9400d3}.home__stripe{display:flex;flex-direction:column;align-items:center;padding-top:55px}.home__stripe-header{position:absolute;top:-50px;right:0;left:0;font-size:32px;font-weight:bold}.home__split{display:flex;justify-content:space-between}.home__split-spaced{margin-right:80px}.home__split-spaced--gutter{margin-right:10px}.home__wrp-buttons{justify-content:center}.home__mobile-visible{display:none}.home__narrow-visible{display:none}@media(width <= 991px){.home__split{flex-direction:column}.home__split>*{margin-bottom:45px}.home__split-spaced{margin-right:0;margin-bottom:15px}.home__split-spaced--no-header{margin-bottom:0}.home__stripe-header{top:-40px;right:0;left:0}.home__mobile-visible{display:block}.home__icn-page{font-size:50px;height:50px}.home__btn-page{height:114px;margin:5px !important}.home__mobile-hidden{display:none !important}}@media(width <= 507px){.home__narrow-visible{display:block !important}.home__narrow-hidden{display:none !important}.home__split-spaced--no-header{margin-bottom:15px}}[id=div-gpt-ad-5etools35927]::after,[id=div-gpt-ad-5etools35930]::after{content:"";margin:20px auto 0;width:100%;display:block}/*# sourceMappingURL=index.css.map */
|
@font-face{font-family:Convergence;font-style:normal;font-weight:400;src:local("Convergence-Regular"),url("../fonts/Convergence-Regular.woff2") format("woff2")}@font-face{font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),url("../fonts/Roboto-Regular.woff2") format("woff2")}@font-face{font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;src:local("glyphicons-halflings-regular"),url("../fonts/glyphicons-halflings-regular.woff2") format("woff2")}@font-face{font-family:"Blambot Casual";src:local("Blambot-Casual"),url("../fonts/Blambot-Casual-Regular.woff2") format("woff2")}@font-face{font-family:HPPHumblescratch;src:local("HPPHumblescratch"),url("../fonts/hpphumblescratch-webfont.woff2") format("woff2")}@keyframes kf-fade-out{from{opacity:1}to{opacity:0}}table.home-table{padding:0 10px 10px}table.home-table td{vertical-align:top;padding:0 5px;width:50%}#don-wrapper{position:relative;margin-bottom:7px;padding:5px 15px}#wrp-patreon{min-height:51px}.home__btn-page{border-width:2px;width:134px;height:110px;text-align:center;flex-shrink:0;padding:6px;display:flex;flex-direction:column;align-items:center;border-radius:0}@media screen and (width <= 1200px){.home__btn-page{width:113px}}.home__btn-page,.home__btn-page:hover,.home__btn-page:active,.home__btn-page:focus{color:#444}.night-mode .home__btn-page,.night-mode .home__btn-page:hover,.night-mode .home__btn-page:active,.night-mode .home__btn-page:focus{color:inherit}.home__icn-page{font-size:50px;height:50px;width:65px;overflow:hidden;text-align:center}.home__lbl-page{height:34px;width:100%;display:flex;justify-content:center;align-items:center;margin-bottom:0;font-size:17px;color:#333}.home__h-player{text-decoration:underline;text-decoration-color:#1e90ff}.home__h-rule{text-decoration:underline;text-decoration-color:#33a5a5}.home__h-dm{text-decoration:underline;text-decoration-color:#9400d3}.home__btn-player,.home__btn-player:hover,.home__btn-player:active,.home__btn-player:focus,.night-mode .home__btn-player,.night-mode .home__btn-player:hover,.night-mode .home__btn-player:active,.night-mode .home__btn-player:focus{border-color:#1e90ff;color:#1e90ff}.home__btn-rule,.home__btn-rule:hover,.home__btn-rule:active,.home__btn-rule:focus,.night-mode .home__btn-rule,.night-mode .home__btn-rule:hover,.night-mode .home__btn-rule:active,.night-mode .home__btn-rule:focus{border-color:#33a5a5;color:#33a5a5}.home__btn-dm,.home__btn-dm:hover,.home__btn-dm:active,.home__btn-dm:focus,.night-mode .home__btn-dm,.night-mode .home__btn-dm:hover,.night-mode .home__btn-dm:active,.night-mode .home__btn-dm:focus{border-color:#9400d3;color:#9400d3}.home__stripe{display:flex;flex-direction:column;align-items:center;padding-top:55px}.home__stripe-header{position:absolute;top:-50px;right:0;left:0;font-size:32px;font-weight:bold}.home__split{display:flex;justify-content:space-between}.home__split-spaced{margin-right:80px}.home__split-spaced--gutter{margin-right:10px}.home__wrp-buttons{justify-content:center}.home__mobile-visible{display:none}.home__narrow-visible{display:none}@media screen and (width <= 991px){.home__split{flex-direction:column}.home__split>*{margin-bottom:45px}.home__split-spaced{margin-right:0;margin-bottom:15px}.home__split-spaced--no-header{margin-bottom:0}.home__stripe-header{top:-40px;right:0;left:0}.home__mobile-visible{display:block}.home__icn-page{font-size:50px;height:50px}.home__btn-page{height:114px;margin:5px !important}.home__mobile-hidden{display:none !important}}@media screen and (width <= 507px){.home__narrow-visible{display:block !important}.home__narrow-hidden{display:none !important}.home__split-spaced--no-header{margin-bottom:15px}}[id=div-gpt-ad-5etools35927]::after,[id=div-gpt-ad-5etools35930]::after{content:"";margin:20px auto 0;width:100%;display:block}/*# sourceMappingURL=index.css.map */
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
#initp__wrp_active{display:none}.is-fullscreen .initp__fullscreen-hidden{display:none !important}@media(width <= 991px){.viewport-wrapper{bottom:0;height:100vh;min-height:0}}/*# sourceMappingURL=inittrackerplayerview.css.map */
|
@font-face{font-family:Convergence;font-style:normal;font-weight:400;src:local("Convergence-Regular"),url("../fonts/Convergence-Regular.woff2") format("woff2")}@font-face{font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),url("../fonts/Roboto-Regular.woff2") format("woff2")}@font-face{font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;src:local("glyphicons-halflings-regular"),url("../fonts/glyphicons-halflings-regular.woff2") format("woff2")}@font-face{font-family:"Blambot Casual";src:local("Blambot-Casual"),url("../fonts/Blambot-Casual-Regular.woff2") format("woff2")}@font-face{font-family:HPPHumblescratch;src:local("HPPHumblescratch"),url("../fonts/hpphumblescratch-webfont.woff2") format("woff2")}@keyframes kf-fade-out{from{opacity:1}to{opacity:0}}#initp__wrp_active{display:none}.is-fullscreen .initp__fullscreen-hidden{display:none !important}@media screen and (width <= 991px){.viewport-wrapper{bottom:0;height:100vh;min-height:0}}/*# sourceMappingURL=inittrackerplayerview.css.map */
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
.list--stats{height:initial;max-height:100%;min-height:100px}.list.subitems{min-height:initial}span.side-label{position:absolute;bottom:0;left:-22px;transform:rotate(-90deg);transform-origin:0 0;font-size:18px}h3.ele-mundane,h3.ele-magic{position:relative;margin:0}@media(width <= 991px){.list--stats{max-height:20em}}@media(device-height <= 700px){.list{max-height:20em}.viewport-wrapper{bottom:auto}.view-col-wrapper{flex-direction:column;max-height:none;height:auto}}.itm__list-divider{width:100%;height:1px;background:#ccc}.night-mode .itm__list-divider{background:#555}.itm__wrp-lists{flex:7}.itm__wrp-stats{flex:5}.itm__wrp-list{height:100%}.itm__wrp-list--empty{height:initial;flex-shrink:0}.style-switch__wide .itm__wrp-list{min-width:calc(50% - 10px);max-width:calc(50% - 10px)}.style-switch__wide .itm__wrp-list--mundane{margin-right:20px}.style-switch__wide #listcontainer.itm__wrp-lists{flex:initial;width:100%;flex-flow:row}.style-switch__wide .itm__wrp-stats{width:480px;flex:initial;flex-shrink:0}.style-switch__wide .side-label{display:none !important}.style-switch__wide .itm__list-divider{display:block !important}/*# sourceMappingURL=items.css.map */
|
@font-face{font-family:Convergence;font-style:normal;font-weight:400;src:local("Convergence-Regular"),url("../fonts/Convergence-Regular.woff2") format("woff2")}@font-face{font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),url("../fonts/Roboto-Regular.woff2") format("woff2")}@font-face{font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;src:local("glyphicons-halflings-regular"),url("../fonts/glyphicons-halflings-regular.woff2") format("woff2")}@font-face{font-family:"Blambot Casual";src:local("Blambot-Casual"),url("../fonts/Blambot-Casual-Regular.woff2") format("woff2")}@font-face{font-family:HPPHumblescratch;src:local("HPPHumblescratch"),url("../fonts/hpphumblescratch-webfont.woff2") format("woff2")}@keyframes kf-fade-out{from{opacity:1}to{opacity:0}}.list--stats{height:initial;max-height:100%;min-height:100px}.list.subitems{min-height:initial}span.side-label{position:absolute;bottom:0;left:-22px;transform:rotate(-90deg);transform-origin:0 0;font-size:18px}h3.ele-mundane,h3.ele-magic{position:relative;margin:0}@media screen and (width <= 991px){.list--stats{max-height:20em}}@media screen and (device-height <= 700px){.list{max-height:20em}.viewport-wrapper{bottom:auto}.view-col-wrapper{flex-direction:column;max-height:none;height:auto}}.itm__list-divider{width:100%;height:1px;background:#ccc}.night-mode .itm__list-divider{background:#555}.itm__wrp-lists{flex:7}.itm__wrp-stats{flex:5}.itm__wrp-list{height:100%}.itm__wrp-list--empty{height:initial;flex-shrink:0}.style-switch__wide .itm__wrp-list{min-width:calc(50% - 10px);max-width:calc(50% - 10px)}.style-switch__wide .itm__wrp-list--mundane{margin-right:20px}.style-switch__wide #listcontainer.itm__wrp-lists{flex:initial;width:100%;flex-flow:row}.style-switch__wide .itm__wrp-stats{width:480px;flex:initial;flex-shrink:0}.style-switch__wide .side-label{display:none !important}.style-switch__wide .itm__list-divider{display:block !important}/*# sourceMappingURL=items.css.map */
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
@font-face{font-family:Convergence;font-style:normal;font-weight:400;src:local("Convergence-Regular"),url("../fonts/Convergence-Regular.woff2") format("woff2")}@font-face{font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),url("../fonts/Roboto-Regular.woff2") format("woff2")}@font-face{font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;src:local("glyphicons-halflings-regular"),url("../fonts/glyphicons-halflings-regular.woff2") format("woff2")}@font-face{font-family:"Blambot Casual";src:local("Blambot-Casual"),url("../fonts/Blambot-Casual-Regular.woff2") format("woff2")}@font-face{font-family:HPPHumblescratch;src:local("HPPHumblescratch"),url("../fonts/hpphumblescratch-webfont.woff2") format("woff2")}@keyframes kf-fade-out{from{opacity:1}to{opacity:0}}.maps .rd__wrp-map{max-width:initial;margin:0}.maps__disp-message-initial{background:#fff;border:1px solid rgba(204,204,204,.6274509804);border-radius:5px}.maps-menu{background:#fff;font-size:1.12rem;border-top:1px solid #ccc;width:235px}@media only screen and (max-width: 768px){.maps-menu{max-height:600px}}.maps-menu__btn-chapter-scroll{width:20px;opacity:0;margin:-2px 3px}.maps-menu__label-cb{border-bottom:1px solid #ccc}.maps-menu__label-cb:hover{background-color:#f5f5f5}.maps-menu__label-cb:hover .maps-menu__btn-chapter-scroll{opacity:1}.maps-gallery__wrp-chapter{border:1px solid rgba(204,204,204,.6274509804);border-radius:5px}.night-mode .maps__disp-message-initial{background:#222;border-color:rgba(85,85,85,.6274509804)}.night-mode .maps-menu{background:#222;border-top-color:rgba(85,85,85,.6274509804)}.night-mode .maps-menu__label-cb{border-bottom-color:#555}.night-mode .maps-menu__label-cb:hover{background-color:#383838}.night-mode .maps-gallery__wrp-chapter{background:#222;border-color:rgba(85,85,85,.6274509804)}/*# sourceMappingURL=maps.css.map */
|
@font-face{font-family:Convergence;font-style:normal;font-weight:400;src:local("Convergence-Regular"),url("../fonts/Convergence-Regular.woff2") format("woff2")}@font-face{font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),url("../fonts/Roboto-Regular.woff2") format("woff2")}@font-face{font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;src:local("glyphicons-halflings-regular"),url("../fonts/glyphicons-halflings-regular.woff2") format("woff2")}@font-face{font-family:"Blambot Casual";src:local("Blambot-Casual"),url("../fonts/Blambot-Casual-Regular.woff2") format("woff2")}@font-face{font-family:HPPHumblescratch;src:local("HPPHumblescratch"),url("../fonts/hpphumblescratch-webfont.woff2") format("woff2")}@keyframes kf-fade-out{from{opacity:1}to{opacity:0}}.maps .rd__wrp-map{max-width:initial;margin:0}.maps__disp-message-initial{background:#fff;border:1px solid rgba(204,204,204,.6274509804);border-radius:5px}.maps-menu{background:#fff;font-size:1.12rem;border-top:1px solid #ccc;width:235px}@media screen and (width <= 768px){.maps-menu{max-height:600px}}.maps-menu__btn-chapter-scroll{width:20px;opacity:0;margin:-2px 3px}.maps-menu__label-cb{border-bottom:1px solid #ccc}.maps-menu__label-cb:hover{background-color:#f5f5f5}.maps-menu__label-cb:hover .maps-menu__btn-chapter-scroll{opacity:1}.maps-gallery__wrp-chapter{border:1px solid rgba(204,204,204,.6274509804);border-radius:5px}.night-mode .maps__disp-message-initial{background:#222;border-color:rgba(85,85,85,.6274509804)}.night-mode .maps-menu{background:#222;border-top-color:rgba(85,85,85,.6274509804)}.night-mode .maps-menu__label-cb{border-bottom-color:#555}.night-mode .maps-menu__label-cb:hover{background-color:#383838}.night-mode .maps-gallery__wrp-chapter{background:#222;border-color:rgba(85,85,85,.6274509804)}/*# sourceMappingURL=maps.css.map */
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
@font-face{font-family:Convergence;font-style:normal;font-weight:400;src:local("Convergence-Regular"),url("../fonts/Convergence-Regular.woff2") format("woff2")}@font-face{font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),url("../fonts/Roboto-Regular.woff2") format("woff2")}@font-face{font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;src:local("glyphicons-halflings-regular"),url("../fonts/glyphicons-halflings-regular.woff2") format("woff2")}@font-face{font-family:"Blambot Casual";src:local("Blambot-Casual"),url("../fonts/Blambot-Casual-Regular.woff2") format("woff2")}@font-face{font-family:HPPHumblescratch;src:local("HPPHumblescratch"),url("../fonts/hpphumblescratch-webfont.woff2") format("woff2")}@keyframes kf-fade-out{from{opacity:1}to{opacity:0}}#jsoninput{width:100%;height:100%}#wrp-output{overflow-y:scroll;margin-bottom:28px;height:calc(100% - 35px)}#demoSelectRenderer{width:200px}@media(max-width: 991px){#wrp-jsoninput{height:480px}}@media print{#wrp-output{display:block;height:unset;overflow:unset;margin:0}#pagecontent{margin-top:-2px}}/*# sourceMappingURL=renderdemo.css.map */
|
@font-face{font-family:Convergence;font-style:normal;font-weight:400;src:local("Convergence-Regular"),url("../fonts/Convergence-Regular.woff2") format("woff2")}@font-face{font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),url("../fonts/Roboto-Regular.woff2") format("woff2")}@font-face{font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;src:local("glyphicons-halflings-regular"),url("../fonts/glyphicons-halflings-regular.woff2") format("woff2")}@font-face{font-family:"Blambot Casual";src:local("Blambot-Casual"),url("../fonts/Blambot-Casual-Regular.woff2") format("woff2")}@font-face{font-family:HPPHumblescratch;src:local("HPPHumblescratch"),url("../fonts/hpphumblescratch-webfont.woff2") format("woff2")}@keyframes kf-fade-out{from{opacity:1}to{opacity:0}}#jsoninput{width:100%;height:100%}#wrp-output{overflow-y:scroll;margin-bottom:28px;height:calc(100% - 35px)}#demoSelectRenderer{width:200px}@media screen and (width <= 991px){#wrp-jsoninput{height:480px}}@media print{#wrp-output{display:block;height:unset;overflow:unset;margin:0}#pagecontent{margin-top:-2px}}/*# sourceMappingURL=renderdemo.css.map */
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
@font-face{font-family:Convergence;font-style:normal;font-weight:400;src:local("Convergence-Regular"),url("../fonts/Convergence-Regular.woff2") format("woff2")}@font-face{font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),url("../fonts/Roboto-Regular.woff2") format("woff2")}@font-face{font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;src:local("glyphicons-halflings-regular"),url("../fonts/glyphicons-halflings-regular.woff2") format("woff2")}@font-face{font-family:"Blambot Casual";src:local("Blambot-Casual"),url("../fonts/Blambot-Casual-Regular.woff2") format("woff2")}@font-face{font-family:HPPHumblescratch;src:local("HPPHumblescratch"),url("../fonts/hpphumblescratch-webfont.woff2") format("woff2")}@keyframes kf-fade-out{from{opacity:1}to{opacity:0}}.pg-search__ipt{border-right:0}.pg-search__wrp-result{border:1px solid #ccc;border-radius:5px;min-height:calc(1rem + 48px + 2px)}.pg-search__disp-token{width:48px;height:48px;align-self:center}.pg-search__disp-srd,.pg-search__disp-source-marker{font-size:8.5px;vertical-align:super;top:2px;margin-left:3px}.pg-search__wrp-preview{width:500px;border:1px solid #ccc}.pg-search__btn-toggle-preview--expanded{border-top-left-radius:0;border-bottom-left-radius:0}@media only screen and (max-width: 768px){.pg-search__btn-toggle-preview--expanded{border-top-left-radius:3px;border-bottom-left-radius:3px}}.night-mode .pg-search__wrp-result{border:1px solid #555;background:#222}.night-mode .pg-search__wrp-preview{border:1px solid #555}.style-switch__wide .pg-search__wrp-preview{width:50vw}/*# sourceMappingURL=search.css.map */
|
@font-face{font-family:Convergence;font-style:normal;font-weight:400;src:local("Convergence-Regular"),url("../fonts/Convergence-Regular.woff2") format("woff2")}@font-face{font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),url("../fonts/Roboto-Regular.woff2") format("woff2")}@font-face{font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;src:local("glyphicons-halflings-regular"),url("../fonts/glyphicons-halflings-regular.woff2") format("woff2")}@font-face{font-family:"Blambot Casual";src:local("Blambot-Casual"),url("../fonts/Blambot-Casual-Regular.woff2") format("woff2")}@font-face{font-family:HPPHumblescratch;src:local("HPPHumblescratch"),url("../fonts/hpphumblescratch-webfont.woff2") format("woff2")}@keyframes kf-fade-out{from{opacity:1}to{opacity:0}}.pg-search__ipt{border-right:0}.pg-search__wrp-result{border:1px solid #ccc;border-radius:5px;min-height:calc(1rem + 48px + 2px)}.pg-search__disp-token{width:48px;height:48px;align-self:center}.pg-search__disp-srd,.pg-search__disp-source-marker{font-size:8.5px;vertical-align:super;top:2px;margin-left:3px}.pg-search__wrp-preview{width:500px;border:1px solid #ccc}.pg-search__btn-toggle-preview--expanded{border-top-left-radius:0;border-bottom-left-radius:0}@media screen and (width <= 768px){.pg-search__btn-toggle-preview--expanded{border-top-left-radius:3px;border-bottom-left-radius:3px}}.night-mode .pg-search__wrp-result{border:1px solid #555;background:#222}.night-mode .pg-search__wrp-preview{border:1px solid #555}.style-switch__wide .pg-search__wrp-preview{width:50vw}/*# sourceMappingURL=search.css.map */
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
@font-face{font-family:Convergence;font-style:normal;font-weight:400;src:local("Convergence-Regular"),url("../fonts/Convergence-Regular.woff2") format("woff2")}@font-face{font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),url("../fonts/Roboto-Regular.woff2") format("woff2")}@font-face{font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;src:local("glyphicons-halflings-regular"),url("../fonts/glyphicons-halflings-regular.woff2") format("woff2")}@font-face{font-family:"Blambot Casual";src:local("Blambot-Casual"),url("../fonts/Blambot-Casual-Regular.woff2") format("woff2")}@font-face{font-family:HPPHumblescratch;src:local("HPPHumblescratch"),url("../fonts/hpphumblescratch-webfont.woff2") format("woff2")}@keyframes kf-fade-out{from{opacity:1}to{opacity:0}}.statgen .statgen-shared__btn-reset{right:-3px;width:22px;height:22px}.statgen .statgen-shared__ipt{width:42px;height:24px}.statgen .statgen-shared__ipt[readonly]{background-color:#eee}.statgen .statgen-shared__ipt--sel{width:64px;text-align-last:center}.statgen .statgen-shared__btn-toggle-tashas-rules{line-height:14px;width:16px;height:16px}.statgen .statgen-shared__btn-toggle-tashas-rules .glyphicon{left:-0.6px}.statgen .statgen-rolled__wrp-results{border:1px solid rgba(204,204,204,.6274509804);border-radius:3px}.statgen .statgen-rolled__disp-result{min-width:24px}.statgen .statgen-pb__ipt-budget{width:70px}.statgen .statgen-pb__ipt-budget--error{border-color:red}.statgen .statgen-pb__header{height:22px}.statgen .statgen-pb__header--group{border-bottom:1px solid rgba(204,204,204,.6274509804)}.statgen .statgen-pb__header--choose-from{min-width:40px}.statgen .statgen-pb__cell{height:24px;min-width:36px}.statgen .statgen-pb__col-cost{width:90px}.statgen .statgen-pb__col-cost-delete{width:26px}.statgen .statgen-pb__row-cost{min-height:27px}.statgen .statgen-asi__row{border-bottom:1px solid rgba(204,204,204,.6274509804)}.statgen .statgen-asi__cell{width:52px}.statgen .statgen-asi__disp-plus{left:-1px}.statgen .statgen-asi__cell-feat{width:40px;min-height:20px}@font-face{font-family:Convergence;font-style:normal;font-weight:400;src:local("Convergence-Regular"),url("../fonts/Convergence-Regular.woff2") format("woff2")}@font-face{font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),url("../fonts/Roboto-Regular.woff2") format("woff2")}@font-face{font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;src:local("glyphicons-halflings-regular"),url("../fonts/glyphicons-halflings-regular.woff2") format("woff2")}@font-face{font-family:"Blambot Casual";src:local("Blambot-Casual"),url("../fonts/Blambot-Casual-Regular.woff2") format("woff2")}@font-face{font-family:HPPHumblescratch;src:local("HPPHumblescratch"),url("../fonts/hpphumblescratch-webfont.woff2") format("woff2")}@keyframes kf-fade-out{from{opacity:1}to{opacity:0}}.night-mode .statgen .statgen-shared__ipt[readonly]{background-color:#3a3a3a}.night-mode .statgen .statgen-rolled__wrp-results{border-color:rgba(85,85,85,.6274509804)}.night-mode .statgen .statgen-pb__ipt-budget--error{border-color:red}.night-mode .statgen .statgen-asi__row{border-bottom:1px solid rgba(85,85,85,.6274509804)}.night-mode .statgen .statgen-asi__cell--top{border-color:#555}@media(width <= 991px){.viewport-wrapper{bottom:0;height:100vh;min-height:0}}.container--main{min-width:420px}/*# sourceMappingURL=statgen-bundle.css.map */
|
@font-face{font-family:Convergence;font-style:normal;font-weight:400;src:local("Convergence-Regular"),url("../fonts/Convergence-Regular.woff2") format("woff2")}@font-face{font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),url("../fonts/Roboto-Regular.woff2") format("woff2")}@font-face{font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;src:local("glyphicons-halflings-regular"),url("../fonts/glyphicons-halflings-regular.woff2") format("woff2")}@font-face{font-family:"Blambot Casual";src:local("Blambot-Casual"),url("../fonts/Blambot-Casual-Regular.woff2") format("woff2")}@font-face{font-family:HPPHumblescratch;src:local("HPPHumblescratch"),url("../fonts/hpphumblescratch-webfont.woff2") format("woff2")}@keyframes kf-fade-out{from{opacity:1}to{opacity:0}}@font-face{font-family:Convergence;font-style:normal;font-weight:400;src:local("Convergence-Regular"),url("../fonts/Convergence-Regular.woff2") format("woff2")}@font-face{font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),url("../fonts/Roboto-Regular.woff2") format("woff2")}@font-face{font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;src:local("glyphicons-halflings-regular"),url("../fonts/glyphicons-halflings-regular.woff2") format("woff2")}@font-face{font-family:"Blambot Casual";src:local("Blambot-Casual"),url("../fonts/Blambot-Casual-Regular.woff2") format("woff2")}@font-face{font-family:HPPHumblescratch;src:local("HPPHumblescratch"),url("../fonts/hpphumblescratch-webfont.woff2") format("woff2")}@keyframes kf-fade-out{from{opacity:1}to{opacity:0}}.statgen .statgen-shared__btn-reset{right:-3px;width:22px;height:22px}.statgen .statgen-shared__ipt{width:42px;height:24px}.statgen .statgen-shared__ipt[readonly]{background-color:#eee}.statgen .statgen-shared__ipt--sel{width:64px;text-align-last:center}.statgen .statgen-shared__btn-toggle-tashas-rules{line-height:14px;width:16px;height:16px}.statgen .statgen-shared__btn-toggle-tashas-rules .glyphicon{left:-0.6px}.statgen .statgen-rolled__wrp-results{border:1px solid rgba(204,204,204,.6274509804);border-radius:3px}.statgen .statgen-rolled__disp-result{min-width:24px}.statgen .statgen-pb__ipt-budget{width:70px}.statgen .statgen-pb__ipt-budget--error{border-color:red}.statgen .statgen-pb__header{height:22px}.statgen .statgen-pb__header--group{border-bottom:1px solid rgba(204,204,204,.6274509804)}.statgen .statgen-pb__header--choose-from{min-width:40px}.statgen .statgen-pb__cell{height:24px;min-width:36px}.statgen .statgen-pb__col-cost{width:90px}.statgen .statgen-pb__col-cost-delete{width:26px}.statgen .statgen-pb__row-cost{min-height:27px}.statgen .statgen-asi__row{border-bottom:1px solid rgba(204,204,204,.6274509804)}.statgen .statgen-asi__cell{width:52px}.statgen .statgen-asi__disp-plus{left:-1px}.statgen .statgen-asi__cell-feat{width:40px;min-height:20px}@font-face{font-family:Convergence;font-style:normal;font-weight:400;src:local("Convergence-Regular"),url("../fonts/Convergence-Regular.woff2") format("woff2")}@font-face{font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),url("../fonts/Roboto-Regular.woff2") format("woff2")}@font-face{font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;src:local("glyphicons-halflings-regular"),url("../fonts/glyphicons-halflings-regular.woff2") format("woff2")}@font-face{font-family:"Blambot Casual";src:local("Blambot-Casual"),url("../fonts/Blambot-Casual-Regular.woff2") format("woff2")}@font-face{font-family:HPPHumblescratch;src:local("HPPHumblescratch"),url("../fonts/hpphumblescratch-webfont.woff2") format("woff2")}@keyframes kf-fade-out{from{opacity:1}to{opacity:0}}.night-mode .statgen .statgen-shared__ipt[readonly]{background-color:#3a3a3a}.night-mode .statgen .statgen-rolled__wrp-results{border-color:rgba(85,85,85,.6274509804)}.night-mode .statgen .statgen-pb__ipt-budget--error{border-color:red}.night-mode .statgen .statgen-asi__row{border-bottom:1px solid rgba(85,85,85,.6274509804)}.night-mode .statgen .statgen-asi__cell--top{border-color:#555}@media screen and (width <= 991px){.viewport-wrapper{bottom:0;height:100vh;min-height:0}}.container--main{min-width:420px}/*# sourceMappingURL=statgen-bundle.css.map */
|
||||||
|
|||||||
@@ -82,14 +82,14 @@
|
|||||||
<div id="lst__search-glass" class="lst__wrp-search-glass no-events ve-flex-vh-center"><span class="glyphicon glyphicon-search"></span></div>
|
<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 class="lst__wrp-search-visible no-events ve-flex-vh-center"></div>
|
||||||
</div>
|
</div>
|
||||||
<button class="btn btn-default" id="reset">Reset</button>
|
<button type="button" class="btn btn-default" id="reset">Reset</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="filtertools" class="input-group input-group--bottom ve-flex no-shrink">
|
<div id="filtertools" class="input-group input-group--bottom ve-flex no-shrink">
|
||||||
<button class="ve-col-2 sort btn btn-default btn-xs" data-sort="type">Type</button>
|
<button type="button" class="ve-col-2 sort btn btn-default btn-xs" data-sort="type">Type</button>
|
||||||
<button class="ve-col-2 sort btn btn-default btn-xs" data-sort="subType">Subtype</button>
|
<button type="button" class="ve-col-2 sort btn btn-default btn-xs" data-sort="subType">Subtype</button>
|
||||||
<button class="ve-col-6 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
<button type="button" class="ve-col-6 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
||||||
<button class="sort btn btn-default btn-xs ve-grow" data-sort="source">Source</button>
|
<button type="button" class="sort btn btn-default btn-xs ve-grow" data-sort="source">Source</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="list" class="list list--stats"></div>
|
<div id="list" class="list list--stats"></div>
|
||||||
@@ -100,9 +100,9 @@
|
|||||||
<div id="contentwrapper" class="view-col">
|
<div id="contentwrapper" class="view-col">
|
||||||
<div id="sublistcontainer" class="sublist sublist--resizable no-print">
|
<div id="sublistcontainer" class="sublist sublist--resizable no-print">
|
||||||
<div id="sublistsort" class="btn-group sublist__wrp-cols">
|
<div id="sublistsort" class="btn-group sublist__wrp-cols">
|
||||||
<button class="ve-col-2 sort btn btn-default btn-xs" data-sort="type">Type</button>
|
<button type="button" class="ve-col-2 sort btn btn-default btn-xs" data-sort="type">Type</button>
|
||||||
<button class="ve-col-2 sort btn btn-default btn-xs" data-sort="subType">Subtype</button>
|
<button type="button" class="ve-col-2 sort btn btn-default btn-xs" data-sort="subType">Subtype</button>
|
||||||
<button class="ve-col-8 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
<button type="button" class="ve-col-8 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="sublist" class="list"></div>
|
<div id="sublist" class="list"></div>
|
||||||
@@ -121,7 +121,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="ve-text-center mt-2 no-print">
|
<div class="ve-text-center mt-2 no-print">
|
||||||
<button class="btn btn-xs btn-info" id="manage-brew">Manage Homebrew</button>
|
<button type="button" class="btn btn-xs btn-info" id="manage-brew">Manage Homebrew</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -5893,7 +5893,7 @@
|
|||||||
],
|
],
|
||||||
[
|
[
|
||||||
"3",
|
"3",
|
||||||
"The creature's eyes become beacons, filling a 15- foot cone with {@quickref Vision and Light||2||dim light} when they're open."
|
"The creature's eyes become beacons, filling a 15-foot cone with {@quickref Vision and Light||2||dim light} when they're open."
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"4",
|
"4",
|
||||||
|
|||||||
@@ -7,6 +7,9 @@
|
|||||||
"MTF"
|
"MTF"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"internalCopies": [
|
||||||
|
"monster"
|
||||||
|
],
|
||||||
"otherSources": {
|
"otherSources": {
|
||||||
"monster": {
|
"monster": {
|
||||||
"MM": "BGDIA",
|
"MM": "BGDIA",
|
||||||
@@ -16,10 +19,7 @@
|
|||||||
"RoT": "BGDIA",
|
"RoT": "BGDIA",
|
||||||
"DMG": "BGDIA"
|
"DMG": "BGDIA"
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
"internalCopies": [
|
|
||||||
"monster"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"monster": [
|
"monster": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,10 @@
|
|||||||
{
|
{
|
||||||
"_meta": {
|
"_meta": {
|
||||||
|
"dependencies": {
|
||||||
|
"monster": [
|
||||||
|
"MM"
|
||||||
|
]
|
||||||
|
},
|
||||||
"otherSources": {
|
"otherSources": {
|
||||||
"monster": {
|
"monster": {
|
||||||
"DMG": "BMT",
|
"DMG": "BMT",
|
||||||
@@ -10,11 +15,6 @@
|
|||||||
"BAM": "BMT",
|
"BAM": "BMT",
|
||||||
"MOT": "BMT"
|
"MOT": "BMT"
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"monster": [
|
|
||||||
"MM"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"monster": [
|
"monster": [
|
||||||
|
|||||||
@@ -5,15 +5,15 @@
|
|||||||
"MM"
|
"MM"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"internalCopies": [
|
||||||
|
"monster"
|
||||||
|
],
|
||||||
"otherSources": {
|
"otherSources": {
|
||||||
"monster": {
|
"monster": {
|
||||||
"MM": "CRCotN",
|
"MM": "CRCotN",
|
||||||
"EGW": "CRCotN"
|
"EGW": "CRCotN"
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
"internalCopies": [
|
|
||||||
"monster"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"monster": [
|
"monster": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -5,14 +5,14 @@
|
|||||||
"MM"
|
"MM"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"internalCopies": [
|
||||||
|
"monster"
|
||||||
|
],
|
||||||
"otherSources": {
|
"otherSources": {
|
||||||
"monster": {
|
"monster": {
|
||||||
"MM": "DoSI"
|
"MM": "DoSI"
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
"internalCopies": [
|
|
||||||
"monster"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"monster": [
|
"monster": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -5,15 +5,15 @@
|
|||||||
"MM"
|
"MM"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"internalCopies": [
|
||||||
|
"monster"
|
||||||
|
],
|
||||||
"otherSources": {
|
"otherSources": {
|
||||||
"monster": {
|
"monster": {
|
||||||
"MM": "EGW",
|
"MM": "EGW",
|
||||||
"TftYP": "EGW"
|
"TftYP": "EGW"
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
"internalCopies": [
|
|
||||||
"monster"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"monster": [
|
"monster": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
{
|
{
|
||||||
"_meta": {
|
"_meta": {
|
||||||
|
"dependencies": {
|
||||||
|
"monster": [
|
||||||
|
"MM"
|
||||||
|
]
|
||||||
|
},
|
||||||
"otherSources": {
|
"otherSources": {
|
||||||
"monster": {
|
"monster": {
|
||||||
"MM": "ERLW",
|
"MM": "ERLW",
|
||||||
"VGM": "ERLW",
|
"VGM": "ERLW",
|
||||||
"TCE": "ERLW"
|
"TCE": "ERLW"
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"monster": [
|
|
||||||
"MM"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"monster": [
|
"monster": [
|
||||||
|
|||||||
@@ -10616,7 +10616,7 @@
|
|||||||
{
|
{
|
||||||
"name": "Storm Breath {@recharge 5}",
|
"name": "Storm Breath {@recharge 5}",
|
||||||
"entries": [
|
"entries": [
|
||||||
"The stormborn ithjar exhales a 30- foot cone of lightning and thunder. Each creature in that area must make a {@dc 16} Dexterity saving throw. On a failure, a creature takes 31 ({@damage 7d8}) lightning damage and 31 ({@damage 7d8}) thunder damage and falls {@condition prone}. If the save succeeds, the creature takes half the lightning and thunder damage and doesn't fall {@condition prone}. The discharge of this breath weapon is audible for 1 mile outside and 300 feet inside."
|
"The stormborn ithjar exhales a 30-foot cone of lightning and thunder. Each creature in that area must make a {@dc 16} Dexterity saving throw. On a failure, a creature takes 31 ({@damage 7d8}) lightning damage and 31 ({@damage 7d8}) thunder damage and falls {@condition prone}. If the save succeeds, the creature takes half the lightning and thunder damage and doesn't fall {@condition prone}. The discharge of this breath weapon is audible for 1 mile outside and 300 feet inside."
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -2766,6 +2766,7 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"tokenCredit": "Andrea Mazzocchetti",
|
||||||
"attachedItems": [
|
"attachedItems": [
|
||||||
"club|phb"
|
"club|phb"
|
||||||
],
|
],
|
||||||
@@ -2776,6 +2777,7 @@
|
|||||||
"MLW",
|
"MLW",
|
||||||
"MW"
|
"MW"
|
||||||
],
|
],
|
||||||
|
"hasToken": true,
|
||||||
"hasFluff": true
|
"hasFluff": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -3950,6 +3952,7 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"tokenCredit": "Anna Christenson",
|
||||||
"attachedItems": [
|
"attachedItems": [
|
||||||
"rapier|phb"
|
"rapier|phb"
|
||||||
],
|
],
|
||||||
@@ -3967,6 +3970,7 @@
|
|||||||
"MLW",
|
"MLW",
|
||||||
"MW"
|
"MW"
|
||||||
],
|
],
|
||||||
|
"hasToken": true,
|
||||||
"hasFluff": true
|
"hasFluff": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -4489,6 +4493,7 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"tokenCredit": "Aireesse",
|
||||||
"attachedItems": [
|
"attachedItems": [
|
||||||
"club|phb"
|
"club|phb"
|
||||||
],
|
],
|
||||||
@@ -4503,6 +4508,7 @@
|
|||||||
"MLW",
|
"MLW",
|
||||||
"MW"
|
"MW"
|
||||||
],
|
],
|
||||||
|
"hasToken": true,
|
||||||
"hasFluff": true
|
"hasFluff": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -4811,6 +4817,7 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"tokenCredit": "Ubergank",
|
||||||
"attachedItems": [
|
"attachedItems": [
|
||||||
"club|phb"
|
"club|phb"
|
||||||
],
|
],
|
||||||
@@ -4826,6 +4833,7 @@
|
|||||||
"MLW",
|
"MLW",
|
||||||
"MW"
|
"MW"
|
||||||
],
|
],
|
||||||
|
"hasToken": true,
|
||||||
"hasFluff": true
|
"hasFluff": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -6622,6 +6630,7 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"tokenCredit": "Jaqdaw",
|
||||||
"attachedItems": [
|
"attachedItems": [
|
||||||
"club|phb"
|
"club|phb"
|
||||||
],
|
],
|
||||||
@@ -6637,6 +6646,7 @@
|
|||||||
"MLW",
|
"MLW",
|
||||||
"MW"
|
"MW"
|
||||||
],
|
],
|
||||||
|
"hasToken": true,
|
||||||
"hasFluff": true
|
"hasFluff": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -8407,6 +8417,7 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"tokenCredit": "Kiruko_Kun",
|
||||||
"attachedItems": [
|
"attachedItems": [
|
||||||
"rapier|phb"
|
"rapier|phb"
|
||||||
],
|
],
|
||||||
@@ -8424,6 +8435,7 @@
|
|||||||
"MLW",
|
"MLW",
|
||||||
"MW"
|
"MW"
|
||||||
],
|
],
|
||||||
|
"hasToken": true,
|
||||||
"hasFluff": true
|
"hasFluff": true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -6,6 +6,9 @@
|
|||||||
"ToA"
|
"ToA"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"internalCopies": [
|
||||||
|
"monster"
|
||||||
|
],
|
||||||
"otherSources": {
|
"otherSources": {
|
||||||
"monster": {
|
"monster": {
|
||||||
"MM": "IDRotF",
|
"MM": "IDRotF",
|
||||||
@@ -13,10 +16,7 @@
|
|||||||
"SKT": "IDRotF",
|
"SKT": "IDRotF",
|
||||||
"VRGR": "IDRotF"
|
"VRGR": "IDRotF"
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
"internalCopies": [
|
|
||||||
"monster"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"monster": [
|
"monster": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -7,6 +7,9 @@
|
|||||||
"VGM"
|
"VGM"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"internalCopies": [
|
||||||
|
"monster"
|
||||||
|
],
|
||||||
"otherSources": {
|
"otherSources": {
|
||||||
"monster": {
|
"monster": {
|
||||||
"MM": "IMR",
|
"MM": "IMR",
|
||||||
@@ -19,10 +22,7 @@
|
|||||||
"LLK": "IMR",
|
"LLK": "IMR",
|
||||||
"SKT": "IMR"
|
"SKT": "IMR"
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
"internalCopies": [
|
|
||||||
"monster"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"monster": [
|
"monster": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -5,14 +5,14 @@
|
|||||||
"MM"
|
"MM"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"internalCopies": [
|
||||||
|
"monster"
|
||||||
|
],
|
||||||
"otherSources": {
|
"otherSources": {
|
||||||
"monster": {
|
"monster": {
|
||||||
"MM": "JttRC"
|
"MM": "JttRC"
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
"internalCopies": [
|
|
||||||
"monster"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"monster": [
|
"monster": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -753,7 +753,9 @@
|
|||||||
"As a bonus action on its first turn in combat, the helmed horror conjures a longsword-sized blade of fire, which appears in its free hand. This sword disappears in a cloud of smoke when the helmed horror drops to 0 hit points."
|
"As a bonus action on its first turn in combat, the helmed horror conjures a longsword-sized blade of fire, which appears in its free hand. This sword disappears in a cloud of smoke when the helmed horror drops to 0 hit points."
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"tokenCredit": "David Calabrese",
|
||||||
|
"hasToken": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Dr. Cassee Dannell",
|
"name": "Dr. Cassee Dannell",
|
||||||
|
|||||||
@@ -397,7 +397,7 @@
|
|||||||
{
|
{
|
||||||
"name": "Pseudopod",
|
"name": "Pseudopod",
|
||||||
"entries": [
|
"entries": [
|
||||||
"{@atk mw} {@hit 7} to hit, reach 5 ft., one target. {@h}7 ({@damage 2d6 + 4}) bludgeoning damage plus 7 ({@damage 2d6}) psychic damage."
|
"{@atk mw} {@hit 7} to hit, reach 5 ft., one target. {@h}11 ({@damage 2d6 + 4}) bludgeoning damage plus 7 ({@damage 2d6}) psychic damage."
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -26907,7 +26907,7 @@
|
|||||||
{
|
{
|
||||||
"name": "Acid Breath {@recharge 5}",
|
"name": "Acid Breath {@recharge 5}",
|
||||||
"entries": [
|
"entries": [
|
||||||
"The neothelid exhales acid in a 60- foot cone. Each creature in that area must make a {@dc 18} Dexterity saving throw, taking 35 ({@damage 10d6}) acid damage on a failed save, or half as much damage on a successful one."
|
"The neothelid exhales acid in a 60-foot cone. Each creature in that area must make a {@dc 18} Dexterity saving throw, taking 35 ({@damage 10d6}) acid damage on a failed save, or half as much damage on a successful one."
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -31151,7 +31151,7 @@
|
|||||||
],
|
],
|
||||||
[
|
[
|
||||||
"21\u201325",
|
"21\u201325",
|
||||||
"The target's eyes become beacons, filling a 15- foot cone with dim light when they are open."
|
"The target's eyes become beacons, filling a 15-foot cone with dim light when they are open."
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"26\u201330",
|
"26\u201330",
|
||||||
|
|||||||
@@ -6,14 +6,14 @@
|
|||||||
"MTF"
|
"MTF"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"internalCopies": [
|
||||||
|
"monster"
|
||||||
|
],
|
||||||
"otherSources": {
|
"otherSources": {
|
||||||
"monster": {
|
"monster": {
|
||||||
"MTF": "OotA"
|
"MTF": "OotA"
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
"internalCopies": [
|
|
||||||
"monster"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"monster": [
|
"monster": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -5,6 +5,9 @@
|
|||||||
"MM"
|
"MM"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"internalCopies": [
|
||||||
|
"monster"
|
||||||
|
],
|
||||||
"otherSources": {
|
"otherSources": {
|
||||||
"monster": {
|
"monster": {
|
||||||
"MM": "PaBTSO",
|
"MM": "PaBTSO",
|
||||||
@@ -12,10 +15,7 @@
|
|||||||
"MOT": "PaBTSO",
|
"MOT": "PaBTSO",
|
||||||
"MPMM": "PaBTSO"
|
"MPMM": "PaBTSO"
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
"internalCopies": [
|
|
||||||
"monster"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"monster": [
|
"monster": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
{
|
{
|
||||||
"_meta": {
|
"_meta": {
|
||||||
|
"dependencies": {
|
||||||
|
"monster": [
|
||||||
|
"MM"
|
||||||
|
]
|
||||||
|
},
|
||||||
"otherSources": {
|
"otherSources": {
|
||||||
"monster": {
|
"monster": {
|
||||||
"MM": "RMBRE",
|
"MM": "RMBRE",
|
||||||
"LMoP": "RMBRE"
|
"LMoP": "RMBRE"
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"monster": [
|
|
||||||
"MM"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"monster": [
|
"monster": [
|
||||||
|
|||||||
@@ -392,7 +392,7 @@
|
|||||||
{
|
{
|
||||||
"name": "Lightning Breath",
|
"name": "Lightning Breath",
|
||||||
"entries": [
|
"entries": [
|
||||||
"Lhammaruntosz exhales lightning in a 90- foot line that is 5 feet wide. Each creature in that line must make a {@dc 19} Dexterity saving throw, taking 66 ({@damage 12d10}) lightning damage on a failed save, or half as much damage on a successful one."
|
"Lhammaruntosz exhales lightning in a 90-foot line that is 5 feet wide. Each creature in that line must make a {@dc 19} Dexterity saving throw, taking 66 ({@damage 12d10}) lightning damage on a failed save, or half as much damage on a successful one."
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
{
|
{
|
||||||
"_meta": {
|
"_meta": {
|
||||||
|
"dependencies": {
|
||||||
|
"monster": [
|
||||||
|
"MM"
|
||||||
|
]
|
||||||
|
},
|
||||||
"otherSources": {
|
"otherSources": {
|
||||||
"monster": {
|
"monster": {
|
||||||
"MM": "TCE",
|
"MM": "TCE",
|
||||||
"DMG": "TCE"
|
"DMG": "TCE"
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"monster": [
|
|
||||||
"MM"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"monster": [
|
"monster": [
|
||||||
|
|||||||
58998
data/bestiary/bestiary-tob1-2023.json
Normal file
58998
data/bestiary/bestiary-tob1-2023.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,17 +1,17 @@
|
|||||||
{
|
{
|
||||||
"_meta": {
|
"_meta": {
|
||||||
|
"dependencies": {
|
||||||
|
"monster": [
|
||||||
|
"MM",
|
||||||
|
"MPP"
|
||||||
|
]
|
||||||
|
},
|
||||||
"otherSources": {
|
"otherSources": {
|
||||||
"monster": {
|
"monster": {
|
||||||
"MPP": "ToFW",
|
"MPP": "ToFW",
|
||||||
"MM": "ToFW",
|
"MM": "ToFW",
|
||||||
"DMG": "ToFW"
|
"DMG": "ToFW"
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"monster": [
|
|
||||||
"MM",
|
|
||||||
"MPP"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"monster": [
|
"monster": [
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
{
|
{
|
||||||
"_meta": {
|
"_meta": {
|
||||||
"otherSources": {
|
|
||||||
"monster": {
|
|
||||||
"MTF": "TTP"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"monster": [
|
"monster": [
|
||||||
"MM"
|
"MM"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
"otherSources": {
|
||||||
|
"monster": {
|
||||||
|
"MTF": "TTP"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"monster": [
|
"monster": [
|
||||||
|
|||||||
@@ -1,13 +1,5 @@
|
|||||||
{
|
{
|
||||||
"_meta": {
|
"_meta": {
|
||||||
"otherSources": {
|
|
||||||
"monster": {
|
|
||||||
"MM": "WBtW",
|
|
||||||
"VGM": "WBtW",
|
|
||||||
"GoS": "WBtW",
|
|
||||||
"CoS": "WBtW"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"monster": [
|
"monster": [
|
||||||
"MM"
|
"MM"
|
||||||
@@ -15,7 +7,15 @@
|
|||||||
},
|
},
|
||||||
"internalCopies": [
|
"internalCopies": [
|
||||||
"monster"
|
"monster"
|
||||||
]
|
],
|
||||||
|
"otherSources": {
|
||||||
|
"monster": {
|
||||||
|
"MM": "WBtW",
|
||||||
|
"VGM": "WBtW",
|
||||||
|
"GoS": "WBtW",
|
||||||
|
"CoS": "WBtW"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"monster": [
|
"monster": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -8,16 +8,16 @@
|
|||||||
"MTF"
|
"MTF"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"internalCopies": [
|
||||||
|
"monster"
|
||||||
|
],
|
||||||
"otherSources": {
|
"otherSources": {
|
||||||
"monster": {
|
"monster": {
|
||||||
"MM": "WDMM",
|
"MM": "WDMM",
|
||||||
"VGM": "WDMM",
|
"VGM": "WDMM",
|
||||||
"MTF": "WDMM"
|
"MTF": "WDMM"
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
"internalCopies": [
|
|
||||||
"monster"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"monster": [
|
"monster": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,70 @@
|
|||||||
{
|
{
|
||||||
|
"_meta": {
|
||||||
|
"dependencies": {
|
||||||
|
"monster": [
|
||||||
|
"MM"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
"monster": [
|
"monster": [
|
||||||
|
{
|
||||||
|
"name": "Hound of Ill Omen",
|
||||||
|
"source": "XGE",
|
||||||
|
"page": 50,
|
||||||
|
"summonedByClass": "Sorcerer|PHB",
|
||||||
|
"_copy": {
|
||||||
|
"name": "Dire Wolf",
|
||||||
|
"source": "MM",
|
||||||
|
"_mod": {
|
||||||
|
"*": {
|
||||||
|
"mode": "replaceTxt",
|
||||||
|
"replace": "\\bwolf\\b",
|
||||||
|
"with": "hound"
|
||||||
|
},
|
||||||
|
"trait": [
|
||||||
|
{
|
||||||
|
"mode": "appendArr",
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"name": "Cloak of Shadows",
|
||||||
|
"entries": [
|
||||||
|
"The hound appears with a number of temporary hit points equal to half your sorcerer level."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Incorporeal Movement",
|
||||||
|
"entries": [
|
||||||
|
"The hound can move through other creatures and objects as if they were {@quickref difficult terrain||3}. The hound takes 5 force damage if it ends its turn inside an object."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Omen Sight",
|
||||||
|
"entries": [
|
||||||
|
"At the start of its turn, the hound automatically knows its target's location. If the target was hidden, it is no longer hidden from the hound."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ever at Your Heels",
|
||||||
|
"entries": [
|
||||||
|
"On its turn, it can move only toward its target by the most direct route, and it can use its action only to attack its target. The hound can make opportunity attacks, but only against its target. Additionally, while the hound is within 5 feet of the target, the target has disadvantage on saving throws against any spell you cast. The hound disappears if it is reduced to 0 hit points, if its target is reduced to 0 hit points, or after 5 minutes."
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"size": [
|
||||||
|
"M"
|
||||||
|
],
|
||||||
|
"type": "monstrosity",
|
||||||
|
"traitTags": [
|
||||||
|
"Incorporeal Movement",
|
||||||
|
"Keen Senses",
|
||||||
|
"Pack Tactics"
|
||||||
|
],
|
||||||
|
"hasToken": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "Tiny Servant",
|
"name": "Tiny Servant",
|
||||||
"source": "XGE",
|
"source": "XGE",
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
{
|
{
|
||||||
"_meta": {
|
"_meta": {
|
||||||
"internalCopies": [
|
|
||||||
"monsterFluff"
|
|
||||||
],
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"monsterFluff": [
|
"monsterFluff": [
|
||||||
"MM"
|
"MM"
|
||||||
]
|
]
|
||||||
}
|
},
|
||||||
|
"internalCopies": [
|
||||||
|
"monsterFluff"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"monsterFluff": [
|
"monsterFluff": [
|
||||||
{
|
{
|
||||||
|
|||||||
19306
data/bestiary/fluff-bestiary-tob1-2023.json
Normal file
19306
data/bestiary/fluff-bestiary-tob1-2023.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,13 +1,13 @@
|
|||||||
{
|
{
|
||||||
"_meta": {
|
"_meta": {
|
||||||
"internalCopies": [
|
|
||||||
"monsterFluff"
|
|
||||||
],
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"monsterFluff": [
|
"monsterFluff": [
|
||||||
"MM"
|
"MM"
|
||||||
]
|
]
|
||||||
}
|
},
|
||||||
|
"internalCopies": [
|
||||||
|
"monsterFluff"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"monsterFluff": [
|
"monsterFluff": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -74,6 +74,7 @@
|
|||||||
"TTP": "fluff-bestiary-ttp.json",
|
"TTP": "fluff-bestiary-ttp.json",
|
||||||
"TftYP": "fluff-bestiary-tftyp.json",
|
"TftYP": "fluff-bestiary-tftyp.json",
|
||||||
"ToA": "fluff-bestiary-toa.json",
|
"ToA": "fluff-bestiary-toa.json",
|
||||||
|
"ToB1-2023": "fluff-bestiary-tob1-2023.json",
|
||||||
"ToFW": "fluff-bestiary-tofw.json",
|
"ToFW": "fluff-bestiary-tofw.json",
|
||||||
"VD": "fluff-bestiary-vd.json",
|
"VD": "fluff-bestiary-vd.json",
|
||||||
"VGM": "fluff-bestiary-vgm.json",
|
"VGM": "fluff-bestiary-vgm.json",
|
||||||
|
|||||||
@@ -3,6 +3,9 @@
|
|||||||
{
|
{
|
||||||
"name": "Beast of the Land",
|
"name": "Beast of the Land",
|
||||||
"source": "TCE",
|
"source": "TCE",
|
||||||
|
"prototypeToken": {
|
||||||
|
"actorLink": true
|
||||||
|
},
|
||||||
"effects": [
|
"effects": [
|
||||||
{
|
{
|
||||||
"name": "Ranger's Leadership",
|
"name": "Ranger's Leadership",
|
||||||
@@ -19,6 +22,9 @@
|
|||||||
{
|
{
|
||||||
"name": "Beast of the Sea",
|
"name": "Beast of the Sea",
|
||||||
"source": "TCE",
|
"source": "TCE",
|
||||||
|
"prototypeToken": {
|
||||||
|
"actorLink": true
|
||||||
|
},
|
||||||
"effects": [
|
"effects": [
|
||||||
{
|
{
|
||||||
"name": "Ranger's Leadership",
|
"name": "Ranger's Leadership",
|
||||||
@@ -35,6 +41,9 @@
|
|||||||
{
|
{
|
||||||
"name": "Beast of the Sky",
|
"name": "Beast of the Sky",
|
||||||
"source": "TCE",
|
"source": "TCE",
|
||||||
|
"prototypeToken": {
|
||||||
|
"actorLink": true
|
||||||
|
},
|
||||||
"effects": [
|
"effects": [
|
||||||
{
|
{
|
||||||
"name": "Ranger's Leadership",
|
"name": "Ranger's Leadership",
|
||||||
@@ -72,6 +81,9 @@
|
|||||||
{
|
{
|
||||||
"name": "Drake Companion",
|
"name": "Drake Companion",
|
||||||
"source": "FTD",
|
"source": "FTD",
|
||||||
|
"prototypeToken": {
|
||||||
|
"actorLink": true
|
||||||
|
},
|
||||||
"effects": [
|
"effects": [
|
||||||
{
|
{
|
||||||
"name": "Ranger's Leadership",
|
"name": "Ranger's Leadership",
|
||||||
@@ -108,6 +120,9 @@
|
|||||||
{
|
{
|
||||||
"name": "Homunculus Servant",
|
"name": "Homunculus Servant",
|
||||||
"source": "TCE",
|
"source": "TCE",
|
||||||
|
"prototypeToken": {
|
||||||
|
"actorLink": true
|
||||||
|
},
|
||||||
"effects": [
|
"effects": [
|
||||||
{
|
{
|
||||||
"name": "Artificer's Leadership",
|
"name": "Artificer's Leadership",
|
||||||
@@ -139,6 +154,9 @@
|
|||||||
{
|
{
|
||||||
"name": "Steel Defender",
|
"name": "Steel Defender",
|
||||||
"source": "TCE",
|
"source": "TCE",
|
||||||
|
"prototypeToken": {
|
||||||
|
"actorLink": true
|
||||||
|
},
|
||||||
"effects": [
|
"effects": [
|
||||||
{
|
{
|
||||||
"name": "Artificer's Leadership",
|
"name": "Artificer's Leadership",
|
||||||
|
|||||||
@@ -87,6 +87,7 @@
|
|||||||
"TTP": "bestiary-ttp.json",
|
"TTP": "bestiary-ttp.json",
|
||||||
"TftYP": "bestiary-tftyp.json",
|
"TftYP": "bestiary-tftyp.json",
|
||||||
"ToA": "bestiary-toa.json",
|
"ToA": "bestiary-toa.json",
|
||||||
|
"ToB1-2023": "bestiary-tob1-2023.json",
|
||||||
"ToFW": "bestiary-tofw.json",
|
"ToFW": "bestiary-tofw.json",
|
||||||
"VD": "bestiary-vd.json",
|
"VD": "bestiary-vd.json",
|
||||||
"VGM": "bestiary-vgm.json",
|
"VGM": "bestiary-vgm.json",
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
904
data/book/book-tob1-2023.json
Normal file
904
data/book/book-tob1-2023.json
Normal file
@@ -0,0 +1,904 @@
|
|||||||
|
{
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"type": "section",
|
||||||
|
"name": "Introduction",
|
||||||
|
"id": "000",
|
||||||
|
"entries": [
|
||||||
|
"Written primarily for game masters, this book features over 400 new creatures to use in your games. For players, this book features a handful of new familiars and beasts perfect for characters seeking companions or druids seeking new beasts for Wild Shape. If you are a player reading this book, be sure to check with your game master before selecting any of these creatures as familiars or companions or for Wild Shape.",
|
||||||
|
{
|
||||||
|
"type": "section",
|
||||||
|
"name": "Using this Book",
|
||||||
|
"id": "001",
|
||||||
|
"entries": [
|
||||||
|
"To use the creatures in this book, you'll need the core rulebooks of the 5th edition of the world's greatest roleplaying game or the {@i System Reference Document 5.1}. Spell, disease, and magic item names that appear in {@i italics} without a page or book reference can be found in those rulebooks or in the {@i System Reference Document 5.1}. Some creatures in this book contain references to the Midgard Campaign Setting, but that setting isn't required to use the creatures in this book. The extra setting information exists simply to bring additional flavor or lore to the creatures.",
|
||||||
|
{
|
||||||
|
"type": "entries",
|
||||||
|
"name": "Alignment and Creature Behavior",
|
||||||
|
"id": "002",
|
||||||
|
"entries": [
|
||||||
|
"Each creature in this book lists an alignment to provide a general guideline for that creature's typical behaviors, often based on its preferred prey or its most commonly observed interactions with other sentient creatures. A creature whose alignment is listed as \"unaligned\" is either created or controlled by another, such as a construct, or operates on more primal or instinctive behavior, such as a rat or tiger. Not every example of a particular creature exhibits behaviors consistent with the creature's listed alignment. If you want an evil {@creature valkyrie|ToB1-2023} or a lawful {@creature kikimora|ToB1-2023} in your world, go for it! Some of the best stories revolve around creatures who break the preconceptions surrounding them, and we encourage you to use the creatures in this book in whatever ways best fit your worlds and the stories you want to tell in them."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "entries",
|
||||||
|
"name": "Languages",
|
||||||
|
"id": "003",
|
||||||
|
"entries": [
|
||||||
|
"Several creatures in this book know or speak the Umbral or Void Speech languages, which can be substituted for other languages if these languages don't fit in your world.",
|
||||||
|
{
|
||||||
|
"type": "entries",
|
||||||
|
"id": "004",
|
||||||
|
"entries": [
|
||||||
|
{
|
||||||
|
"type": "entries",
|
||||||
|
"name": "Umbral",
|
||||||
|
"id": "005",
|
||||||
|
"entries": [
|
||||||
|
"This is the language of the {@creature shadow fey|ToB1-2023} and other denizens of planes of shadow and darkness. It is a corrupted dialect of Elvish, and those who speak it gain a +1 bonus to one Dexterity ({@skill Stealth}) check each day. If Umbral isn't a language in your world, you can substitute Umbral with Elvish or Undercommon."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "entries",
|
||||||
|
"name": "Void Speech",
|
||||||
|
"id": "006",
|
||||||
|
"entries": [
|
||||||
|
"This is the language of the Outer Darkness in the Midgard Campaign Setting. It is spoken by vile things that are malevolent toward humanoids and their allies and by those who seek to bring about the ruinous apocalypse of the dark gods. If Void Speech isn't a language in your world, you can substitute Void Speech with any ancient language with an evil reputation or with Deep Speech."
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "entries",
|
||||||
|
"name": "Touch of Iron",
|
||||||
|
"id": "007",
|
||||||
|
"entries": [
|
||||||
|
{
|
||||||
|
"type": "image",
|
||||||
|
"href": {
|
||||||
|
"type": "internal",
|
||||||
|
"path": "book/ToB1-2023/000-00-001.feral-hunter-fey.webp"
|
||||||
|
},
|
||||||
|
"width": 850,
|
||||||
|
"height": 1153
|
||||||
|
},
|
||||||
|
"Several fey creatures in this book have resistance or immunity to attacks from weapons that aren't made with cold iron. This design choice comes from folklore, where cold-wrought iron was believed to be capable of repelling or harming fairies, {@creature Ghost||ghosts}, witches, and other supernatural creatures. In this book, lords and ladies of the fey courts are timeless creatures, inured to many of the world's threats\u2014except weapons of cold-wrought iron. This metal undoes the very fabric of a fey creature's life as it blights their ageless flesh.",
|
||||||
|
{
|
||||||
|
"type": "entries",
|
||||||
|
"id": "008",
|
||||||
|
"entries": [
|
||||||
|
{
|
||||||
|
"type": "entries",
|
||||||
|
"name": "Cold Iron Weaponry",
|
||||||
|
"id": "009",
|
||||||
|
"entries": [
|
||||||
|
"A cold iron weapon is treated as magical when used against any fey creature, and it is the only weapon with any hope of harming the most powerful fey lords and ladies. However, cold iron weapons are difficult to construct. The skill and material required to produce such a weapon doubles its price or adds 100 gp to the cost, whichever is more. Finding a smith with the skill to make a durable weapon without the aid of fire is always difficult\u2014and finding one with the courage to anger the fey courts may be even harder."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "entries",
|
||||||
|
"name": "Substitutions for Cold Iron",
|
||||||
|
"id": "00a",
|
||||||
|
"entries": [
|
||||||
|
"If cold iron doesn't exist in your world, you can substitute this resistance or immunity with silver or adamantine, whichever you feel is most appropriate for that creature in your world."
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "section",
|
||||||
|
"name": "Refreshing a Classic",
|
||||||
|
"id": "00b",
|
||||||
|
"entries": [
|
||||||
|
{
|
||||||
|
"type": "quote",
|
||||||
|
"entries": [
|
||||||
|
"The world is full of monsters, and tabletop games teach us to face them\u2014and defeat them. There's a huge satisfaction in cutting a giant down to size or sending a malevolent dragon into a final dive from the heights. But what happens when we run out of monsters and the fear of them leaves us? What happens when the everyday {@creature Goblin||goblins} and dragons of our early years become overly familiar? Well, if you are Kobold Press, that's precisely the time to dream up new monsters.",
|
||||||
|
"This new printing of our very first hardcover monster book for 5th Edition provides dungeon vermin and world-shaking villains, and it does so with a small refresh of these monsters and improvement of the volume as a whole. The wisdom of years of play shows we could tighten here and errata there. In some cases, our understanding of both monster rules and monster stats has evolved over time. It was time to address that.",
|
||||||
|
"This 2023 edition also adds significant new art to strengthen the look and feel of these creatures, and it corrects several early errors and omissions, including the omission of reference tables of the monsters by Terrain and by Type. The Kobold Press team has also made lore changes; a {@creature Mithral Dragon Wyrmling|ToB1-2023|wyrmling version} of the mithral dragon is now available, along with an {@creature Ancient Cave Dragon|ToB1-2023|ancient version} of the cave dragon. Other new creatures include the {@creature planewatcher|ToB1-2023}, the {@creature Beheaded Vengeful Spirit|ToB1-2023|vengeful spirit}, and a couple others for you to discover. To make the makeover complete, we included rules material, like each monster's proficiency bonus, and we streamlined rules and game mechanics to improve the playability of many creatures.",
|
||||||
|
"How did we find room in this compendium for new dragon stats, new tables, and new art? Well, several monsters are in-game gods or demi-gods, and they really don't belong here as dungeon foes (Boreas and Mammon, for instance). Others that we created in 2016 have since gotten rules and stats from Wizards of the Coast (the Zaratan and Titivullus, for instance). And some simply belong in a very particular world (for instance, the Emperor of the Ghouls is central to the Midgard setting). To avoid confusion, we dropped these creatures. Finally, a few monsters were simply not getting much play, and they have been released back into the wilds. In all cases, the changes strengthen an already powerful volume of monsters, cementing its status as a legendary reference book for 5th Edition games.",
|
||||||
|
"Thanks to the continued play of tens of thousands of tabletop gamers, {@i Tome of Beasts} is back\u2014and fiercer than ever. So have at thee, beasts. This tome is ready to fuel great games and bring you true horrors and mayhem!"
|
||||||
|
],
|
||||||
|
"by": "Wolfgang Baur Kirkland, WA December, 2022"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "image",
|
||||||
|
"href": {
|
||||||
|
"type": "internal",
|
||||||
|
"path": "book/ToB1-2023/001-00-002.mordovermis-aberration.webp"
|
||||||
|
},
|
||||||
|
"width": 1700,
|
||||||
|
"height": 1325
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "section",
|
||||||
|
"name": "Monsters",
|
||||||
|
"id": "00c",
|
||||||
|
"entries": [
|
||||||
|
{
|
||||||
|
"type": "list",
|
||||||
|
"columns": 3,
|
||||||
|
"items": [
|
||||||
|
"{@creature Abominable Beauty|ToB1-2023}",
|
||||||
|
"{@creature Accursed Defiler|ToB1-2023}",
|
||||||
|
"{@creature Adult Cave Dragon|ToB1-2023}",
|
||||||
|
"{@creature Adult Flame Dragon|ToB1-2023}",
|
||||||
|
"{@creature Adult Mithral Dragon|ToB1-2023}",
|
||||||
|
"{@creature Adult Sea Dragon|ToB1-2023}",
|
||||||
|
"{@creature Adult Void Dragon|ToB1-2023}",
|
||||||
|
"{@creature Adult Wind Dragon|ToB1-2023}",
|
||||||
|
"{@creature Al-Aeshma Genie|ToB1-2023}",
|
||||||
|
"{@creature Ala|ToB1-2023}",
|
||||||
|
"{@creature Alehouse Drake|ToB1-2023}",
|
||||||
|
"{@creature Algorith|ToB1-2023}",
|
||||||
|
"{@creature Alseid|ToB1-2023}",
|
||||||
|
"{@creature Amphiptere|ToB1-2023}",
|
||||||
|
"{@creature Ancient Cave Dragon|ToB1-2023}",
|
||||||
|
"{@creature Ancient Flame Dragon|ToB1-2023}",
|
||||||
|
"{@creature Ancient Mithral Dragon|ToB1-2023}",
|
||||||
|
"{@creature Ancient Sea Dragon|ToB1-2023}",
|
||||||
|
"{@creature Ancient Titan|ToB1-2023}",
|
||||||
|
"{@creature Ancient Void Dragon|ToB1-2023}",
|
||||||
|
"{@creature Ancient Wind Dragon|ToB1-2023}",
|
||||||
|
"{@creature Angatra|ToB1-2023}",
|
||||||
|
"{@creature Angler Worm|ToB1-2023}",
|
||||||
|
"{@creature Annelidast|ToB1-2023}",
|
||||||
|
"{@creature Anubian|ToB1-2023}",
|
||||||
|
"{@creature Apau Perape Demon|ToB1-2023}",
|
||||||
|
"{@creature Arboreal Grappler|ToB1-2023}",
|
||||||
|
"{@creature Arcane Guardian|ToB1-2023}",
|
||||||
|
"{@creature Arch-Devil Ia'Affrat|ToB1-2023}",
|
||||||
|
"{@creature Aridni|ToB1-2023}",
|
||||||
|
"{@creature Arx|ToB1-2023}",
|
||||||
|
"{@creature Asanbosam|ToB1-2023}",
|
||||||
|
"{@creature Ash Drake|ToB1-2023}",
|
||||||
|
"{@creature Ashwalker|ToB1-2023}",
|
||||||
|
"{@creature Automata Devil|ToB1-2023}",
|
||||||
|
"{@creature Azza Gremlin|ToB1-2023}",
|
||||||
|
"{@creature Baba Yaga's Horsemen|ToB1-2023}",
|
||||||
|
"{@creature Bagiennik|ToB1-2023}",
|
||||||
|
"{@creature Bandit Lord|ToB1-2023}",
|
||||||
|
"{@creature Bastet Temple Cat|ToB1-2023}",
|
||||||
|
"{@creature Bear King|ToB1-2023}",
|
||||||
|
"{@creature Bearfolk|ToB1-2023}",
|
||||||
|
"{@creature Beggar Ghoul|ToB1-2023}",
|
||||||
|
"{@creature Beheaded Vengeful Spirit|ToB1-2023}",
|
||||||
|
"{@creature Behtu|ToB1-2023}",
|
||||||
|
"{@creature Beli|ToB1-2023}",
|
||||||
|
"{@creature Bereginyas|ToB1-2023}",
|
||||||
|
"{@creature Berstuc Demon|ToB1-2023}",
|
||||||
|
"{@creature Black Knight Commander|ToB1-2023}",
|
||||||
|
"{@creature Blemmyes|ToB1-2023}",
|
||||||
|
"{@creature Blood Hag|ToB1-2023}",
|
||||||
|
"{@creature Boloti|ToB1-2023}",
|
||||||
|
"{@creature Bone Collective|ToB1-2023}",
|
||||||
|
"{@creature Bone Crab|ToB1-2023}",
|
||||||
|
"{@creature Bone Swarm|ToB1-2023}",
|
||||||
|
"{@creature Bonepowder Ghoul|ToB1-2023}",
|
||||||
|
"{@creature Bouda|ToB1-2023}",
|
||||||
|
"{@creature Broodiken|ToB1-2023}",
|
||||||
|
"{@creature Bucca|ToB1-2023}",
|
||||||
|
"{@creature Bukavac|ToB1-2023}",
|
||||||
|
"{@creature Buraq|ToB1-2023}",
|
||||||
|
"{@creature Burrowling|ToB1-2023}",
|
||||||
|
"{@creature Cactid|ToB1-2023}",
|
||||||
|
"{@creature Cambium|ToB1-2023}",
|
||||||
|
"{@creature Carrion Beetle|ToB1-2023}",
|
||||||
|
"{@creature Caustic Charger|ToB1-2023}",
|
||||||
|
"{@creature Cave Dragon Wyrmling|ToB1-2023}",
|
||||||
|
"{@creature Cavelight Moss|ToB1-2023}",
|
||||||
|
"{@creature Chained Angel|ToB1-2023}",
|
||||||
|
"{@creature Chelicerae|ToB1-2023}",
|
||||||
|
"{@creature Chernomoi|ToB1-2023}",
|
||||||
|
"{@creature Child of the Briar|ToB1-2023}",
|
||||||
|
"{@creature Chort Devil|ToB1-2023}",
|
||||||
|
"{@creature Chronalmental|ToB1-2023}",
|
||||||
|
"{@creature Cikavak|ToB1-2023}",
|
||||||
|
"{@creature Citrullus|ToB1-2023}",
|
||||||
|
"{@creature City Watch Captain|ToB1-2023}",
|
||||||
|
"{@creature Clockwork Abomination|ToB1-2023}",
|
||||||
|
"{@creature Clockwork Beetle|ToB1-2023}",
|
||||||
|
"{@creature Clockwork Beetle Swarm|ToB1-2023}",
|
||||||
|
"{@creature Clockwork Hound|ToB1-2023}",
|
||||||
|
"{@creature Clockwork Huntsman|ToB1-2023}",
|
||||||
|
"{@creature Clockwork Myrmidon|ToB1-2023}",
|
||||||
|
"{@creature Clockwork Watchman|ToB1-2023}",
|
||||||
|
"{@creature Clockwork Weaving Spider|ToB1-2023}",
|
||||||
|
"{@creature Clurichaun|ToB1-2023}",
|
||||||
|
"{@creature Cobbleswarm|ToB1-2023}",
|
||||||
|
"{@creature Coral Drake|ToB1-2023}",
|
||||||
|
"{@creature Corpse Mound|ToB1-2023}",
|
||||||
|
"{@creature Corrupted Ushabti|ToB1-2023}",
|
||||||
|
"{@creature Corrupting Ooze|ToB1-2023}",
|
||||||
|
"{@creature Crimson Drake|ToB1-2023}",
|
||||||
|
"{@creature Crystalline Devil|ToB1-2023}",
|
||||||
|
"{@creature Darakhul|ToB1-2023}",
|
||||||
|
"{@creature Dau|ToB1-2023}",
|
||||||
|
"{@creature Death Butterfly Swarm|ToB1-2023}",
|
||||||
|
"{@creature Deathcap Myconid|ToB1-2023}",
|
||||||
|
"{@creature Deathwisp|ToB1-2023}",
|
||||||
|
"{@creature Deep Drake|ToB1-2023}",
|
||||||
|
"{@creature Deep One|ToB1-2023}",
|
||||||
|
"{@creature Deep One Archimandrite|ToB1-2023}",
|
||||||
|
"{@creature Deep One Priest|ToB1-2023}",
|
||||||
|
"{@creature Degenerate Titan|ToB1-2023}",
|
||||||
|
"{@creature Demon Lord Akyishigal|ToB1-2023}",
|
||||||
|
"{@creature Demon Lord Camazotz|ToB1-2023}",
|
||||||
|
"{@creature Demon Lord Mechuiti|ToB1-2023}",
|
||||||
|
"{@creature Demon Lord Qorgeth|ToB1-2023}",
|
||||||
|
"{@creature Derro Fetal Savant|ToB1-2023}",
|
||||||
|
"{@creature Derro Shadow Antipaladin|ToB1-2023}",
|
||||||
|
"{@creature Desert Giant|ToB1-2023}",
|
||||||
|
"{@creature Devilbound Gnome|ToB1-2023}",
|
||||||
|
"{@creature Dipsa|ToB1-2023}",
|
||||||
|
"{@creature Dissimortuum|ToB1-2023}",
|
||||||
|
"{@creature Dogmole|ToB1-2023}",
|
||||||
|
"{@creature Dogmole Juggernaut|ToB1-2023}",
|
||||||
|
"{@creature Domovoi|ToB1-2023}",
|
||||||
|
"{@creature Doppelrat|ToB1-2023}",
|
||||||
|
"{@creature Dorreq|ToB1-2023}",
|
||||||
|
"{@creature Dragon Eel|ToB1-2023}",
|
||||||
|
"{@creature Dragonleaf Tree|ToB1-2023}",
|
||||||
|
"{@creature Drakon|ToB1-2023}",
|
||||||
|
"{@creature Dream Eater|ToB1-2023}",
|
||||||
|
"{@creature Drowned Maiden|ToB1-2023}",
|
||||||
|
"{@creature Dullahan|ToB1-2023}",
|
||||||
|
"{@creature Dune Mimic|ToB1-2023}",
|
||||||
|
"{@creature Duskthorn Dryad|ToB1-2023}",
|
||||||
|
"{@creature Dust Goblin|ToB1-2023}",
|
||||||
|
"{@creature Dwarven Ringmage|ToB1-2023}",
|
||||||
|
"{@creature Eala|ToB1-2023}",
|
||||||
|
"{@creature Eater of Dust|ToB1-2023}",
|
||||||
|
"{@creature Edimmu|ToB1-2023}",
|
||||||
|
"{@creature Eel Hound|ToB1-2023}",
|
||||||
|
"{@creature Einherjar|ToB1-2023}",
|
||||||
|
"{@creature Elder Shadow Drake|ToB1-2023}",
|
||||||
|
"{@creature Elemental Locus|ToB1-2023}",
|
||||||
|
"{@creature Elvish Veteran Archer|ToB1-2023}",
|
||||||
|
"{@creature Emerald Eye|ToB1-2023}",
|
||||||
|
"{@creature Emerald Order Cult Leader|ToB1-2023}",
|
||||||
|
"{@creature Empty Cloak|ToB1-2023}",
|
||||||
|
"{@creature Eonic Drifter|ToB1-2023}",
|
||||||
|
"{@creature Erina|ToB1-2023}",
|
||||||
|
"{@creature Erina Defender|ToB1-2023}",
|
||||||
|
"{@creature Eye Golem|ToB1-2023}",
|
||||||
|
"{@creature Far Darrig|ToB1-2023}",
|
||||||
|
"{@creature Fate Eater|ToB1-2023}",
|
||||||
|
"{@creature Fear Smith|ToB1-2023}",
|
||||||
|
"{@creature Fellforged|ToB1-2023}",
|
||||||
|
"{@creature Fext|ToB1-2023}",
|
||||||
|
"{@creature Feyward Tree|ToB1-2023}",
|
||||||
|
"{@creature Fidele Angel|ToB1-2023}",
|
||||||
|
"{@creature Firebird|ToB1-2023}",
|
||||||
|
"{@creature Firegeist|ToB1-2023}",
|
||||||
|
"{@creature Flab Giant|ToB1-2023}",
|
||||||
|
"{@creature Flame Dragon Wyrmling|ToB1-2023}",
|
||||||
|
"{@creature Flutterflesh|ToB1-2023}",
|
||||||
|
"{@creature Folk of Leng|ToB1-2023}",
|
||||||
|
"{@creature Forest Marauder|ToB1-2023}",
|
||||||
|
"{@creature Fraughashar|ToB1-2023}",
|
||||||
|
"{@creature Frostveil|ToB1-2023}",
|
||||||
|
"{@creature Garroter Crab|ToB1-2023}",
|
||||||
|
"{@creature Gbahali|ToB1-2023}",
|
||||||
|
"{@creature Gearforged Templar|ToB1-2023}",
|
||||||
|
"{@creature Gerridae|ToB1-2023}",
|
||||||
|
"{@creature Ghost Knight|ToB1-2023}",
|
||||||
|
"{@creature Ghostwalk Spider|ToB1-2023}",
|
||||||
|
"{@creature Giant Ant|ToB1-2023}",
|
||||||
|
"{@creature Giant Ant Queen|ToB1-2023}",
|
||||||
|
"{@creature Gilded Devil|ToB1-2023}",
|
||||||
|
"{@creature Glass Gator|ToB1-2023}",
|
||||||
|
"{@creature Gnarljak|ToB1-2023}",
|
||||||
|
"{@creature Gnoll Havoc Runner|ToB1-2023}",
|
||||||
|
"{@creature Goat-Man|ToB1-2023}",
|
||||||
|
"{@creature Gray Thirster|ToB1-2023}",
|
||||||
|
"{@creature Greater Death Butterfly Swarm|ToB1-2023}",
|
||||||
|
"{@creature Greyfur|ToB1-2023}",
|
||||||
|
"{@creature Grim Jester|ToB1-2023}",
|
||||||
|
"{@creature Gug|ToB1-2023}",
|
||||||
|
"{@creature Gypsosphinx|ToB1-2023}",
|
||||||
|
"{@creature Haugbui|ToB1-2023}",
|
||||||
|
"{@creature Herald of Blood|ToB1-2023}",
|
||||||
|
"{@creature Herald of Darkness|ToB1-2023}",
|
||||||
|
"{@creature Hoard Golem|ToB1-2023}",
|
||||||
|
"{@creature Horakh|ToB1-2023}",
|
||||||
|
"{@creature Hound of the Night|ToB1-2023}",
|
||||||
|
"{@creature Hraesvelgr|ToB1-2023}",
|
||||||
|
"{@creature Hulking Whelp|ToB1-2023}",
|
||||||
|
"{@creature Hundun|ToB1-2023}",
|
||||||
|
"{@creature Ice Maiden|ToB1-2023}",
|
||||||
|
"{@creature Idolic Deity|ToB1-2023}",
|
||||||
|
"{@creature Imperial Ghoul|ToB1-2023}",
|
||||||
|
"{@creature Ink Devil|ToB1-2023}",
|
||||||
|
"{@creature Iron Ghoul|ToB1-2023}",
|
||||||
|
"{@creature Isonade|ToB1-2023}",
|
||||||
|
"{@creature J'ba Fofi Spider|ToB1-2023}",
|
||||||
|
"{@creature Jaculus|ToB1-2023}",
|
||||||
|
"{@creature Jotun|ToB1-2023}",
|
||||||
|
"{@creature Kalke|ToB1-2023}",
|
||||||
|
"{@creature Kikimora|ToB1-2023}",
|
||||||
|
"{@creature Kishi Demon|ToB1-2023}",
|
||||||
|
"{@creature Kobold Alchemist|ToB1-2023}",
|
||||||
|
"{@creature Kobold Chieftain|ToB1-2023}",
|
||||||
|
"{@creature Kobold Trapsmith|ToB1-2023}",
|
||||||
|
"{@creature Kongamato|ToB1-2023}",
|
||||||
|
"{@creature Koralk Devil|ToB1-2023}",
|
||||||
|
"{@creature Kot Bayun|ToB1-2023}",
|
||||||
|
"{@creature Krake Spawn|ToB1-2023}",
|
||||||
|
"{@creature Lake Troll|ToB1-2023}",
|
||||||
|
"{@creature Lantern Dragonette|ToB1-2023}",
|
||||||
|
"{@creature Lemurfolk|ToB1-2023}",
|
||||||
|
"{@creature Leshy|ToB1-2023}",
|
||||||
|
"{@creature Library Automaton|ToB1-2023}",
|
||||||
|
"{@creature Lich Hound|ToB1-2023}",
|
||||||
|
"{@creature Likho|ToB1-2023}",
|
||||||
|
"{@creature Lindwurm|ToB1-2023}",
|
||||||
|
"{@creature Liosalfar|ToB1-2023}",
|
||||||
|
"{@creature Living Wick|ToB1-2023}",
|
||||||
|
"{@creature Lord of the Hunt|ToB1-2023}",
|
||||||
|
"{@creature Lorelei|ToB1-2023}",
|
||||||
|
"{@creature Loxoda|ToB1-2023}",
|
||||||
|
"{@creature Lunar Devil|ToB1-2023}",
|
||||||
|
"{@creature Mahoru|ToB1-2023}",
|
||||||
|
"{@creature Malakbel Demon|ToB1-2023}",
|
||||||
|
"{@creature Mallqui|ToB1-2023}",
|
||||||
|
"{@creature Malphas|ToB1-2023}",
|
||||||
|
"{@creature Mamura|ToB1-2023}",
|
||||||
|
"{@creature Map Mimic|ToB1-2023}",
|
||||||
|
"{@creature Mask Wight|ToB1-2023}",
|
||||||
|
"{@creature Mavka|ToB1-2023}",
|
||||||
|
"{@creature Mbielu Dinosaur|ToB1-2023}",
|
||||||
|
"{@creature Mi-go|ToB1-2023}",
|
||||||
|
"{@creature Millitaur|ToB1-2023}",
|
||||||
|
"{@creature Mindrot Thrall|ToB1-2023}",
|
||||||
|
"{@creature Mirager|ToB1-2023}",
|
||||||
|
"{@creature Miremal|ToB1-2023}",
|
||||||
|
"{@creature Mirror Hag|ToB1-2023}",
|
||||||
|
"{@creature Mithral Dragon Wyrmling|ToB1-2023}",
|
||||||
|
"{@creature Mngwa|ToB1-2023}",
|
||||||
|
"{@creature Monolith Champion|ToB1-2023}",
|
||||||
|
"{@creature Monolith Footman|ToB1-2023}",
|
||||||
|
"{@creature Moonlit King|ToB1-2023}",
|
||||||
|
"{@creature Mordant Snare|ToB1-2023}",
|
||||||
|
"{@creature Morphoi|ToB1-2023}",
|
||||||
|
"{@creature Moss Lurker|ToB1-2023}",
|
||||||
|
"{@creature Myling|ToB1-2023}",
|
||||||
|
"{@creature Naina|ToB1-2023}",
|
||||||
|
"{@creature Necrohydra|ToB1-2023}",
|
||||||
|
"{@creature Ngobou Dinosaur|ToB1-2023}",
|
||||||
|
"{@creature Nichny|ToB1-2023}",
|
||||||
|
"{@creature Night Scorpion|ToB1-2023}",
|
||||||
|
"{@creature Nightgarm|ToB1-2023}",
|
||||||
|
"{@creature Nihileth Aboleth|ToB1-2023}",
|
||||||
|
"{@creature Nihilethic Dominator|ToB1-2023}",
|
||||||
|
"{@creature Nihilethic Zombie|ToB1-2023}",
|
||||||
|
"{@creature Nkosi|ToB1-2023}",
|
||||||
|
"{@creature Nkosi Pridelord|ToB1-2023}",
|
||||||
|
"{@creature Noctiny|ToB1-2023}",
|
||||||
|
"{@creature Oculo Swarm|ToB1-2023}",
|
||||||
|
"{@creature Ogre Corrupted Chieftain|ToB1-2023}",
|
||||||
|
"{@creature Oozasis|ToB1-2023}",
|
||||||
|
"{@creature Orobas Devil|ToB1-2023}",
|
||||||
|
"{@creature Ostinato|ToB1-2023}",
|
||||||
|
"{@creature Owl Harpy|ToB1-2023}",
|
||||||
|
"{@creature Pact Vampire|ToB1-2023}",
|
||||||
|
"{@creature Paper Drake|ToB1-2023}",
|
||||||
|
"{@creature Planewatcher|ToB1-2023}",
|
||||||
|
"{@creature Pombero|ToB1-2023}",
|
||||||
|
"{@creature Possessed Pillar|ToB1-2023}",
|
||||||
|
"{@creature Psoglav Demon|ToB1-2023}",
|
||||||
|
"{@creature Putrid Haunt|ToB1-2023}",
|
||||||
|
"{@creature Queen of Night and Magic|ToB1-2023}",
|
||||||
|
"{@creature Queen of Witches|ToB1-2023}",
|
||||||
|
"{@creature Quicksilver Siege Orb|ToB1-2023}",
|
||||||
|
"{@creature Qwyllion|ToB1-2023}",
|
||||||
|
"{@creature Ramag|ToB1-2023}",
|
||||||
|
"{@creature Rat King|ToB1-2023}",
|
||||||
|
"{@creature Ratatosk|ToB1-2023}",
|
||||||
|
"{@creature Ratfolk|ToB1-2023}",
|
||||||
|
"{@creature Ratfolk Rogue|ToB1-2023}",
|
||||||
|
"{@creature Ravenala|ToB1-2023}",
|
||||||
|
"{@creature Ravenfolk Doom Croaker|ToB1-2023}",
|
||||||
|
"{@creature Ravenfolk Scout|ToB1-2023}",
|
||||||
|
"{@creature Ravenfolk Warrior|ToB1-2023}",
|
||||||
|
"{@creature Red Hag|ToB1-2023}",
|
||||||
|
"{@creature Red-Banded Line Spider|ToB1-2023}",
|
||||||
|
"{@creature Redcap|ToB1-2023}",
|
||||||
|
"{@creature Rift Swine|ToB1-2023}",
|
||||||
|
"{@creature Rime Worm|ToB1-2023}",
|
||||||
|
"{@creature Rime Worm Grub|ToB1-2023}",
|
||||||
|
"{@creature Risen Reaver|ToB1-2023}",
|
||||||
|
"{@creature River King|ToB1-2023}",
|
||||||
|
"{@creature Roachling Lord|ToB1-2023}",
|
||||||
|
"{@creature Roachling Skirmisher|ToB1-2023}",
|
||||||
|
"{@creature Rotting Wind|ToB1-2023}",
|
||||||
|
"{@creature Rubezahl Demon|ToB1-2023}",
|
||||||
|
"{@creature Rum Gremlin|ToB1-2023}",
|
||||||
|
"{@creature Rust Drake|ToB1-2023}",
|
||||||
|
"{@creature Salt Devil|ToB1-2023}",
|
||||||
|
"{@creature Salt Golem|ToB1-2023}",
|
||||||
|
"{@creature Sand Hag|ToB1-2023}",
|
||||||
|
"{@creature Sand Silhouette|ToB1-2023}",
|
||||||
|
"{@creature Sand Spider|ToB1-2023}",
|
||||||
|
"{@creature Sandman|ToB1-2023}",
|
||||||
|
"{@creature Sandwyrm|ToB1-2023}",
|
||||||
|
"{@creature Sap Demon|ToB1-2023}",
|
||||||
|
"{@creature Sarcophagus Slime|ToB1-2023}",
|
||||||
|
"{@creature Sathaq Worm|ToB1-2023}",
|
||||||
|
"{@creature Savager|ToB1-2023}",
|
||||||
|
"{@creature Scheznyki|ToB1-2023}",
|
||||||
|
"{@creature Scorpion Cultist|ToB1-2023}",
|
||||||
|
"{@creature Sea Dragon Wyrmling|ToB1-2023}",
|
||||||
|
"{@creature Selang|ToB1-2023}",
|
||||||
|
"{@creature Serpopard|ToB1-2023}",
|
||||||
|
"{@creature Shadhavar|ToB1-2023}",
|
||||||
|
"{@creature Shadow Beast|ToB1-2023}",
|
||||||
|
"{@creature Shadow Fey|ToB1-2023}",
|
||||||
|
"{@creature Shadow Fey Duelist|ToB1-2023}",
|
||||||
|
"{@creature Shadow Fey Enchantress|ToB1-2023}",
|
||||||
|
"{@creature Shadow Fey Forest Hunter|ToB1-2023}",
|
||||||
|
"{@creature Shadow Fey Guardian|ToB1-2023}",
|
||||||
|
"{@creature Shambling Pile|ToB1-2023}",
|
||||||
|
"{@creature Sharkjaw Skeleton|ToB1-2023}",
|
||||||
|
"{@creature Shellycoat|ToB1-2023}",
|
||||||
|
"{@creature Shoggoth|ToB1-2023}",
|
||||||
|
"{@creature Shroud|ToB1-2023}",
|
||||||
|
"{@creature Skein Witch|ToB1-2023}",
|
||||||
|
"{@creature Skin Bat|ToB1-2023}",
|
||||||
|
"{@creature Skitterhaunt|ToB1-2023}",
|
||||||
|
"{@creature Slow Storm|ToB1-2023}",
|
||||||
|
"{@creature Smaragdine Golem|ToB1-2023}",
|
||||||
|
"{@creature Snow Queen|ToB1-2023}",
|
||||||
|
"{@creature Son of Fenris|ToB1-2023}",
|
||||||
|
"{@creature Soul Eater|ToB1-2023}",
|
||||||
|
"{@creature Spark|ToB1-2023}",
|
||||||
|
"{@creature Spawn of Akyishigal|ToB1-2023}",
|
||||||
|
"{@creature Spawn of Arbeyach|ToB1-2023}",
|
||||||
|
"{@creature Spectral Guardian|ToB1-2023}",
|
||||||
|
"{@creature Spider of Leng|ToB1-2023}",
|
||||||
|
"{@creature Spider Thief|ToB1-2023}",
|
||||||
|
"{@creature Spinosaurus Dinosaur|ToB1-2023}",
|
||||||
|
"{@creature Spire Walker|ToB1-2023}",
|
||||||
|
"{@creature Star Drake|ToB1-2023}",
|
||||||
|
"{@creature Star-Spawn of Cthulhu|ToB1-2023}",
|
||||||
|
"{@creature Steam Golem|ToB1-2023}",
|
||||||
|
"{@creature Strife|ToB1-2023}",
|
||||||
|
"{@creature Stryx|ToB1-2023}",
|
||||||
|
"{@creature Stuhac|ToB1-2023}",
|
||||||
|
"{@creature Stygian Fat-Tailed Scorpion|ToB1-2023}",
|
||||||
|
"{@creature Subek|ToB1-2023}",
|
||||||
|
"{@creature Suturefly|ToB1-2023}",
|
||||||
|
"{@creature Swamp Adder|ToB1-2023}",
|
||||||
|
"{@creature Swarm of Fire Dancers|ToB1-2023}",
|
||||||
|
"{@creature Swarm of Manabane Scarabs|ToB1-2023}",
|
||||||
|
"{@creature Swarm of Prismatic Beetles|ToB1-2023}",
|
||||||
|
"{@creature Swarm of Sluaghs|ToB1-2023}",
|
||||||
|
"{@creature Swarm of Wharflings|ToB1-2023}",
|
||||||
|
"{@creature Swarm of Wolf Spirits|ToB1-2023}",
|
||||||
|
"{@creature Temple Dog|ToB1-2023}",
|
||||||
|
"{@creature Tendril Puppet|ToB1-2023}",
|
||||||
|
"{@creature Thuellai|ToB1-2023}",
|
||||||
|
"{@creature Thursir|ToB1-2023}",
|
||||||
|
"{@creature Titanoboa|ToB1-2023}",
|
||||||
|
"{@creature Tophet|ToB1-2023}",
|
||||||
|
"{@creature Tosculi Drone|ToB1-2023}",
|
||||||
|
"{@creature Tosculi Elite Bow Raider|ToB1-2023}",
|
||||||
|
"{@creature Tosculi Hive Queen|ToB1-2023}",
|
||||||
|
"{@creature Tosculi Warrior|ToB1-2023}",
|
||||||
|
"{@creature Treacle|ToB1-2023}",
|
||||||
|
"{@creature Trollkin Reaver|ToB1-2023}",
|
||||||
|
"{@creature Tusked Skyfish|ToB1-2023}",
|
||||||
|
"{@creature Umbral Vampire|ToB1-2023}",
|
||||||
|
"{@creature Uraeus|ToB1-2023}",
|
||||||
|
"{@creature Urochar|ToB1-2023}",
|
||||||
|
"{@creature Ushabti|ToB1-2023}",
|
||||||
|
"{@creature Ushabti Royal Guard|ToB1-2023}",
|
||||||
|
"{@creature Valkyrie|ToB1-2023}",
|
||||||
|
"{@creature Vapor Lynx|ToB1-2023}",
|
||||||
|
"{@creature Venomous Mummy|ToB1-2023}",
|
||||||
|
"{@creature Vesiculosa|ToB1-2023}",
|
||||||
|
"{@creature Vila|ToB1-2023}",
|
||||||
|
"{@creature Vile Barber|ToB1-2023}",
|
||||||
|
"{@creature Vine Lord|ToB1-2023}",
|
||||||
|
"{@creature Vine Troll Skeleton|ToB1-2023}",
|
||||||
|
"{@creature Void Dragon Wyrmling|ToB1-2023}",
|
||||||
|
"{@creature Voidling|ToB1-2023}",
|
||||||
|
"{@creature Volguloth|ToB1-2023}",
|
||||||
|
"{@creature Vættir|ToB1-2023}",
|
||||||
|
"{@creature Wampus Cat|ToB1-2023}",
|
||||||
|
"{@creature War Ostrich|ToB1-2023}",
|
||||||
|
"{@creature Water Leaper|ToB1-2023}",
|
||||||
|
"{@creature Weeping Treant|ToB1-2023}",
|
||||||
|
"{@creature Wharfling|ToB1-2023}",
|
||||||
|
"{@creature White Ape|ToB1-2023}",
|
||||||
|
"{@creature Wind Dragon Wyrmling|ToB1-2023}",
|
||||||
|
"{@creature Witchlight|ToB1-2023}",
|
||||||
|
"{@creature Wolf Reaver Dwarf|ToB1-2023}",
|
||||||
|
"{@creature Wormhearted Suffragan|ToB1-2023}",
|
||||||
|
"{@creature Xanka|ToB1-2023}",
|
||||||
|
"{@creature Xhkarsh|ToB1-2023}",
|
||||||
|
"{@creature Ychen Bannog|ToB1-2023}",
|
||||||
|
"{@creature Young Cave Dragon|ToB1-2023}",
|
||||||
|
"{@creature Young Flame Dragon|ToB1-2023}",
|
||||||
|
"{@creature Young Mithral Dragon|ToB1-2023}",
|
||||||
|
"{@creature Young Sea Dragon|ToB1-2023}",
|
||||||
|
"{@creature Young Spinosaurus Dinosaur|ToB1-2023}",
|
||||||
|
"{@creature Young Void Dragon|ToB1-2023}",
|
||||||
|
"{@creature Young Wind Dragon|ToB1-2023}",
|
||||||
|
"{@creature Zanskaran Viper|ToB1-2023}",
|
||||||
|
"{@creature Zimwi|ToB1-2023}",
|
||||||
|
"{@creature Zmey|ToB1-2023}",
|
||||||
|
"{@creature Zmey Headling|ToB1-2023}"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "section",
|
||||||
|
"name": "Appendix: NPCs",
|
||||||
|
"id": "1e3",
|
||||||
|
"entries": [
|
||||||
|
"This appendix contains statistics for various humanoids. From dastardly bandit lords to city watch captains to fiend-powered devilbound gnomes, these NPCs can be found across the world, breathing new life into the places they appear. This appendix also includes a table for using these statistics, and other similar, general-use humanoid statistics, such as the {@creature knight} or {@creature thug}, with the various humanoids found in this book.",
|
||||||
|
{
|
||||||
|
"type": "section",
|
||||||
|
"name": "NPC Features Table",
|
||||||
|
"id": "1e4",
|
||||||
|
"entries": [
|
||||||
|
"When an NPC's statistics include the note \"Humanoid (Any Race)\" as the creature type, you can adjust those statistics as described in the NPC Features table to create an NPC of the humanoid race detailed in the table. In this way, you can fill a city, town, or village with a particular humanoid type while still using variable statistics and differing challenges.",
|
||||||
|
"To use the table, choose a set of NPC statistics, such as the {@creature bandit lord|ToB1-2023}, and reference the Race column for the humanoid you want to rework as that NPC. The Ability Modifiers column details how to change the ability scores in the NPC statistics, and the Features column lists which features from the chosen race you should add to the chosen NPC statistics. For example, a group of bandits might be led by a noctiny bandit lord seeking to build a small empire in honor of its patron. To create a noctiny bandit lord, use the statistics of the {@creature bandit lord|ToB1-2023} as the starting point. Increase the Charisma by 2 and the Strength by 1 and give it immunity to the {@condition frightened} condition. In addition, the bandit lord gains the Eldritch Fury attack and the Eldritch Weapons and Magic Resistance traits of the {@creature noctiny|ToB1-2023}.",
|
||||||
|
"{@b NPC Features and CR}. Adding new traits and features to a creature's statistics can increase the creature's Challenge Rating. When adjusting statistics by using the NPC Features table, use the higher of the two CRs between the statistics you are adjusting and the lowest-CR version of the humanoid you are using. In the above example, the noctiny bandit lord's Challenge Rating is 4 (1,100 XP), as the {@creature bandit lord|ToB1-2023}'s CR is higher than the {@creature noctiny|ToB1-2023}'s CR.",
|
||||||
|
{
|
||||||
|
"type": "table",
|
||||||
|
"caption": "NPC Features",
|
||||||
|
"colStyles": [
|
||||||
|
"col-2",
|
||||||
|
"col-2",
|
||||||
|
"col-8"
|
||||||
|
],
|
||||||
|
"rows": [
|
||||||
|
[
|
||||||
|
"{@creature Behtu|ToB1-2023}",
|
||||||
|
"+2 Str, +1 Dex",
|
||||||
|
"Fire Breath action; Bite attack; resistance to cold, fire, and lightning damage; {@sense darkvision} 60 ft.; walking speed of 20 feet, climbing speed of 20 feet; knows the Infernal and Behtu languages"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"{@creature Burrowling|ToB1-2023}",
|
||||||
|
"+2 Dex",
|
||||||
|
"Burrow Awareness and Pack Tactics traits; Bite and Claw attacks; {@sense darkvision} 60 ft.; burrowing speed of 10 feet"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"{@creature Deep One|ToB1-2023}",
|
||||||
|
"+2 Str, +1 Con",
|
||||||
|
"Amphibious and Frenzied Rage traits; Claw attack; resistance to cold damage and vulnerability to fire damage; {@sense darkvision} 120 ft.; swimming speed of 30 feet; knows the Void Speech language"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"{@creature Eonic Drifter|ToB1-2023}",
|
||||||
|
"+2 Int, +1 Dex",
|
||||||
|
"Drift Forward action; Call to the Future bonus action; proficiency in the {@skill History} skill; knows the Eonic, Giant, and Sylvan languages"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"{@creature Lemurfolk|ToB1-2023}",
|
||||||
|
"+2 Dex",
|
||||||
|
"Glide trait; Small size; {@sense darkvision} 60 ft.; walking speed of 30 feet, climbing speed of 20 feet; knows the Lemurfolk language"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"{@creature Noctiny|ToB1-2023}",
|
||||||
|
"+2 Cha, +1 Str",
|
||||||
|
"Eldritch Weapons and Magic Resistance traits; Eldritch Fury attack; immunity to the {@condition frightened} condition"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"{@creature Roachling Skirmisher|ToB1-2023|Roachling}",
|
||||||
|
"+2 Dex",
|
||||||
|
"Hardy and Unpleasant Scent traits; Small size; AC equals 11 + its Dexterity modifier; {@sense darkvision} 60 ft., {@sense tremorsense|MM} 10 ft.; walking speed of 25 feet"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "section",
|
||||||
|
"entries": [
|
||||||
|
{
|
||||||
|
"type": "list",
|
||||||
|
"columns": 3,
|
||||||
|
"items": [
|
||||||
|
"{@creature Bandit Lord|ToB1-2023}",
|
||||||
|
"{@creature Black Knight Commander|ToB1-2023}",
|
||||||
|
"{@creature City Watch Captain|ToB1-2023}",
|
||||||
|
"{@creature Devilbound Gnome|ToB1-2023}",
|
||||||
|
"{@creature Dwarven Ringmage|ToB1-2023}",
|
||||||
|
"{@creature Elvish Veteran Archer|ToB1-2023}",
|
||||||
|
"{@creature Emerald Order Cult Leader|ToB1-2023}",
|
||||||
|
"{@creature Scorpion Cultist|ToB1-2023}",
|
||||||
|
"{@creature Wolf Reaver Dwarf|ToB1-2023}"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "section",
|
||||||
|
"name": "Credits",
|
||||||
|
"id": "1ff",
|
||||||
|
"entries": [
|
||||||
|
{
|
||||||
|
"type": "entries",
|
||||||
|
"entries": [
|
||||||
|
{
|
||||||
|
"type": "list",
|
||||||
|
"style": "list-hang-notitle",
|
||||||
|
"columns": 2,
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"type": "list",
|
||||||
|
"style": "list-hang-notitle",
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"type": "item",
|
||||||
|
"name": "Designers",
|
||||||
|
"entries": [
|
||||||
|
"Dan Dillon, Chris Harris, Rodrigo Garcia Carmona, Wolfgang Baur"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "item",
|
||||||
|
"name": "Backer Designers",
|
||||||
|
"entries": [
|
||||||
|
"William Ryan Carden, Christopher Carlson, Christopher Delvo, Matthew F. Dowd, Timothy Eagon, Robert Fairbanks, David Gibson, John Henzel, Michael Holland, Ben Iglauer, James Introcaso, Dan Layman-Kennedy, Christopher Lockey, Maximilian Maier, Richard Pratt, Ryan Shatford, Troy E. Taylor, Andrew Teheran, Jorge A. Torres, Darius Uknuis"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "item",
|
||||||
|
"name": "Developer",
|
||||||
|
"entries": [
|
||||||
|
"Steve Winter"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "item",
|
||||||
|
"name": "Editors",
|
||||||
|
"entries": [
|
||||||
|
"Dan Dillon, Peter Hogan, Wade Rockett, Wolfgang Baur"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "item",
|
||||||
|
"name": "Playtest Coordinator (2016)",
|
||||||
|
"entries": [
|
||||||
|
"Ben McFarland"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "item",
|
||||||
|
"name": "Cover Artist",
|
||||||
|
"entries": [
|
||||||
|
"Marcel Mercado"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "item",
|
||||||
|
"name": "Interior Artists",
|
||||||
|
"entries": [
|
||||||
|
"Darren Calvert, Ivan Lee Dixon, Micah Epstein, Frank Garza, Felipe Gaona, Josh Hass, Ambrose H. Hoilman, Michael Jaecks, Eoghan Kerrigan, Guido Kuip, Pat Loboyko, Shawncee McCoy, Dio Mahesa, Justin Mayhew, Marcel Mercado, Aaron Miller, Johnny Morrow, William O'Brien, Roberto Pitturru, Jason Rainville, Lance Red, Felipe Gaona Reydet, Kathryn Steele, Florian Stitz, Nakarin Sukontakorn, Kiki Moch Rizki, Ørjan Ruttenborg Svendsen, Byran Syme, Egil Thompson, Cory Trego-Erdner, Eva Widermann, and Keiran Yanner"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "entries",
|
||||||
|
"name": "2023 Edition",
|
||||||
|
"entries": [
|
||||||
|
{
|
||||||
|
"type": "list",
|
||||||
|
"style": "list-hang-notitle",
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"type": "item",
|
||||||
|
"name": "Designers",
|
||||||
|
"entries": [
|
||||||
|
"Daniel Kahn, Jeff Lee, Mike Welham"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "item",
|
||||||
|
"name": "Developers",
|
||||||
|
"entries": [
|
||||||
|
"Jeff Lee, Meagan Maricle, Mike Welham"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "item",
|
||||||
|
"name": "Editor",
|
||||||
|
"entries": [
|
||||||
|
"Meagan Maricle"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "item",
|
||||||
|
"name": "Proofreader",
|
||||||
|
"entries": [
|
||||||
|
"Jeff Quick"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "item",
|
||||||
|
"name": "Cover Artist",
|
||||||
|
"entries": [
|
||||||
|
"Craig J Spearing"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "item",
|
||||||
|
"name": "Limited Edition Cover Artist",
|
||||||
|
"entries": [
|
||||||
|
"Addison Rankin"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "item",
|
||||||
|
"name": "Graphic Designers",
|
||||||
|
"entries": [
|
||||||
|
"Marc Radle, Amber Seger"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "entries",
|
||||||
|
"name": "Kobold Warrens",
|
||||||
|
"entries": [
|
||||||
|
{
|
||||||
|
"type": "list",
|
||||||
|
"style": "list-hang-notitle",
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"type": "item",
|
||||||
|
"name": "Publisher",
|
||||||
|
"entries": [
|
||||||
|
"Wolfgang Baur"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "item",
|
||||||
|
"name": "Chief Operations Officer",
|
||||||
|
"entries": [
|
||||||
|
"T. Alexander Stangroom"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "item",
|
||||||
|
"name": "Director of Digital Growth",
|
||||||
|
"entries": [
|
||||||
|
"Blaine M****t"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "item",
|
||||||
|
"name": "Art Director",
|
||||||
|
"entries": [
|
||||||
|
"Marc Radle"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "item",
|
||||||
|
"name": "Art Department",
|
||||||
|
"entries": [
|
||||||
|
"Marc Radle, Amber Seger"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "item",
|
||||||
|
"name": "Editorial Director",
|
||||||
|
"entries": [
|
||||||
|
"Thomas M. Reid"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "item",
|
||||||
|
"name": "Editorial Department",
|
||||||
|
"entries": [
|
||||||
|
"Scott Gable, Meagan Maricle, Jeff Quick, Thomas M. Reid"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "item",
|
||||||
|
"name": "Senior Game Designer",
|
||||||
|
"entries": [
|
||||||
|
"Celeste Conowitch"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "item",
|
||||||
|
"name": "Marketing Director",
|
||||||
|
"entries": [
|
||||||
|
"Chelsea \"Dot\" Steverson"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "item",
|
||||||
|
"name": "Community Manager",
|
||||||
|
"entries": [
|
||||||
|
"Zachery Newbill"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "item",
|
||||||
|
"name": "Sales Manager",
|
||||||
|
"entries": [
|
||||||
|
"Kym Weiler"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "entries",
|
||||||
|
"name": "Special Thanks",
|
||||||
|
"entries": [
|
||||||
|
{
|
||||||
|
"type": "list",
|
||||||
|
"style": "list-hang-notitle",
|
||||||
|
"items": [
|
||||||
|
"To the 2,312 backers who made the 2016 volume possible and the dozens of playtesters who helped refine it!",
|
||||||
|
"An extra special thanks to the designers and contributors to earlier versions of the monsters that appear in this book, such as the versions that appeared in the 2016 Tome of Beasts, the Southlands Bestiary, the Midgard Bestiary, and many others. These designers and contributors include but are not limited to: Lou Anders, Jobe Bittman, Michael John Conard, Ryan Costello Jr., James L. Crawford, Adam Daigle, Matthew Eyman, Crystal Frasier, Christopher Gilliford, Andrew Hind, Jeremy Hochhalter, Brandon Hodge, Michael Lane, Phillip Larwood, Jeff Lee, Greg Marks, Mike McArtor, Ben McFarland, Dave Olson, Carlos Ovalle, Richard Pett, James Pratt, Marc Radle, Adam Roy, Jon Sawatsky, Christina Stiles, Brian Suskind, Sersa Victory, Dan Voyce, Mike Welham, Ben Wertz"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "image",
|
||||||
|
"href": {
|
||||||
|
"type": "internal",
|
||||||
|
"path": "book/ToB1-2023/384-31-003.kobold.wizard.webp"
|
||||||
|
},
|
||||||
|
"maxWidth": 300,
|
||||||
|
"width": 850,
|
||||||
|
"height": 1233
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "gallery",
|
||||||
|
"images": [
|
||||||
|
{
|
||||||
|
"type": "image",
|
||||||
|
"href": {
|
||||||
|
"type": "internal",
|
||||||
|
"path": "book/ToB1-2023/385-31-002.cover-regular.webp"
|
||||||
|
},
|
||||||
|
"title": "On the Cover: An adult wind dragon snaps at the tail and wings of a griffon, driving the smaller creature from its territory in this art by Craig Spearing.",
|
||||||
|
"width": 850,
|
||||||
|
"height": 1086
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "image",
|
||||||
|
"href": {
|
||||||
|
"type": "internal",
|
||||||
|
"path": "book/ToB1-2023/386-31-003.cover-alt.webp"
|
||||||
|
},
|
||||||
|
"title": "On the Limited Edition Cover: A wind dragon grins mischievously from among swirls of clouds in this art by Addison Rankin.",
|
||||||
|
"width": 850,
|
||||||
|
"height": 1088
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -4453,6 +4453,35 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "Tome of Beasts 1 (2023 Edition)",
|
||||||
|
"id": "ToB1-2023",
|
||||||
|
"source": "ToB1-2023",
|
||||||
|
"group": "supplement-alt",
|
||||||
|
"coverUrl": "img/covers/ToB1-2023.webp",
|
||||||
|
"published": "2023-05-31",
|
||||||
|
"contents": [
|
||||||
|
{
|
||||||
|
"name": "Introduction",
|
||||||
|
"headers": [
|
||||||
|
"Using this Book",
|
||||||
|
"Refreshing a Classic"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Monsters"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Appendix: NPCs",
|
||||||
|
"headers": [
|
||||||
|
"NPC Features Table"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Credits"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "Bigby Presents: Glory of the Giants",
|
"name": "Bigby Presents: Glory of the Giants",
|
||||||
"id": "BGG",
|
"id": "BGG",
|
||||||
|
|||||||
@@ -2667,5 +2667,11 @@
|
|||||||
"date": "2024-03-10",
|
"date": "2024-03-10",
|
||||||
"title": "Page of Wisdom",
|
"title": "Page of Wisdom",
|
||||||
"txt": "- Added \"The Dungeons & Dragons Tarot Deck\" as partnered content (thanks @ Lyra for the data entry and conversion)\n- Added page numbers to: Grim Hollow: Lairs of Etharis adventure content; Phandelver and Below: The Shattered Obelisk adventure content\n- Added remaining page numbers to entries from: Dungeons of Drakkenheim; Planescape: Adventures in the Multiverse; Grim Hollow: Lairs of Etharis; Phandelver and Below: The Shattered Obelisk\n- Added credits sections to all adventures/books\n- Omnisearch results (and other links) can now be directly dropped onto DM Screen panels, without first opening a permanent hover window\n- The DM Screen \"fullscreen\" mode can now be exited by pressing `ESC`\n- Fixed various hover window bugs; temporary windows should now more reliably auto-close, and clicking any element now correctly triggers a fallback cleanup\n- Fixed display of Filter \"Select by Date\" slider\n- (Brew) Added support for `@tag`s in immunity/resistance/vulnerability notes\n- (Brew) Added `+`/`-` keybinds to the Text Converter to increment/decrement page number\n- (Brew) Improved Creature Text Converter handling of homebrew spellcasting spell level formats\n- (Brew) Added support for `mailto:` in `@link` tags\n- (Brew) Fixed crash when adding homebrew from file when offline\n- (Fixed typos/added tags)"
|
"txt": "- Added \"The Dungeons & Dragons Tarot Deck\" as partnered content (thanks @ Lyra for the data entry and conversion)\n- Added page numbers to: Grim Hollow: Lairs of Etharis adventure content; Phandelver and Below: The Shattered Obelisk adventure content\n- Added remaining page numbers to entries from: Dungeons of Drakkenheim; Planescape: Adventures in the Multiverse; Grim Hollow: Lairs of Etharis; Phandelver and Below: The Shattered Obelisk\n- Added credits sections to all adventures/books\n- Omnisearch results (and other links) can now be directly dropped onto DM Screen panels, without first opening a permanent hover window\n- The DM Screen \"fullscreen\" mode can now be exited by pressing `ESC`\n- Fixed various hover window bugs; temporary windows should now more reliably auto-close, and clicking any element now correctly triggers a fallback cleanup\n- Fixed display of Filter \"Select by Date\" slider\n- (Brew) Added support for `@tag`s in immunity/resistance/vulnerability notes\n- (Brew) Added `+`/`-` keybinds to the Text Converter to increment/decrement page number\n- (Brew) Improved Creature Text Converter handling of homebrew spellcasting spell level formats\n- (Brew) Added support for `mailto:` in `@link` tags\n- (Brew) Fixed crash when adding homebrew from file when offline\n- (Fixed typos/added tags)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ver": "1.202.0",
|
||||||
|
"date": "2024-03-24",
|
||||||
|
"title": "Old 'Bold",
|
||||||
|
"txt": "- Added Tome of Beast 1 (2023 Edition) content _[for now; as with all \"partnered\" content, to be moved to the homebrew repo at a later date]_\n- (Brew) Improved Creature Text Converter\n - SRD spell names in `\"spellcasting\"` are now mapped to their expected full names\n - Improved parsing of conditional resistances/immunities/vulnerabilities\n - Fixed rare case where creature type could be misinterpreted as size\n- (Brew) Added Vehicles support for vulnerabilities/resistances\n- (Brew) Updated source editor to better match schema/requirements\n - Added version input\n - Empty optional fields are no longer included in output\n - Output `\"color\"`s are now schema-valid\n- (Fixed typos/added tags)"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -3537,7 +3537,7 @@
|
|||||||
"amount": 3
|
"amount": 3
|
||||||
},
|
},
|
||||||
"entries": [
|
"entries": [
|
||||||
"At 6th level, you gain the ability to call forth a howling creature of darkness to harass your foes. As a bonus action, you can spend 3 sorcery points to magically summon a hound of ill omen to target one creature you can see within 120 feet of you. The hound uses the {@creature dire wolf}'s statistics (see the Monster Manual or appendix C in the Player's Handbook), with the following changes:",
|
"At 6th level, you gain the ability to call forth a howling creature of darkness to harass your foes. As a bonus action, you can spend 3 sorcery points to magically summon a {@creature hound of ill omen|XGE} to target one creature you can see within 120 feet of you. The hound uses the {@creature dire wolf}'s statistics (see the Monster Manual or appendix C in the Player's Handbook), with the following changes:",
|
||||||
{
|
{
|
||||||
"type": "list",
|
"type": "list",
|
||||||
"items": [
|
"items": [
|
||||||
|
|||||||
@@ -638,6 +638,14 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "Fighting Style",
|
||||||
|
"source": "PHB",
|
||||||
|
"className": "Ranger",
|
||||||
|
"classSource": "PHB",
|
||||||
|
"level": 2,
|
||||||
|
"isIgnored": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "Favored Enemy and Natural Explorer improvements",
|
"name": "Favored Enemy and Natural Explorer improvements",
|
||||||
"source": "PHB",
|
"source": "PHB",
|
||||||
@@ -666,14 +674,6 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "Fighting Style",
|
|
||||||
"source": "PHB",
|
|
||||||
"className": "Ranger",
|
|
||||||
"classSource": "PHB",
|
|
||||||
"level": 2,
|
|
||||||
"isIgnored": true
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "Expertise",
|
"name": "Expertise",
|
||||||
"source": "PHB",
|
"source": "PHB",
|
||||||
@@ -867,6 +867,11 @@
|
|||||||
"classSource": "TCE",
|
"classSource": "TCE",
|
||||||
"level": 1,
|
"level": 1,
|
||||||
"entryData": {
|
"entryData": {
|
||||||
|
"skillProficiencies": [
|
||||||
|
{
|
||||||
|
"any": 5
|
||||||
|
}
|
||||||
|
],
|
||||||
"armorProficiencies": [
|
"armorProficiencies": [
|
||||||
{
|
{
|
||||||
"light": true
|
"light": true
|
||||||
@@ -883,11 +888,6 @@
|
|||||||
"count": 1
|
"count": 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
|
||||||
"skillProficiencies": [
|
|
||||||
{
|
|
||||||
"any": 5
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -926,23 +926,6 @@
|
|||||||
"classSource": "TCE",
|
"classSource": "TCE",
|
||||||
"level": 1,
|
"level": 1,
|
||||||
"entryData": {
|
"entryData": {
|
||||||
"armorProficiencies": [
|
|
||||||
{
|
|
||||||
"light": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"savingThrowProficiencies": [
|
|
||||||
{
|
|
||||||
"choose": {
|
|
||||||
"from": [
|
|
||||||
"wis",
|
|
||||||
"int",
|
|
||||||
"cha"
|
|
||||||
],
|
|
||||||
"count": 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"skillProficiencies": [
|
"skillProficiencies": [
|
||||||
{
|
{
|
||||||
"choose": {
|
"choose": {
|
||||||
@@ -959,6 +942,23 @@
|
|||||||
"count": 2
|
"count": 2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"armorProficiencies": [
|
||||||
|
{
|
||||||
|
"light": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"savingThrowProficiencies": [
|
||||||
|
{
|
||||||
|
"choose": {
|
||||||
|
"from": [
|
||||||
|
"wis",
|
||||||
|
"int",
|
||||||
|
"cha"
|
||||||
|
],
|
||||||
|
"count": 1
|
||||||
|
}
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -969,6 +969,22 @@
|
|||||||
"classSource": "TCE",
|
"classSource": "TCE",
|
||||||
"level": 1,
|
"level": 1,
|
||||||
"entryData": {
|
"entryData": {
|
||||||
|
"skillProficiencies": [
|
||||||
|
{
|
||||||
|
"choose": {
|
||||||
|
"from": [
|
||||||
|
"acrobatics",
|
||||||
|
"animal handling",
|
||||||
|
"athletics",
|
||||||
|
"intimidation",
|
||||||
|
"nature",
|
||||||
|
"perception",
|
||||||
|
"survival"
|
||||||
|
],
|
||||||
|
"count": 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
"armorProficiencies": [
|
"armorProficiencies": [
|
||||||
{
|
{
|
||||||
"light": true,
|
"light": true,
|
||||||
@@ -987,22 +1003,6 @@
|
|||||||
"count": 1
|
"count": 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
|
||||||
"skillProficiencies": [
|
|
||||||
{
|
|
||||||
"choose": {
|
|
||||||
"from": [
|
|
||||||
"acrobatics",
|
|
||||||
"animal handling",
|
|
||||||
"athletics",
|
|
||||||
"intimidation",
|
|
||||||
"nature",
|
|
||||||
"perception",
|
|
||||||
"survival"
|
|
||||||
],
|
|
||||||
"count": 2
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1055,7 +1055,6 @@
|
|||||||
"subclassShortName": "Zealot",
|
"subclassShortName": "Zealot",
|
||||||
"subclassSource": "XGE",
|
"subclassSource": "XGE",
|
||||||
"level": 3,
|
"level": 3,
|
||||||
"isChooseSystemRenderEntries": true,
|
|
||||||
"system": {
|
"system": {
|
||||||
"activation.type": "special",
|
"activation.type": "special",
|
||||||
"activation.condition": "While you're raging, the first creature you hit on each of your turns with a weapon attack"
|
"activation.condition": "While you're raging, the first creature you hit on each of your turns with a weapon attack"
|
||||||
@@ -1083,7 +1082,8 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"isChooseSystemRenderEntries": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Bonus Proficiencies",
|
"name": "Bonus Proficiencies",
|
||||||
@@ -1110,16 +1110,16 @@
|
|||||||
"subclassSource": "PHB",
|
"subclassSource": "PHB",
|
||||||
"level": 3,
|
"level": 3,
|
||||||
"entryData": {
|
"entryData": {
|
||||||
|
"weaponProficiencies": [
|
||||||
|
{
|
||||||
|
"martial": true
|
||||||
|
}
|
||||||
|
],
|
||||||
"armorProficiencies": [
|
"armorProficiencies": [
|
||||||
{
|
{
|
||||||
"medium": true,
|
"medium": true,
|
||||||
"shield|phb": true
|
"shield|phb": true
|
||||||
}
|
}
|
||||||
],
|
|
||||||
"weaponProficiencies": [
|
|
||||||
{
|
|
||||||
"martial": true
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1150,7 +1150,8 @@
|
|||||||
"target.value": 1,
|
"target.value": 1,
|
||||||
"target.type": "object",
|
"target.type": "object",
|
||||||
"range.value": 30,
|
"range.value": 30,
|
||||||
"range.units": "ft"
|
"range.units": "ft",
|
||||||
|
"actionType": "summ"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1237,15 +1238,15 @@
|
|||||||
"subclassSource": "XGE",
|
"subclassSource": "XGE",
|
||||||
"level": 3,
|
"level": 3,
|
||||||
"entryData": {
|
"entryData": {
|
||||||
"armorProficiencies": [
|
|
||||||
{
|
|
||||||
"medium": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"weaponProficiencies": [
|
"weaponProficiencies": [
|
||||||
{
|
{
|
||||||
"scimitar|phb": true
|
"scimitar|phb": true
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"armorProficiencies": [
|
||||||
|
{
|
||||||
|
"medium": true
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1366,6 +1367,11 @@
|
|||||||
"subclassSource": "PHB",
|
"subclassSource": "PHB",
|
||||||
"level": 1,
|
"level": 1,
|
||||||
"entryData": {
|
"entryData": {
|
||||||
|
"languageProficiencies": [
|
||||||
|
{
|
||||||
|
"any": 2
|
||||||
|
}
|
||||||
|
],
|
||||||
"skillProficiencies": [
|
"skillProficiencies": [
|
||||||
{
|
{
|
||||||
"choose": {
|
"choose": {
|
||||||
@@ -1378,11 +1384,6 @@
|
|||||||
"count": 2
|
"count": 2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
|
||||||
"languageProficiencies": [
|
|
||||||
{
|
|
||||||
"any": 2
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1592,15 +1593,15 @@
|
|||||||
"subclassSource": "PHB",
|
"subclassSource": "PHB",
|
||||||
"level": 1,
|
"level": 1,
|
||||||
"entryData": {
|
"entryData": {
|
||||||
"armorProficiencies": [
|
|
||||||
{
|
|
||||||
"heavy": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"weaponProficiencies": [
|
"weaponProficiencies": [
|
||||||
{
|
{
|
||||||
"martial": true
|
"martial": true
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"armorProficiencies": [
|
||||||
|
{
|
||||||
|
"heavy": true
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1645,15 +1646,15 @@
|
|||||||
"subclassSource": "PHB",
|
"subclassSource": "PHB",
|
||||||
"level": 1,
|
"level": 1,
|
||||||
"entryData": {
|
"entryData": {
|
||||||
"armorProficiencies": [
|
|
||||||
{
|
|
||||||
"heavy": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"weaponProficiencies": [
|
"weaponProficiencies": [
|
||||||
{
|
{
|
||||||
"martial": true
|
"martial": true
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"armorProficiencies": [
|
||||||
|
{
|
||||||
|
"heavy": true
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1813,15 +1814,15 @@
|
|||||||
"subclassSource": "TCE",
|
"subclassSource": "TCE",
|
||||||
"level": 1,
|
"level": 1,
|
||||||
"entryData": {
|
"entryData": {
|
||||||
"armorProficiencies": [
|
|
||||||
{
|
|
||||||
"heavy": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"weaponProficiencies": [
|
"weaponProficiencies": [
|
||||||
{
|
{
|
||||||
"martial": true
|
"martial": true
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"armorProficiencies": [
|
||||||
|
{
|
||||||
|
"heavy": true
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1833,6 +1834,11 @@
|
|||||||
"subclassShortName": "Twilight",
|
"subclassShortName": "Twilight",
|
||||||
"subclassSource": "TCE",
|
"subclassSource": "TCE",
|
||||||
"level": 1,
|
"level": 1,
|
||||||
|
"system": {
|
||||||
|
"target.type": "creature",
|
||||||
|
"range.value": 10,
|
||||||
|
"range.units": "ft"
|
||||||
|
},
|
||||||
"actorTokenMod": {
|
"actorTokenMod": {
|
||||||
"dimSight": [
|
"dimSight": [
|
||||||
{
|
{
|
||||||
@@ -1840,11 +1846,6 @@
|
|||||||
"value": 300
|
"value": 300
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
|
||||||
"system": {
|
|
||||||
"target.type": "creature",
|
|
||||||
"range.value": 10,
|
|
||||||
"range.units": "ft"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1993,6 +1994,18 @@
|
|||||||
"range.units": "self"
|
"range.units": "self"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "Fungal Infestation",
|
||||||
|
"source": "TCE",
|
||||||
|
"className": "Druid",
|
||||||
|
"classSource": "PHB",
|
||||||
|
"subclassShortName": "Spores",
|
||||||
|
"subclassSource": "TCE",
|
||||||
|
"level": 6,
|
||||||
|
"system": {
|
||||||
|
"actionType": "summ"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "Spreading Spores",
|
"name": "Spreading Spores",
|
||||||
"source": "TCE",
|
"source": "TCE",
|
||||||
@@ -2039,7 +2052,20 @@
|
|||||||
"system": {
|
"system": {
|
||||||
"target.type": "space",
|
"target.type": "space",
|
||||||
"range.value": 30,
|
"range.value": 30,
|
||||||
"range.units": "ft"
|
"range.units": "ft",
|
||||||
|
"actionType": "summ"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Call of the Shadowseeds",
|
||||||
|
"source": "TDCSR",
|
||||||
|
"className": "Druid",
|
||||||
|
"classSource": "PHB",
|
||||||
|
"subclassShortName": "Blighted",
|
||||||
|
"subclassSource": "TDCSR",
|
||||||
|
"level": 6,
|
||||||
|
"system": {
|
||||||
|
"actionType": "summ"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -2159,6 +2185,11 @@
|
|||||||
"subclassShortName": "Battle Master",
|
"subclassShortName": "Battle Master",
|
||||||
"subclassSource": "PHB",
|
"subclassSource": "PHB",
|
||||||
"level": 3,
|
"level": 3,
|
||||||
|
"system": {
|
||||||
|
"activation.type": null,
|
||||||
|
"uses.value": null,
|
||||||
|
"uses.max": null
|
||||||
|
},
|
||||||
"entryData": {
|
"entryData": {
|
||||||
"resources": [
|
"resources": [
|
||||||
{
|
{
|
||||||
@@ -2170,11 +2201,6 @@
|
|||||||
"faces": "8 + (sign(ceil((<$level$> - 2) / 8) - 1) * 2)"
|
"faces": "8 + (sign(ceil((<$level$> - 2) / 8) - 1) * 2)"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
|
||||||
"system": {
|
|
||||||
"activation.type": null,
|
|
||||||
"uses.value": null,
|
|
||||||
"uses.max": null
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -2467,15 +2493,15 @@
|
|||||||
"subclassSource": "TCE",
|
"subclassSource": "TCE",
|
||||||
"level": 3,
|
"level": 3,
|
||||||
"entryData": {
|
"entryData": {
|
||||||
"toolProficiencies": [
|
|
||||||
{
|
|
||||||
"smith's tools": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"languageProficiencies": [
|
"languageProficiencies": [
|
||||||
{
|
{
|
||||||
"giant": true
|
"giant": true
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"toolProficiencies": [
|
||||||
|
{
|
||||||
|
"smith's tools": true
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2943,6 +2969,11 @@
|
|||||||
"subclassSource": "TDCSR",
|
"subclassSource": "TDCSR",
|
||||||
"level": 6,
|
"level": 6,
|
||||||
"entryData": {
|
"entryData": {
|
||||||
|
"languageProficiencies": [
|
||||||
|
{
|
||||||
|
"any": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
"skillProficiencies": [
|
"skillProficiencies": [
|
||||||
{
|
{
|
||||||
"choose": {
|
"choose": {
|
||||||
@@ -2956,11 +2987,6 @@
|
|||||||
"count": 1
|
"count": 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
|
||||||
"languageProficiencies": [
|
|
||||||
{
|
|
||||||
"any": 1
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2973,6 +2999,11 @@
|
|||||||
"subclassSource": "TDCSR",
|
"subclassSource": "TDCSR",
|
||||||
"level": 11,
|
"level": 11,
|
||||||
"entryData": {
|
"entryData": {
|
||||||
|
"languageProficiencies": [
|
||||||
|
{
|
||||||
|
"any": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
"skillProficiencies": [
|
"skillProficiencies": [
|
||||||
{
|
{
|
||||||
"choose": {
|
"choose": {
|
||||||
@@ -2986,11 +3017,6 @@
|
|||||||
"count": 1
|
"count": 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
|
||||||
"languageProficiencies": [
|
|
||||||
{
|
|
||||||
"any": 1
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -3003,6 +3029,11 @@
|
|||||||
"subclassSource": "TDCSR",
|
"subclassSource": "TDCSR",
|
||||||
"level": 17,
|
"level": 17,
|
||||||
"entryData": {
|
"entryData": {
|
||||||
|
"languageProficiencies": [
|
||||||
|
{
|
||||||
|
"any": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
"skillProficiencies": [
|
"skillProficiencies": [
|
||||||
{
|
{
|
||||||
"choose": {
|
"choose": {
|
||||||
@@ -3016,11 +3047,6 @@
|
|||||||
"count": 1
|
"count": 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
|
||||||
"languageProficiencies": [
|
|
||||||
{
|
|
||||||
"any": 1
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -3370,6 +3396,42 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "Drake Companion",
|
||||||
|
"source": "FTD",
|
||||||
|
"className": "Ranger",
|
||||||
|
"classSource": "PHB",
|
||||||
|
"subclassShortName": "Drakewarden",
|
||||||
|
"subclassSource": "FTD",
|
||||||
|
"level": 3,
|
||||||
|
"system": {
|
||||||
|
"actionType": "summ"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Primal Companion",
|
||||||
|
"source": "TCE",
|
||||||
|
"className": "Ranger",
|
||||||
|
"classSource": "PHB",
|
||||||
|
"subclassShortName": "Beast Master",
|
||||||
|
"subclassSource": "PHB",
|
||||||
|
"level": 3,
|
||||||
|
"system": {
|
||||||
|
"actionType": "summ"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ranger's Companion",
|
||||||
|
"source": "PHB",
|
||||||
|
"className": "Ranger",
|
||||||
|
"classSource": "PHB",
|
||||||
|
"subclassShortName": "Beast Master",
|
||||||
|
"subclassSource": "PHB",
|
||||||
|
"level": 3,
|
||||||
|
"system": {
|
||||||
|
"actionType": "summ"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "Otherworldly Glamour",
|
"name": "Otherworldly Glamour",
|
||||||
"source": "TCE",
|
"source": "TCE",
|
||||||
@@ -3571,17 +3633,17 @@
|
|||||||
"subclassSource": "XGE",
|
"subclassSource": "XGE",
|
||||||
"level": 3,
|
"level": 3,
|
||||||
"entryData": {
|
"entryData": {
|
||||||
|
"languageProficiencies": [
|
||||||
|
{
|
||||||
|
"any": 2
|
||||||
|
}
|
||||||
|
],
|
||||||
"toolProficiencies": [
|
"toolProficiencies": [
|
||||||
{
|
{
|
||||||
"disguise kit": true,
|
"disguise kit": true,
|
||||||
"forgery kit": true,
|
"forgery kit": true,
|
||||||
"gaming set": true
|
"gaming set": true
|
||||||
}
|
}
|
||||||
],
|
|
||||||
"languageProficiencies": [
|
|
||||||
{
|
|
||||||
"any": 2
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -3805,6 +3867,7 @@
|
|||||||
"subclassSource": "XGE",
|
"subclassSource": "XGE",
|
||||||
"level": 6,
|
"level": 6,
|
||||||
"system": {
|
"system": {
|
||||||
|
"actionType": "summ",
|
||||||
"target.value": 1,
|
"target.value": 1,
|
||||||
"target.type": "creature",
|
"target.type": "creature",
|
||||||
"range.value": 120,
|
"range.value": 120,
|
||||||
@@ -3850,16 +3913,16 @@
|
|||||||
"subclassShortName": "Storm",
|
"subclassShortName": "Storm",
|
||||||
"subclassSource": "XGE",
|
"subclassSource": "XGE",
|
||||||
"level": 6,
|
"level": 6,
|
||||||
|
"system": {
|
||||||
|
"target.value": 10,
|
||||||
|
"target.units": "ft",
|
||||||
|
"target.type": "sphere"
|
||||||
|
},
|
||||||
"entryData": {
|
"entryData": {
|
||||||
"resist": [
|
"resist": [
|
||||||
"lightning",
|
"lightning",
|
||||||
"thunder"
|
"thunder"
|
||||||
]
|
]
|
||||||
},
|
|
||||||
"system": {
|
|
||||||
"target.value": 10,
|
|
||||||
"target.units": "ft",
|
|
||||||
"target.type": "sphere"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -4053,15 +4116,15 @@
|
|||||||
"subclassShortName": "Undead",
|
"subclassShortName": "Undead",
|
||||||
"subclassSource": "VRGR",
|
"subclassSource": "VRGR",
|
||||||
"level": 10,
|
"level": 10,
|
||||||
"entryData": {
|
|
||||||
"resist": [
|
|
||||||
"necrotic"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"system": {
|
"system": {
|
||||||
"target.value": 30,
|
"target.value": 30,
|
||||||
"target.units": "ft",
|
"target.units": "ft",
|
||||||
"target.type": "radius"
|
"target.type": "radius"
|
||||||
|
},
|
||||||
|
"entryData": {
|
||||||
|
"resist": [
|
||||||
|
"necrotic"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -4114,6 +4177,18 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "Accursed Specter",
|
||||||
|
"source": "XGE",
|
||||||
|
"className": "Warlock",
|
||||||
|
"classSource": "PHB",
|
||||||
|
"subclassShortName": "Hexblade",
|
||||||
|
"subclassSource": "XGE",
|
||||||
|
"level": 6,
|
||||||
|
"system": {
|
||||||
|
"actionType": "summ"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "Chronal Shift",
|
"name": "Chronal Shift",
|
||||||
"source": "EGW",
|
"source": "EGW",
|
||||||
@@ -4335,17 +4410,17 @@
|
|||||||
"performance": true
|
"performance": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"armorProficiencies": [
|
|
||||||
{
|
|
||||||
"light": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"weaponProficiencies": [
|
"weaponProficiencies": [
|
||||||
{
|
{
|
||||||
"choose": {
|
"choose": {
|
||||||
"fromFilter": "type=melee weapon|property=!two-handed|rarity=none"
|
"fromFilter": "type=melee weapon|property=!two-handed|rarity=none"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"armorProficiencies": [
|
||||||
|
{
|
||||||
|
"light": true
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -4650,6 +4725,18 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "Steel Defender",
|
||||||
|
"source": "TCE",
|
||||||
|
"className": "Artificer",
|
||||||
|
"classSource": "TCE",
|
||||||
|
"subclassShortName": "Battle Smith",
|
||||||
|
"subclassSource": "TCE",
|
||||||
|
"level": 3,
|
||||||
|
"system": {
|
||||||
|
"actionType": "summ"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "Tool Proficiency",
|
"name": "Tool Proficiency",
|
||||||
"source": "TCE",
|
"source": "TCE",
|
||||||
|
|||||||
@@ -144,6 +144,22 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "War Caster",
|
||||||
|
"source": "PHB",
|
||||||
|
"effects": [
|
||||||
|
{
|
||||||
|
"transfer": true,
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"key": "system.attributes.concentration.roll.mode",
|
||||||
|
"mode": "OVERRIDE",
|
||||||
|
"value": "1"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -106,7 +106,7 @@
|
|||||||
"name": "Hazirawn",
|
"name": "Hazirawn",
|
||||||
"source": "HotDQ",
|
"source": "HotDQ",
|
||||||
"system": {
|
"system": {
|
||||||
"attackBonus": "+1 + floor(@item.attunement / 2)",
|
"attack.bonus": "+1 + floor(@item.attunement / 2)",
|
||||||
"damage.parts": [
|
"damage.parts": [
|
||||||
[
|
[
|
||||||
"2d6+1+floor(@item.attunement / 2)",
|
"2d6+1+floor(@item.attunement / 2)",
|
||||||
|
|||||||
@@ -95,6 +95,22 @@
|
|||||||
"activation.cost": null
|
"activation.cost": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "Eldritch Mind",
|
||||||
|
"source": "TCE",
|
||||||
|
"effects": [
|
||||||
|
{
|
||||||
|
"transfer": true,
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"key": "system.attributes.concentration.roll.mode",
|
||||||
|
"mode": "OVERRIDE",
|
||||||
|
"value": "1"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "Eldritch Sight",
|
"name": "Eldritch Sight",
|
||||||
"source": "PHB",
|
"source": "PHB",
|
||||||
|
|||||||
@@ -18,204 +18,6 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"raceFeature": [
|
"raceFeature": [
|
||||||
{
|
|
||||||
"name": "Radiant Soul",
|
|
||||||
"source": "VGM",
|
|
||||||
"raceName": "Aasimar (Protector)",
|
|
||||||
"raceSource": "VGM",
|
|
||||||
"system": {
|
|
||||||
"activation.type": "action",
|
|
||||||
"activation.cost": 1
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Hooves",
|
|
||||||
"source": "GGR",
|
|
||||||
"raceName": "Centaur",
|
|
||||||
"raceSource": "GGR",
|
|
||||||
"system": {
|
|
||||||
"activation.type": "action",
|
|
||||||
"activation.cost": 1
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Dwarven Toughness",
|
|
||||||
"source": "PHB",
|
|
||||||
"raceName": "Dwarf (Hill)",
|
|
||||||
"raceSource": "PHB",
|
|
||||||
"effects": [
|
|
||||||
{
|
|
||||||
"name": "HP Increase",
|
|
||||||
"transfer": true,
|
|
||||||
"changes": [
|
|
||||||
{
|
|
||||||
"key": "data.attributes.hp.bonuses.level",
|
|
||||||
"mode": "ADD",
|
|
||||||
"value": "+ 1"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Grit",
|
|
||||||
"source": "PSZ",
|
|
||||||
"raceName": "Goblin (Zendikar; Grotag Tribe)",
|
|
||||||
"raceSource": "PSZ",
|
|
||||||
"effects": [
|
|
||||||
{
|
|
||||||
"name": "Natural Armor",
|
|
||||||
"transfer": true,
|
|
||||||
"changes": [
|
|
||||||
{
|
|
||||||
"key": "data.attributes.ac.calc",
|
|
||||||
"mode": "OVERRIDE",
|
|
||||||
"value": "custom"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "data.attributes.ac.formula",
|
|
||||||
"mode": "OVERRIDE",
|
|
||||||
"value": "11 + @abilities.dex.mod"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Grit",
|
|
||||||
"source": "PSZ",
|
|
||||||
"raceName": "Goblin (Zendikar; Lavastep Tribe)",
|
|
||||||
"raceSource": "PSZ",
|
|
||||||
"_copy": {
|
|
||||||
"name": "Grit",
|
|
||||||
"source": "PSZ",
|
|
||||||
"raceName": "Goblin (Zendikar; Grotag Tribe)",
|
|
||||||
"raceSource": "PSZ"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Grit",
|
|
||||||
"source": "PSZ",
|
|
||||||
"raceName": "Goblin (Zendikar; Tuktuk Tribe)",
|
|
||||||
"raceSource": "PSZ",
|
|
||||||
"_copy": {
|
|
||||||
"name": "Grit",
|
|
||||||
"source": "PSZ",
|
|
||||||
"raceName": "Goblin (Zendikar; Grotag Tribe)",
|
|
||||||
"raceSource": "PSZ"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Natural Armor",
|
|
||||||
"source": "DMG",
|
|
||||||
"raceName": "Lizardfolk",
|
|
||||||
"raceSource": "DMG",
|
|
||||||
"effects": [
|
|
||||||
{
|
|
||||||
"name": "Natural Armor",
|
|
||||||
"transfer": true,
|
|
||||||
"changes": [
|
|
||||||
{
|
|
||||||
"key": "data.attributes.ac.bonus",
|
|
||||||
"mode": "ADD",
|
|
||||||
"value": "+ 3"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Natural Armor",
|
|
||||||
"source": "VGM",
|
|
||||||
"raceName": "Lizardfolk",
|
|
||||||
"raceSource": "VGM",
|
|
||||||
"effects": [
|
|
||||||
{
|
|
||||||
"name": "Natural Armor",
|
|
||||||
"transfer": true,
|
|
||||||
"changes": [
|
|
||||||
{
|
|
||||||
"key": "data.attributes.ac.calc",
|
|
||||||
"mode": "OVERRIDE",
|
|
||||||
"value": "custom"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "data.attributes.ac.formula",
|
|
||||||
"mode": "OVERRIDE",
|
|
||||||
"value": "13 + @abilities.dex.mod"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Natural Armor",
|
|
||||||
"source": "LR",
|
|
||||||
"raceName": "Locathah",
|
|
||||||
"raceSource": "LR",
|
|
||||||
"effects": [
|
|
||||||
{
|
|
||||||
"name": "Natural Armor",
|
|
||||||
"transfer": true,
|
|
||||||
"changes": [
|
|
||||||
{
|
|
||||||
"key": "data.attributes.ac.calc",
|
|
||||||
"mode": "OVERRIDE",
|
|
||||||
"value": "custom"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "data.attributes.ac.formula",
|
|
||||||
"mode": "OVERRIDE",
|
|
||||||
"value": "12 + @abilities.dex.mod"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Natural Armor",
|
|
||||||
"source": "GGR",
|
|
||||||
"raceName": "Loxodon",
|
|
||||||
"raceSource": "GGR",
|
|
||||||
"effects": [
|
|
||||||
{
|
|
||||||
"name": "Natural Armor",
|
|
||||||
"transfer": true,
|
|
||||||
"changes": [
|
|
||||||
{
|
|
||||||
"key": "data.attributes.ac.calc",
|
|
||||||
"mode": "OVERRIDE",
|
|
||||||
"value": "custom"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "data.attributes.ac.formula",
|
|
||||||
"mode": "OVERRIDE",
|
|
||||||
"value": "12 + @abilities.con.mod"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Shifting Feature",
|
|
||||||
"source": "ERLW",
|
|
||||||
"raceName": "Shifter (Beasthide)",
|
|
||||||
"raceSource": "ERLW",
|
|
||||||
"effects": [
|
|
||||||
{
|
|
||||||
"name": "Natural Armor",
|
|
||||||
"transfer": true,
|
|
||||||
"changes": [
|
|
||||||
{
|
|
||||||
"key": "data.attributes.ac.bonus",
|
|
||||||
"mode": "ADD",
|
|
||||||
"value": "+ 1"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"disabled": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "Animal Enhancement",
|
"name": "Animal Enhancement",
|
||||||
"source": "GGR",
|
"source": "GGR",
|
||||||
@@ -237,13 +39,13 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Natural Armor",
|
"name": "Armored Casing",
|
||||||
"source": "TTP",
|
"source": "AAG",
|
||||||
"raceName": "Tortle",
|
"raceName": "Autognome",
|
||||||
"raceSource": "TTP",
|
"raceSource": "AAG",
|
||||||
"effects": [
|
"effects": [
|
||||||
{
|
{
|
||||||
"name": "Natural Armor",
|
"name": "Armored Casing",
|
||||||
"transfer": true,
|
"transfer": true,
|
||||||
"changes": [
|
"changes": [
|
||||||
{
|
{
|
||||||
@@ -254,240 +56,12 @@
|
|||||||
{
|
{
|
||||||
"key": "data.attributes.ac.formula",
|
"key": "data.attributes.ac.formula",
|
||||||
"mode": "OVERRIDE",
|
"mode": "OVERRIDE",
|
||||||
"value": "17"
|
"value": "13 + @abilities.dex.mod"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "Shell Defense",
|
|
||||||
"source": "TTP",
|
|
||||||
"raceName": "Tortle",
|
|
||||||
"raceSource": "TTP",
|
|
||||||
"effects": [
|
|
||||||
{
|
|
||||||
"name": "Natural Armor",
|
|
||||||
"transfer": true,
|
|
||||||
"changes": [
|
|
||||||
{
|
|
||||||
"key": "data.attributes.ac.bonus",
|
|
||||||
"mode": "ADD",
|
|
||||||
"value": "+ 4"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"disabled": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Natural Armor",
|
|
||||||
"source": "DMG",
|
|
||||||
"raceName": "Troglodyte",
|
|
||||||
"raceSource": "DMG",
|
|
||||||
"effects": [
|
|
||||||
{
|
|
||||||
"name": "Natural Armor",
|
|
||||||
"transfer": true,
|
|
||||||
"changes": [
|
|
||||||
{
|
|
||||||
"key": "data.attributes.ac.bonus",
|
|
||||||
"mode": "ADD",
|
|
||||||
"value": "+ 1"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Integrated Protection",
|
|
||||||
"source": "ERLW",
|
|
||||||
"raceName": "Warforged",
|
|
||||||
"raceSource": "ERLW",
|
|
||||||
"effects": [
|
|
||||||
{
|
|
||||||
"name": "Natural Armor",
|
|
||||||
"transfer": true,
|
|
||||||
"changes": [
|
|
||||||
{
|
|
||||||
"key": "data.attributes.ac.bonus",
|
|
||||||
"mode": "ADD",
|
|
||||||
"value": "+ 1"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Breath Weapon",
|
|
||||||
"source": "PHB",
|
|
||||||
"raceName": "Dragonborn (Black)",
|
|
||||||
"raceSource": "PHB",
|
|
||||||
"system": {
|
|
||||||
"activation.type": "action",
|
|
||||||
"activation.cost": 1,
|
|
||||||
"target.value": 30,
|
|
||||||
"target.units": "ft",
|
|
||||||
"target.type": "line",
|
|
||||||
"range.units": "self",
|
|
||||||
"duration.units": "instantaneous",
|
|
||||||
"save.ability": "dex",
|
|
||||||
"save.scaling": "con"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Breath Weapon",
|
|
||||||
"source": "PHB",
|
|
||||||
"raceName": "Dragonborn (Blue)",
|
|
||||||
"raceSource": "PHB",
|
|
||||||
"system": {
|
|
||||||
"activation.type": "action",
|
|
||||||
"activation.cost": 1,
|
|
||||||
"target.value": 30,
|
|
||||||
"target.units": "ft",
|
|
||||||
"target.type": "line",
|
|
||||||
"range.units": "self",
|
|
||||||
"duration.units": "instantaneous",
|
|
||||||
"save.ability": "dex",
|
|
||||||
"save.scaling": "con"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Breath Weapon",
|
|
||||||
"source": "PHB",
|
|
||||||
"raceName": "Dragonborn (Brass)",
|
|
||||||
"raceSource": "PHB",
|
|
||||||
"system": {
|
|
||||||
"activation.type": "action",
|
|
||||||
"activation.cost": 1,
|
|
||||||
"target.value": 30,
|
|
||||||
"target.units": "ft",
|
|
||||||
"target.type": "line",
|
|
||||||
"range.units": "self",
|
|
||||||
"duration.units": "instantaneous",
|
|
||||||
"save.ability": "dex",
|
|
||||||
"save.scaling": "con"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Breath Weapon",
|
|
||||||
"source": "PHB",
|
|
||||||
"raceName": "Dragonborn (Bronze)",
|
|
||||||
"raceSource": "PHB",
|
|
||||||
"system": {
|
|
||||||
"activation.type": "action",
|
|
||||||
"activation.cost": 1,
|
|
||||||
"target.value": 30,
|
|
||||||
"target.units": "ft",
|
|
||||||
"target.type": "line",
|
|
||||||
"range.units": "self",
|
|
||||||
"duration.units": "instantaneous",
|
|
||||||
"save.ability": "dex",
|
|
||||||
"save.scaling": "con"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Breath Weapon",
|
|
||||||
"source": "PHB",
|
|
||||||
"raceName": "Dragonborn (Copper)",
|
|
||||||
"raceSource": "PHB",
|
|
||||||
"system": {
|
|
||||||
"activation.type": "action",
|
|
||||||
"activation.cost": 1,
|
|
||||||
"target.value": 30,
|
|
||||||
"target.units": "ft",
|
|
||||||
"target.type": "line",
|
|
||||||
"range.units": "self",
|
|
||||||
"duration.units": "instantaneous",
|
|
||||||
"save.ability": "dex",
|
|
||||||
"save.scaling": "con"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Breath Weapon",
|
|
||||||
"source": "PHB",
|
|
||||||
"raceName": "Dragonborn (Gold)",
|
|
||||||
"raceSource": "PHB",
|
|
||||||
"system": {
|
|
||||||
"activation.type": "action",
|
|
||||||
"activation.cost": 1,
|
|
||||||
"target.value": 15,
|
|
||||||
"target.units": "ft",
|
|
||||||
"target.type": "cone",
|
|
||||||
"range.units": "self",
|
|
||||||
"duration.units": "instantaneous",
|
|
||||||
"save.ability": "dex",
|
|
||||||
"save.scaling": "con"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Breath Weapon",
|
|
||||||
"source": "PHB",
|
|
||||||
"raceName": "Dragonborn (Green)",
|
|
||||||
"raceSource": "PHB",
|
|
||||||
"system": {
|
|
||||||
"activation.type": "action",
|
|
||||||
"activation.cost": 1,
|
|
||||||
"target.value": 15,
|
|
||||||
"target.units": "ft",
|
|
||||||
"target.type": "cone",
|
|
||||||
"range.units": "self",
|
|
||||||
"duration.units": "instantaneous",
|
|
||||||
"save.ability": "con",
|
|
||||||
"save.scaling": "con"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Breath Weapon",
|
|
||||||
"source": "PHB",
|
|
||||||
"raceName": "Dragonborn (Red)",
|
|
||||||
"raceSource": "PHB",
|
|
||||||
"system": {
|
|
||||||
"activation.type": "action",
|
|
||||||
"activation.cost": 1,
|
|
||||||
"target.value": 15,
|
|
||||||
"target.units": "ft",
|
|
||||||
"target.type": "cone",
|
|
||||||
"range.units": "self",
|
|
||||||
"duration.units": "instantaneous",
|
|
||||||
"save.ability": "dex",
|
|
||||||
"save.scaling": "con"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Breath Weapon",
|
|
||||||
"source": "PHB",
|
|
||||||
"raceName": "Dragonborn (Silver)",
|
|
||||||
"raceSource": "PHB",
|
|
||||||
"system": {
|
|
||||||
"activation.type": "action",
|
|
||||||
"activation.cost": 1,
|
|
||||||
"target.value": 15,
|
|
||||||
"target.units": "ft",
|
|
||||||
"target.type": "cone",
|
|
||||||
"range.units": "self",
|
|
||||||
"duration.units": "instantaneous",
|
|
||||||
"save.ability": "con",
|
|
||||||
"save.scaling": "con"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Breath Weapon",
|
|
||||||
"source": "PHB",
|
|
||||||
"raceName": "Dragonborn (White)",
|
|
||||||
"raceSource": "PHB",
|
|
||||||
"system": {
|
|
||||||
"activation.type": "action",
|
|
||||||
"activation.cost": 1,
|
|
||||||
"target.value": 15,
|
|
||||||
"target.units": "ft",
|
|
||||||
"target.type": "cone",
|
|
||||||
"range.units": "self",
|
|
||||||
"duration.units": "instantaneous",
|
|
||||||
"save.ability": "con",
|
|
||||||
"save.scaling": "con"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "Breath Weapon",
|
"name": "Breath Weapon",
|
||||||
"source": "EGW",
|
"source": "EGW",
|
||||||
@@ -1068,6 +642,262 @@
|
|||||||
"save.scaling": "con"
|
"save.scaling": "con"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "Breath Weapon",
|
||||||
|
"source": "PHB",
|
||||||
|
"raceName": "Dragonborn (Black)",
|
||||||
|
"raceSource": "PHB",
|
||||||
|
"system": {
|
||||||
|
"activation.type": "action",
|
||||||
|
"activation.cost": 1,
|
||||||
|
"target.value": 30,
|
||||||
|
"target.units": "ft",
|
||||||
|
"target.type": "line",
|
||||||
|
"range.units": "self",
|
||||||
|
"duration.units": "instantaneous",
|
||||||
|
"save.ability": "dex",
|
||||||
|
"save.scaling": "con"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Breath Weapon",
|
||||||
|
"source": "PHB",
|
||||||
|
"raceName": "Dragonborn (Blue)",
|
||||||
|
"raceSource": "PHB",
|
||||||
|
"system": {
|
||||||
|
"activation.type": "action",
|
||||||
|
"activation.cost": 1,
|
||||||
|
"target.value": 30,
|
||||||
|
"target.units": "ft",
|
||||||
|
"target.type": "line",
|
||||||
|
"range.units": "self",
|
||||||
|
"duration.units": "instantaneous",
|
||||||
|
"save.ability": "dex",
|
||||||
|
"save.scaling": "con"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Breath Weapon",
|
||||||
|
"source": "PHB",
|
||||||
|
"raceName": "Dragonborn (Brass)",
|
||||||
|
"raceSource": "PHB",
|
||||||
|
"system": {
|
||||||
|
"activation.type": "action",
|
||||||
|
"activation.cost": 1,
|
||||||
|
"target.value": 30,
|
||||||
|
"target.units": "ft",
|
||||||
|
"target.type": "line",
|
||||||
|
"range.units": "self",
|
||||||
|
"duration.units": "instantaneous",
|
||||||
|
"save.ability": "dex",
|
||||||
|
"save.scaling": "con"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Breath Weapon",
|
||||||
|
"source": "PHB",
|
||||||
|
"raceName": "Dragonborn (Bronze)",
|
||||||
|
"raceSource": "PHB",
|
||||||
|
"system": {
|
||||||
|
"activation.type": "action",
|
||||||
|
"activation.cost": 1,
|
||||||
|
"target.value": 30,
|
||||||
|
"target.units": "ft",
|
||||||
|
"target.type": "line",
|
||||||
|
"range.units": "self",
|
||||||
|
"duration.units": "instantaneous",
|
||||||
|
"save.ability": "dex",
|
||||||
|
"save.scaling": "con"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Breath Weapon",
|
||||||
|
"source": "PHB",
|
||||||
|
"raceName": "Dragonborn (Copper)",
|
||||||
|
"raceSource": "PHB",
|
||||||
|
"system": {
|
||||||
|
"activation.type": "action",
|
||||||
|
"activation.cost": 1,
|
||||||
|
"target.value": 30,
|
||||||
|
"target.units": "ft",
|
||||||
|
"target.type": "line",
|
||||||
|
"range.units": "self",
|
||||||
|
"duration.units": "instantaneous",
|
||||||
|
"save.ability": "dex",
|
||||||
|
"save.scaling": "con"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Breath Weapon",
|
||||||
|
"source": "PHB",
|
||||||
|
"raceName": "Dragonborn (Gold)",
|
||||||
|
"raceSource": "PHB",
|
||||||
|
"system": {
|
||||||
|
"activation.type": "action",
|
||||||
|
"activation.cost": 1,
|
||||||
|
"target.value": 15,
|
||||||
|
"target.units": "ft",
|
||||||
|
"target.type": "cone",
|
||||||
|
"range.units": "self",
|
||||||
|
"duration.units": "instantaneous",
|
||||||
|
"save.ability": "dex",
|
||||||
|
"save.scaling": "con"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Breath Weapon",
|
||||||
|
"source": "PHB",
|
||||||
|
"raceName": "Dragonborn (Green)",
|
||||||
|
"raceSource": "PHB",
|
||||||
|
"system": {
|
||||||
|
"activation.type": "action",
|
||||||
|
"activation.cost": 1,
|
||||||
|
"target.value": 15,
|
||||||
|
"target.units": "ft",
|
||||||
|
"target.type": "cone",
|
||||||
|
"range.units": "self",
|
||||||
|
"duration.units": "instantaneous",
|
||||||
|
"save.ability": "con",
|
||||||
|
"save.scaling": "con"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Breath Weapon",
|
||||||
|
"source": "PHB",
|
||||||
|
"raceName": "Dragonborn (Red)",
|
||||||
|
"raceSource": "PHB",
|
||||||
|
"system": {
|
||||||
|
"activation.type": "action",
|
||||||
|
"activation.cost": 1,
|
||||||
|
"target.value": 15,
|
||||||
|
"target.units": "ft",
|
||||||
|
"target.type": "cone",
|
||||||
|
"range.units": "self",
|
||||||
|
"duration.units": "instantaneous",
|
||||||
|
"save.ability": "dex",
|
||||||
|
"save.scaling": "con"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Breath Weapon",
|
||||||
|
"source": "PHB",
|
||||||
|
"raceName": "Dragonborn (Silver)",
|
||||||
|
"raceSource": "PHB",
|
||||||
|
"system": {
|
||||||
|
"activation.type": "action",
|
||||||
|
"activation.cost": 1,
|
||||||
|
"target.value": 15,
|
||||||
|
"target.units": "ft",
|
||||||
|
"target.type": "cone",
|
||||||
|
"range.units": "self",
|
||||||
|
"duration.units": "instantaneous",
|
||||||
|
"save.ability": "con",
|
||||||
|
"save.scaling": "con"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Breath Weapon",
|
||||||
|
"source": "PHB",
|
||||||
|
"raceName": "Dragonborn (White)",
|
||||||
|
"raceSource": "PHB",
|
||||||
|
"system": {
|
||||||
|
"activation.type": "action",
|
||||||
|
"activation.cost": 1,
|
||||||
|
"target.value": 15,
|
||||||
|
"target.units": "ft",
|
||||||
|
"target.type": "cone",
|
||||||
|
"range.units": "self",
|
||||||
|
"duration.units": "instantaneous",
|
||||||
|
"save.ability": "con",
|
||||||
|
"save.scaling": "con"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Dwarven Toughness",
|
||||||
|
"source": "PHB",
|
||||||
|
"raceName": "Dwarf (Hill)",
|
||||||
|
"raceSource": "PHB",
|
||||||
|
"effects": [
|
||||||
|
{
|
||||||
|
"name": "HP Increase",
|
||||||
|
"transfer": true,
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"key": "data.attributes.hp.bonuses.level",
|
||||||
|
"mode": "ADD",
|
||||||
|
"value": "+ 1"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Grit",
|
||||||
|
"source": "PSZ",
|
||||||
|
"raceName": "Goblin (Zendikar; Grotag Tribe)",
|
||||||
|
"raceSource": "PSZ",
|
||||||
|
"effects": [
|
||||||
|
{
|
||||||
|
"name": "Natural Armor",
|
||||||
|
"transfer": true,
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"key": "data.attributes.ac.calc",
|
||||||
|
"mode": "OVERRIDE",
|
||||||
|
"value": "custom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "data.attributes.ac.formula",
|
||||||
|
"mode": "OVERRIDE",
|
||||||
|
"value": "11 + @abilities.dex.mod"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Grit",
|
||||||
|
"source": "PSZ",
|
||||||
|
"raceName": "Goblin (Zendikar; Lavastep Tribe)",
|
||||||
|
"raceSource": "PSZ",
|
||||||
|
"_copy": {
|
||||||
|
"name": "Grit",
|
||||||
|
"source": "PSZ",
|
||||||
|
"raceName": "Goblin (Zendikar; Grotag Tribe)",
|
||||||
|
"raceSource": "PSZ"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Grit",
|
||||||
|
"source": "PSZ",
|
||||||
|
"raceName": "Goblin (Zendikar; Tuktuk Tribe)",
|
||||||
|
"raceSource": "PSZ",
|
||||||
|
"_copy": {
|
||||||
|
"name": "Grit",
|
||||||
|
"source": "PSZ",
|
||||||
|
"raceName": "Goblin (Zendikar; Grotag Tribe)",
|
||||||
|
"raceSource": "PSZ"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Hare-Trigger",
|
||||||
|
"source": "MPMM",
|
||||||
|
"raceName": "Harengon",
|
||||||
|
"raceSource": "MPMM",
|
||||||
|
"effects": [
|
||||||
|
{
|
||||||
|
"name": "Bonus Initiative",
|
||||||
|
"transfer": true,
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"key": "data.attributes.init.total",
|
||||||
|
"mode": "ADD",
|
||||||
|
"value": "+ @attributes.prof"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "Healing Hands",
|
"name": "Healing Hands",
|
||||||
"source": "MPMM",
|
"source": "MPMM",
|
||||||
@@ -1097,13 +927,152 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Armored Casing",
|
"name": "Hooves",
|
||||||
"source": "AAG",
|
"source": "GGR",
|
||||||
"raceName": "Autognome",
|
"raceName": "Centaur",
|
||||||
"raceSource": "AAG",
|
"raceSource": "GGR",
|
||||||
|
"system": {
|
||||||
|
"activation.type": "action",
|
||||||
|
"activation.cost": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Integrated Protection",
|
||||||
|
"source": "ERLW",
|
||||||
|
"raceName": "Warforged",
|
||||||
|
"raceSource": "ERLW",
|
||||||
"effects": [
|
"effects": [
|
||||||
{
|
{
|
||||||
"name": "Armored Casing",
|
"name": "Natural Armor",
|
||||||
|
"transfer": true,
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"key": "data.attributes.ac.bonus",
|
||||||
|
"mode": "ADD",
|
||||||
|
"value": "+ 1"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Natural Armor",
|
||||||
|
"source": "DMG",
|
||||||
|
"raceName": "Lizardfolk",
|
||||||
|
"raceSource": "DMG",
|
||||||
|
"effects": [
|
||||||
|
{
|
||||||
|
"name": "Natural Armor",
|
||||||
|
"transfer": true,
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"key": "data.attributes.ac.bonus",
|
||||||
|
"mode": "ADD",
|
||||||
|
"value": "+ 3"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Natural Armor",
|
||||||
|
"source": "DMG",
|
||||||
|
"raceName": "Troglodyte",
|
||||||
|
"raceSource": "DMG",
|
||||||
|
"effects": [
|
||||||
|
{
|
||||||
|
"name": "Natural Armor",
|
||||||
|
"transfer": true,
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"key": "data.attributes.ac.bonus",
|
||||||
|
"mode": "ADD",
|
||||||
|
"value": "+ 1"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Natural Armor",
|
||||||
|
"source": "GGR",
|
||||||
|
"raceName": "Loxodon",
|
||||||
|
"raceSource": "GGR",
|
||||||
|
"effects": [
|
||||||
|
{
|
||||||
|
"name": "Natural Armor",
|
||||||
|
"transfer": true,
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"key": "data.attributes.ac.calc",
|
||||||
|
"mode": "OVERRIDE",
|
||||||
|
"value": "custom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "data.attributes.ac.formula",
|
||||||
|
"mode": "OVERRIDE",
|
||||||
|
"value": "12 + @abilities.con.mod"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Natural Armor",
|
||||||
|
"source": "LR",
|
||||||
|
"raceName": "Locathah",
|
||||||
|
"raceSource": "LR",
|
||||||
|
"effects": [
|
||||||
|
{
|
||||||
|
"name": "Natural Armor",
|
||||||
|
"transfer": true,
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"key": "data.attributes.ac.calc",
|
||||||
|
"mode": "OVERRIDE",
|
||||||
|
"value": "custom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "data.attributes.ac.formula",
|
||||||
|
"mode": "OVERRIDE",
|
||||||
|
"value": "12 + @abilities.dex.mod"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Natural Armor",
|
||||||
|
"source": "TTP",
|
||||||
|
"raceName": "Tortle",
|
||||||
|
"raceSource": "TTP",
|
||||||
|
"effects": [
|
||||||
|
{
|
||||||
|
"name": "Natural Armor",
|
||||||
|
"transfer": true,
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"key": "data.attributes.ac.calc",
|
||||||
|
"mode": "OVERRIDE",
|
||||||
|
"value": "custom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "data.attributes.ac.formula",
|
||||||
|
"mode": "OVERRIDE",
|
||||||
|
"value": "17"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Natural Armor",
|
||||||
|
"source": "VGM",
|
||||||
|
"raceName": "Lizardfolk",
|
||||||
|
"raceSource": "VGM",
|
||||||
|
"effects": [
|
||||||
|
{
|
||||||
|
"name": "Natural Armor",
|
||||||
"transfer": true,
|
"transfer": true,
|
||||||
"changes": [
|
"changes": [
|
||||||
{
|
{
|
||||||
@@ -1121,21 +1090,52 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Hare-Trigger",
|
"name": "Radiant Soul",
|
||||||
"source": "MPMM",
|
"source": "VGM",
|
||||||
"raceName": "Harengon",
|
"raceName": "Aasimar (Protector)",
|
||||||
"raceSource": "MPMM",
|
"raceSource": "VGM",
|
||||||
|
"system": {
|
||||||
|
"activation.type": "action",
|
||||||
|
"activation.cost": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Shell Defense",
|
||||||
|
"source": "TTP",
|
||||||
|
"raceName": "Tortle",
|
||||||
|
"raceSource": "TTP",
|
||||||
"effects": [
|
"effects": [
|
||||||
{
|
{
|
||||||
"name": "Bonus Initiative",
|
"name": "Natural Armor",
|
||||||
"transfer": true,
|
"transfer": true,
|
||||||
"changes": [
|
"changes": [
|
||||||
{
|
{
|
||||||
"key": "data.attributes.init.total",
|
"key": "data.attributes.ac.bonus",
|
||||||
"mode": "ADD",
|
"mode": "ADD",
|
||||||
"value": "+ @attributes.prof"
|
"value": "+ 4"
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"disabled": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Shifting Feature",
|
||||||
|
"source": "ERLW",
|
||||||
|
"raceName": "Shifter (Beasthide)",
|
||||||
|
"raceSource": "ERLW",
|
||||||
|
"effects": [
|
||||||
|
{
|
||||||
|
"name": "Natural Armor",
|
||||||
|
"transfer": true,
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"key": "data.attributes.ac.bonus",
|
||||||
|
"mode": "ADD",
|
||||||
|
"value": "+ 1"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"disabled": true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -13919,6 +13919,16 @@
|
|||||||
"This smooth, rainbow-colored, egg-shaped stone can be thrown up to 30 feet and explodes in a 10-foot-radius sphere of magical energy on impact, destroying the stone. Any active spell of 5th level or lower in the sphere ends."
|
"This smooth, rainbow-colored, egg-shaped stone can be thrown up to 30 feet and explodes in a 10-foot-radius sphere of magical energy on impact, destroying the stone. Any active spell of 5th level or lower in the sphere ends."
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "Dissimortuum's Cursed Mask",
|
||||||
|
"source": "ToB1-2023",
|
||||||
|
"page": 106,
|
||||||
|
"rarity": "rare",
|
||||||
|
"wondrous": true,
|
||||||
|
"entries": [
|
||||||
|
"The dissimortuum's mask is nigh indestructible. When the creature is destroyed, its mask usually survives and breaks free. On its own, the object emits a faint magical aura with mixed enchantment and necromantic properties. It is a tempting souvenir, but any humanoid or giant foolish enough to don the mask is immediately wracked by pain and takes 7 ({@damage 2d6}) necrotic damage. The creature must succeed on a DC 15 Wisdom saving throw or become dominated by the mask. The domination arrives slowly. The creature acts normally for a day or two, but then the creature notices periods of time that cannot be accounted for. During these unremembered times, the creature gathers the grisly components needed to build a new body for the dissimortuum. This process takes a week, after which the creature is freed from domination as the dissimortuum arises anew and dons its mask once more."
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "Docent",
|
"name": "Docent",
|
||||||
"source": "ERLW",
|
"source": "ERLW",
|
||||||
@@ -29436,6 +29446,7 @@
|
|||||||
],
|
],
|
||||||
"wondrous": true,
|
"wondrous": true,
|
||||||
"weight": 8,
|
"weight": 8,
|
||||||
|
"bonusSavingThrowConcentration": "+2",
|
||||||
"recharge": "dawn",
|
"recharge": "dawn",
|
||||||
"rechargeAmount": 3,
|
"rechargeAmount": 3,
|
||||||
"charges": 3,
|
"charges": 3,
|
||||||
@@ -36516,6 +36527,7 @@
|
|||||||
"dmg1": "1d4",
|
"dmg1": "1d4",
|
||||||
"dmgType": "S",
|
"dmgType": "S",
|
||||||
"bonusWeapon": "+3",
|
"bonusWeapon": "+3",
|
||||||
|
"critThreshold": 18,
|
||||||
"entries": [
|
"entries": [
|
||||||
"Said to be a gift to Glasya from Asmodeus, the Scourge of Shadow is a multi-headed whip constructed from infernal iron. The scourge is nigh-in- destructible, and Glasya carries it with her wherever she goes. When she wields the whip in battle, it shrouds her in an aura of shadow.",
|
"Said to be a gift to Glasya from Asmodeus, the Scourge of Shadow is a multi-headed whip constructed from infernal iron. The scourge is nigh-in- destructible, and Glasya carries it with her wherever she goes. When she wields the whip in battle, it shrouds her in an aura of shadow.",
|
||||||
"The Scourge of Shadow is a magic whip. You have a +3 bonus to attack and damage rolls made with this weapon, and it does {@damage 3d4} slashing damage instead of its regular damage. When you hit a good aligned creature with it, that creatures takes an extra {@damage 4d4} necrotic damage.",
|
"The Scourge of Shadow is a magic whip. You have a +3 bonus to attack and damage rolls made with this weapon, and it does {@damage 3d4} slashing damage instead of its regular damage. When you hit a good aligned creature with it, that creatures takes an extra {@damage 4d4} necrotic damage.",
|
||||||
@@ -39762,6 +39774,18 @@
|
|||||||
"A transparent red, red-brown, or deep green gemstone."
|
"A transparent red, red-brown, or deep green gemstone."
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "Spinosaurus",
|
||||||
|
"source": "ToB1-2023",
|
||||||
|
"page": 103,
|
||||||
|
"type": "MNT",
|
||||||
|
"rarity": "none",
|
||||||
|
"value": 200000,
|
||||||
|
"entries": [
|
||||||
|
"Before it can be ridden in combat, a {@creature spinosaurus dinosaur|ToB1-2023} must practice bearing the weight of its trainer and passengers. They rarely master more than a handful of tricks, but they are extremely comfortable in the water and can be trained to be are aware that some of their riders may not breathe water.",
|
||||||
|
"An adult spinosaurus can carry up to six tons as cargo. Riding a spinosaurus requires an exotic saddle, riding platform, or howdah."
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "Spire of Conflux (Awakened)",
|
"name": "Spire of Conflux (Awakened)",
|
||||||
"source": "TDCSR",
|
"source": "TDCSR",
|
||||||
@@ -46991,6 +47015,17 @@
|
|||||||
],
|
],
|
||||||
"hasFluffImages": true
|
"hasFluffImages": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "Vanisher Hat",
|
||||||
|
"source": "ToB1-2023",
|
||||||
|
"page": 319,
|
||||||
|
"rarity": "uncommon",
|
||||||
|
"reqAttune": true,
|
||||||
|
"wondrous": true,
|
||||||
|
"entries": [
|
||||||
|
"This plain hat appears to be a rough burlap tam. A creature that can see through illusions sees the hat as a golden, bejeweled coronet. While wearing this hat, you can use an action to speak its command word to become invisible and gain a flying speed of 40 feet for up to 1 minute. Anything you are wearing or carrying is invisible with you. You remain invisible and capable of flying until you repeat the command word as an action or until you attack or cast a spell. Once used, the hat can't be used again until the next dawn."
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "Vanquisher's Banner",
|
"name": "Vanquisher's Banner",
|
||||||
"source": "XMtS",
|
"source": "XMtS",
|
||||||
|
|||||||
@@ -3084,15 +3084,23 @@
|
|||||||
"max": 350
|
"max": 350
|
||||||
},
|
},
|
||||||
"darkvision": 60,
|
"darkvision": 60,
|
||||||
"traitTags": [
|
|
||||||
"Tool Proficiency"
|
|
||||||
],
|
|
||||||
"languageProficiencies": [
|
"languageProficiencies": [
|
||||||
{
|
{
|
||||||
"common": true,
|
"common": true,
|
||||||
"dwarvish": true
|
"dwarvish": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"toolProficiencies": [
|
||||||
|
{
|
||||||
|
"choose": {
|
||||||
|
"from": [
|
||||||
|
"smith's tools",
|
||||||
|
"brewer's supplies",
|
||||||
|
"mason's tools"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
"weaponProficiencies": [
|
"weaponProficiencies": [
|
||||||
{
|
{
|
||||||
"battleaxe|phb": true,
|
"battleaxe|phb": true,
|
||||||
@@ -3195,15 +3203,17 @@
|
|||||||
"max": 350
|
"max": 350
|
||||||
},
|
},
|
||||||
"darkvision": 60,
|
"darkvision": 60,
|
||||||
"traitTags": [
|
|
||||||
"Tool Proficiency"
|
|
||||||
],
|
|
||||||
"languageProficiencies": [
|
"languageProficiencies": [
|
||||||
{
|
{
|
||||||
"common": true,
|
"common": true,
|
||||||
"dwarvish": true
|
"dwarvish": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"toolProficiencies": [
|
||||||
|
{
|
||||||
|
"anyArtisansTool": 2
|
||||||
|
}
|
||||||
|
],
|
||||||
"resist": [
|
"resist": [
|
||||||
"poison"
|
"poison"
|
||||||
],
|
],
|
||||||
@@ -3373,7 +3383,7 @@
|
|||||||
"name": "Trance",
|
"name": "Trance",
|
||||||
"entries": [
|
"entries": [
|
||||||
"You don't need to sleep, and magic can't put you to sleep. You can finish a long rest in 4 hours if you spend those hours in a trancelike meditation, during which you retain consciousness.",
|
"You don't need to sleep, and magic can't put you to sleep. You can finish a long rest in 4 hours if you spend those hours in a trancelike meditation, during which you retain consciousness.",
|
||||||
"Whenever you finish this trance, you can change your season, and you can gain two proficiencies that you don't have, each one with a weapon or a tool of your choice selected from the Player's Handbook. You mystically acquire these proficiencies by drawing them from shared elven memory, and you retain them until you finish your next long rest."
|
"Whenever you finish this trance, you can change your season, and you can gain two proficiencies that you don't have, each one with a {@book weapon|phb|5|weapons} or a {@book tool|phb|5|tools} of your choice selected from the Player's Handbook. You mystically acquire these proficiencies by drawing them from shared elven memory, and you retain them until you finish your next long rest."
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -4026,6 +4036,17 @@
|
|||||||
"auran": true
|
"auran": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"toolProficiencies": [
|
||||||
|
{
|
||||||
|
"choose": {
|
||||||
|
"from": [
|
||||||
|
"brewer's supplies",
|
||||||
|
"carpenter's tools",
|
||||||
|
"smith's tools"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
"entries": [
|
"entries": [
|
||||||
{
|
{
|
||||||
"name": "Age",
|
"name": "Age",
|
||||||
@@ -8324,14 +8345,16 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"darkvision": 60,
|
"darkvision": 60,
|
||||||
"traitTags": [
|
|
||||||
"Tool Proficiency"
|
|
||||||
],
|
|
||||||
"languageProficiencies": [
|
"languageProficiencies": [
|
||||||
{
|
{
|
||||||
"other": true
|
"other": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"toolProficiencies": [
|
||||||
|
{
|
||||||
|
"tinker's tools": true
|
||||||
|
}
|
||||||
|
],
|
||||||
"resist": [
|
"resist": [
|
||||||
"poison"
|
"poison"
|
||||||
],
|
],
|
||||||
@@ -8844,8 +8867,7 @@
|
|||||||
},
|
},
|
||||||
"traitTags": [
|
"traitTags": [
|
||||||
"Language Proficiency",
|
"Language Proficiency",
|
||||||
"Natural Weapon",
|
"Natural Weapon"
|
||||||
"Tool Proficiency"
|
|
||||||
],
|
],
|
||||||
"languageProficiencies": [
|
"languageProficiencies": [
|
||||||
{
|
{
|
||||||
@@ -9964,7 +9986,7 @@
|
|||||||
"name": "Trance",
|
"name": "Trance",
|
||||||
"entries": [
|
"entries": [
|
||||||
"You don't need to sleep, and magic can't put you to sleep. You can finish a long rest in 4 hours if you spend those hours in a trancelike meditation, during which you retain consciousness.",
|
"You don't need to sleep, and magic can't put you to sleep. You can finish a long rest in 4 hours if you spend those hours in a trancelike meditation, during which you retain consciousness.",
|
||||||
"Whenever you finish this trance, you can gain two proficiencies that you don't have, each one with a weapon or a tool of your choice selected from the Player's Handbook. You mystically acquire these proficiencies by drawing them from shared elven memory, and you retain them until you finish your next long rest."
|
"Whenever you finish this trance, you can gain two proficiencies that you don't have, each one with a {@book weapon|phb|5|weapons} or a {@book tool|phb|5|tools} of your choice selected from the Player's Handbook. You mystically acquire these proficiencies by drawing them from shared elven memory, and you retain them until you finish your next long rest."
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -10052,7 +10074,7 @@
|
|||||||
"name": "Trance",
|
"name": "Trance",
|
||||||
"entries": [
|
"entries": [
|
||||||
"You don't need to sleep, and magic can't put you to sleep. You can finish a long rest in 4 hours if you spend those hours in a trancelike meditation, during which you retain consciousness.",
|
"You don't need to sleep, and magic can't put you to sleep. You can finish a long rest in 4 hours if you spend those hours in a trancelike meditation, during which you retain consciousness.",
|
||||||
"Whenever you finish this trance, you can gain two proficiencies that you don't have, each one with a weapon or a tool of your choice selected from the Player's Handbook. You mystically acquire these proficiencies by drawing them from shared elven memory, and you retain them until you finish your next long rest."
|
"Whenever you finish this trance, you can gain two proficiencies that you don't have, each one with a {@book weapon|phb|5|weapons} or a {@book tool|phb|5|tools} of your choice selected from the Player's Handbook. You mystically acquire these proficiencies by drawing them from shared elven memory, and you retain them until you finish your next long rest."
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -12683,8 +12705,12 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"traitTags": [
|
"traitTags": [
|
||||||
"Natural Weapon",
|
"Natural Weapon"
|
||||||
"Tool Proficiency"
|
],
|
||||||
|
"toolProficiencies": [
|
||||||
|
{
|
||||||
|
"any": 1
|
||||||
|
}
|
||||||
],
|
],
|
||||||
"entries": [
|
"entries": [
|
||||||
{
|
{
|
||||||
@@ -14480,9 +14506,6 @@
|
|||||||
"cha": 1
|
"cha": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"traitTags": [
|
|
||||||
"Tool Proficiency"
|
|
||||||
],
|
|
||||||
"entries": [
|
"entries": [
|
||||||
{
|
{
|
||||||
"name": "Inspiring",
|
"name": "Inspiring",
|
||||||
@@ -14513,9 +14536,6 @@
|
|||||||
"dex": 1
|
"dex": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"traitTags": [
|
|
||||||
"Tool Proficiency"
|
|
||||||
],
|
|
||||||
"entries": [
|
"entries": [
|
||||||
{
|
{
|
||||||
"name": "One With the Wood",
|
"name": "One With the Wood",
|
||||||
@@ -15561,8 +15581,10 @@
|
|||||||
"con": 1
|
"con": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"traitTags": [
|
"toolProficiencies": [
|
||||||
"Tool Proficiency"
|
{
|
||||||
|
"tinker's tools": true
|
||||||
|
}
|
||||||
],
|
],
|
||||||
"entries": [
|
"entries": [
|
||||||
{
|
{
|
||||||
@@ -15728,8 +15750,10 @@
|
|||||||
"con": 2
|
"con": 2
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"traitTags": [
|
"toolProficiencies": [
|
||||||
"Tool Proficiency"
|
{
|
||||||
|
"thieves' tools": true
|
||||||
|
}
|
||||||
],
|
],
|
||||||
"entries": [
|
"entries": [
|
||||||
{
|
{
|
||||||
@@ -18214,14 +18238,16 @@
|
|||||||
"int": 2
|
"int": 2
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"traitTags": [
|
|
||||||
"Tool Proficiency"
|
|
||||||
],
|
|
||||||
"skillProficiencies": [
|
"skillProficiencies": [
|
||||||
{
|
{
|
||||||
"survival": true
|
"survival": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"toolProficiencies": [
|
||||||
|
{
|
||||||
|
"navigator's tools": true
|
||||||
|
}
|
||||||
|
],
|
||||||
"additionalSpells": [
|
"additionalSpells": [
|
||||||
{
|
{
|
||||||
"ability": "int",
|
"ability": "int",
|
||||||
|
|||||||
10
decks.html
10
decks.html
@@ -84,12 +84,12 @@
|
|||||||
<div id="lst__search-glass" class="lst__wrp-search-glass no-events ve-flex-vh-center"><span class="glyphicon glyphicon-search"></span></div>
|
<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 class="lst__wrp-search-visible no-events ve-flex-vh-center"></div>
|
||||||
</div>
|
</div>
|
||||||
<button class="btn btn-default" id="reset">Reset</button>
|
<button type="button" class="btn btn-default" id="reset">Reset</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="filtertools" class="input-group input-group--bottom ve-flex no-shrink">
|
<div id="filtertools" class="input-group input-group--bottom ve-flex no-shrink">
|
||||||
<button class="ve-col-10 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
<button type="button" class="ve-col-10 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
||||||
<button class="sort btn btn-default btn-xs ve-grow" data-sort="source">Source</button>
|
<button type="button" class="sort btn btn-default btn-xs ve-grow" data-sort="source">Source</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="list" class="list list--stats"></div>
|
<div id="list" class="list list--stats"></div>
|
||||||
@@ -100,7 +100,7 @@
|
|||||||
<div id="contentwrapper" class="view-col ve-flex-7">
|
<div id="contentwrapper" class="view-col ve-flex-7">
|
||||||
<div id="sublistcontainer" class="sublist sublist--resizable no-print">
|
<div id="sublistcontainer" class="sublist sublist--resizable no-print">
|
||||||
<div id="sublistsort" class="btn-group sublist__wrp-cols">
|
<div id="sublistsort" class="btn-group sublist__wrp-cols">
|
||||||
<button class="ve-col-12 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
<button type="button" class="ve-col-12 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="sublist" class="list"></div>
|
<div id="sublist" class="list"></div>
|
||||||
@@ -119,7 +119,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="ve-text-center mt-2 no-print">
|
<div class="ve-text-center mt-2 no-print">
|
||||||
<button class="btn btn-xs btn-info" id="manage-brew">Manage Homebrew</button>
|
<button type="button" class="btn btn-xs btn-info" id="manage-brew">Manage Homebrew</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
22
deities.html
22
deities.html
@@ -82,15 +82,15 @@
|
|||||||
<div id="lst__search-glass" class="lst__wrp-search-glass no-events ve-flex-vh-center"><span class="glyphicon glyphicon-search"></span></div>
|
<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 class="lst__wrp-search-visible no-events ve-flex-vh-center"></div>
|
||||||
</div>
|
</div>
|
||||||
<button class="btn btn-default" id="reset">Reset</button>
|
<button type="button" class="btn btn-default" id="reset">Reset</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="filtertools" class="input-group input-group--bottom ve-flex no-shrink">
|
<div id="filtertools" class="input-group input-group--bottom ve-flex no-shrink">
|
||||||
<button class="ve-col-3 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
<button type="button" class="ve-col-3 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
||||||
<button class="ve-col-2 sort btn btn-default btn-xs" data-sort="pantheon">Pantheon</button>
|
<button type="button" class="ve-col-2 sort btn btn-default btn-xs" data-sort="pantheon">Pantheon</button>
|
||||||
<button class="ve-col-2 sort btn btn-default btn-xs" data-sort="alignment">Alignment</button>
|
<button type="button" class="ve-col-2 sort btn btn-default btn-xs" data-sort="alignment">Alignment</button>
|
||||||
<button class="ve-col-3 sort btn btn-default btn-xs" data-sort="domains">Domains</button>
|
<button type="button" class="ve-col-3 sort btn btn-default btn-xs" data-sort="domains">Domains</button>
|
||||||
<button class="sort btn btn-default btn-xs ve-grow" data-sort="source">Source</button>
|
<button type="button" class="sort btn btn-default btn-xs ve-grow" data-sort="source">Source</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="list" class="list list--stats"></div>
|
<div id="list" class="list list--stats"></div>
|
||||||
@@ -101,10 +101,10 @@
|
|||||||
<div id="contentwrapper" class="view-col ve-flex-4">
|
<div id="contentwrapper" class="view-col ve-flex-4">
|
||||||
<div id="sublistcontainer" class="sublist sublist--resizable no-print">
|
<div id="sublistcontainer" class="sublist sublist--resizable no-print">
|
||||||
<div id="sublistsort" class="btn-group sublist__wrp-cols">
|
<div id="sublistsort" class="btn-group sublist__wrp-cols">
|
||||||
<button class="ve-col-4 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
<button type="button" class="ve-col-4 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
||||||
<button class="ve-col-2 sort btn btn-default btn-xs" data-sort="pantheon">Pantheon</button>
|
<button type="button" class="ve-col-2 sort btn btn-default btn-xs" data-sort="pantheon">Pantheon</button>
|
||||||
<button class="ve-col-2 sort btn btn-default btn-xs" data-sort="alignment">Alignment</button>
|
<button type="button" class="ve-col-2 sort btn btn-default btn-xs" data-sort="alignment">Alignment</button>
|
||||||
<button class="ve-col-4 sort btn btn-default btn-xs" data-sort="domains">Domains</button>
|
<button type="button" class="ve-col-4 sort btn btn-default btn-xs" data-sort="domains">Domains</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="sublist" class="list"></div>
|
<div id="sublist" class="list"></div>
|
||||||
@@ -123,7 +123,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="ve-text-center mt-2 no-print">
|
<div class="ve-text-center mt-2 no-print">
|
||||||
<button class="btn btn-xs btn-info" id="manage-brew">Manage Homebrew</button>
|
<button type="button" class="btn btn-xs btn-info" id="manage-brew">Manage Homebrew</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
22
feats.html
22
feats.html
@@ -82,15 +82,15 @@
|
|||||||
<div id="lst__search-glass" class="lst__wrp-search-glass no-events ve-flex-vh-center"><span class="glyphicon glyphicon-search"></span></div>
|
<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 class="lst__wrp-search-visible no-events ve-flex-vh-center"></div>
|
||||||
</div>
|
</div>
|
||||||
<button class="btn btn-default" id="reset">Reset</button>
|
<button type="button" class="btn btn-default" id="reset">Reset</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="filtertools" class="input-group input-group--bottom ve-flex no-shrink">
|
<div id="filtertools" class="input-group input-group--bottom ve-flex no-shrink">
|
||||||
<button class="ve-col-0-3 btn btn-default btn-xs p-0 lst__btn-collapse-all-previews" name="list-toggle-all-previews">[+]</button>
|
<button type="button" class="ve-col-0-3 btn btn-default btn-xs p-0 lst__btn-collapse-all-previews" name="list-toggle-all-previews">[+]</button>
|
||||||
<button class="ve-col-3-5 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
<button type="button" class="ve-col-3-5 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
||||||
<button class="ve-col-3-5 sort btn btn-default btn-xs" data-sort="ability">Ability</button>
|
<button type="button" class="ve-col-3-5 sort btn btn-default btn-xs" data-sort="ability">Ability</button>
|
||||||
<button class="ve-col-3 sort btn btn-default btn-xs" data-sort="prerequisite">Prerequisite</button>
|
<button type="button" class="ve-col-3 sort btn btn-default btn-xs" data-sort="prerequisite">Prerequisite</button>
|
||||||
<button class="sort btn btn-default btn-xs ve-grow" data-sort="source">Source</button>
|
<button type="button" class="sort btn btn-default btn-xs ve-grow" data-sort="source">Source</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="list" class="list list--stats"></div>
|
<div id="list" class="list list--stats"></div>
|
||||||
@@ -101,9 +101,9 @@
|
|||||||
<div id="contentwrapper" class="view-col">
|
<div id="contentwrapper" class="view-col">
|
||||||
<div id="sublistcontainer" class="sublist sublist--resizable no-print">
|
<div id="sublistcontainer" class="sublist sublist--resizable no-print">
|
||||||
<div id="sublistsort" class="btn-group sublist__wrp-cols">
|
<div id="sublistsort" class="btn-group sublist__wrp-cols">
|
||||||
<button class="ve-col-4 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
<button type="button" class="ve-col-4 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
||||||
<button class="ve-col-4 sort btn btn-default btn-xs" data-sort="ability">Ability</button>
|
<button type="button" class="ve-col-4 sort btn btn-default btn-xs" data-sort="ability">Ability</button>
|
||||||
<button class="ve-col-4 sort btn btn-default btn-xs" data-sort="prerequisite">Prerequisite</button>
|
<button type="button" class="ve-col-4 sort btn btn-default btn-xs" data-sort="prerequisite">Prerequisite</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="sublist" class="list"></div>
|
<div id="sublist" class="list"></div>
|
||||||
@@ -122,8 +122,8 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="ve-text-center mt-2 no-print">
|
<div class="ve-text-center mt-2 no-print">
|
||||||
<button class="btn btn-default btn-xs" id="btn-book">Printer View</button>
|
<button type="button" class="btn btn-default btn-xs" id="btn-book">Printer View</button>
|
||||||
<button class="btn btn-xs btn-info" id="manage-brew">Manage Homebrew</button>
|
<button type="button" class="btn btn-xs btn-info" id="manage-brew">Manage Homebrew</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
38
items.html
38
items.html
@@ -84,15 +84,15 @@
|
|||||||
<div id="lst__search-glass" class="lst__wrp-search-glass no-events ve-flex-vh-center"><span class="glyphicon glyphicon-search"></span></div>
|
<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 class="lst__wrp-search-visible no-events ve-flex-vh-center"></div>
|
||||||
</div>
|
</div>
|
||||||
<button class="btn btn-default" id="reset">Reset</button>
|
<button type="button" class="btn btn-default" id="reset">Reset</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="filtertools-mundane" class="ele-mundane input-group input-group--bottom ve-flex no-shrink">
|
<div id="filtertools-mundane" class="ele-mundane input-group input-group--bottom ve-flex no-shrink">
|
||||||
<button class="ve-col-3-5 sort btn btn-default btn-xs" data-sort="name" data-sortby="asc">Name</button>
|
<button type="button" class="ve-col-3-5 sort btn btn-default btn-xs" data-sort="name" data-sortby="asc">Name</button>
|
||||||
<button class="ve-col-4-5 sort btn btn-default btn-xs" data-sort="type" data-sortby="asc">Type</button>
|
<button type="button" class="ve-col-4-5 sort btn btn-default btn-xs" data-sort="type" data-sortby="asc">Type</button>
|
||||||
<button class="ve-col-1-5 sort btn btn-default btn-xs" data-sort="cost" data-sortby="asc">Cost</button>
|
<button type="button" class="ve-col-1-5 sort btn btn-default btn-xs" data-sort="cost" data-sortby="asc">Cost</button>
|
||||||
<button class="ve-col-1-5 sort btn btn-default btn-xs" data-sort="weight" data-sortby="asc">Weight</button>
|
<button type="button" class="ve-col-1-5 sort btn btn-default btn-xs" data-sort="weight" data-sortby="asc">Weight</button>
|
||||||
<button class="sort btn btn-default btn-xs ve-grow" data-sort="source" data-sortby="asc">Source</button>
|
<button type="button" class="sort btn btn-default btn-xs ve-grow" data-sort="source" data-sortby="asc">Source</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="list list--stats mundane ele-mundane"></div>
|
<div class="list list--stats mundane ele-mundane"></div>
|
||||||
@@ -103,12 +103,12 @@
|
|||||||
<div class="no-shrink itm__list-divider ele-mundane-and-magic"></div>
|
<div class="no-shrink itm__list-divider ele-mundane-and-magic"></div>
|
||||||
|
|
||||||
<div id="filtertools-magic" class="ele-magic input-group input-group--bottom ve-flex no-shrink">
|
<div id="filtertools-magic" class="ele-magic input-group input-group--bottom ve-flex no-shrink">
|
||||||
<button class="fullborder ve-col-3-5 sort btn btn-default btn-xs" data-sort="name" data-sortby="asc">Name</button>
|
<button type="button" class="fullborder ve-col-3-5 sort btn btn-default btn-xs" data-sort="name" data-sortby="asc">Name</button>
|
||||||
<button class="fullborder ve-col-4 sort btn btn-default btn-xs" data-sort="type" data-sortby="asc">Type</button>
|
<button type="button" class="fullborder ve-col-4 sort btn btn-default btn-xs" data-sort="type" data-sortby="asc">Type</button>
|
||||||
<button class="fullborder ve-col-1-5 sort btn btn-default btn-xs" data-sort="weight" data-sortby="asc">Weight</button>
|
<button type="button" class="fullborder ve-col-1-5 sort btn btn-default btn-xs" data-sort="weight" data-sortby="asc">Weight</button>
|
||||||
<button class="ve-col-0-6 sort btn btn-default btn-xs" data-sort="attunement" title="Can Be Attuned">A.</button>
|
<button type="button" class="ve-col-0-6 sort btn btn-default btn-xs" data-sort="attunement" title="Can Be Attuned">A.</button>
|
||||||
<button class="fullborder ve-col-1-4 sort btn btn-default btn-xs" data-sort="rarity" data-sortby="asc">Rarity</button>
|
<button type="button" class="fullborder ve-col-1-4 sort btn btn-default btn-xs" data-sort="rarity" data-sortby="asc">Rarity</button>
|
||||||
<button class="fullborder sort btn btn-default btn-xs ve-grow" data-sort="source" data-sortby="asc">Source</button>
|
<button type="button" class="fullborder sort btn btn-default btn-xs ve-grow" data-sort="source" data-sortby="asc">Source</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="list list--stats magic ele-magic"></div>
|
<div class="list list--stats magic ele-magic"></div>
|
||||||
@@ -121,10 +121,10 @@
|
|||||||
<div id="contentwrapper" class="view-col itm__wrp-stats">
|
<div id="contentwrapper" class="view-col itm__wrp-stats">
|
||||||
<div id="sublistcontainer" class="sublist sublist--resizable no-print">
|
<div id="sublistcontainer" class="sublist sublist--resizable no-print">
|
||||||
<div id="sublistsort" class="btn-group sublist__wrp-cols">
|
<div id="sublistsort" class="btn-group sublist__wrp-cols">
|
||||||
<button class="ve-col-6 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
<button type="button" class="ve-col-6 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
||||||
<button class="ve-col-2 sort btn btn-default btn-xs" data-sort="weight">Weight</button>
|
<button type="button" class="ve-col-2 sort btn btn-default btn-xs" data-sort="weight">Weight</button>
|
||||||
<button class="ve-col-2 sort btn btn-default btn-xs" data-sort="cost">Cost</button>
|
<button type="button" class="ve-col-2 sort btn btn-default btn-xs" data-sort="cost">Cost</button>
|
||||||
<button class="ve-col-2 sort btn btn-default btn-xs" data-sort="count">Number</button>
|
<button type="button" class="ve-col-2 sort btn btn-default btn-xs" data-sort="count">Number</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="sublist" class="list"></div>
|
<div id="sublist" class="list"></div>
|
||||||
@@ -150,9 +150,9 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="ve-text-center mt-2 no-print">
|
<div class="ve-text-center mt-2 no-print">
|
||||||
<button class="btn btn-default btn-xs" id="btn-book">Printer View</button>
|
<button type="button" class="btn btn-default btn-xs" id="btn-book">Printer View</button>
|
||||||
<button class="btn btn-default btn-xs" id="btn-show-table" title="View and Download Items in Tabular Format">Table View</button>
|
<button type="button" class="btn btn-default btn-xs" id="btn-show-table" title="View and Download Items in Tabular Format">Table View</button>
|
||||||
<button class="btn btn-xs btn-info" id="manage-brew">Manage Homebrew</button>
|
<button type="button" class="btn btn-xs btn-info" id="manage-brew">Manage Homebrew</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1553,7 +1553,7 @@ class CreatureParser extends BaseParser {
|
|||||||
// regular creatures
|
// regular creatures
|
||||||
|
|
||||||
// region Size
|
// region Size
|
||||||
const reSize = new RegExp(`(${Object.values(Parser.SIZE_ABV_TO_FULL).join("|")})`, "i");
|
const reSize = new RegExp(`\\b(${Object.values(Parser.SIZE_ABV_TO_FULL).join("|")})\\b`, "i");
|
||||||
const reSizeGlobal = new RegExp(reSize, "gi");
|
const reSizeGlobal = new RegExp(reSize, "gi");
|
||||||
|
|
||||||
const tks = meta.curLine.split(reSizeGlobal);
|
const tks = meta.curLine.split(reSizeGlobal);
|
||||||
|
|||||||
@@ -2,6 +2,12 @@
|
|||||||
|
|
||||||
class AcConvert {
|
class AcConvert {
|
||||||
static tryPostProcessAc (mon, cbMan, cbErr) {
|
static tryPostProcessAc (mon, cbMan, cbErr) {
|
||||||
|
const traitNames = new Set(
|
||||||
|
(mon.trait || [])
|
||||||
|
.map(it => it.name ? it.name.toLowerCase() : null)
|
||||||
|
.filter(Boolean),
|
||||||
|
);
|
||||||
|
|
||||||
if (this._tryPostProcessAc_special(mon, cbMan, cbErr)) return;
|
if (this._tryPostProcessAc_special(mon, cbMan, cbErr)) return;
|
||||||
|
|
||||||
const nuAc = [];
|
const nuAc = [];
|
||||||
@@ -114,14 +120,14 @@ class AcConvert {
|
|||||||
|
|
||||||
// everything else
|
// everything else
|
||||||
default: {
|
default: {
|
||||||
const simpleFrom = this._getSimpleFrom(fromLow);
|
const simpleFrom = this._getSimpleFrom({fromLow, traitNames});
|
||||||
if (simpleFrom) return froms.push(simpleFrom);
|
if (simpleFrom) return froms.push(simpleFrom);
|
||||||
|
|
||||||
// Special parsing for barding, as the pre-barding armor type might not exactly match our known
|
// Special parsing for barding, as the pre-barding armor type might not exactly match our known
|
||||||
// barding names (e.g. "chainmail barding")
|
// barding names (e.g. "chainmail barding")
|
||||||
const mWithBarding = /^(?<ac>\d+) with (?<name>(?<type>.*?) barding)$/.exec(fromLow);
|
const mWithBarding = /^(?<ac>\d+) with (?<name>(?<type>.*?) barding)$/.exec(fromLow);
|
||||||
if (mWithBarding) {
|
if (mWithBarding) {
|
||||||
let simpleFromBarding = this._getSimpleFrom(mWithBarding.groups.type);
|
let simpleFromBarding = this._getSimpleFrom({fromLow: mWithBarding.groups.type, traitNames});
|
||||||
if (simpleFromBarding) {
|
if (simpleFromBarding) {
|
||||||
simpleFromBarding = simpleFromBarding
|
simpleFromBarding = simpleFromBarding
|
||||||
.replace(/{@item ([^}]+)}/, (...m) => {
|
.replace(/{@item ([^}]+)}/, (...m) => {
|
||||||
@@ -203,7 +209,7 @@ class AcConvert {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static _getSimpleFrom (fromLow) {
|
static _getSimpleFrom ({fromLow, traitNames}) {
|
||||||
switch (fromLow) {
|
switch (fromLow) {
|
||||||
// region unhandled/other
|
// region unhandled/other
|
||||||
case "unarmored defense":
|
case "unarmored defense":
|
||||||
@@ -323,6 +329,10 @@ class AcConvert {
|
|||||||
if (/scraps of .*?armor/i.test(fromLow)) { // e.g. "scraps of hide armor"
|
if (/scraps of .*?armor/i.test(fromLow)) { // e.g. "scraps of hide armor"
|
||||||
return fromLow;
|
return fromLow;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (traitNames.has(fromLow)) {
|
||||||
|
return fromLow;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -371,9 +381,19 @@ class _CreatureImmunityResistanceVulnerabilityConverterBase {
|
|||||||
static _getSplitInput ({ipt}) {
|
static _getSplitInput ({ipt}) {
|
||||||
return ipt
|
return ipt
|
||||||
.toLowerCase()
|
.toLowerCase()
|
||||||
.split(";")
|
|
||||||
|
// Split e.g.
|
||||||
|
// "Bludgeoning and Piercing from nonmagical attacks, Acid, Fire, Lightning"
|
||||||
|
.split(/(.*\b(?:from|by)\b[^,;.!?]+)(?:[,;] ?)?/g)
|
||||||
.map(it => it.trim())
|
.map(it => it.trim())
|
||||||
.filter(Boolean);
|
.filter(Boolean)
|
||||||
|
|
||||||
|
// Split e.g.
|
||||||
|
// "poison; bludgeoning, piercing, and slashing from nonmagical attacks"
|
||||||
|
.flatMap(pt => pt.split(";"))
|
||||||
|
.map(it => it.trim())
|
||||||
|
.filter(Boolean)
|
||||||
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1343,9 +1363,14 @@ class MiscTag {
|
|||||||
globalThis.MiscTag = MiscTag;
|
globalThis.MiscTag = MiscTag;
|
||||||
|
|
||||||
class SpellcastingTraitConvert {
|
class SpellcastingTraitConvert {
|
||||||
|
static SPELL_SRC_MAP = {};
|
||||||
|
static SPELL_SRD_MAP = {};
|
||||||
|
|
||||||
static init (spellData) {
|
static init (spellData) {
|
||||||
// reversed so official sources take precedence over 3pp
|
spellData.forEach(s => {
|
||||||
spellData.forEach(s => SpellcastingTraitConvert.SPELL_SRC_MAP[s.name.toLowerCase()] = s.source);
|
this.SPELL_SRC_MAP[s.name.toLowerCase()] = s.source;
|
||||||
|
if (typeof s.srd === "string") this.SPELL_SRD_MAP[s.srd.toLowerCase()] = s.name;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
static tryParseSpellcasting (ent, {isMarkdown, cbErr, displayAs, actions, reactions}) {
|
static tryParseSpellcasting (ent, {isMarkdown, cbErr, displayAs, actions, reactions}) {
|
||||||
@@ -1490,6 +1515,8 @@ class SpellcastingTraitConvert {
|
|||||||
str = str.substring(0, ixParenOpen);
|
str = str.substring(0, ixParenOpen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
str = this._parseSpell_getNonSrdSpellName(str);
|
||||||
|
|
||||||
return [
|
return [
|
||||||
`{@spell ${str}${this._parseSpell_getSourcePart(str)}}`,
|
`{@spell ${str}${this._parseSpell_getSourcePart(str)}}`,
|
||||||
ptsSuffix.join(" "),
|
ptsSuffix.join(" "),
|
||||||
@@ -1498,6 +1525,16 @@ class SpellcastingTraitConvert {
|
|||||||
.join(" ");
|
.join(" ");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static _parseSpell_getNonSrdSpellName (spellName) {
|
||||||
|
const nonSrdName = SpellcastingTraitConvert.SPELL_SRD_MAP[spellName.toLowerCase().trim()];
|
||||||
|
if (!nonSrdName) return spellName;
|
||||||
|
|
||||||
|
if (spellName.toSpellCase() === spellName) return nonSrdName.toSpellCase();
|
||||||
|
if (spellName.toLowerCase() === spellName) return nonSrdName.toLowerCase();
|
||||||
|
if (spellName.toTitleCase() === spellName) return nonSrdName.toTitleCase();
|
||||||
|
return spellName;
|
||||||
|
}
|
||||||
|
|
||||||
static _parseSpell_getSourcePart (spellName) {
|
static _parseSpell_getSourcePart (spellName) {
|
||||||
const source = SpellcastingTraitConvert._getSpellSource(spellName);
|
const source = SpellcastingTraitConvert._getSpellSource(spellName);
|
||||||
return `${source && source !== Parser.SRC_PHB ? `|${source}` : ""}`;
|
return `${source && source !== Parser.SRC_PHB ? `|${source}` : ""}`;
|
||||||
@@ -1583,7 +1620,6 @@ class SpellcastingTraitConvert {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SpellcastingTraitConvert.SPELL_SRC_MAP = {};
|
|
||||||
|
|
||||||
globalThis.SpellcastingTraitConvert = SpellcastingTraitConvert;
|
globalThis.SpellcastingTraitConvert = SpellcastingTraitConvert;
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,6 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
class LanguagesSublistManager extends SublistManager {
|
class LanguagesSublistManager extends SublistManager {
|
||||||
constructor () {
|
|
||||||
super({
|
|
||||||
sublistClass: "sublanguages",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
static get _ROW_TEMPLATE () {
|
static get _ROW_TEMPLATE () {
|
||||||
return [
|
return [
|
||||||
new SublistCellTemplate({
|
new SublistCellTemplate({
|
||||||
@@ -70,8 +64,6 @@ class LanguagesPage extends ListPage {
|
|||||||
|
|
||||||
pageFilter,
|
pageFilter,
|
||||||
|
|
||||||
listClass: "languages",
|
|
||||||
|
|
||||||
dataProps: ["language"],
|
dataProps: ["language"],
|
||||||
|
|
||||||
isMarkdownPopout: true,
|
isMarkdownPopout: true,
|
||||||
|
|||||||
@@ -107,7 +107,6 @@ class SublistManager {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param [opts]
|
* @param [opts]
|
||||||
* @param [opts.sublistClass] Sublist class.
|
|
||||||
* @param [opts.sublistListOptions] Other sublist options.
|
* @param [opts.sublistListOptions] Other sublist options.
|
||||||
* @param [opts.isSublistItemsCountable] If the sublist items should be countable, i.e. have a quantity.
|
* @param [opts.isSublistItemsCountable] If the sublist items should be countable, i.e. have a quantity.
|
||||||
* @param [opts.shiftCountAddSubtract] If the sublist items should be countable, i.e. have a quantity.
|
* @param [opts.shiftCountAddSubtract] If the sublist items should be countable, i.e. have a quantity.
|
||||||
@@ -115,7 +114,6 @@ class SublistManager {
|
|||||||
constructor (opts) {
|
constructor (opts) {
|
||||||
opts = opts || {};
|
opts = opts || {};
|
||||||
|
|
||||||
this._sublistClass = opts.sublistClass; // TODO(PageGen) remove once all pages transitioned
|
|
||||||
this._sublistListOptions = opts.sublistListOptions || {};
|
this._sublistListOptions = opts.sublistListOptions || {};
|
||||||
this._isSublistItemsCountable = !!opts.isSublistItemsCountable;
|
this._isSublistItemsCountable = !!opts.isSublistItemsCountable;
|
||||||
this._shiftCountAddSubtract = opts.shiftCountAddSubtract ?? 20;
|
this._shiftCountAddSubtract = opts.shiftCountAddSubtract ?? 20;
|
||||||
@@ -160,7 +158,7 @@ class SublistManager {
|
|||||||
|
|
||||||
this._listSub = new List({
|
this._listSub = new List({
|
||||||
...this._sublistListOptions,
|
...this._sublistListOptions,
|
||||||
$wrpList: this._sublistClass ? $(`.${this._sublistClass}`) : $(`#sublist`),
|
$wrpList: $(`#sublist`),
|
||||||
isUseJquery: true,
|
isUseJquery: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -987,7 +985,6 @@ class ListPage {
|
|||||||
* `pageFilter` must be specified.)
|
* `pageFilter` must be specified.)
|
||||||
* @param [opts.pageFilter] PageFilter implementation for this page. (Either `filters` and `filterSource` or
|
* @param [opts.pageFilter] PageFilter implementation for this page. (Either `filters` and `filterSource` or
|
||||||
* `pageFilter` must be specified.)
|
* `pageFilter` must be specified.)
|
||||||
* @param [opts.listClass] List class.
|
|
||||||
* @param opts.listOptions Other list options.
|
* @param opts.listOptions Other list options.
|
||||||
* @param opts.dataProps JSON data propert(y/ies).
|
* @param opts.dataProps JSON data propert(y/ies).
|
||||||
*
|
*
|
||||||
@@ -1017,7 +1014,6 @@ class ListPage {
|
|||||||
this._filters = opts.filters;
|
this._filters = opts.filters;
|
||||||
this._filterSource = opts.filterSource;
|
this._filterSource = opts.filterSource;
|
||||||
this._pageFilter = opts.pageFilter;
|
this._pageFilter = opts.pageFilter;
|
||||||
this._listClass = opts.listClass; // TODO(PageGen) remove once all pages transitioned
|
|
||||||
this._listOptions = opts.listOptions || {};
|
this._listOptions = opts.listOptions || {};
|
||||||
this._dataProps = opts.dataProps;
|
this._dataProps = opts.dataProps;
|
||||||
this._bookViewOptions = opts.bookViewOptions;
|
this._bookViewOptions = opts.bookViewOptions;
|
||||||
@@ -1152,7 +1148,7 @@ class ListPage {
|
|||||||
const $btnReset = $("#reset");
|
const $btnReset = $("#reset");
|
||||||
this._list = this._initList({
|
this._list = this._initList({
|
||||||
$iptSearch,
|
$iptSearch,
|
||||||
$wrpList: this._listClass ? $(`.list.${this._listClass}`) : $(`#list`),
|
$wrpList: $(`#list`),
|
||||||
$btnReset,
|
$btnReset,
|
||||||
$btnClear: $(`#lst__search-glass`),
|
$btnClear: $(`#lst__search-glass`),
|
||||||
dispPageTagline: document.getElementById(`page__subtitle`),
|
dispPageTagline: document.getElementById(`page__subtitle`),
|
||||||
|
|||||||
@@ -1,12 +1,6 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
class ObjectsSublistManager extends SublistManager {
|
class ObjectsSublistManager extends SublistManager {
|
||||||
constructor () {
|
|
||||||
super({
|
|
||||||
sublistClass: "subobjects",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
static get _ROW_TEMPLATE () {
|
static get _ROW_TEMPLATE () {
|
||||||
return [
|
return [
|
||||||
new SublistCellTemplate({
|
new SublistCellTemplate({
|
||||||
@@ -64,8 +58,6 @@ class ObjectsPage extends ListPage {
|
|||||||
|
|
||||||
pageFilter,
|
pageFilter,
|
||||||
|
|
||||||
listClass: "objects",
|
|
||||||
|
|
||||||
dataProps: ["object"],
|
dataProps: ["object"],
|
||||||
|
|
||||||
listSyntax: new ListSyntaxObjects({fnGetDataList: () => this._dataList, pFnGetFluff}),
|
listSyntax: new ListSyntaxObjects({fnGetDataList: () => this._dataList, pFnGetFluff}),
|
||||||
|
|||||||
@@ -3,7 +3,6 @@
|
|||||||
class OptionalFeaturesSublistManager extends SublistManager {
|
class OptionalFeaturesSublistManager extends SublistManager {
|
||||||
constructor () {
|
constructor () {
|
||||||
super({
|
super({
|
||||||
sublistClass: "suboptfeatures",
|
|
||||||
sublistListOptions: {
|
sublistListOptions: {
|
||||||
fnSort: PageFilterOptionalFeatures.sortOptionalFeatures,
|
fnSort: PageFilterOptionalFeatures.sortOptionalFeatures,
|
||||||
},
|
},
|
||||||
@@ -84,7 +83,6 @@ class OptionalFeaturesPage extends ListPage {
|
|||||||
|
|
||||||
pageFilter,
|
pageFilter,
|
||||||
|
|
||||||
listClass: "optfeatures",
|
|
||||||
listOptions: {
|
listOptions: {
|
||||||
fnSort: PageFilterOptionalFeatures.sortOptionalFeatures,
|
fnSort: PageFilterOptionalFeatures.sortOptionalFeatures,
|
||||||
},
|
},
|
||||||
|
|||||||
11
js/parser.js
11
js/parser.js
@@ -645,7 +645,7 @@ Parser.sourceJsonToDate = function (source) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
Parser.sourceJsonToColor = function (source) {
|
Parser.sourceJsonToColor = function (source) {
|
||||||
return `source${Parser.sourceJsonToAbv(source)}`;
|
return `source__${source}`;
|
||||||
};
|
};
|
||||||
|
|
||||||
Parser.sourceJsonToStyle = function (source) {
|
Parser.sourceJsonToStyle = function (source) {
|
||||||
@@ -2536,7 +2536,7 @@ Parser.vehicleTypeToFull = function (vehicleType) {
|
|||||||
|
|
||||||
// SOURCES =============================================================================================================
|
// SOURCES =============================================================================================================
|
||||||
|
|
||||||
Parser.SRC_5ETOOLS_TMP = "Parser.SRC_5ETOOLS_TMP"; // Temp source, used as a placeholder value
|
Parser.SRC_5ETOOLS_TMP = "SRC_5ETOOLS_TMP"; // Temp source, used as a placeholder value
|
||||||
|
|
||||||
Parser.SRC_CoS = "CoS";
|
Parser.SRC_CoS = "CoS";
|
||||||
Parser.SRC_DMG = "DMG";
|
Parser.SRC_DMG = "DMG";
|
||||||
@@ -2645,6 +2645,7 @@ Parser.SRC_GHLoE = "GHLoE";
|
|||||||
Parser.SRC_DoDk = "DoDk";
|
Parser.SRC_DoDk = "DoDk";
|
||||||
Parser.SRC_HWCS = "HWCS";
|
Parser.SRC_HWCS = "HWCS";
|
||||||
Parser.SRC_HWAitW = "HWAitW";
|
Parser.SRC_HWAitW = "HWAitW";
|
||||||
|
Parser.SRC_ToB1_2023 = "ToB1-2023";
|
||||||
Parser.SRC_TD = "TD";
|
Parser.SRC_TD = "TD";
|
||||||
Parser.SRC_SCREEN = "Screen";
|
Parser.SRC_SCREEN = "Screen";
|
||||||
Parser.SRC_SCREEN_WILDERNESS_KIT = "ScreenWildernessKit";
|
Parser.SRC_SCREEN_WILDERNESS_KIT = "ScreenWildernessKit";
|
||||||
@@ -2821,6 +2822,7 @@ Parser.SOURCE_JSON_TO_FULL[Parser.SRC_GHLoE] = "Grim Hollow: Lairs of Etharis";
|
|||||||
Parser.SOURCE_JSON_TO_FULL[Parser.SRC_DoDk] = "Dungeons of Drakkenheim";
|
Parser.SOURCE_JSON_TO_FULL[Parser.SRC_DoDk] = "Dungeons of Drakkenheim";
|
||||||
Parser.SOURCE_JSON_TO_FULL[Parser.SRC_HWCS] = "Humblewood Campaign Setting";
|
Parser.SOURCE_JSON_TO_FULL[Parser.SRC_HWCS] = "Humblewood Campaign Setting";
|
||||||
Parser.SOURCE_JSON_TO_FULL[Parser.SRC_HWAitW] = "Humblewood: Adventure in the Wood";
|
Parser.SOURCE_JSON_TO_FULL[Parser.SRC_HWAitW] = "Humblewood: Adventure in the Wood";
|
||||||
|
Parser.SOURCE_JSON_TO_FULL[Parser.SRC_ToB1_2023] = "Tome of Beasts 1 (2023 Edition)";
|
||||||
Parser.SOURCE_JSON_TO_FULL[Parser.SRC_TD] = "Tarot Deck";
|
Parser.SOURCE_JSON_TO_FULL[Parser.SRC_TD] = "Tarot Deck";
|
||||||
Parser.SOURCE_JSON_TO_FULL[Parser.SRC_SCREEN] = "Dungeon Master's Screen";
|
Parser.SOURCE_JSON_TO_FULL[Parser.SRC_SCREEN] = "Dungeon Master's Screen";
|
||||||
Parser.SOURCE_JSON_TO_FULL[Parser.SRC_SCREEN_WILDERNESS_KIT] = "Dungeon Master's Screen: Wilderness Kit";
|
Parser.SOURCE_JSON_TO_FULL[Parser.SRC_SCREEN_WILDERNESS_KIT] = "Dungeon Master's Screen: Wilderness Kit";
|
||||||
@@ -2972,6 +2974,7 @@ Parser.SOURCE_JSON_TO_ABV[Parser.SRC_GHLoE] = "GHLoE";
|
|||||||
Parser.SOURCE_JSON_TO_ABV[Parser.SRC_DoDk] = "DoDk";
|
Parser.SOURCE_JSON_TO_ABV[Parser.SRC_DoDk] = "DoDk";
|
||||||
Parser.SOURCE_JSON_TO_ABV[Parser.SRC_HWCS] = "HWCS";
|
Parser.SOURCE_JSON_TO_ABV[Parser.SRC_HWCS] = "HWCS";
|
||||||
Parser.SOURCE_JSON_TO_ABV[Parser.SRC_HWAitW] = "HWAitW";
|
Parser.SOURCE_JSON_TO_ABV[Parser.SRC_HWAitW] = "HWAitW";
|
||||||
|
Parser.SOURCE_JSON_TO_ABV[Parser.SRC_ToB1_2023] = "ToB1'23";
|
||||||
Parser.SOURCE_JSON_TO_ABV[Parser.SRC_TD] = "TD";
|
Parser.SOURCE_JSON_TO_ABV[Parser.SRC_TD] = "TD";
|
||||||
Parser.SOURCE_JSON_TO_ABV[Parser.SRC_SCREEN] = "Screen";
|
Parser.SOURCE_JSON_TO_ABV[Parser.SRC_SCREEN] = "Screen";
|
||||||
Parser.SOURCE_JSON_TO_ABV[Parser.SRC_SCREEN_WILDERNESS_KIT] = "ScWild";
|
Parser.SOURCE_JSON_TO_ABV[Parser.SRC_SCREEN_WILDERNESS_KIT] = "ScWild";
|
||||||
@@ -3122,6 +3125,7 @@ Parser.SOURCE_JSON_TO_DATE[Parser.SRC_GHLoE] = "2023-11-30";
|
|||||||
Parser.SOURCE_JSON_TO_DATE[Parser.SRC_DoDk] = "2023-12-21";
|
Parser.SOURCE_JSON_TO_DATE[Parser.SRC_DoDk] = "2023-12-21";
|
||||||
Parser.SOURCE_JSON_TO_DATE[Parser.SRC_HWCS] = "2019-06-17";
|
Parser.SOURCE_JSON_TO_DATE[Parser.SRC_HWCS] = "2019-06-17";
|
||||||
Parser.SOURCE_JSON_TO_DATE[Parser.SRC_HWAitW] = "2019-06-17";
|
Parser.SOURCE_JSON_TO_DATE[Parser.SRC_HWAitW] = "2019-06-17";
|
||||||
|
Parser.SOURCE_JSON_TO_DATE[Parser.SRC_ToB1_2023] = "2023-05-31";
|
||||||
Parser.SOURCE_JSON_TO_DATE[Parser.SRC_TD] = "2022-05-24";
|
Parser.SOURCE_JSON_TO_DATE[Parser.SRC_TD] = "2022-05-24";
|
||||||
Parser.SOURCE_JSON_TO_DATE[Parser.SRC_SCREEN] = "2015-01-20";
|
Parser.SOURCE_JSON_TO_DATE[Parser.SRC_SCREEN] = "2015-01-20";
|
||||||
Parser.SOURCE_JSON_TO_DATE[Parser.SRC_SCREEN_WILDERNESS_KIT] = "2020-11-17";
|
Parser.SOURCE_JSON_TO_DATE[Parser.SRC_SCREEN_WILDERNESS_KIT] = "2020-11-17";
|
||||||
@@ -3311,6 +3315,7 @@ Parser.SOURCES_PARTNERED_WOTC = new Set([
|
|||||||
Parser.SRC_DoDk,
|
Parser.SRC_DoDk,
|
||||||
Parser.SRC_HWCS,
|
Parser.SRC_HWCS,
|
||||||
Parser.SRC_HWAitW,
|
Parser.SRC_HWAitW,
|
||||||
|
Parser.SRC_ToB1_2023,
|
||||||
Parser.SRC_TD,
|
Parser.SRC_TD,
|
||||||
]);
|
]);
|
||||||
// region Source categories
|
// region Source categories
|
||||||
@@ -3397,6 +3402,7 @@ Parser.SOURCES_NON_FR = new Set([
|
|||||||
Parser.SRC_DoDk,
|
Parser.SRC_DoDk,
|
||||||
Parser.SRC_HWCS,
|
Parser.SRC_HWCS,
|
||||||
Parser.SRC_HWAitW,
|
Parser.SRC_HWAitW,
|
||||||
|
Parser.SRC_ToB1_2023,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
// endregion
|
// endregion
|
||||||
@@ -3439,6 +3445,7 @@ Parser.SOURCES_AVAILABLE_DOCS_BOOK = {};
|
|||||||
Parser.SRC_BMT,
|
Parser.SRC_BMT,
|
||||||
Parser.SRC_DMTCRG,
|
Parser.SRC_DMTCRG,
|
||||||
Parser.SRC_HWCS,
|
Parser.SRC_HWCS,
|
||||||
|
Parser.SRC_ToB1_2023,
|
||||||
Parser.SRC_TD,
|
Parser.SRC_TD,
|
||||||
].forEach(src => {
|
].forEach(src => {
|
||||||
Parser.SOURCES_AVAILABLE_DOCS_BOOK[src] = src;
|
Parser.SOURCES_AVAILABLE_DOCS_BOOK[src] = src;
|
||||||
|
|||||||
@@ -1,12 +1,6 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
class PsionicsSublistManager extends SublistManager {
|
class PsionicsSublistManager extends SublistManager {
|
||||||
constructor () {
|
|
||||||
super({
|
|
||||||
sublistClass: "subpsionics",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
static get _ROW_TEMPLATE () {
|
static get _ROW_TEMPLATE () {
|
||||||
return [
|
return [
|
||||||
new SublistCellTemplate({
|
new SublistCellTemplate({
|
||||||
@@ -65,10 +59,6 @@ class PsionicsPage extends ListPage {
|
|||||||
|
|
||||||
pageFilter,
|
pageFilter,
|
||||||
|
|
||||||
listClass: "psionics",
|
|
||||||
|
|
||||||
sublistClass: "subpsionics",
|
|
||||||
|
|
||||||
dataProps: ["psionic"],
|
dataProps: ["psionic"],
|
||||||
|
|
||||||
isMarkdownPopout: true,
|
isMarkdownPopout: true,
|
||||||
|
|||||||
@@ -1,12 +1,6 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
class RacesSublistManager extends SublistManager {
|
class RacesSublistManager extends SublistManager {
|
||||||
constructor () {
|
|
||||||
super({
|
|
||||||
sublistClass: "subraces",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
static get _ROW_TEMPLATE () {
|
static get _ROW_TEMPLATE () {
|
||||||
return [
|
return [
|
||||||
new SublistCellTemplate({
|
new SublistCellTemplate({
|
||||||
@@ -73,8 +67,6 @@ class RacesPage extends ListPage {
|
|||||||
|
|
||||||
pageFilter,
|
pageFilter,
|
||||||
|
|
||||||
listClass: "races",
|
|
||||||
|
|
||||||
dataProps: ["race"],
|
dataProps: ["race"],
|
||||||
|
|
||||||
isMarkdownPopout: true,
|
isMarkdownPopout: true,
|
||||||
|
|||||||
@@ -1,12 +1,6 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
class RecipesSublistManager extends SublistManager {
|
class RecipesSublistManager extends SublistManager {
|
||||||
constructor () {
|
|
||||||
super({
|
|
||||||
sublistClass: "subrecipes",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
_getCustomHashId ({entity}) {
|
_getCustomHashId ({entity}) {
|
||||||
return Renderer.recipe.getCustomHashId(entity);
|
return Renderer.recipe.getCustomHashId(entity);
|
||||||
}
|
}
|
||||||
@@ -71,8 +65,6 @@ class RecipesPage extends ListPage {
|
|||||||
|
|
||||||
pageFilter,
|
pageFilter,
|
||||||
|
|
||||||
listClass: "recipes",
|
|
||||||
|
|
||||||
dataProps: ["recipe"],
|
dataProps: ["recipe"],
|
||||||
|
|
||||||
isMarkdownPopout: true,
|
isMarkdownPopout: true,
|
||||||
|
|||||||
@@ -1689,6 +1689,8 @@ RendererMarkdown.vehicle = class {
|
|||||||
renderer.render(entriesMetaShip.entrySizeDimensions),
|
renderer.render(entriesMetaShip.entrySizeDimensions),
|
||||||
RendererMarkdown.vehicle.ship.getCrewCargoPaceSection_(ent, {entriesMetaShip}),
|
RendererMarkdown.vehicle.ship.getCrewCargoPaceSection_(ent, {entriesMetaShip}),
|
||||||
RendererMarkdown.utils.compact.getRenderedAbilityScores(ent),
|
RendererMarkdown.utils.compact.getRenderedAbilityScores(ent),
|
||||||
|
entriesMeta.entryDamageVulnerabilities ? renderer.render(entriesMeta.entryDamageVulnerabilities) : null,
|
||||||
|
entriesMeta.entryDamageResistances ? renderer.render(entriesMeta.entryDamageResistances) : null,
|
||||||
entriesMeta.entryDamageImmunities ? renderer.render(entriesMeta.entryDamageImmunities) : null,
|
entriesMeta.entryDamageImmunities ? renderer.render(entriesMeta.entryDamageImmunities) : null,
|
||||||
entriesMeta.entryConditionImmunities ? renderer.render(entriesMeta.entryConditionImmunities) : null,
|
entriesMeta.entryConditionImmunities ? renderer.render(entriesMeta.entryConditionImmunities) : null,
|
||||||
ent.action ? "### Actions" : null,
|
ent.action ? "### Actions" : null,
|
||||||
@@ -1770,6 +1772,8 @@ RendererMarkdown.vehicle = class {
|
|||||||
.map(prop => renderer.render(entriesMetaInfwar[prop])),
|
.map(prop => renderer.render(entriesMetaInfwar[prop])),
|
||||||
renderer.render(entriesMetaInfwar.entrySpeedNote),
|
renderer.render(entriesMetaInfwar.entrySpeedNote),
|
||||||
RendererMarkdown.utils.compact.getRenderedAbilityScores(ent),
|
RendererMarkdown.utils.compact.getRenderedAbilityScores(ent),
|
||||||
|
entriesMeta.entryDamageVulnerabilities ? renderer.render(entriesMeta.entryDamageVulnerabilities) : null,
|
||||||
|
entriesMeta.entryDamageResistances ? renderer.render(entriesMeta.entryDamageResistances) : null,
|
||||||
entriesMeta.entryDamageImmunities ? renderer.render(entriesMeta.entryDamageImmunities) : null,
|
entriesMeta.entryDamageImmunities ? renderer.render(entriesMeta.entryDamageImmunities) : null,
|
||||||
entriesMeta.entryConditionImmunities ? renderer.render(entriesMeta.entryConditionImmunities) : null,
|
entriesMeta.entryConditionImmunities ? renderer.render(entriesMeta.entryConditionImmunities) : null,
|
||||||
...this._getLinesRendered_traits({ent, renderer}),
|
...this._getLinesRendered_traits({ent, renderer}),
|
||||||
|
|||||||
31
js/render.js
31
js/render.js
@@ -260,6 +260,25 @@ globalThis.Renderer = function () {
|
|||||||
|
|
||||||
this._getPlugins = function (pluginType) { return this._plugins[pluginType] ||= []; };
|
this._getPlugins = function (pluginType) { return this._plugins[pluginType] ||= []; };
|
||||||
|
|
||||||
|
// TODO(Future) refactor to use this
|
||||||
|
this._applyPlugins_useFirst = function (pluginType, commonArgs, pluginArgs) {
|
||||||
|
for (const plugin of this._getPlugins(pluginType)) {
|
||||||
|
const out = plugin(commonArgs, pluginArgs);
|
||||||
|
if (out) return out;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this._applyPlugins_useAll = function (pluginType, commonArgs, pluginArgs) {
|
||||||
|
const plugins = this._getPlugins(pluginType);
|
||||||
|
if (!plugins?.length) return null;
|
||||||
|
|
||||||
|
let input = pluginArgs.input;
|
||||||
|
for (const plugin of plugins) {
|
||||||
|
input = plugin(commonArgs, pluginArgs) ?? input;
|
||||||
|
}
|
||||||
|
return input;
|
||||||
|
};
|
||||||
|
|
||||||
/** Run a function with the given plugin active. */
|
/** Run a function with the given plugin active. */
|
||||||
this.withPlugin = function ({pluginTypes, fnPlugin, fn}) {
|
this.withPlugin = function ({pluginTypes, fnPlugin, fn}) {
|
||||||
for (const pt of pluginTypes) this.addPlugin(pt, fnPlugin);
|
for (const pt of pluginTypes) this.addPlugin(pt, fnPlugin);
|
||||||
@@ -1547,7 +1566,9 @@ globalThis.Renderer = function () {
|
|||||||
};
|
};
|
||||||
|
|
||||||
this._renderString = function (entry, textStack, meta, options) {
|
this._renderString = function (entry, textStack, meta, options) {
|
||||||
const tagSplit = Renderer.splitByTags(entry);
|
const str = this._applyPlugins_useAll("string_preprocess", {textStack, meta, options}, {input: entry}) ?? entry;
|
||||||
|
|
||||||
|
const tagSplit = Renderer.splitByTags(str);
|
||||||
const len = tagSplit.length;
|
const len = tagSplit.length;
|
||||||
for (let i = 0; i < len; ++i) {
|
for (let i = 0; i < len; ++i) {
|
||||||
const s = tagSplit[i];
|
const s = tagSplit[i];
|
||||||
@@ -9605,6 +9626,12 @@ Renderer.vehicle = class {
|
|||||||
|
|
||||||
static getVehicleRenderableEntriesMeta (ent) {
|
static getVehicleRenderableEntriesMeta (ent) {
|
||||||
return {
|
return {
|
||||||
|
entryDamageVulnerabilities: ent.vulnerable
|
||||||
|
? `{@b Damage Vulnerabilities} ${Parser.getFullImmRes(ent.vulnerable)}`
|
||||||
|
: null,
|
||||||
|
entryDamageResistances: ent.resist
|
||||||
|
? `{@b Damage Resistances} ${Parser.getFullImmRes(ent.resist)}`
|
||||||
|
: null,
|
||||||
entryDamageImmunities: ent.immune
|
entryDamageImmunities: ent.immune
|
||||||
? `{@b Damage Immunities} ${Parser.getFullImmRes(ent.immune)}`
|
? `{@b Damage Immunities} ${Parser.getFullImmRes(ent.immune)}`
|
||||||
: null,
|
: null,
|
||||||
@@ -9940,6 +9967,8 @@ Renderer.vehicle = class {
|
|||||||
entriesMeta ||= Renderer.vehicle.getVehicleRenderableEntriesMeta(ent);
|
entriesMeta ||= Renderer.vehicle.getVehicleRenderableEntriesMeta(ent);
|
||||||
|
|
||||||
const props = [
|
const props = [
|
||||||
|
"entryDamageVulnerabilities",
|
||||||
|
"entryDamageResistances",
|
||||||
"entryDamageImmunities",
|
"entryDamageImmunities",
|
||||||
"entryConditionImmunities",
|
"entryConditionImmunities",
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -1,12 +1,6 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
class RewardsSublistManager extends SublistManager {
|
class RewardsSublistManager extends SublistManager {
|
||||||
constructor () {
|
|
||||||
super({
|
|
||||||
sublistClass: "subrewards",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
static get _ROW_TEMPLATE () {
|
static get _ROW_TEMPLATE () {
|
||||||
return [
|
return [
|
||||||
new SublistCellTemplate({
|
new SublistCellTemplate({
|
||||||
@@ -61,8 +55,6 @@ class RewardsPage extends ListPage {
|
|||||||
|
|
||||||
pageFilter,
|
pageFilter,
|
||||||
|
|
||||||
listClass: "rewards",
|
|
||||||
|
|
||||||
dataProps: ["reward"],
|
dataProps: ["reward"],
|
||||||
|
|
||||||
isPreviewable: true,
|
isPreviewable: true,
|
||||||
|
|||||||
@@ -104,10 +104,10 @@ class SearchPage {
|
|||||||
SearchPage._$wrpResults = $(`<div class="ve-flex-col w-100">${this._getWrpResult_message("Loading...")}</div>`);
|
SearchPage._$wrpResults = $(`<div class="ve-flex-col w-100">${this._getWrpResult_message("Loading...")}</div>`);
|
||||||
|
|
||||||
$$(SearchPage._$wrp)`<div class="ve-flex-col w-100 pg-search__wrp">
|
$$(SearchPage._$wrp)`<div class="ve-flex-col w-100 pg-search__wrp">
|
||||||
<div class="ve-flex-v-center mb-2 mobile-ish__ve-flex-col">
|
<div class="ve-flex-v-center mb-2 mobile-lg__ve-flex-col">
|
||||||
<div class="ve-flex-v-center input-group btn-group mr-2 w-100 mobile-ish__mb-2">${$iptSearch}${$btnSearch}</div>
|
<div class="ve-flex-v-center input-group btn-group mr-2 w-100 mobile-lg__mb-2">${$iptSearch}${$btnSearch}</div>
|
||||||
|
|
||||||
<div class="ve-flex-v-center mobile__ve-flex-col mobile-ish__ve-flex-ai-start mobile-ish__w-100">
|
<div class="ve-flex-v-center mobile__ve-flex-col mobile-lg__ve-flex-ai-start mobile-lg__w-100">
|
||||||
${$btnHelp}
|
${$btnHelp}
|
||||||
<div class="ve-flex-v-center btn-group mr-2 mobile__mb-2 mobile__mr-0">
|
<div class="ve-flex-v-center btn-group mr-2 mobile__mb-2 mobile__mr-0">
|
||||||
${$btnToggleBrew}
|
${$btnToggleBrew}
|
||||||
|
|||||||
10
js/spells.js
10
js/spells.js
@@ -1,15 +1,6 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
class SpellsSublistManager extends SublistManager {
|
class SpellsSublistManager extends SublistManager {
|
||||||
constructor () {
|
|
||||||
super({
|
|
||||||
sublistClass: "subspells",
|
|
||||||
sublistListOptions: {
|
|
||||||
fnSort: PageFilterSpells.sortSpells,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
static get _ROW_TEMPLATE () {
|
static get _ROW_TEMPLATE () {
|
||||||
return [
|
return [
|
||||||
new SublistCellTemplate({
|
new SublistCellTemplate({
|
||||||
@@ -223,7 +214,6 @@ class SpellsPage extends ListPageMultiSource {
|
|||||||
super({
|
super({
|
||||||
pageFilter: new PageFilterSpells(),
|
pageFilter: new PageFilterSpells(),
|
||||||
|
|
||||||
listClass: "spells",
|
|
||||||
listOptions: {
|
listOptions: {
|
||||||
fnSort: PageFilterSpells.sortSpells,
|
fnSort: PageFilterSpells.sortSpells,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -661,8 +661,8 @@ class StatGenUi extends BaseComponent {
|
|||||||
// region Point Buy stages
|
// region Point Buy stages
|
||||||
const $stgPbHeader = this._render_$getStgPbHeader();
|
const $stgPbHeader = this._render_$getStgPbHeader();
|
||||||
const $stgPbCustom = this._render_$getStgPbCustom();
|
const $stgPbCustom = this._render_$getStgPbCustom();
|
||||||
const $vrPbCustom = $(`<div class="vr-5 mobile-ish__hidden"></div>`);
|
const $vrPbCustom = $(`<div class="vr-5 mobile-lg__hidden"></div>`);
|
||||||
const $hrPbCustom = $(`<hr class="hr-5 mobile-ish__visible">`);
|
const $hrPbCustom = $(`<hr class="hr-5 mobile-lg__visible">`);
|
||||||
const hkStgPb = () => {
|
const hkStgPb = () => {
|
||||||
$stgPbHeader.toggleVe(this.ixActiveTab === this._IX_TAB_PB);
|
$stgPbHeader.toggleVe(this.ixActiveTab === this._IX_TAB_PB);
|
||||||
$stgPbCustom.toggleVe(this.ixActiveTab === this._IX_TAB_PB);
|
$stgPbCustom.toggleVe(this.ixActiveTab === this._IX_TAB_PB);
|
||||||
@@ -859,7 +859,7 @@ class StatGenUi extends BaseComponent {
|
|||||||
${$stgArrayHeader}
|
${$stgArrayHeader}
|
||||||
${$stgManualHeader}
|
${$stgManualHeader}
|
||||||
|
|
||||||
<div class="ve-flex mobile-ish__ve-flex-col w-100 px-3">
|
<div class="ve-flex mobile-lg__ve-flex-col w-100 px-3">
|
||||||
<div class="ve-flex-col">
|
<div class="ve-flex-col">
|
||||||
${$stgPbHeader}
|
${$stgPbHeader}
|
||||||
|
|
||||||
@@ -1363,7 +1363,7 @@ class StatGenUi extends BaseComponent {
|
|||||||
const $wrpAsi = this._render_$getWrpAsi();
|
const $wrpAsi = this._render_$getWrpAsi();
|
||||||
|
|
||||||
$$($wrpTab)`
|
$$($wrpTab)`
|
||||||
<div class="ve-flex mobile-ish__ve-flex-col w-100 px-3">
|
<div class="ve-flex mobile-lg__ve-flex-col w-100 px-3">
|
||||||
<div class="ve-flex-col">
|
<div class="ve-flex-col">
|
||||||
<div class="ve-flex">
|
<div class="ve-flex">
|
||||||
<div class="ve-flex-col mr-3">
|
<div class="ve-flex-col mr-3">
|
||||||
|
|||||||
@@ -3,7 +3,6 @@
|
|||||||
class TablesSublistManager extends SublistManager {
|
class TablesSublistManager extends SublistManager {
|
||||||
constructor () {
|
constructor () {
|
||||||
super({
|
super({
|
||||||
sublistClass: "subtablesdata",
|
|
||||||
sublistListOptions: {
|
sublistListOptions: {
|
||||||
sortByInitial: "sortName",
|
sortByInitial: "sortName",
|
||||||
},
|
},
|
||||||
@@ -55,7 +54,6 @@ class TablesPage extends ListPage {
|
|||||||
|
|
||||||
pageFilter,
|
pageFilter,
|
||||||
|
|
||||||
listClass: "tablesdata",
|
|
||||||
listOptions: {
|
listOptions: {
|
||||||
sortByInitial: "sortName",
|
sortByInitial: "sortName",
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2119,7 +2119,7 @@ class ManageBrewUi {
|
|||||||
|
|
||||||
const btnViewJson = e_({
|
const btnViewJson = e_({
|
||||||
tag: "button",
|
tag: "button",
|
||||||
clazz: `btn btn-default btn-xs mobile-ish__hidden w-24p`,
|
clazz: `btn btn-default btn-xs mobile-lg__hidden w-24p`,
|
||||||
title: `${this._LBL_LIST_VIEW_JSON}: ${this.constructor._getBrewJsonTitle({brew, brewName})}`,
|
title: `${this._LBL_LIST_VIEW_JSON}: ${this.constructor._getBrewJsonTitle({brew, brewName})}`,
|
||||||
children: [
|
children: [
|
||||||
e_({
|
e_({
|
||||||
|
|||||||
@@ -78,11 +78,16 @@ PropOrder._ObjectKey = class {
|
|||||||
this.order = opts.order;
|
this.order = opts.order;
|
||||||
}
|
}
|
||||||
|
|
||||||
static getCopyKey ({fnGetModOrder}) {
|
static getCopyKey ({identKeys = null, fnGetModOrder}) {
|
||||||
return new this("_copy", {
|
return new this("_copy", {
|
||||||
order: [
|
order: [
|
||||||
"name",
|
...(
|
||||||
"source",
|
identKeys
|
||||||
|
|| [
|
||||||
|
"name",
|
||||||
|
"source",
|
||||||
|
]
|
||||||
|
),
|
||||||
"_templates",
|
"_templates",
|
||||||
new PropOrder._ObjectKey("_mod", {
|
new PropOrder._ObjectKey("_mod", {
|
||||||
fnGetOrder: fnGetModOrder,
|
fnGetOrder: fnGetModOrder,
|
||||||
@@ -112,6 +117,63 @@ PropOrder._ArrayKey = class {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
PropOrder._META = [
|
||||||
|
"sources",
|
||||||
|
|
||||||
|
"dependencies",
|
||||||
|
"includes",
|
||||||
|
"internalCopies",
|
||||||
|
|
||||||
|
"otherSources",
|
||||||
|
|
||||||
|
"spellSchools",
|
||||||
|
"spellDistanceUnits",
|
||||||
|
"optionalFeatureTypes",
|
||||||
|
"psionicTypes",
|
||||||
|
"currencyConversions",
|
||||||
|
"fonts",
|
||||||
|
|
||||||
|
"status",
|
||||||
|
"unlisted",
|
||||||
|
|
||||||
|
"dateAdded",
|
||||||
|
"dateLastModified",
|
||||||
|
"_dateLastModifiedHash",
|
||||||
|
];
|
||||||
|
PropOrder._FOUNDRY_GENERIC = [
|
||||||
|
"name",
|
||||||
|
"source",
|
||||||
|
|
||||||
|
"type",
|
||||||
|
"system",
|
||||||
|
"effects",
|
||||||
|
"flags",
|
||||||
|
"img",
|
||||||
|
|
||||||
|
"_merge",
|
||||||
|
];
|
||||||
|
PropOrder._FOUNDRY_GENERIC_FEATURE = [
|
||||||
|
"name",
|
||||||
|
"source",
|
||||||
|
|
||||||
|
"isIgnored",
|
||||||
|
|
||||||
|
"type",
|
||||||
|
"system",
|
||||||
|
"actorDataMod",
|
||||||
|
"effects",
|
||||||
|
"ignoreSrdEffects",
|
||||||
|
"flags",
|
||||||
|
"img",
|
||||||
|
|
||||||
|
"entries",
|
||||||
|
|
||||||
|
new PropOrder._ObjectKey("entryData", {
|
||||||
|
fnGetOrder: () => PropOrder._ENTRY_DATA_OBJECT,
|
||||||
|
}),
|
||||||
|
|
||||||
|
"_merge",
|
||||||
|
];
|
||||||
PropOrder._MONSTER = [
|
PropOrder._MONSTER = [
|
||||||
"name",
|
"name",
|
||||||
"shortName",
|
"shortName",
|
||||||
@@ -335,6 +397,7 @@ PropOrder._FOUNDRY_MONSTER = [
|
|||||||
"source",
|
"source",
|
||||||
|
|
||||||
"system",
|
"system",
|
||||||
|
"prototypeToken",
|
||||||
"effects",
|
"effects",
|
||||||
"flags",
|
"flags",
|
||||||
"img",
|
"img",
|
||||||
@@ -450,15 +513,6 @@ PropOrder._ROLL20_SPELL = [
|
|||||||
}),
|
}),
|
||||||
"shapedData",
|
"shapedData",
|
||||||
];
|
];
|
||||||
PropOrder._FOUNDRY_SPELL = [
|
|
||||||
"name",
|
|
||||||
"source",
|
|
||||||
|
|
||||||
"system",
|
|
||||||
"effects",
|
|
||||||
"flags",
|
|
||||||
"img",
|
|
||||||
];
|
|
||||||
PropOrder._SPELL__COPY_MOD = [
|
PropOrder._SPELL__COPY_MOD = [
|
||||||
"*",
|
"*",
|
||||||
"_",
|
"_",
|
||||||
@@ -739,6 +793,21 @@ PropOrder._SUBCLASS__COPY_MOD = [
|
|||||||
"_",
|
"_",
|
||||||
...PropOrder._SUBCLASS,
|
...PropOrder._SUBCLASS,
|
||||||
];
|
];
|
||||||
|
PropOrder._FOUNDRY_SUBCLASS = [
|
||||||
|
"name",
|
||||||
|
"source",
|
||||||
|
"className",
|
||||||
|
"classSource",
|
||||||
|
|
||||||
|
"advancement",
|
||||||
|
"chooseSystem",
|
||||||
|
"isChooseSystemRenderEntries",
|
||||||
|
"isChooseFlagsRenderEntries",
|
||||||
|
"isIgnored",
|
||||||
|
"ignoreSrdEffects",
|
||||||
|
"actorDataMod",
|
||||||
|
"actorTokenMod",
|
||||||
|
];
|
||||||
PropOrder._ENTRY_DATA_OBJECT = [
|
PropOrder._ENTRY_DATA_OBJECT = [
|
||||||
"languageProficiencies",
|
"languageProficiencies",
|
||||||
"skillProficiencies",
|
"skillProficiencies",
|
||||||
@@ -1110,15 +1179,6 @@ PropOrder._FEAT__COPY_MOD = [
|
|||||||
"_",
|
"_",
|
||||||
...PropOrder._FEAT,
|
...PropOrder._FEAT,
|
||||||
];
|
];
|
||||||
PropOrder._FOUNDRY_FEAT = [
|
|
||||||
"name",
|
|
||||||
"source",
|
|
||||||
|
|
||||||
"system",
|
|
||||||
"effects",
|
|
||||||
"flags",
|
|
||||||
"img",
|
|
||||||
];
|
|
||||||
PropOrder._VEHICLE = [
|
PropOrder._VEHICLE = [
|
||||||
"name",
|
"name",
|
||||||
|
|
||||||
@@ -1158,7 +1218,9 @@ PropOrder._VEHICLE = [
|
|||||||
|
|
||||||
"hp",
|
"hp",
|
||||||
|
|
||||||
|
"resist",
|
||||||
"immune",
|
"immune",
|
||||||
|
"vulnerable",
|
||||||
"conditionImmune",
|
"conditionImmune",
|
||||||
|
|
||||||
"hull",
|
"hull",
|
||||||
@@ -1319,6 +1381,7 @@ PropOrder._ITEM = [
|
|||||||
"bonusSavingThrow",
|
"bonusSavingThrow",
|
||||||
"bonusAbilityCheck",
|
"bonusAbilityCheck",
|
||||||
"bonusProficiencyBonus",
|
"bonusProficiencyBonus",
|
||||||
|
"bonusSavingThrowConcentration",
|
||||||
"modifySpeed",
|
"modifySpeed",
|
||||||
"reach",
|
"reach",
|
||||||
"critThreshold",
|
"critThreshold",
|
||||||
@@ -1679,11 +1742,26 @@ PropOrder._FOUNDRY_RACE_FEATURE = [
|
|||||||
"raceName",
|
"raceName",
|
||||||
"raceSource",
|
"raceSource",
|
||||||
|
|
||||||
|
PropOrder._ObjectKey.getCopyKey({
|
||||||
|
identKeys: [
|
||||||
|
"name",
|
||||||
|
"source",
|
||||||
|
"raceName",
|
||||||
|
"raceSource",
|
||||||
|
],
|
||||||
|
fnGetModOrder: () => PropOrder._FOUNDRY_RACE_FEATURE__COPY_MOD,
|
||||||
|
}),
|
||||||
|
|
||||||
"system",
|
"system",
|
||||||
"effects",
|
"effects",
|
||||||
"flags",
|
"flags",
|
||||||
"img",
|
"img",
|
||||||
];
|
];
|
||||||
|
PropOrder._FOUNDRY_RACE_FEATURE__COPY_MOD = [
|
||||||
|
"*",
|
||||||
|
"_",
|
||||||
|
...PropOrder._FOUNDRY_RACE_FEATURE,
|
||||||
|
];
|
||||||
PropOrder._TABLE = [
|
PropOrder._TABLE = [
|
||||||
"name",
|
"name",
|
||||||
|
|
||||||
@@ -1915,6 +1993,7 @@ PropOrder._CITATION = [
|
|||||||
];
|
];
|
||||||
|
|
||||||
PropOrder._PROP_TO_LIST = {
|
PropOrder._PROP_TO_LIST = {
|
||||||
|
"_meta": PropOrder._META,
|
||||||
"monster": PropOrder._MONSTER,
|
"monster": PropOrder._MONSTER,
|
||||||
"foundryMonster": PropOrder._FOUNDRY_MONSTER,
|
"foundryMonster": PropOrder._FOUNDRY_MONSTER,
|
||||||
"monsterFluff": PropOrder._GENERIC_FLUFF,
|
"monsterFluff": PropOrder._GENERIC_FLUFF,
|
||||||
@@ -1935,9 +2014,10 @@ PropOrder._PROP_TO_LIST = {
|
|||||||
"hazardFluff": PropOrder._GENERIC_FLUFF,
|
"hazardFluff": PropOrder._GENERIC_FLUFF,
|
||||||
"spell": PropOrder._SPELL,
|
"spell": PropOrder._SPELL,
|
||||||
"roll20Spell": PropOrder._ROLL20_SPELL,
|
"roll20Spell": PropOrder._ROLL20_SPELL,
|
||||||
"foundrySpell": PropOrder._FOUNDRY_SPELL,
|
"foundrySpell": PropOrder._FOUNDRY_GENERIC,
|
||||||
"spellList": PropOrder._SPELL_LIST,
|
"spellList": PropOrder._SPELL_LIST,
|
||||||
"action": PropOrder._ACTION,
|
"action": PropOrder._ACTION,
|
||||||
|
"foundryAction": PropOrder._FOUNDRY_GENERIC,
|
||||||
"adventure": PropOrder._ADVENTURE,
|
"adventure": PropOrder._ADVENTURE,
|
||||||
"adventureData": PropOrder._ADVENTURE_DATA,
|
"adventureData": PropOrder._ADVENTURE_DATA,
|
||||||
"book": PropOrder._BOOK,
|
"book": PropOrder._BOOK,
|
||||||
@@ -1947,6 +2027,7 @@ PropOrder._PROP_TO_LIST = {
|
|||||||
"class": PropOrder._CLASS,
|
"class": PropOrder._CLASS,
|
||||||
"foundryClass": PropOrder._FOUNDRY_CLASS,
|
"foundryClass": PropOrder._FOUNDRY_CLASS,
|
||||||
"subclass": PropOrder._SUBCLASS,
|
"subclass": PropOrder._SUBCLASS,
|
||||||
|
"foundrySubclass": PropOrder._FOUNDRY_SUBCLASS,
|
||||||
"classFeature": PropOrder._CLASS_FEATURE,
|
"classFeature": PropOrder._CLASS_FEATURE,
|
||||||
"subclassFeature": PropOrder._SUBCLASS_FEATURE,
|
"subclassFeature": PropOrder._SUBCLASS_FEATURE,
|
||||||
"foundryClassFeature": PropOrder._FOUNDRY_CLASS_FEATURE,
|
"foundryClassFeature": PropOrder._FOUNDRY_CLASS_FEATURE,
|
||||||
@@ -1961,21 +2042,28 @@ PropOrder._PROP_TO_LIST = {
|
|||||||
"boon": PropOrder._BOON,
|
"boon": PropOrder._BOON,
|
||||||
"deity": PropOrder._DEITY,
|
"deity": PropOrder._DEITY,
|
||||||
"feat": PropOrder._FEAT,
|
"feat": PropOrder._FEAT,
|
||||||
"foundryFeat": PropOrder._FOUNDRY_FEAT,
|
"foundryFeat": PropOrder._FOUNDRY_GENERIC_FEATURE,
|
||||||
"vehicle": PropOrder._VEHICLE,
|
"vehicle": PropOrder._VEHICLE,
|
||||||
"vehicleUpgrade": PropOrder._VEHICLE_UPGRADE,
|
"vehicleUpgrade": PropOrder._VEHICLE_UPGRADE,
|
||||||
|
"foundryVehicleUpgrade": PropOrder._FOUNDRY_GENERIC_FEATURE,
|
||||||
"item": PropOrder._ITEM,
|
"item": PropOrder._ITEM,
|
||||||
|
"foundryItem": PropOrder._FOUNDRY_GENERIC,
|
||||||
"baseitem": PropOrder._ITEM,
|
"baseitem": PropOrder._ITEM,
|
||||||
"magicvariant": PropOrder._MAGICVARIANT,
|
"magicvariant": PropOrder._MAGICVARIANT,
|
||||||
|
"foundryMagicvariant": PropOrder._FOUNDRY_GENERIC,
|
||||||
"itemGroup": PropOrder._ITEM,
|
"itemGroup": PropOrder._ITEM,
|
||||||
"itemMastery": PropOrder._ITEM_MASTERY,
|
"itemMastery": PropOrder._ITEM_MASTERY,
|
||||||
"object": PropOrder._OBJECT,
|
"object": PropOrder._OBJECT,
|
||||||
"optionalfeature": PropOrder._OPTIONALFEATURE,
|
"optionalfeature": PropOrder._OPTIONALFEATURE,
|
||||||
|
"foundryOptionalfeature": PropOrder._FOUNDRY_GENERIC_FEATURE,
|
||||||
"psionic": PropOrder._PSIONIC,
|
"psionic": PropOrder._PSIONIC,
|
||||||
|
"foundryPsionic": PropOrder._FOUNDRY_GENERIC_FEATURE,
|
||||||
"reward": PropOrder._REWARD,
|
"reward": PropOrder._REWARD,
|
||||||
|
"foundryReward": PropOrder._FOUNDRY_GENERIC_FEATURE,
|
||||||
"variantrule": PropOrder._VARIANTRULE,
|
"variantrule": PropOrder._VARIANTRULE,
|
||||||
"spellFluff": PropOrder._GENERIC_FLUFF,
|
"spellFluff": PropOrder._GENERIC_FLUFF,
|
||||||
"race": PropOrder._RACE,
|
"race": PropOrder._RACE,
|
||||||
|
"foundryRace": PropOrder._FOUNDRY_GENERIC_FEATURE,
|
||||||
"subrace": PropOrder._SUBRACE,
|
"subrace": PropOrder._SUBRACE,
|
||||||
"foundryRaceFeature": PropOrder._FOUNDRY_RACE_FEATURE,
|
"foundryRaceFeature": PropOrder._FOUNDRY_RACE_FEATURE,
|
||||||
"table": PropOrder._TABLE,
|
"table": PropOrder._TABLE,
|
||||||
|
|||||||
@@ -1406,7 +1406,7 @@ class TabUiUtilSide extends TabUiUtilBase {
|
|||||||
super.decorate(obj, {isInitMeta});
|
super.decorate(obj, {isInitMeta});
|
||||||
|
|
||||||
obj.__$getBtnTab = function ({isSingleTab, tabMeta, _propProxy, propActive, ixTab}) {
|
obj.__$getBtnTab = function ({isSingleTab, tabMeta, _propProxy, propActive, ixTab}) {
|
||||||
return isSingleTab ? null : $(`<button class="btn btn-default btn-sm ui-tab-side__btn-tab mb-2 br-0 btr-0 bbr-0 text-left ve-flex-v-center" title="${tabMeta.name.qq()}"><div class="${tabMeta.icon} ui-tab-side__icon-tab mr-2 mobile-ish__mr-0 ve-text-center"></div><div class="mobile-ish__hidden">${tabMeta.name.qq()}</div></button>`)
|
return isSingleTab ? null : $(`<button class="btn btn-default btn-sm ui-tab-side__btn-tab mb-2 br-0 btr-0 bbr-0 text-left ve-flex-v-center" title="${tabMeta.name.qq()}"><div class="${tabMeta.icon} ui-tab-side__icon-tab mr-2 mobile-lg__mr-0 ve-text-center"></div><div class="mobile-lg__hidden">${tabMeta.name.qq()}</div></button>`)
|
||||||
.click(() => this[_propProxy][propActive] = ixTab);
|
.click(() => this[_propProxy][propActive] = ixTab);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -3496,11 +3496,14 @@ class SourceUiUtil {
|
|||||||
$iptJson.removeClass("form-control--error");
|
$iptJson.removeClass("form-control--error");
|
||||||
});
|
});
|
||||||
if (options.source) $iptJson.val(options.source.json);
|
if (options.source) $iptJson.val(options.source.json);
|
||||||
|
const $iptVersion = $(`<input class="form-control ui-source__ipt-named">`)
|
||||||
|
.keydown(evt => { if (evt.key === "Escape") $iptUrl.blur(); });
|
||||||
|
if (options.source) $iptVersion.val(options.source.version);
|
||||||
let hasColor = false;
|
let hasColor = false;
|
||||||
const $iptColor = $(`<input type="color" class="w-100 b-0">`)
|
const $iptColor = $(`<input type="color" class="w-100 b-0">`)
|
||||||
.keydown(evt => { if (evt.key === "Escape") $iptColor.blur(); })
|
.keydown(evt => { if (evt.key === "Escape") $iptColor.blur(); })
|
||||||
.change(() => hasColor = true);
|
.change(() => hasColor = true);
|
||||||
if (options.source?.color != null) { hasColor = true; $iptColor.val(options.source.color); }
|
if (options.source?.color != null) { hasColor = true; $iptColor.val(`#${options.source.color}`); }
|
||||||
const $iptUrl = $(`<input class="form-control ui-source__ipt-named">`)
|
const $iptUrl = $(`<input class="form-control ui-source__ipt-named">`)
|
||||||
.keydown(evt => { if (evt.key === "Escape") $iptUrl.blur(); });
|
.keydown(evt => { if (evt.key === "Escape") $iptUrl.blur(); });
|
||||||
if (options.source) $iptUrl.val(options.source.url);
|
if (options.source) $iptUrl.val(options.source.url);
|
||||||
@@ -3531,11 +3534,19 @@ class SourceUiUtil {
|
|||||||
json: jsonVal,
|
json: jsonVal,
|
||||||
abbreviation: $iptAbv.val().trim(),
|
abbreviation: $iptAbv.val().trim(),
|
||||||
full: $iptName.val().trim(),
|
full: $iptName.val().trim(),
|
||||||
url: $iptUrl.val().trim(),
|
version: $iptVersion.val().trim() || "1.0.0",
|
||||||
authors: $iptAuthors.val().trim().split(",").map(it => it.trim()).filter(Boolean),
|
|
||||||
convertedBy: $iptConverters.val().trim().split(",").map(it => it.trim()).filter(Boolean),
|
|
||||||
};
|
};
|
||||||
if (hasColor) source.color = $iptColor.val().trim();
|
|
||||||
|
const url = $iptUrl.val().trim();
|
||||||
|
if (url) source.url = url;
|
||||||
|
|
||||||
|
const authors = $iptAuthors.val().trim().split(",").map(it => it.trim()).filter(Boolean);
|
||||||
|
if (authors.length) source.authors = authors;
|
||||||
|
|
||||||
|
const convertedBy = $iptConverters.val().trim().split(",").map(it => it.trim()).filter(Boolean);
|
||||||
|
if (convertedBy.length) source.convertedBy = convertedBy;
|
||||||
|
|
||||||
|
if (hasColor) source.color = $iptColor.val().trim().replace(/^#/, "");
|
||||||
|
|
||||||
await options.cbConfirm(source, options.mode !== "edit");
|
await options.cbConfirm(source, options.mode !== "edit");
|
||||||
});
|
});
|
||||||
@@ -3567,6 +3578,10 @@ class SourceUiUtil {
|
|||||||
<span class="mr-2 ui-source__name help" title="This will be used to identify your homebrew universally, so should be unique to you and you alone">JSON Identifier</span>
|
<span class="mr-2 ui-source__name help" title="This will be used to identify your homebrew universally, so should be unique to you and you alone">JSON Identifier</span>
|
||||||
${$iptJson}
|
${$iptJson}
|
||||||
</div></div>
|
</div></div>
|
||||||
|
<div class="ui-source__row mb-2"><div class="ve-col-12 ve-flex-v-center">
|
||||||
|
<span class="mr-2 ui-source__name help" title="A version identifier, e.g. "1.0.0" or "draft 1"">Version</span>
|
||||||
|
${$iptVersion}
|
||||||
|
</div></div>
|
||||||
<div class="ui-source__row mb-2"><div class="ve-col-12 ve-flex-v-center">
|
<div class="ui-source__row mb-2"><div class="ve-col-12 ve-flex-v-center">
|
||||||
<span class="mr-2 ui-source__name help" title="A color which should be used when displaying the source abbreviation">Color</span>
|
<span class="mr-2 ui-source__name help" title="A color which should be used when displaying the source abbreviation">Color</span>
|
||||||
${$iptColor}
|
${$iptColor}
|
||||||
|
|||||||
153
js/utils.js
153
js/utils.js
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
// in deployment, `IS_DEPLOYED = "<version number>";` should be set below.
|
// in deployment, `IS_DEPLOYED = "<version number>";` should be set below.
|
||||||
globalThis.IS_DEPLOYED = undefined;
|
globalThis.IS_DEPLOYED = undefined;
|
||||||
globalThis.VERSION_NUMBER = /* 5ETOOLS_VERSION__OPEN */"1.201.1"/* 5ETOOLS_VERSION__CLOSE */;
|
globalThis.VERSION_NUMBER = /* 5ETOOLS_VERSION__OPEN */"1.202.0"/* 5ETOOLS_VERSION__CLOSE */;
|
||||||
globalThis.DEPLOYED_IMG_ROOT = undefined;
|
globalThis.DEPLOYED_IMG_ROOT = undefined;
|
||||||
// for the roll20 script to set
|
// for the roll20 script to set
|
||||||
globalThis.IS_VTT = false;
|
globalThis.IS_VTT = false;
|
||||||
@@ -1293,12 +1293,12 @@ globalThis.ObjUtil = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO refactor other misc utils into this
|
// TODO refactor specific utils out of this
|
||||||
globalThis.MiscUtil = {
|
globalThis.MiscUtil = class {
|
||||||
COLOR_HEALTHY: "#00bb20",
|
static COLOR_HEALTHY = "#00bb20";
|
||||||
COLOR_HURT: "#c5ca00",
|
static COLOR_HURT = "#c5ca00";
|
||||||
COLOR_BLOODIED: "#f7a100",
|
static COLOR_BLOODIED = "#f7a100";
|
||||||
COLOR_DEFEATED: "#cc0000",
|
static COLOR_DEFEATED = "#cc0000";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param obj
|
* @param obj
|
||||||
@@ -1306,12 +1306,12 @@ globalThis.MiscUtil = {
|
|||||||
* @param isPreserveUndefinedValueKeys Otherwise, drops the keys of `undefined` values
|
* @param isPreserveUndefinedValueKeys Otherwise, drops the keys of `undefined` values
|
||||||
* (e.g. `{a: undefined}` -> `{}`).
|
* (e.g. `{a: undefined}` -> `{}`).
|
||||||
*/
|
*/
|
||||||
copy (obj, {isSafe = false, isPreserveUndefinedValueKeys = false} = {}) {
|
static copy (obj, {isSafe = false, isPreserveUndefinedValueKeys = false} = {}) {
|
||||||
if (isSafe && obj === undefined) return undefined; // Generally use "unsafe," as this helps identify bugs.
|
if (isSafe && obj === undefined) return undefined; // Generally use "unsafe," as this helps identify bugs.
|
||||||
return JSON.parse(JSON.stringify(obj));
|
return JSON.parse(JSON.stringify(obj));
|
||||||
},
|
}
|
||||||
|
|
||||||
copyFast (obj) {
|
static copyFast (obj) {
|
||||||
if ((typeof obj !== "object") || obj == null) return obj;
|
if ((typeof obj !== "object") || obj == null) return obj;
|
||||||
|
|
||||||
if (obj instanceof Array) return obj.map(MiscUtil.copyFast);
|
if (obj instanceof Array) return obj.map(MiscUtil.copyFast);
|
||||||
@@ -1319,9 +1319,9 @@ globalThis.MiscUtil = {
|
|||||||
const cpy = {};
|
const cpy = {};
|
||||||
for (const k of Object.keys(obj)) cpy[k] = MiscUtil.copyFast(obj[k]);
|
for (const k of Object.keys(obj)) cpy[k] = MiscUtil.copyFast(obj[k]);
|
||||||
return cpy;
|
return cpy;
|
||||||
},
|
}
|
||||||
|
|
||||||
async pCopyTextToClipboard (text) {
|
static async pCopyTextToClipboard (text) {
|
||||||
function doCompatibilityCopy () {
|
function doCompatibilityCopy () {
|
||||||
const $iptTemp = $(`<textarea class="clp__wrp-temp"></textarea>`)
|
const $iptTemp = $(`<textarea class="clp__wrp-temp"></textarea>`)
|
||||||
.appendTo(document.body)
|
.appendTo(document.body)
|
||||||
@@ -1339,26 +1339,26 @@ globalThis.MiscUtil = {
|
|||||||
} else doCompatibilityCopy();
|
} else doCompatibilityCopy();
|
||||||
} catch (e) { doCompatibilityCopy(); }
|
} catch (e) { doCompatibilityCopy(); }
|
||||||
} else doCompatibilityCopy();
|
} else doCompatibilityCopy();
|
||||||
},
|
}
|
||||||
|
|
||||||
checkProperty (object, ...path) {
|
static checkProperty (object, ...path) {
|
||||||
for (let i = 0; i < path.length; ++i) {
|
for (let i = 0; i < path.length; ++i) {
|
||||||
object = object[path[i]];
|
object = object[path[i]];
|
||||||
if (object == null) return false;
|
if (object == null) return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
},
|
}
|
||||||
|
|
||||||
get (object, ...path) {
|
static get (object, ...path) {
|
||||||
if (object == null) return null;
|
if (object == null) return null;
|
||||||
for (let i = 0; i < path.length; ++i) {
|
for (let i = 0; i < path.length; ++i) {
|
||||||
object = object[path[i]];
|
object = object[path[i]];
|
||||||
if (object == null) return object;
|
if (object == null) return object;
|
||||||
}
|
}
|
||||||
return object;
|
return object;
|
||||||
},
|
}
|
||||||
|
|
||||||
set (object, ...pathAndVal) {
|
static set (object, ...pathAndVal) {
|
||||||
if (object == null) return null;
|
if (object == null) return null;
|
||||||
|
|
||||||
const val = pathAndVal.pop();
|
const val = pathAndVal.pop();
|
||||||
@@ -1372,31 +1372,31 @@ globalThis.MiscUtil = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return val;
|
return val;
|
||||||
},
|
}
|
||||||
|
|
||||||
getOrSet (object, ...pathAndVal) {
|
static getOrSet (object, ...pathAndVal) {
|
||||||
if (pathAndVal.length < 2) return null;
|
if (pathAndVal.length < 2) return null;
|
||||||
const existing = MiscUtil.get(object, ...pathAndVal.slice(0, -1));
|
const existing = MiscUtil.get(object, ...pathAndVal.slice(0, -1));
|
||||||
if (existing != null) return existing;
|
if (existing != null) return existing;
|
||||||
return MiscUtil.set(object, ...pathAndVal);
|
return MiscUtil.set(object, ...pathAndVal);
|
||||||
},
|
}
|
||||||
|
|
||||||
getThenSetCopy (object1, object2, ...path) {
|
static getThenSetCopy (object1, object2, ...path) {
|
||||||
const val = MiscUtil.get(object1, ...path);
|
const val = MiscUtil.get(object1, ...path);
|
||||||
return MiscUtil.set(object2, ...path, MiscUtil.copyFast(val, {isSafe: true}));
|
return MiscUtil.set(object2, ...path, MiscUtil.copyFast(val, {isSafe: true}));
|
||||||
},
|
}
|
||||||
|
|
||||||
delete (object, ...path) {
|
static delete (object, ...path) {
|
||||||
if (object == null) return object;
|
if (object == null) return object;
|
||||||
for (let i = 0; i < path.length - 1; ++i) {
|
for (let i = 0; i < path.length - 1; ++i) {
|
||||||
object = object[path[i]];
|
object = object[path[i]];
|
||||||
if (object == null) return object;
|
if (object == null) return object;
|
||||||
}
|
}
|
||||||
return delete object[path.last()];
|
return delete object[path.last()];
|
||||||
},
|
}
|
||||||
|
|
||||||
/** Delete a prop from a nested object, then all now-empty objects backwards from that point. */
|
/** Delete a prop from a nested object, then all now-empty objects backwards from that point. */
|
||||||
deleteObjectPath (object, ...path) {
|
static deleteObjectPath (object, ...path) {
|
||||||
const stack = [object];
|
const stack = [object];
|
||||||
|
|
||||||
if (object == null) return object;
|
if (object == null) return object;
|
||||||
@@ -1412,9 +1412,9 @@ globalThis.MiscUtil = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return out;
|
return out;
|
||||||
},
|
}
|
||||||
|
|
||||||
merge (obj1, obj2) {
|
static merge (obj1, obj2) {
|
||||||
obj2 = MiscUtil.copyFast(obj2);
|
obj2 = MiscUtil.copyFast(obj2);
|
||||||
|
|
||||||
Object.entries(obj2)
|
Object.entries(obj2)
|
||||||
@@ -1438,21 +1438,21 @@ globalThis.MiscUtil = {
|
|||||||
});
|
});
|
||||||
|
|
||||||
return obj1;
|
return obj1;
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @deprecated
|
* @deprecated
|
||||||
*/
|
*/
|
||||||
mix: (superclass) => new MiscUtil._MixinBuilder(superclass),
|
static mix = (superclass) => new MiscUtil._MixinBuilder(superclass);
|
||||||
_MixinBuilder: function (superclass) {
|
static _MixinBuilder = function (superclass) {
|
||||||
this.superclass = superclass;
|
this.superclass = superclass;
|
||||||
|
|
||||||
this.with = function (...mixins) {
|
this.with = function (...mixins) {
|
||||||
return mixins.reduce((c, mixin) => mixin(c), this.superclass);
|
return mixins.reduce((c, mixin) => mixin(c), this.superclass);
|
||||||
};
|
};
|
||||||
},
|
};
|
||||||
|
|
||||||
clearSelection () {
|
static clearSelection () {
|
||||||
if (document.getSelection) {
|
if (document.getSelection) {
|
||||||
document.getSelection().removeAllRanges();
|
document.getSelection().removeAllRanges();
|
||||||
document.getSelection().addRange(document.createRange());
|
document.getSelection().addRange(document.createRange());
|
||||||
@@ -1466,9 +1466,9 @@ globalThis.MiscUtil = {
|
|||||||
} else if (document.selection) {
|
} else if (document.selection) {
|
||||||
document.selection.empty();
|
document.selection.empty();
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
|
|
||||||
randomColor () {
|
static randomColor () {
|
||||||
let r; let g; let b;
|
let r; let g; let b;
|
||||||
const h = RollerUtil.randomise(30, 0) / 30;
|
const h = RollerUtil.randomise(30, 0) / 30;
|
||||||
const i = ~~(h * 6);
|
const i = ~~(h * 6);
|
||||||
@@ -1483,7 +1483,7 @@ globalThis.MiscUtil = {
|
|||||||
case 5: r = 1; g = 0; b = q; break;
|
case 5: r = 1; g = 0; b = q; break;
|
||||||
}
|
}
|
||||||
return `#${`00${(~~(r * 255)).toString(16)}`.slice(-2)}${`00${(~~(g * 255)).toString(16)}`.slice(-2)}${`00${(~~(b * 255)).toString(16)}`.slice(-2)}`;
|
return `#${`00${(~~(r * 255)).toString(16)}`.slice(-2)}${`00${(~~(g * 255)).toString(16)}`.slice(-2)}${`00${(~~(b * 255)).toString(16)}`.slice(-2)}`;
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param hex Original hex color.
|
* @param hex Original hex color.
|
||||||
@@ -1492,7 +1492,7 @@ globalThis.MiscUtil = {
|
|||||||
* @param [opts.dark] Color to return if a "dark" color would contrast best.
|
* @param [opts.dark] Color to return if a "dark" color would contrast best.
|
||||||
* @param [opts.light] Color to return if a "light" color would contrast best.
|
* @param [opts.light] Color to return if a "light" color would contrast best.
|
||||||
*/
|
*/
|
||||||
invertColor (hex, opts) {
|
static invertColor (hex, opts) {
|
||||||
opts = opts || {};
|
opts = opts || {};
|
||||||
|
|
||||||
hex = hex.slice(1); // remove #
|
hex = hex.slice(1); // remove #
|
||||||
@@ -1508,18 +1508,18 @@ globalThis.MiscUtil = {
|
|||||||
|
|
||||||
r = (255 - r).toString(16); g = (255 - g).toString(16); b = (255 - b).toString(16);
|
r = (255 - r).toString(16); g = (255 - g).toString(16); b = (255 - b).toString(16);
|
||||||
return `#${[r, g, b].map(it => it.padStart(2, "0")).join("")}`;
|
return `#${[r, g, b].map(it => it.padStart(2, "0")).join("")}`;
|
||||||
},
|
}
|
||||||
|
|
||||||
scrollPageTop () {
|
static scrollPageTop () {
|
||||||
document.body.scrollTop = document.documentElement.scrollTop = 0;
|
document.body.scrollTop = document.documentElement.scrollTop = 0;
|
||||||
},
|
}
|
||||||
|
|
||||||
expEval (str) {
|
static expEval (str) {
|
||||||
// eslint-disable-next-line no-new-func
|
// eslint-disable-next-line no-new-func
|
||||||
return new Function(`return ${str.replace(/[^-()\d/*+.]/g, "")}`)();
|
return new Function(`return ${str.replace(/[^-()\d/*+.]/g, "")}`)();
|
||||||
},
|
}
|
||||||
|
|
||||||
parseNumberRange (input, min = Number.MIN_SAFE_INTEGER, max = Number.MAX_SAFE_INTEGER) {
|
static parseNumberRange (input, min = Number.MIN_SAFE_INTEGER, max = Number.MAX_SAFE_INTEGER) {
|
||||||
if (!input || !input.trim()) return null;
|
if (!input || !input.trim()) return null;
|
||||||
|
|
||||||
const errInvalid = input => { throw new Error(`Could not parse range input "${input}"`); };
|
const errInvalid = input => { throw new Error(`Could not parse range input "${input}"`); };
|
||||||
@@ -1563,9 +1563,9 @@ globalThis.MiscUtil = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return out;
|
return out;
|
||||||
},
|
}
|
||||||
|
|
||||||
findCommonPrefix (strArr, {isRespectWordBoundaries} = {}) {
|
static findCommonPrefix (strArr, {isRespectWordBoundaries} = {}) {
|
||||||
if (isRespectWordBoundaries) {
|
if (isRespectWordBoundaries) {
|
||||||
return MiscUtil._findCommonPrefixSuffixWords({strArr});
|
return MiscUtil._findCommonPrefixSuffixWords({strArr});
|
||||||
}
|
}
|
||||||
@@ -1588,15 +1588,15 @@ globalThis.MiscUtil = {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
return prefix;
|
return prefix;
|
||||||
},
|
}
|
||||||
|
|
||||||
findCommonSuffix (strArr, {isRespectWordBoundaries} = {}) {
|
static findCommonSuffix (strArr, {isRespectWordBoundaries} = {}) {
|
||||||
if (!isRespectWordBoundaries) throw new Error(`Unimplemented!`);
|
if (!isRespectWordBoundaries) throw new Error(`Unimplemented!`);
|
||||||
|
|
||||||
return MiscUtil._findCommonPrefixSuffixWords({strArr, isSuffix: true});
|
return MiscUtil._findCommonPrefixSuffixWords({strArr, isSuffix: true});
|
||||||
},
|
}
|
||||||
|
|
||||||
_findCommonPrefixSuffixWords ({strArr, isSuffix}) {
|
static _findCommonPrefixSuffixWords ({strArr, isSuffix}) {
|
||||||
let prefixTks = null;
|
let prefixTks = null;
|
||||||
let lenMax = -1;
|
let lenMax = -1;
|
||||||
|
|
||||||
@@ -1633,18 +1633,18 @@ globalThis.MiscUtil = {
|
|||||||
return isSuffix
|
return isSuffix
|
||||||
? ` ${prefixTks.join(" ")}`
|
? ` ${prefixTks.join(" ")}`
|
||||||
: `${prefixTks.join(" ")} `;
|
: `${prefixTks.join(" ")} `;
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param fgHexTarget Target/resultant color for the foreground item
|
* @param fgHexTarget Target/resultant color for the foreground item
|
||||||
* @param fgOpacity Desired foreground transparency (0-1 inclusive)
|
* @param fgOpacity Desired foreground transparency (0-1 inclusive)
|
||||||
* @param bgHex Background color
|
* @param bgHex Background color
|
||||||
*/
|
*/
|
||||||
calculateBlendedColor (fgHexTarget, fgOpacity, bgHex) {
|
static calculateBlendedColor (fgHexTarget, fgOpacity, bgHex) {
|
||||||
const fgDcTarget = CryptUtil.hex2Dec(fgHexTarget);
|
const fgDcTarget = CryptUtil.hex2Dec(fgHexTarget);
|
||||||
const bgDc = CryptUtil.hex2Dec(bgHex);
|
const bgDc = CryptUtil.hex2Dec(bgHex);
|
||||||
return ((fgDcTarget - ((1 - fgOpacity) * bgDc)) / fgOpacity).toString(16);
|
return ((fgDcTarget - ((1 - fgOpacity) * bgDc)) / fgOpacity).toString(16);
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Borrowed from lodash.
|
* Borrowed from lodash.
|
||||||
@@ -1654,7 +1654,7 @@ globalThis.MiscUtil = {
|
|||||||
* @param options Options object.
|
* @param options Options object.
|
||||||
* @return {Function} The debounced function.
|
* @return {Function} The debounced function.
|
||||||
*/
|
*/
|
||||||
debounce (func, wait, options) {
|
static debounce (func, wait, options) {
|
||||||
let lastArgs; let lastThis; let maxWait; let result; let timerId; let lastCallTime; let lastInvokeTime = 0; let leading = false; let maxing = false; let trailing = true;
|
let lastArgs; let lastThis; let maxWait; let result; let timerId; let lastCallTime; let lastInvokeTime = 0; let leading = false; let maxing = false; let trailing = true;
|
||||||
|
|
||||||
wait = Number(wait) || 0;
|
wait = Number(wait) || 0;
|
||||||
@@ -1739,10 +1739,10 @@ globalThis.MiscUtil = {
|
|||||||
debounced.cancel = cancel;
|
debounced.cancel = cancel;
|
||||||
debounced.flush = flush;
|
debounced.flush = flush;
|
||||||
return debounced;
|
return debounced;
|
||||||
},
|
}
|
||||||
|
|
||||||
// from lodash
|
// from lodash
|
||||||
throttle (func, wait, options) {
|
static throttle (func, wait, options) {
|
||||||
let leading = true; let trailing = true;
|
let leading = true; let trailing = true;
|
||||||
|
|
||||||
if (typeof options === "object") {
|
if (typeof options === "object") {
|
||||||
@@ -1751,13 +1751,13 @@ globalThis.MiscUtil = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return this.debounce(func, wait, {leading, maxWait: wait, trailing});
|
return this.debounce(func, wait, {leading, maxWait: wait, trailing});
|
||||||
},
|
}
|
||||||
|
|
||||||
pDelay (msecs, resolveAs) {
|
static pDelay (msecs, resolveAs) {
|
||||||
return new Promise(resolve => setTimeout(() => resolve(resolveAs), msecs));
|
return new Promise(resolve => setTimeout(() => resolve(resolveAs), msecs));
|
||||||
},
|
}
|
||||||
|
|
||||||
GENERIC_WALKER_ENTRIES_KEY_BLOCKLIST: new Set(["caption", "type", "colLabels", "colLabelGroups", "name", "colStyles", "style", "shortName", "subclassShortName", "id", "path"]),
|
static GENERIC_WALKER_ENTRIES_KEY_BLOCKLIST = new Set(["caption", "type", "colLabels", "colLabelGroups", "name", "colStyles", "style", "shortName", "subclassShortName", "id", "path"]);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param [opts]
|
* @param [opts]
|
||||||
@@ -1771,7 +1771,7 @@ globalThis.MiscUtil = {
|
|||||||
* @param [opts.isNoModification] If the walker should not attempt to modify the data.
|
* @param [opts.isNoModification] If the walker should not attempt to modify the data.
|
||||||
* @param [opts.isBreakOnReturn] If the walker should fast-exist on any handler returning a value.
|
* @param [opts.isBreakOnReturn] If the walker should fast-exist on any handler returning a value.
|
||||||
*/
|
*/
|
||||||
getWalker (opts) {
|
static getWalker (opts) {
|
||||||
opts = opts || {};
|
opts = opts || {};
|
||||||
|
|
||||||
if (opts.isBreakOnReturn && !opts.isNoModification) throw new Error(`"isBreakOnReturn" may only be used in "isNoModification" mode!`);
|
if (opts.isBreakOnReturn && !opts.isNoModification) throw new Error(`"isBreakOnReturn" may only be used in "isNoModification" mode!`);
|
||||||
@@ -1893,9 +1893,9 @@ globalThis.MiscUtil = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return {walk: fn};
|
return {walk: fn};
|
||||||
},
|
}
|
||||||
|
|
||||||
_getWalker_applyHandlers ({opts, handlers, obj, lastKey, stack}) {
|
static _getWalker_applyHandlers ({opts, handlers, obj, lastKey, stack}) {
|
||||||
handlers = handlers instanceof Array ? handlers : [handlers];
|
handlers = handlers instanceof Array ? handlers : [handlers];
|
||||||
const didBreak = handlers.some(h => {
|
const didBreak = handlers.some(h => {
|
||||||
const out = h(obj, lastKey, stack);
|
const out = h(obj, lastKey, stack);
|
||||||
@@ -1904,12 +1904,12 @@ globalThis.MiscUtil = {
|
|||||||
});
|
});
|
||||||
if (didBreak) return VeCt.SYM_WALKER_BREAK;
|
if (didBreak) return VeCt.SYM_WALKER_BREAK;
|
||||||
return obj;
|
return obj;
|
||||||
},
|
}
|
||||||
|
|
||||||
_getWalker_runHandlers ({handlers, obj, lastKey, stack}) {
|
static _getWalker_runHandlers ({handlers, obj, lastKey, stack}) {
|
||||||
handlers = handlers instanceof Array ? handlers : [handlers];
|
handlers = handlers instanceof Array ? handlers : [handlers];
|
||||||
handlers.forEach(h => h(obj, lastKey, stack));
|
handlers.forEach(h => h(obj, lastKey, stack));
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO refresh to match sync version
|
* TODO refresh to match sync version
|
||||||
@@ -1923,7 +1923,7 @@ globalThis.MiscUtil = {
|
|||||||
* @param [opts.isDepthFirst] If array/object recursion should occur before array/object primitive handling.
|
* @param [opts.isDepthFirst] If array/object recursion should occur before array/object primitive handling.
|
||||||
* @param [opts.isNoModification] If the walker should not attempt to modify the data.
|
* @param [opts.isNoModification] If the walker should not attempt to modify the data.
|
||||||
*/
|
*/
|
||||||
getAsyncWalker (opts) {
|
static getAsyncWalker (opts) {
|
||||||
opts = opts || {};
|
opts = opts || {};
|
||||||
const keyBlocklist = opts.keyBlocklist || new Set();
|
const keyBlocklist = opts.keyBlocklist || new Set();
|
||||||
|
|
||||||
@@ -2040,25 +2040,32 @@ globalThis.MiscUtil = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return {pWalk: pFn};
|
return {pWalk: pFn};
|
||||||
},
|
}
|
||||||
|
|
||||||
async _getAsyncWalker_pApplyHandlers ({opts, handlers, obj, lastKey, stack}) {
|
static async _getAsyncWalker_pApplyHandlers ({opts, handlers, obj, lastKey, stack}) {
|
||||||
handlers = handlers instanceof Array ? handlers : [handlers];
|
handlers = handlers instanceof Array ? handlers : [handlers];
|
||||||
await handlers.pSerialAwaitMap(async pH => {
|
await handlers.pSerialAwaitMap(async pH => {
|
||||||
const out = await pH(obj, lastKey, stack);
|
const out = await pH(obj, lastKey, stack);
|
||||||
if (!opts.isNoModification) obj = out;
|
if (!opts.isNoModification) obj = out;
|
||||||
});
|
});
|
||||||
return obj;
|
return obj;
|
||||||
},
|
}
|
||||||
|
|
||||||
async _getAsyncWalker_pRunHandlers ({handlers, obj, lastKey, stack}) {
|
static async _getAsyncWalker_pRunHandlers ({handlers, obj, lastKey, stack}) {
|
||||||
handlers = handlers instanceof Array ? handlers : [handlers];
|
handlers = handlers instanceof Array ? handlers : [handlers];
|
||||||
await handlers.pSerialAwaitMap(pH => pH(obj, lastKey, stack));
|
await handlers.pSerialAwaitMap(pH => pH(obj, lastKey, stack));
|
||||||
},
|
}
|
||||||
|
|
||||||
pDefer (fn) {
|
static pDefer (fn) {
|
||||||
return (async () => fn())();
|
return (async () => fn())();
|
||||||
},
|
}
|
||||||
|
|
||||||
|
static isNearStrictlyEqual (a, b) {
|
||||||
|
if (a == null && b == null) return true;
|
||||||
|
if (a == null && b != null) return false;
|
||||||
|
if (a != null && b == null) return false;
|
||||||
|
return a === b;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// EVENT HANDLERS ======================================================================================================
|
// EVENT HANDLERS ======================================================================================================
|
||||||
|
|||||||
@@ -1,12 +1,6 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
class VariantRulesSublistManager extends SublistManager {
|
class VariantRulesSublistManager extends SublistManager {
|
||||||
constructor () {
|
|
||||||
super({
|
|
||||||
sublistClass: "subvariantrules",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
static get _ROW_TEMPLATE () {
|
static get _ROW_TEMPLATE () {
|
||||||
return [
|
return [
|
||||||
new SublistCellTemplate({
|
new SublistCellTemplate({
|
||||||
@@ -58,8 +52,6 @@ class VariantRulesPage extends ListPage {
|
|||||||
|
|
||||||
pageFilter,
|
pageFilter,
|
||||||
|
|
||||||
listClass: "variantrules",
|
|
||||||
|
|
||||||
dataProps: ["variantrule"],
|
dataProps: ["variantrule"],
|
||||||
|
|
||||||
isMarkdownPopout: true,
|
isMarkdownPopout: true,
|
||||||
|
|||||||
@@ -1,12 +1,6 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
class VehiclesSublistManager extends SublistManager {
|
class VehiclesSublistManager extends SublistManager {
|
||||||
constructor () {
|
|
||||||
super({
|
|
||||||
sublistClass: "subvehicles",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
static get _ROW_TEMPLATE () {
|
static get _ROW_TEMPLATE () {
|
||||||
return [
|
return [
|
||||||
new SublistCellTemplate({
|
new SublistCellTemplate({
|
||||||
@@ -66,8 +60,6 @@ class VehiclesPage extends ListPage {
|
|||||||
|
|
||||||
pageFilter,
|
pageFilter,
|
||||||
|
|
||||||
listClass: "vehicles",
|
|
||||||
|
|
||||||
dataProps: ["vehicle", "vehicleUpgrade"],
|
dataProps: ["vehicle", "vehicleUpgrade"],
|
||||||
|
|
||||||
isMarkdownPopout: true,
|
isMarkdownPopout: true,
|
||||||
|
|||||||
@@ -58,6 +58,7 @@
|
|||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<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="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="viewport-wrapper">
|
||||||
@@ -69,7 +70,6 @@
|
|||||||
<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>
|
<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>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<nav class="container page__nav" id="navigation">
|
<nav class="container page__nav" id="navigation">
|
||||||
<ul class="nav nav-pills page__nav-inner" id="navbar"></ul>
|
<ul class="nav nav-pills page__nav-inner" id="navbar"></ul>
|
||||||
</nav>
|
</nav>
|
||||||
@@ -83,52 +83,55 @@
|
|||||||
<div id="lst__search-glass" class="lst__wrp-search-glass no-events ve-flex-vh-center"><span class="glyphicon glyphicon-search"></span></div>
|
<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 class="lst__wrp-search-visible no-events ve-flex-vh-center"></div>
|
||||||
</div>
|
</div>
|
||||||
<button class="btn btn-default" id="reset">Reset</button>
|
<button type="button" class="btn btn-default" id="reset">Reset</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="filtertools" class="input-group input-group--bottom ve-flex no-shrink">
|
<div id="filtertools" class="input-group input-group--bottom ve-flex no-shrink">
|
||||||
<button class="ve-col-6 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
<button type="button" class="ve-col-6 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
||||||
<button class="ve-col-2 sort btn btn-default btn-xs" data-sort="type">Type</button>
|
<button type="button" class="ve-col-2 sort btn btn-default btn-xs" data-sort="type">Type</button>
|
||||||
<button class="ve-col-2 sort btn btn-default btn-xs" data-sort="script">Script</button>
|
<button type="button" class="ve-col-2 sort btn btn-default btn-xs" data-sort="script">Script</button>
|
||||||
<button class="sort btn btn-default btn-xs ve-grow" data-sort="source">Source</button>
|
<button type="button" class="sort btn btn-default btn-xs ve-grow" data-sort="source">Source</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="list list--stats languages"></div>
|
<div id="list" class="list list--stats"></div>
|
||||||
</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="contentwrapper" class="view-col">
|
||||||
<div id="sublistcontainer" class="sublist sublist--resizable no-print">
|
<div id="sublistcontainer" class="sublist sublist--resizable no-print">
|
||||||
<div id="sublistsort" class="btn-group sublist__wrp-cols">
|
<div id="sublistsort" class="btn-group sublist__wrp-cols">
|
||||||
<button class="ve-col-8 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
<button type="button" class="ve-col-8 sort btn btn-default btn-xs" data-sort="name">Name</button>
|
||||||
<button class="ve-col-2 sort btn btn-default btn-xs" data-sort="type">Type</button>
|
<button type="button" class="ve-col-2 sort btn btn-default btn-xs" data-sort="type">Type</button>
|
||||||
<button class="ve-col-2 sort btn btn-default btn-xs" data-sort="script">Script</button>
|
<button type="button" class="ve-col-2 sort btn btn-default btn-xs" data-sort="script">Script</button>
|
||||||
</div>
|
|
||||||
<div class="list sublanguages">
|
|
||||||
<!-- populate with JS -->
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div id="sublist" class="list"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="wrp-stat-tab" id="stat-tabs">
|
<div class="wrp-stat-tab" id="stat-tabs">
|
||||||
<div id="tabs-right"></div>
|
<div id="tabs-right"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="wrp-stats-table">
|
<div id="wrp-pagecontent" class="wrp-stats-table">
|
||||||
<table id="pagecontent" class="w-100 stats">
|
<table id="pagecontent" class="w-100 stats">
|
||||||
<tr><th class="border" colspan="6"></th></tr>
|
<tr><th class="border" colspan="6"></th></tr>
|
||||||
<tr><td colspan="6" class="initial-message">Select a language from the list to view it here</td></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>
|
<tr><th class="border" colspan="6"></th></tr>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="ve-text-center mt-2 no-print">
|
<div class="ve-text-center mt-2 no-print">
|
||||||
<button class="btn btn-xs btn-info" id="manage-brew">Manage Homebrew</button>
|
<button type="button" class="btn btn-xs btn-info" id="manage-brew">Manage Homebrew</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!--5ETOOLS_SCRIPT_ANCHOR-->
|
<!--5ETOOLS_SCRIPT_ANCHOR-->
|
||||||
<!--5ETOOLS_AD_ADHESION-->
|
<!--5ETOOLS_AD_ADHESION-->
|
||||||
|
|
||||||
<script type="text/javascript" src="lib/jquery.js"></script>
|
<script type="text/javascript" src="lib/jquery.js"></script>
|
||||||
<script type="text/javascript" src="js/parser.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.js"></script>
|
||||||
@@ -147,10 +150,11 @@
|
|||||||
<script type="text/javascript" src="js/scalecreature.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/hist.js"></script>
|
||||||
<script type="text/javascript" src="js/listpage.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-languages.js"></script>
|
<script type="text/javascript" src="js/filter-languages.js"></script>
|
||||||
<script type="text/javascript" src="js/languages.js"></script>
|
<script type="text/javascript" src="js/languages.js"></script>
|
||||||
<script type="text/javascript" src="js/list2.js"></script>
|
<script type="text/javascript" src="js/list2.js"></script>
|
||||||
<script type="text/javascript" src="lib/elasticlunr.js"></script>
|
<script type="text/javascript" src="lib/elasticlunr.js"></script>
|
||||||
</body>
|
|
||||||
|
|
||||||
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -11,8 +11,6 @@ function cleanFolder (folder, {isFast = false} = {}) {
|
|||||||
console.log(`Cleaning directory ${folder}...`);
|
console.log(`Cleaning directory ${folder}...`);
|
||||||
const files = ut.listFiles({
|
const files = ut.listFiles({
|
||||||
dir: folder,
|
dir: folder,
|
||||||
blocklistFilePrefixes: ut.FILE_PREFIX_BLOCKLIST
|
|
||||||
.filter(it => it !== "foundry-"),
|
|
||||||
});
|
});
|
||||||
files
|
files
|
||||||
.filter(file => file.endsWith(".json"))
|
.filter(file => file.endsWith(".json"))
|
||||||
|
|||||||
@@ -7,6 +7,9 @@ import "../js/utils.js";
|
|||||||
const BLOCKLIST_FILE_PREFIXES = [
|
const BLOCKLIST_FILE_PREFIXES = [
|
||||||
...ut.FILE_PREFIX_BLOCKLIST,
|
...ut.FILE_PREFIX_BLOCKLIST,
|
||||||
|
|
||||||
|
"foundry-",
|
||||||
|
"foundry.json",
|
||||||
|
|
||||||
// specific files
|
// specific files
|
||||||
"demo.json",
|
"demo.json",
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -18,17 +18,18 @@ class _HtmlGenerator {
|
|||||||
|
|
||||||
class _HtmlGeneratorListButtons extends _HtmlGenerator {
|
class _HtmlGeneratorListButtons extends _HtmlGenerator {
|
||||||
static getBtnPreviewToggle () {
|
static getBtnPreviewToggle () {
|
||||||
return `<button class="ve-col-0-3 btn btn-default btn-xs p-0 lst__btn-collapse-all-previews" name="list-toggle-all-previews">[+]</button>`;
|
return `<button type="button" class="ve-col-0-3 btn btn-default btn-xs p-0 lst__btn-collapse-all-previews" name="list-toggle-all-previews">[+]</button>`;
|
||||||
}
|
}
|
||||||
|
|
||||||
static getBtnSource () {
|
static getBtnSource () {
|
||||||
return `<button class="sort btn btn-default btn-xs ve-grow" data-sort="source">Source</button>`;
|
return `<button type="button" class="sort btn btn-default btn-xs ve-grow" data-sort="source">Source</button>`;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} width
|
* @param {string} width
|
||||||
* @param {?string} sortIdent
|
* @param {?string} sortIdent
|
||||||
* @param {string} text
|
* @param {string} text
|
||||||
|
* @param {?string} title
|
||||||
* @param {?boolean} isDisabled
|
* @param {?boolean} isDisabled
|
||||||
* @param {?Array<string>} classListAdditional
|
* @param {?Array<string>} classListAdditional
|
||||||
* @return {string}
|
* @return {string}
|
||||||
@@ -38,6 +39,7 @@ class _HtmlGeneratorListButtons extends _HtmlGenerator {
|
|||||||
width,
|
width,
|
||||||
sortIdent = null,
|
sortIdent = null,
|
||||||
text,
|
text,
|
||||||
|
title = null,
|
||||||
isDisabled = false,
|
isDisabled = false,
|
||||||
classListAdditional = null,
|
classListAdditional = null,
|
||||||
},
|
},
|
||||||
@@ -45,28 +47,13 @@ class _HtmlGeneratorListButtons extends _HtmlGenerator {
|
|||||||
const attrs = [
|
const attrs = [
|
||||||
this._getAttrClass(`ve-col-${width} sort btn btn-default btn-xs`, {classListAdditional}),
|
this._getAttrClass(`ve-col-${width} sort btn btn-default btn-xs`, {classListAdditional}),
|
||||||
sortIdent ? `data-sort="${sortIdent}"` : null,
|
sortIdent ? `data-sort="${sortIdent}"` : null,
|
||||||
|
title ? `title="${title}"` : null,
|
||||||
isDisabled ? `disabled` : null,
|
isDisabled ? `disabled` : null,
|
||||||
]
|
]
|
||||||
.filter(Boolean)
|
.filter(Boolean)
|
||||||
.join(" ");
|
.join(" ");
|
||||||
|
|
||||||
return `<button ${attrs}>${text}</button>`;
|
return `<button type="button" ${attrs}>${text}</button>`;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class _HtmlGeneratorListToken extends _HtmlGenerator {
|
|
||||||
/**
|
|
||||||
* @param {?Array<string>} classListAdditional
|
|
||||||
* @return {string}
|
|
||||||
*/
|
|
||||||
static getWrpToken ({classListAdditional = null} = {}) {
|
|
||||||
const attrs = [
|
|
||||||
`id="float-token"`,
|
|
||||||
this._getAttrClass(`relative`, {classListAdditional}),
|
|
||||||
]
|
|
||||||
.filter(Boolean)
|
|
||||||
.join(" ");
|
|
||||||
return `<div ${attrs}></div>`;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -133,9 +120,11 @@ class _PageGeneratorListBase extends _PageGeneratorBase {
|
|||||||
_isMultisource = false;
|
_isMultisource = false;
|
||||||
_btnsList;
|
_btnsList;
|
||||||
_btnsSublist;
|
_btnsSublist;
|
||||||
_wrpToken;
|
_isWrpToken;
|
||||||
|
_onscrollPageContent;
|
||||||
_styleListContainerAdditional;
|
_styleListContainerAdditional;
|
||||||
_styleContentWrapperAdditional;
|
_styleContentWrapperAdditional;
|
||||||
|
_stylePageContentAdditional;
|
||||||
_isPrinterView = false;
|
_isPrinterView = false;
|
||||||
|
|
||||||
_registerPartials () {
|
_registerPartials () {
|
||||||
@@ -158,6 +147,9 @@ class _PageGeneratorListBase extends _PageGeneratorBase {
|
|||||||
this._registerPartial({ident: "listScripts", filename: "list/template-list-scripts.hbs"});
|
this._registerPartial({ident: "listScripts", filename: "list/template-list-scripts.hbs"});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return {object}
|
||||||
|
*/
|
||||||
_getData () {
|
_getData () {
|
||||||
return {
|
return {
|
||||||
titlePage: this._titlePage,
|
titlePage: this._titlePage,
|
||||||
@@ -172,10 +164,12 @@ class _PageGeneratorListBase extends _PageGeneratorBase {
|
|||||||
isMultisource: this._isMultisource,
|
isMultisource: this._isMultisource,
|
||||||
btnsList: this._btnsList,
|
btnsList: this._btnsList,
|
||||||
btnsSublist: this._btnsSublist,
|
btnsSublist: this._btnsSublist,
|
||||||
wrpToken: this._wrpToken,
|
isWrpToken: this._isWrpToken,
|
||||||
|
onscrollPageContent: this._onscrollPageContent,
|
||||||
isStyleBook: this._isStyleBook,
|
isStyleBook: this._isStyleBook,
|
||||||
styleListContainerAdditional: this._styleListContainerAdditional,
|
styleListContainerAdditional: this._styleListContainerAdditional,
|
||||||
styleContentWrapperAdditional: this._styleContentWrapperAdditional,
|
styleContentWrapperAdditional: this._styleContentWrapperAdditional,
|
||||||
|
stylePageContentAdditional: this._stylePageContentAdditional,
|
||||||
identPartialListListcontainer: "listListcontainer",
|
identPartialListListcontainer: "listListcontainer",
|
||||||
identPartialListContentwrapper: "listContentwrapper",
|
identPartialListContentwrapper: "listContentwrapper",
|
||||||
isPrinterView: this._isPrinterView,
|
isPrinterView: this._isPrinterView,
|
||||||
@@ -475,6 +469,321 @@ class _PageGeneratorListTrapsHazards extends _PageGeneratorListBase {
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class _PageGeneratorListRewards extends _PageGeneratorListBase {
|
||||||
|
_page = UrlUtil.PG_REWARDS;
|
||||||
|
_titlePage = "Supernatural Gifts & Rewards";
|
||||||
|
_scriptIdentList = "rewards";
|
||||||
|
|
||||||
|
_btnsList = [
|
||||||
|
_HtmlGeneratorListButtons.getBtnPreviewToggle(),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "2", sortIdent: "type", text: "Type"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "7-7", sortIdent: "name", text: "Name"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtnSource(),
|
||||||
|
];
|
||||||
|
|
||||||
|
_btnsSublist = [
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "2", sortIdent: "type", text: "Type"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "10", sortIdent: "name", text: "Name"}),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
class _PageGeneratorListLanguages extends _PageGeneratorListBase {
|
||||||
|
_page = UrlUtil.PG_LANGUAGES;
|
||||||
|
_titlePage = "Languages";
|
||||||
|
_scriptIdentList = "languages";
|
||||||
|
|
||||||
|
_stylesheets = [
|
||||||
|
"languages",
|
||||||
|
];
|
||||||
|
|
||||||
|
_btnsList = [
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "6", sortIdent: "name", text: "Name"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "2", sortIdent: "type", text: "Type"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "2", sortIdent: "script", text: "Script"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtnSource(),
|
||||||
|
];
|
||||||
|
|
||||||
|
_btnsSublist = [
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "8", sortIdent: "name", text: "Name"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "2", sortIdent: "type", text: "Type"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "2", sortIdent: "script", text: "Script"}),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
class _PageGeneratorListObjects extends _PageGeneratorListBase {
|
||||||
|
_page = UrlUtil.PG_OBJECTS;
|
||||||
|
_titlePage = "Objects";
|
||||||
|
_scriptIdentList = "objects";
|
||||||
|
|
||||||
|
_stylesheets = [
|
||||||
|
"objects",
|
||||||
|
];
|
||||||
|
|
||||||
|
_btnsList = [
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "8", sortIdent: "name", text: "Name"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "2", sortIdent: "size", text: "Size"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtnSource(),
|
||||||
|
];
|
||||||
|
|
||||||
|
_btnsSublist = [
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "9", sortIdent: "name", text: "Name"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "3", sortIdent: "size", text: "Size"}),
|
||||||
|
];
|
||||||
|
|
||||||
|
_isWrpToken = true;
|
||||||
|
|
||||||
|
_onscrollPageContent = `TokenUtil.handleStatblockScroll(event, this)`;
|
||||||
|
}
|
||||||
|
|
||||||
|
class _PageGeneratorListOptionalFeatures extends _PageGeneratorListBase {
|
||||||
|
_page = UrlUtil.PG_OPT_FEATURES;
|
||||||
|
_titlePage = "Other Options and Features";
|
||||||
|
_scriptIdentList = "optionalfeatures";
|
||||||
|
|
||||||
|
_isPrinterView = true;
|
||||||
|
|
||||||
|
_stylesheets = [
|
||||||
|
"optionalfeatures",
|
||||||
|
];
|
||||||
|
|
||||||
|
_styleListContainerAdditional = "ve-flex-6";
|
||||||
|
_styleContentWrapperAdditional = "ve-flex-4";
|
||||||
|
|
||||||
|
_btnsList = [
|
||||||
|
_HtmlGeneratorListButtons.getBtnPreviewToggle(),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "3", sortIdent: "name", text: "Name"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "1-5", sortIdent: "type", text: "Type"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "4-7", sortIdent: "prerequisite", text: "Prerequisite"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "1", sortIdent: "level", text: "Level"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtnSource(),
|
||||||
|
];
|
||||||
|
|
||||||
|
_btnsSublist = [
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "4", sortIdent: "name", text: "Name"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "2", sortIdent: "type", text: "Type"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "4-5", sortIdent: "prerequisite", text: "Prerequisite"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "1-5", sortIdent: "level", text: "Level"}),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
class _PageGeneratorListPsionics extends _PageGeneratorListBase {
|
||||||
|
_page = UrlUtil.PG_PSIONICS;
|
||||||
|
_titlePage = "Psionics";
|
||||||
|
_scriptIdentList = "psionics";
|
||||||
|
|
||||||
|
_scriptsUtilsAdditional = [
|
||||||
|
"utils-tableview.js",
|
||||||
|
];
|
||||||
|
|
||||||
|
_btnsList = [
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "6", sortIdent: "name", text: "Name"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "2", sortIdent: "type", text: "Type"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "2", sortIdent: "order", text: "Order"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtnSource(),
|
||||||
|
];
|
||||||
|
|
||||||
|
_btnsSublist = [
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "6", sortIdent: "name", text: "Name"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "3", sortIdent: "type", text: "Type"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "3", sortIdent: "order", text: "Order"}),
|
||||||
|
];
|
||||||
|
|
||||||
|
_registerPartials () {
|
||||||
|
super._registerPartials();
|
||||||
|
|
||||||
|
this._registerPartial({
|
||||||
|
ident: "listContentwrapperPsionics",
|
||||||
|
filename: "list/template-list-contentwrapper--psionics.hbs",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_getData () {
|
||||||
|
return {
|
||||||
|
...super._getData(),
|
||||||
|
identPartialListContentwrapper: "listContentwrapperPsionics",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class _PageGeneratorListRaces extends _PageGeneratorListBase {
|
||||||
|
_page = UrlUtil.PG_RACES;
|
||||||
|
_titlePage = "Races";
|
||||||
|
_scriptIdentList = "races";
|
||||||
|
|
||||||
|
_btnsList = [
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "4", sortIdent: "name", text: "Name"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "4", sortIdent: "ability", text: "Ability"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "2", sortIdent: "size", text: "Size"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtnSource(),
|
||||||
|
];
|
||||||
|
|
||||||
|
_btnsSublist = [
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "5", sortIdent: "name", text: "Name"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "5", sortIdent: "ability", text: "Ability"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "2", sortIdent: "size", text: "Size"}),
|
||||||
|
];
|
||||||
|
|
||||||
|
_isPrinterView = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
class _PageGeneratorListRecipes extends _PageGeneratorListBase {
|
||||||
|
_page = UrlUtil.PG_RECIPES;
|
||||||
|
_titlePage = "Recipes";
|
||||||
|
_scriptIdentList = "recipes";
|
||||||
|
|
||||||
|
_stylesheets = [
|
||||||
|
"recipes",
|
||||||
|
];
|
||||||
|
|
||||||
|
_isStyleBook = true;
|
||||||
|
|
||||||
|
_styleListContainerAdditional = "ve-flex-4";
|
||||||
|
_styleContentWrapperAdditional = "ve-flex-7";
|
||||||
|
_stylePageContentAdditional = "recipes__tbl-recipes";
|
||||||
|
|
||||||
|
_btnsList = [
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "6", sortIdent: "name", text: "Name"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "4", sortIdent: "type", text: "Category"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtnSource(),
|
||||||
|
];
|
||||||
|
|
||||||
|
_btnsSublist = [
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "9", sortIdent: "name", text: "Name"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "3", sortIdent: "type", text: "Category"}),
|
||||||
|
];
|
||||||
|
|
||||||
|
_registerPartials () {
|
||||||
|
super._registerPartials();
|
||||||
|
|
||||||
|
this._registerPartial({
|
||||||
|
ident: "listContentwrapperRecipes",
|
||||||
|
filename: "list/template-list-contentwrapper--recipes.hbs",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_getData () {
|
||||||
|
return {
|
||||||
|
...super._getData(),
|
||||||
|
identPartialListContentwrapper: "listContentwrapperRecipes",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class _PageGeneratorListSpells extends _PageGeneratorListBase {
|
||||||
|
_page = UrlUtil.PG_SPELLS;
|
||||||
|
_titlePage = "Spells";
|
||||||
|
_scriptIdentList = "spells";
|
||||||
|
|
||||||
|
_stylesheets = [
|
||||||
|
"spells",
|
||||||
|
];
|
||||||
|
|
||||||
|
_styleListContainerAdditional = "ve-flex-7";
|
||||||
|
_styleContentWrapperAdditional = "ve-flex-5";
|
||||||
|
|
||||||
|
_isMultisource = true;
|
||||||
|
|
||||||
|
_scriptsUtilsAdditional = [
|
||||||
|
"utils-tableview.js",
|
||||||
|
];
|
||||||
|
|
||||||
|
_btnsList = [
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "2-9", sortIdent: "name", text: "Name"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "1-5", sortIdent: "level", text: "Level"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "1-7", sortIdent: "time", text: "Time"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "1-2", sortIdent: "school", text: "School"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "0-6", sortIdent: "concentration", title: "Concentration", text: "C."}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "2-4", sortIdent: "range", text: "Range"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtnSource(),
|
||||||
|
];
|
||||||
|
|
||||||
|
_btnsSublist = [
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "3-2", sortIdent: "name", text: "Name"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "1-5", sortIdent: "level", text: "Level"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "1-8", sortIdent: "time", text: "Time"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "1-6", sortIdent: "school", text: "School"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "0-7", sortIdent: "concentration", title: "Concentration", text: "C."}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "3-2", sortIdent: "range", text: "Range"}),
|
||||||
|
];
|
||||||
|
|
||||||
|
_registerPartials () {
|
||||||
|
super._registerPartials();
|
||||||
|
|
||||||
|
this._registerPartial({
|
||||||
|
ident: "listContentwrapperSpells",
|
||||||
|
filename: "list/template-list-contentwrapper--spells.hbs",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_getData () {
|
||||||
|
return {
|
||||||
|
...super._getData(),
|
||||||
|
identPartialListContentwrapper: "listContentwrapperSpells",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class _PageGeneratorListTables extends _PageGeneratorListBase {
|
||||||
|
_page = UrlUtil.PG_TABLES;
|
||||||
|
_titlePage = "Tables";
|
||||||
|
_scriptIdentList = "tables";
|
||||||
|
|
||||||
|
_styleListContainerAdditional = "ve-flex-4";
|
||||||
|
_styleContentWrapperAdditional = "ve-flex-6";
|
||||||
|
|
||||||
|
_btnsList = [
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "10", sortIdent: "sortName", text: "Name"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtnSource(),
|
||||||
|
];
|
||||||
|
|
||||||
|
_btnsSublist = [
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "12", sortIdent: "sortName", text: "Name"}),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
class _PageGeneratorListVariantRules extends _PageGeneratorListBase {
|
||||||
|
_page = UrlUtil.PG_VARIANTRULES;
|
||||||
|
_titlePage = "Optional, Variant, and Expanded Rules";
|
||||||
|
_navbarTitle = "Optional/etc. Rules";
|
||||||
|
_scriptIdentList = "variantrules";
|
||||||
|
|
||||||
|
_btnsList = [
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "7", sortIdent: "name", text: "Name"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "3", sortIdent: "ruleType", text: "Type"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtnSource(),
|
||||||
|
];
|
||||||
|
|
||||||
|
_btnsSublist = [
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "9", sortIdent: "name", text: "Name"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "3", sortIdent: "ruleType", text: "Type"}),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
class _PageGeneratorListVehicles extends _PageGeneratorListBase {
|
||||||
|
_page = UrlUtil.PG_VEHICLES;
|
||||||
|
_titlePage = "Vehicles";
|
||||||
|
_scriptIdentList = "vehicles";
|
||||||
|
|
||||||
|
_stylesheets = [
|
||||||
|
"vehicles",
|
||||||
|
];
|
||||||
|
|
||||||
|
_btnsList = [
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "6", sortIdent: "type", text: "Type"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "4", sortIdent: "name", text: "Name"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtnSource(),
|
||||||
|
];
|
||||||
|
|
||||||
|
_btnsSublist = [
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "8", sortIdent: "type", text: "Type"}),
|
||||||
|
_HtmlGeneratorListButtons.getBtn({width: "4", sortIdent: "name", text: "Name"}),
|
||||||
|
];
|
||||||
|
|
||||||
|
_isWrpToken = true;
|
||||||
|
|
||||||
|
_onscrollPageContent = `TokenUtil.handleStatblockScroll(event, this)`;
|
||||||
|
}
|
||||||
|
|
||||||
const generators = [
|
const generators = [
|
||||||
new _PageGeneratorListActions(),
|
new _PageGeneratorListActions(),
|
||||||
new _PageGeneratorListBackgrounds(),
|
new _PageGeneratorListBackgrounds(),
|
||||||
@@ -487,6 +796,17 @@ const generators = [
|
|||||||
new _PageGeneratorListFeats(),
|
new _PageGeneratorListFeats(),
|
||||||
new _PageGeneratorListItems(),
|
new _PageGeneratorListItems(),
|
||||||
new _PageGeneratorListTrapsHazards(),
|
new _PageGeneratorListTrapsHazards(),
|
||||||
|
new _PageGeneratorListRewards(),
|
||||||
|
new _PageGeneratorListLanguages(),
|
||||||
|
new _PageGeneratorListObjects(),
|
||||||
|
new _PageGeneratorListOptionalFeatures(),
|
||||||
|
new _PageGeneratorListPsionics(),
|
||||||
|
new _PageGeneratorListRaces(),
|
||||||
|
new _PageGeneratorListRecipes(),
|
||||||
|
new _PageGeneratorListSpells(),
|
||||||
|
new _PageGeneratorListTables(),
|
||||||
|
new _PageGeneratorListVariantRules(),
|
||||||
|
new _PageGeneratorListVehicles(),
|
||||||
];
|
];
|
||||||
|
|
||||||
generators
|
generators
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user