A new sheet arrives

This is terrifying.
This commit is contained in:
morgdalaine
2021-11-18 10:57:07 -06:00
parent f6e095569b
commit c3bca66164
79 changed files with 18765 additions and 0 deletions
+29
View File
@@ -0,0 +1,29 @@
# ARC: Doom Tabletop RPG Roll20 Character Sheet
- [ARC](https://arc-rpg.com) by momatoes
## Prerequisites
- [Nodejs](https://nodejs.org/en/) installed
- [git](https://git-scm.com/) installed
## References
- [gulp](https://gulpjs.com/)
- [pugjs](https://pugjs.org/api/getting-started.html)
- [sass](https://sass-lang.com/)
- [Building Character Sheets](https://wiki.roll20.net/Building_Character_Sheets)
## Setup
- clone this repository
- clone roll20-character-sheets
- copy all files into the roll20-character-sheets directory (aside from the `.git/` files), under a folder of the sheet name
- Run the following commands from either the terminal or command line:
```bash
# Go to the source for your sheet
$ cd /<path_to>/roll20-character-sheets/ARC/source
# Install all of the npm packages
$ npm install
# Run the build process
$ npm run gulp:watch
```
This will create 2 files ARC.html and ARC.css. The watch command allows for any saved changes to automatically build the html and css from the pug and stylus files.
+2268
View File
File diff suppressed because it is too large Load Diff
+2707
View File
File diff suppressed because it is too large Load Diff
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 292 KiB

+1
View File
@@ -0,0 +1 @@
<svg height="512pt" viewBox="0 0 512 512" width="512pt" xmlns="http://www.w3.org/2000/svg"><path d="m453.332031 0h-394.664062c-32.363281 0-58.667969 26.304688-58.667969 58.667969v394.664062c0 32.363281 26.304688 58.667969 58.667969 58.667969h394.664062c32.363281 0 58.667969-26.304688 58.667969-58.667969v-394.664062c0-32.363281-26.304688-58.667969-58.667969-58.667969zm-85.332031 277.332031h-90.667969v90.667969c0 11.777344-9.535156 21.332031-21.332031 21.332031s-21.332031-9.554687-21.332031-21.332031v-90.667969h-90.667969c-11.796875 0-21.332031-9.554687-21.332031-21.332031s9.535156-21.332031 21.332031-21.332031h90.667969v-90.667969c0-11.777344 9.535156-21.332031 21.332031-21.332031s21.332031 9.554687 21.332031 21.332031v90.667969h90.667969c11.796875 0 21.332031 9.554687 21.332031 21.332031s-9.535156 21.332031-21.332031 21.332031zm0 0"/></svg>

After

Width:  |  Height:  |  Size: 852 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 345 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

+1
View File
@@ -0,0 +1 @@
<svg id="bold" enable-background="new 0 0 24 24" height="512" viewBox="0 0 24 24" width="512" xmlns="http://www.w3.org/2000/svg"><path d="m23.525 5.054c-.705-.778-1.724-1.243-2.525-1.516v-1.538c0-.552-.448-1-1-1h-4c-1.634 0-3.087.788-4 2.003-.913-1.215-2.366-2.003-4-2.003h-4c-.552 0-1 .448-1 1v1.538c-.801.273-1.82.738-2.526 1.517-.306.338-.474.797-.474 1.291l.002 10.471c.001 5.737.001 5.737.477 6.03.359.221.815.195 1.146-.065 3.021-2.385 6.144-2.367 9.827.053.165.11.357.165.548.165s.383-.055.549-.165c3.683-2.42 6.805-2.437 9.827-.053.331.262.787.287 1.146.065.475-.293.475-.293.477-6.03l.001-10.471c0-.494-.168-.953-.475-1.292zm-7.525-2.054h3v12.89c-2.374-.1-4.333.811-6 2.769v-12.659c0-1.654 1.346-3 3-3zm-11 0h3c1.654 0 3 1.346 3 3v12.659c-1.584-1.859-3.429-2.777-5.641-2.777-.119 0-.238.002-.359.008zm-2.997 17.135c-.001-2.931-.002-8.628-.003-11.821l-.043-1.917c.228-.252.598-.493 1.043-.704v11.307c0 .294.129.573.354.763.225.189.522.273.811.223 1.503-.251 3.189-.188 4.874 1.487-2.462-.761-4.816-.551-7.036.662zm19.997-11.821c0 3.193-.001 8.89-.002 11.821-2.22-1.213-4.574-1.421-7.035-.661 1.686-1.675 3.372-1.738 4.874-1.487.288.049.586-.034.811-.223.223-.191.352-.47.352-.764v-11.309c.441.207.8.436 1 .655z"/></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

+1
View File
@@ -0,0 +1 @@
<svg height="365.696pt" viewBox="0 0 365.696 365.696" width="365.696pt" xmlns="http://www.w3.org/2000/svg"><path d="m243.1875 182.859375 113.132812-113.132813c12.5-12.5 12.5-32.765624 0-45.246093l-15.082031-15.082031c-12.503906-12.503907-32.769531-12.503907-45.25 0l-113.128906 113.128906-113.132813-113.152344c-12.5-12.5-32.765624-12.5-45.246093 0l-15.105469 15.082031c-12.5 12.503907-12.5 32.769531 0 45.25l113.152344 113.152344-113.128906 113.128906c-12.503907 12.503907-12.503907 32.769531 0 45.25l15.082031 15.082031c12.5 12.5 32.765625 12.5 45.246093 0l113.132813-113.132812 113.128906 113.132812c12.503907 12.5 32.769531 12.5 45.25 0l15.082031-15.082031c12.5-12.503906 12.5-32.769531 0-45.25zm0 0"/></svg>

After

Width:  |  Height:  |  Size: 712 B

+1
View File
@@ -0,0 +1 @@
<svg enable-background="new 0 0 24 24" height="512" viewBox="0 0 24 24" width="512" xmlns="http://www.w3.org/2000/svg"><path d="m21.25 4h-12.88c-.761 0-1.494.319-2.012.876l-6.157 6.613c-.269.288-.269.734 0 1.022l6.157 6.612c.518.558 1.251.877 2.012.877h12.88c1.517 0 2.75-1.233 2.75-2.75v-10.5c0-1.517-1.233-2.75-2.75-2.75zm-1.768 10.819c.376.405.353 1.038-.052 1.414-.192.179-.437.267-.681.267-.269 0-.536-.107-.732-.319l-2.517-2.712-2.518 2.711c-.196.212-.464.319-.732.319-.244 0-.488-.088-.681-.267-.404-.376-.428-1.009-.052-1.414l2.619-2.818-2.618-2.819c-.376-.405-.353-1.038.052-1.414.403-.376 1.038-.354 1.413.052l2.518 2.711 2.518-2.711c.374-.406 1.009-.428 1.413-.052s.428 1.009.052 1.414l-2.62 2.819z"/></svg>

After

Width:  |  Height:  |  Size: 718 B

+1
View File
@@ -0,0 +1 @@
<svg id="bold" enable-background="new 0 0 24 24" height="512" viewBox="0 0 24 24" width="512" xmlns="http://www.w3.org/2000/svg"><path d="m12 16c-.205 0-.401-.084-.542-.232l-5.25-5.5c-.455-.476-.117-1.268.542-1.268h2.75v-5.75c0-.689.561-1.25 1.25-1.25h2.5c.689 0 1.25.561 1.25 1.25v5.75h2.75c.659 0 .997.792.542 1.268l-5.25 5.5c-.141.148-.337.232-.542.232z"/><path d="m22.25 22h-20.5c-.965 0-1.75-.785-1.75-1.75v-.5c0-.965.785-1.75 1.75-1.75h20.5c.965 0 1.75.785 1.75 1.75v.5c0 .965-.785 1.75-1.75 1.75z"/></svg>

After

Width:  |  Height:  |  Size: 512 B

+1
View File
@@ -0,0 +1 @@
<svg height="512pt" viewBox="0 0 512 512" width="512pt" xmlns="http://www.w3.org/2000/svg"><path d="m304 0h-266.667969c-20.585937 0-37.332031 16.746094-37.332031 37.332031v53.335938c0 20.585937 16.746094 37.332031 37.332031 37.332031h266.667969c20.585938 0 37.332031-16.746094 37.332031-37.332031v-53.335938c0-20.585937-16.746093-37.332031-37.332031-37.332031zm0 0"/><path d="m304 192h-266.667969c-20.585937 0-37.332031 16.746094-37.332031 37.332031v53.335938c0 20.585937 16.746094 37.332031 37.332031 37.332031h266.667969c20.585938 0 37.332031-16.746094 37.332031-37.332031v-53.335938c0-20.585937-16.746093-37.332031-37.332031-37.332031zm0 0"/><path d="m304 384h-266.667969c-20.585937 0-37.332031 16.746094-37.332031 37.332031v53.335938c0 20.585937 16.746094 37.332031 37.332031 37.332031h266.667969c20.585938 0 37.332031-16.746094 37.332031-37.332031v-53.335938c0-20.585937-16.746093-37.332031-37.332031-37.332031zm0 0"/><path d="m506.902344 244.265625-74.667969-69.332031c-3.027344-2.796875-6.933594-4.265625-10.902344-4.265625-2.175781 0-4.328125.445312-6.398437 1.320312-5.824219 2.5625-9.601563 8.320313-9.601563 14.679688v138.664062c0 6.359375 3.777344 12.117188 9.601563 14.679688 5.824218 2.515625 12.628906 1.386719 17.300781-2.945313l74.667969-69.332031c3.242187-3.03125 5.097656-7.277344 5.097656-11.734375s-1.855469-8.683594-5.097656-11.734375zm0 0"/></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

+1
View File
@@ -0,0 +1 @@
<svg id="bold" enable-background="new 0 0 24 24" height="512" viewBox="0 0 24 24" width="512" xmlns="http://www.w3.org/2000/svg"><g><path d="m23 22h-13c-.552 0-1-.448-1-1s.448-1 1-1h13c.552 0 1 .448 1 1s-.448 1-1 1z"/></g><g><path d="m20.268 4.146-1.414-1.414c-.756-.756-2.073-.755-2.828 0l-2.068 2.068 4.242 4.242 2.068-2.068c.378-.377.586-.879.586-1.414 0-.534-.208-1.036-.586-1.414z"/><path d="m12.543 6.215-10.306 10.306c-.066.065-.112.148-.133.239l-1.09 4.625c-.04.168.011.346.133.468.094.095.222.147.353.147.038 0 .077-.004.115-.013l4.625-1.09c.09-.021.173-.067.239-.133l10.306-10.306z"/></g></svg>

After

Width:  |  Height:  |  Size: 604 B

+1
View File
@@ -0,0 +1 @@
<svg id="bold" enable-background="new 0 0 24 24" height="512" viewBox="0 0 24 24" width="512" xmlns="http://www.w3.org/2000/svg"><circle cx="12" cy="12" r="3"/><circle cx="3" cy="12" r="3"/><circle cx="21" cy="12" r="3"/></svg>

After

Width:  |  Height:  |  Size: 227 B

+50
View File
@@ -0,0 +1,50 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
<g>
<g>
<path d="M352,288.994v127.008H64v-288h96v-64H32c-17.664,0-32,14.336-32,32v352c0,17.696,14.336,32,32,32h352
c17.696,0,32-14.304,32-32V288.994H352z"/>
</g>
</g>
<g>
<g>
<path d="M505.6,131.202l-128-96c-4.8-3.648-11.328-4.224-16.736-1.504c-5.44,2.72-8.864,8.256-8.864,14.304v48h-48
c-97.056,0-176,78.944-176,176c0,7.424,5.12,13.888,12.32,15.584c1.216,0.288,2.464,0.416,3.68,0.416
c5.952,0,11.552-3.328,14.304-8.832l3.776-7.52c24.544-49.12,73.888-79.648,128.8-79.648H352v48
c0,6.048,3.424,11.584,8.832,14.304c5.408,2.72,11.936,2.144,16.768-1.504l128-96c4.032-3.008,6.4-7.776,6.4-12.8
S509.632,134.21,505.6,131.202z"/>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

+1
View File
@@ -0,0 +1 @@
<svg height="512pt" viewBox="0 0 512 512" width="512pt" xmlns="http://www.w3.org/2000/svg"><path d="m256 0c-141.164062 0-256 114.835938-256 256s114.835938 256 256 256 256-114.835938 256-256-114.835938-256-256-256zm0 405.332031c-11.777344 0-21.332031-9.554687-21.332031-21.332031s9.554687-21.332031 21.332031-21.332031 21.332031 9.554687 21.332031 21.332031-9.554687 21.332031-21.332031 21.332031zm33.769531-135.636719c-7.550781 3.476563-12.4375 11.09375-12.4375 19.394532v9.578125c0 11.773437-9.535156 21.332031-21.332031 21.332031s-21.332031-9.558594-21.332031-21.332031v-9.578125c0-24.898438 14.632812-47.722656 37.226562-58.15625 21.738281-10.003906 37.4375-36.566406 37.4375-49.601563 0-29.394531-23.914062-53.332031-53.332031-53.332031s-53.332031 23.9375-53.332031 53.332031c0 11.777344-9.539063 21.335938-21.335938 21.335938s-21.332031-9.558594-21.332031-21.335938c0-52.925781 43.070312-96 96-96s96 43.074219 96 96c0 28.824219-25.003906 71.191407-62.230469 88.363281zm0 0"/></svg>

After

Width:  |  Height:  |  Size: 986 B

+46
View File
@@ -0,0 +1,46 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
<g>
<g>
<path d="M394.667,214.421v-75.755C394.667,62.208,332.459,0,256,0S117.333,62.208,117.333,138.667v75.755
c-24.32,4.949-42.667,26.496-42.667,52.245v192C74.667,488.064,98.581,512,128,512h256c29.419,0,53.333-23.936,53.333-53.333v-192
C437.333,240.917,418.987,219.371,394.667,214.421z M279.659,378.24l8.235,57.579c0.448,3.072-0.469,6.165-2.496,8.491
c-2.027,2.325-4.971,3.691-8.064,3.691h-42.667c-3.093,0-6.037-1.344-8.064-3.669s-2.944-5.44-2.496-8.491l8.235-57.579
c-17.835-8.917-29.675-27.328-29.675-47.595c0-29.397,23.915-53.333,53.333-53.333s53.333,23.936,53.333,53.333
C309.333,350.933,297.493,369.344,279.659,378.24z M330.667,213.333H181.333v-74.667C181.333,97.493,214.827,64,256,64
s74.667,33.493,74.667,74.667V213.333z"/>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

+1
View File
@@ -0,0 +1 @@
<svg height="384pt" viewBox="0 -21 384 384" width="384pt" xmlns="http://www.w3.org/2000/svg"><path d="m362.667969 0h-341.335938c-11.753906 0-21.332031 9.578125-21.332031 21.332031v42.667969c0 11.753906 9.578125 21.332031 21.332031 21.332031h341.335938c11.753906 0 21.332031-9.578125 21.332031-21.332031v-42.667969c0-11.753906-9.578125-21.332031-21.332031-21.332031zm0 0"/><path d="m362.667969 128h-341.335938c-11.753906 0-21.332031 9.578125-21.332031 21.332031v42.667969c0 11.753906 9.578125 21.332031 21.332031 21.332031h341.335938c11.753906 0 21.332031-9.578125 21.332031-21.332031v-42.667969c0-11.753906-9.578125-21.332031-21.332031-21.332031zm0 0"/><path d="m362.667969 256h-341.335938c-11.753906 0-21.332031 9.578125-21.332031 21.332031v42.667969c0 11.753906 9.578125 21.332031 21.332031 21.332031h341.335938c11.753906 0 21.332031-9.578125 21.332031-21.332031v-42.667969c0-11.753906-9.578125-21.332031-21.332031-21.332031zm0 0"/></svg>

After

Width:  |  Height:  |  Size: 940 B

+47
View File
@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 512.016 512.016" style="enable-background:new 0 0 512.016 512.016;" xml:space="preserve">
<g>
<g>
<path d="M507.336,244.68l-96-96c-4.576-4.576-11.456-5.952-17.44-3.456c-5.984,2.496-9.888,8.32-9.888,14.784v48h-80v-80h48
c6.464,0,12.32-3.904,14.784-9.888s1.088-12.864-3.456-17.44l-96-96c-6.24-6.24-16.384-6.24-22.624,0l-96,96
c-4.576,4.608-5.952,11.456-3.488,17.44s8.32,9.888,14.784,9.888h48v80h-80v-48c0-6.464-3.904-12.32-9.888-14.784
s-12.832-1.088-17.44,3.456l-96,96c-6.24,6.24-6.24,16.384,0,22.624l96,96c4.576,4.576,11.456,5.952,17.44,3.456
c5.984-2.432,9.888-8.288,9.888-14.752v-48h80v80h-48c-6.464,0-12.32,3.904-14.784,9.888c-2.496,5.984-1.12,12.864,3.456,17.44
l96,96c6.24,6.24,16.384,6.24,22.624,0l96-96c4.576-4.576,5.952-11.456,3.456-17.44c-2.496-5.984-8.288-9.888-14.752-9.888h-48
v-80h80v48c0,6.464,3.904,12.32,9.888,14.784c5.984,2.496,12.864,1.12,17.44-3.456l96-96
C513.576,261.064,513.576,250.952,507.336,244.68z"/>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

+1
View File
@@ -0,0 +1 @@
<svg height="512pt" viewBox="0 0 512 512" width="512pt" xmlns="http://www.w3.org/2000/svg"><path d="m486.996094 64.382812-39.378906-39.378906c-16-16.023437-37.695313-25.003906-60.332032-25.003906h-328.617187c-32.40625 0-58.667969 26.261719-58.667969 58.667969v394.664062c0 32.40625 26.261719 58.667969 58.667969 58.667969h394.664062c32.40625 0 58.667969-26.261719 58.667969-58.667969v-328.617187c0-22.636719-8.980469-44.332032-25.003906-60.332032zm-401.664063 68.949219v-53.332031c0-8.832031 7.167969-16 16-16h224c8.832031 0 16 7.167969 16 16v53.332031c0 8.832031-7.167969 16-16 16h-224c-8.832031 0-16-7.167969-16-16zm170.667969 293.335938c-53.011719 0-96-42.988281-96-96 0-53.015625 42.988281-96 96-96s96 42.984375 96 96c0 53.011719-42.988281 96-96 96zm0 0"/></svg>

After

Width:  |  Height:  |  Size: 766 B

+50
View File
@@ -0,0 +1,50 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
<g>
<g>
<path d="M496.659,312.107l-47.061-36.8c0.597-5.675,1.109-12.309,1.109-19.328c0-7.019-0.491-13.653-1.109-19.328l47.104-36.821
c8.747-6.912,11.136-19.179,5.568-29.397L453.331,85.76c-5.227-9.557-16.683-14.464-28.309-10.176l-55.531,22.293
c-10.645-7.68-21.803-14.165-33.344-19.349l-8.448-58.901C326.312,8.448,316.584,0,305.086,0h-98.133
c-11.499,0-21.205,8.448-22.571,19.456l-8.469,59.115c-11.179,5.035-22.165,11.435-33.28,19.349l-55.68-22.357
C76.52,71.531,64.04,76.053,58.856,85.568L9.854,170.347c-5.781,9.771-3.392,22.464,5.547,29.547l47.061,36.8
c-0.747,7.189-1.109,13.44-1.109,19.307s0.363,12.117,1.109,19.328l-47.104,36.821c-8.747,6.933-11.115,19.2-5.547,29.397
l48.939,84.672c5.227,9.536,16.576,14.485,28.309,10.176l55.531-22.293c10.624,7.659,21.781,14.144,33.323,19.349l8.448,58.88
C185.747,503.552,195.454,512,206.974,512h98.133c11.499,0,21.227-8.448,22.592-19.456l8.469-59.093
c11.179-5.056,22.144-11.435,33.28-19.371l55.68,22.357c2.688,1.045,5.483,1.579,8.363,1.579c8.277,0,15.893-4.523,19.733-11.563
l49.152-85.12C507.838,331.349,505.448,319.083,496.659,312.107z M256.019,341.333c-47.061,0-85.333-38.272-85.333-85.333
s38.272-85.333,85.333-85.333s85.333,38.272,85.333,85.333S303.08,341.333,256.019,341.333z"/>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

+6
View File
@@ -0,0 +1,6 @@
<svg version="1.2" baseProfile="tiny-ps" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 880 128" width="880" height="128">
<style>
tspan { white-space:pre }
</style>
<path fill="#ffffff" aria-label="careful" d="M81.84 72.19L85.04 72.19Q85.04 92.67 76.08 103.68Q67.25 114.56 51.25 114.56Q30 114.56 19.76 101.76Q9.52 88.96 9.52 64.9Q9.52 40.19 19.38 26.88Q29.36 13.44 50.48 13.44Q61.23 13.44 68.53 19.07Q75.82 24.7 79.28 35.2L79.28 16L82.48 16L82.48 58.11L79.28 58.11Q79.28 38.27 72.11 27.65Q65.07 16.9 50.61 16.9Q37.3 16.9 32.3 27.9Q27.44 38.91 27.44 65.02Q27.44 89.6 32.56 100.22Q37.68 110.85 51.25 110.85Q65.33 110.85 73.52 101.38Q81.84 91.9 81.84 72.19ZM178.61 44.54L178.61 96.77Q178.61 103.04 179.89 106.37Q181.3 109.7 183.73 109.7Q187.57 109.7 188.72 106.75Q190 103.81 190 96.51L190 87.04L193.2 87.04L193.2 96.77Q193.2 107.01 190.38 110.85Q187.7 114.56 179.25 114.56Q170.42 114.56 166.32 109.95Q162.22 105.34 162.22 96.51L162.22 91.26Q160.43 95.74 157.36 100.1Q154.29 104.32 150.45 107.52Q146.61 110.72 142.13 112.64Q137.78 114.56 133.17 114.56Q121.14 114.56 115.76 108.03Q110.38 101.38 110.38 92.03Q110.38 85.89 113.46 81.15Q116.53 76.42 121.14 72.7Q125.87 68.86 131.63 65.79Q137.52 62.72 142.9 59.9Q146.61 57.98 150.06 56.19Q153.65 54.27 156.34 52.22Q159.02 50.18 160.56 47.74Q162.22 45.31 162.22 42.24L162.22 41.98Q162.22 28.54 159.28 22.78Q156.34 16.9 147.5 16.9Q141.49 16.9 135.86 19.58Q130.35 22.27 126.13 27.52Q121.9 32.64 119.34 40.45Q116.78 48.26 116.78 58.37L116.78 61.18L113.58 61.18L113.58 16L116.78 16L116.78 37.76Q120.75 26.24 128.94 19.84Q137.26 13.44 147.76 13.44Q163.76 13.44 171.18 22.02Q178.61 30.46 178.61 44.54ZM128.3 86.14Q128.3 96.64 129.84 103.17Q131.5 109.57 137.01 109.57Q141.74 109.57 146.35 106.5Q150.96 103.42 154.42 98.82Q157.87 94.21 160.05 88.7Q162.22 83.07 162.22 77.95L162.22 50.43Q159.79 53.76 155.31 56.58Q150.96 59.39 144.05 62.98Q135.98 67.2 132.14 71.94Q128.3 76.54 128.3 86.14ZM245.81 108.8L264.11 108.8L264.11 112L214.32 112L214.32 108.8L229.42 108.8L229.42 19.2L214.32 19.2L214.32 16L244.53 16L244.53 30.72Q246.7 21.12 251.06 17.28Q255.41 13.44 261.68 13.44Q266.93 13.44 270.64 15.87Q274.35 18.3 276.4 24.19L276.4 16L279.6 16L279.6 56.06L276.4 56.06L276.4 52.35Q276.4 41.73 275.5 34.94Q274.61 28.03 272.82 24.19Q271.02 20.22 268.21 18.69Q265.39 17.15 261.68 17.15Q252.59 17.15 249.14 26.62Q245.81 36.1 245.81 56.83L245.81 108.8ZM374.96 75.9L378.42 75.9Q378.42 94.59 369.07 104.58Q359.86 114.56 343.34 114.56Q321.46 114.56 310.83 101.76Q300.34 88.96 300.34 64.9Q300.34 40.19 309.94 26.88Q319.66 13.44 338.86 13.44Q358.96 13.44 368.69 27.39Q378.54 41.34 378.42 67.07L318.26 67.07Q318.38 90.5 323.76 100.74Q329.26 110.85 343.34 110.85Q358.06 110.85 366.51 102.27Q374.96 93.7 374.96 75.9ZM338.99 16.9Q327.6 16.9 322.99 27.65Q318.38 38.27 318.26 63.62L360.5 63.62Q360.37 38.4 355.63 27.65Q350.9 16.9 338.99 16.9ZM456.5 112L399.02 112L399.02 108.8L411.7 108.8L411.7 87.81L398.9 87.81L398.9 84.61L411.7 84.61L411.7 55.3Q411.7 34.3 419.63 23.94Q427.7 13.44 443.82 13.44Q454.06 13.44 459.82 19.71Q465.58 25.86 465.58 36.99Q465.58 47.23 460.08 52.61Q454.58 57.98 447.79 61.95Q441.01 65.92 434.99 70.53Q428.98 75.01 428.08 83.58L428.08 84.61L456.5 84.61L456.5 87.81L428.08 87.81L428.08 108.8L456.5 108.8L456.5 112ZM462 36.99Q462 26.62 456.75 21.76Q451.63 16.9 444.08 16.9Q434.99 16.9 431.54 25.34Q428.08 33.79 428.08 55.3L428.08 74.75Q431.02 68.74 436.66 65.02Q442.42 61.31 447.92 57.86Q453.55 54.27 457.78 49.66Q462 45.06 462 36.99ZM496.82 75.78L496.82 19.2L483.5 19.2L483.5 16L560.43 16L560.43 96.77Q560.43 103.42 561.84 106.62Q563.25 109.7 566.06 109.7Q569.14 109.7 570.16 106.75Q571.18 103.81 571.18 96.51L571.18 87.04L574.38 87.04L574.38 96.77Q574.38 107.01 571.7 110.85Q569.14 114.56 561.2 114.56Q553.39 114.56 549.3 110.59Q545.33 106.62 545.33 94.34L545.33 94.21Q543.02 104.96 537.52 109.82Q532.02 114.56 524.34 114.56Q517.3 114.56 512.05 112.77Q506.93 110.85 503.47 106.5Q500.14 102.02 498.48 94.59Q496.82 87.04 496.82 75.78ZM513.2 19.2L513.2 70.53Q513.2 82.56 513.71 90.37Q514.35 98.05 515.89 102.53Q517.42 106.88 519.98 108.67Q522.54 110.34 526.38 110.34Q536.24 110.34 540.08 100.99Q544.05 91.65 544.05 71.17L544.05 19.2L513.2 19.2ZM625.07 108.8L643.63 108.8L643.38 112L595.12 112L595.12 108.8L608.69 108.8L608.69 47.62Q608.69 29.31 614.83 21.38Q621.1 13.44 634.42 13.44Q640.82 13.44 644.14 17.92Q647.6 22.4 647.6 29.82Q647.6 38.91 644.14 46.21Q640.82 53.5 636.59 61.31Q632.5 69.12 628.91 78.85Q625.46 88.45 625.07 102.4L625.07 108.8ZM625.07 47.62L625.07 82.3Q627.5 72.7 630.7 65.92Q634.03 59.01 636.98 53.38Q639.92 47.62 641.97 42.11Q644.14 36.61 644.14 29.82Q644.14 23.3 641.33 20.1Q638.64 16.9 634.29 16.9Q631.47 16.9 629.68 18.3Q627.89 19.58 626.86 23.04Q625.84 26.37 625.46 32.38Q625.07 38.4 625.07 47.62Z" />
</svg>

After

Width:  |  Height:  |  Size: 4.7 KiB

+6
View File
@@ -0,0 +1,6 @@
<svg version="1.2" baseProfile="tiny-ps" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 880 128" width="880" height="128">
<style>
tspan { white-space:pre }
</style>
<path fill="#ffffff" aria-label="concerted" d="M81.84 72.19L85.04 72.19Q85.04 92.67 76.08 103.68Q67.25 114.56 51.25 114.56Q30 114.56 19.76 101.76Q9.52 88.96 9.52 64.9Q9.52 40.19 19.38 26.88Q29.36 13.44 50.48 13.44Q61.23 13.44 68.53 19.07Q75.82 24.7 79.28 35.2L79.28 16L82.48 16L82.48 58.11L79.28 58.11Q79.28 38.27 72.11 27.65Q65.07 16.9 50.61 16.9Q37.3 16.9 32.3 27.9Q27.44 38.91 27.44 65.02Q27.44 89.6 32.56 100.22Q37.68 110.85 51.25 110.85Q65.33 110.85 73.52 101.38Q81.84 91.9 81.84 72.19ZM149.55 13.44Q170.29 13.44 180.78 26.88Q191.28 40.19 191.28 64.9Q191.28 88.83 180.53 101.76Q169.78 114.56 149.55 114.56Q129.33 114.56 118.7 101.76Q108.08 88.83 108.08 64.9Q108.08 40.19 118.58 26.88Q129.07 13.44 149.55 13.44ZM149.55 16.64Q136.24 16.64 131.12 27.78Q126 38.91 126 65.02Q126 89.73 131.25 100.61Q136.5 111.36 149.55 111.36Q162.61 111.36 167.98 100.61Q173.36 89.73 173.36 65.02Q173.36 38.91 168.11 27.78Q162.86 16.64 149.55 16.64ZM244.02 108.8L254.64 108.8L254.64 112L214.32 112L214.32 108.8L227.63 108.8L227.63 19.2L214.32 19.2L214.32 16L242.74 16L242.74 33.79Q245.04 23.04 250.54 18.3Q256.05 13.44 263.73 13.44Q270.77 13.44 275.89 15.36Q281.14 17.15 284.46 21.63Q287.92 25.98 289.58 33.54Q291.25 40.96 291.25 52.22L291.25 108.8L304.56 108.8L304.56 112L263.6 112L263.6 108.8L274.86 108.8L274.86 57.47Q274.86 45.44 274.22 37.76Q273.71 29.95 272.18 25.6Q270.64 21.12 268.08 19.46Q265.52 17.66 261.68 17.66Q251.82 17.66 247.86 27.01Q244.02 36.35 244.02 56.83L244.02 108.8ZM399.28 72.19L402.48 72.19Q402.48 92.67 393.52 103.68Q384.69 114.56 368.69 114.56Q347.44 114.56 337.2 101.76Q326.96 88.96 326.96 64.9Q326.96 40.19 336.82 26.88Q346.8 13.44 367.92 13.44Q378.67 13.44 385.97 19.07Q393.26 24.7 396.72 35.2L396.72 16L399.92 16L399.92 58.11L396.72 58.11Q396.72 38.27 389.55 27.65Q382.51 16.9 368.05 16.9Q354.74 16.9 349.74 27.9Q344.88 38.91 344.88 65.02Q344.88 89.6 350 100.22Q355.12 110.85 368.69 110.85Q382.77 110.85 390.96 101.38Q399.28 91.9 399.28 72.19ZM500.14 75.9L503.6 75.9Q503.6 94.59 494.26 104.58Q485.04 114.56 468.53 114.56Q446.64 114.56 436.02 101.76Q425.52 88.96 425.52 64.9Q425.52 40.19 435.12 26.88Q444.85 13.44 464.05 13.44Q484.14 13.44 493.87 27.39Q503.73 41.34 503.6 67.07L443.44 67.07Q443.57 90.5 448.94 100.74Q454.45 110.85 468.53 110.85Q483.25 110.85 491.7 102.27Q500.14 93.7 500.14 75.9ZM464.18 16.9Q452.78 16.9 448.18 27.65Q443.57 38.27 443.44 63.62L485.68 63.62Q485.55 38.4 480.82 27.65Q476.08 16.9 464.18 16.9ZM558.13 108.8L576.43 108.8L576.43 112L526.64 112L526.64 108.8L541.74 108.8L541.74 19.2L526.64 19.2L526.64 16L556.85 16L556.85 30.72Q559.02 21.12 563.38 17.28Q567.73 13.44 574 13.44Q579.25 13.44 582.96 15.87Q586.67 18.3 588.72 24.19L588.72 16L591.92 16L591.92 56.06L588.72 56.06L588.72 52.35Q588.72 41.73 587.82 34.94Q586.93 28.03 585.14 24.19Q583.34 20.22 580.53 18.69Q577.71 17.15 574 17.15Q564.91 17.15 561.46 26.62Q558.13 36.1 558.13 56.83L558.13 108.8ZM622.38 83.07L622.38 36.48L606.26 36.48L606.26 33.02L616.11 33.02L635.44 13.44L638.64 13.44L638.64 33.02L666.8 33.02L666.8 36.48L638.64 36.48L638.64 83.07Q638.64 97.79 640.94 103.81Q643.25 109.82 649.39 109.82Q651.57 109.82 653.87 108.67Q656.18 107.52 657.97 105.09Q659.89 102.66 661.04 98.69Q662.19 94.72 662.19 89.09L665.52 89.09Q665.52 96 663.86 100.99Q662.32 105.86 659.63 108.93Q656.94 111.87 653.36 113.28Q649.9 114.56 646.06 114.56Q634.03 114.56 628.14 106.62Q622.38 98.56 622.38 83.07ZM759.98 75.9L763.44 75.9Q763.44 94.59 754.1 104.58Q744.88 114.56 728.37 114.56Q706.48 114.56 695.86 101.76Q685.36 88.96 685.36 64.9Q685.36 40.19 694.96 26.88Q704.69 13.44 723.89 13.44Q743.98 13.44 753.71 27.39Q763.57 41.34 763.44 67.07L703.28 67.07Q703.41 90.5 708.78 100.74Q714.29 110.85 728.37 110.85Q743.09 110.85 751.54 102.27Q759.98 93.7 759.98 75.9ZM724.02 16.9Q712.62 16.9 708.02 27.65Q703.41 38.27 703.28 63.62L745.52 63.62Q745.39 38.4 740.66 27.65Q735.92 16.9 724.02 16.9ZM842.03 19.2L793.26 19.2L793.26 16L871.09 16L871.09 19.2L858.42 19.2L858.42 99.46Q858.42 105.73 859.44 107.78Q860.46 109.7 862.64 109.7Q865.46 109.7 866.35 106.75Q867.38 103.81 867.38 96.64L867.38 87.17L870.58 87.17L870.58 96.9Q870.58 107.01 868.27 110.85Q866.1 114.56 859.18 114.56Q851.25 114.56 846.77 112Q842.29 109.31 842.29 100.61Q839.6 107.78 834.61 111.23Q829.74 114.56 823.34 114.56Q805.81 114.56 796.85 103.04Q788.02 91.52 788.02 70.27Q788.02 49.02 796.85 37.63Q805.81 26.11 823.34 26.11Q828.21 26.11 831.54 27.52Q834.86 28.8 837.04 30.72Q839.22 32.51 840.37 34.69Q841.52 36.74 842.03 38.14L842.03 19.2ZM823.22 111.1Q828.98 111.1 832.56 108.8Q836.27 106.5 838.32 102.53Q840.5 98.43 841.26 92.93Q842.03 87.42 842.03 81.02L842.03 53.5Q842.03 39.42 836.53 34.56Q831.02 29.57 823.09 29.57Q817.84 29.57 814.38 31.23Q811.06 32.9 809.14 37.38Q807.34 41.73 806.58 49.66Q805.94 57.6 805.94 69.89Q805.94 81.92 806.7 89.86Q807.6 97.79 809.52 102.53Q811.57 107.26 814.9 109.18Q818.22 111.1 823.22 111.1Z" />
</svg>

After

Width:  |  Height:  |  Size: 4.9 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.2 KiB

+46
View File
@@ -0,0 +1,46 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
<g>
<g>
<path d="M384,213.333H181.333v-74.667C181.333,97.493,214.827,64,256,64s74.667,33.493,74.667,74.667v42.667
c0,5.888,4.779,10.667,10.667,10.667H384c5.888,0,10.667-4.779,10.667-10.667v-42.667C394.667,62.208,332.459,0,256,0
S117.333,62.208,117.333,138.667v75.755c-24.32,4.949-42.667,26.517-42.667,52.245v192C74.667,488.064,98.581,512,128,512h256
c29.419,0,53.333-23.936,53.333-53.333v-192C437.333,237.269,413.419,213.333,384,213.333z M279.659,378.24l8.235,57.579
c0.448,3.072-0.469,6.165-2.496,8.491c-2.027,2.325-4.971,3.691-8.064,3.691h-42.667c-3.093,0-6.037-1.344-8.064-3.669
s-2.944-5.44-2.496-8.491l8.235-57.579c-17.835-8.917-29.675-27.328-29.675-47.595c0-29.397,23.915-53.333,53.333-53.333
s53.333,23.936,53.333,53.333C309.333,350.933,297.493,369.344,279.659,378.24z"/>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

+9
View File
@@ -0,0 +1,9 @@
{
"html": "arc.html",
"css": "arc.css",
"authors": "Morgdalaine",
"roll20userid": "61327",
"preview": "arc.png",
"patreon": "https://www.patreon.com/morgdalaine",
"instructions": "Don't forget to install the Doomsday Clock API!"
}
+27
View File
@@ -0,0 +1,27 @@
const gulp = require("gulp");
const pug = require("gulp-pug");
const sass = require('gulp-sass')(require('sass'));
gulp.task("scss", () => {
return gulp.src("./scss/arc.scss")
.pipe(sass({
outputStyle: "expanded"
}).on("error", sass.logError))
.pipe(gulp.dest("../"))
})
gulp.task("html", function () {
return gulp.src("./pug/arc.pug")
.pipe(pug({
pretty: true,
locals: require("../translation.json")
}))
.pipe(gulp.dest("../"))
})
gulp.task("watch", gulp.series(["scss", "html"], () => {
gulp.watch("./scss/**/*.scss", gulp.series(["scss"]))
gulp.watch(["./pug/**/*.pug","./js/**/*.js"], gulp.series(["html"]))
}))
gulp.task("build", gulp.series(["scss", "html"]))
+125
View File
@@ -0,0 +1,125 @@
on("sheet:opened", () => {
getAttrs(["sheet_type"], (updateAttrs) => {
if (!updateAttrs.sheet_type) {
updateAttrs.sheet_type = "character";
}
setAttrs(updateAttrs);
});
});
// NOTE: The API sets export_show to "on";
// it does not trigger the event handler
on("sheet:opened change:export", (eventInfo) => {
getAttrs(["export"], (val) => {
const updateAttrs = {};
updateAttrs.export_show = val.export ? "on" : "0";
setAttrs(updateAttrs);
});
});
[1, 2, 3].forEach((l) => {
on(`change:repeating_bonds:level_${l}`, (eventInfo) => {
if (eventInfo.sourceType == "player") {
let updateAttrs = {};
let changed = parseInt(eventInfo.sourceAttribute.slice(-1));
// fill major bonds below
for (let f = changed - 1; f > 0; f--) {
updateAttrs[`repeating_bonds_level_${f}`] = 4;
}
// clear major bonds above
for (let c = changed + 1; c <= 3; c++) {
updateAttrs[`repeating_bonds_level_${c}`] = 0;
}
setAttrs(updateAttrs);
}
});
});
GLOBAL__HEALTH.forEach(s => on(`change:${s} change:${s}_max`, eventInfo =>
currentMax(s, eventInfo)));
const currentMax = (attr, eventInfo) => {
if (eventInfo.sourceType == "player") {
let updateAttrs = {};
let attr_max = `${attr}_max`;
getAttrs([attr, attr_max], val => {
const current = parseInt(val[attr]) || 0;
const maximum = parseInt(val[attr_max]) || 0;
const newCurr = (current > maximum)
? maximum
: Math.max(0, current);
updateAttrs[attr] = newCurr;
updateAttrs[attr_max] = Math.max(0, maximum);
setAttrs(updateAttrs);
});
}
};
on("change:repeating_inventory:name", (eventInfo) => {
const id = eventInfo.sourceAttribute.split("_")[2];
const updateAttrs = {};
const name = eventInfo.newValue.trim();
let translation = getTranslationByKey(name)
if (translation) {
updateAttrs[`repeating_inventory_${id}_name`] = translation;
const searchInputs = _.difference(GLOBAL__INVENTORY_INPUTS, ["name"]);
_.each(searchInputs, (key) => {
const attr = `repeating_inventory_${id}_${key}`;
const i18n = `${name}_${key}`;
// check if property exists in global
if (GLOBAL__INVENTORY[name][key]) {
updateAttrs[attr] = GLOBAL__INVENTORY[name][key];
}
// check if translation exists
else if (getTranslationByKey(i18n)) {
updateAttrs[attr] = getTranslationByKey(i18n);
}
});
log(updateAttrs)
setAttrs(updateAttrs, { silent: true });
}
});
on("clicked:repeating_inventory:item-expand-toggle", (eventInfo) => {
const id = eventInfo.sourceAttribute.split("_")[2];
getAttrs([`repeating_inventory_${id}_item_expand`], (val) => {
setAttrs({
[`repeating_inventory_${id}_item_expand`]: val[`repeating_inventory_${id}_item_expand`] === "0" ? "on" : "0"
});
});
});
GLOBAL__SKILLS.forEach((skill) => {
on(`clicked:${skill}`, initiateSkillRoll);
});
on("sheet:opened", () => {
getAttrs(["version"], (updateAttrs) => {
// Logic to determine what updates need to be done
if (!updateAttrs.version) {
// set sheet version if it doesn't exist
updateAttrs.version = "1.0";
}
setAttrs(updateAttrs);
});
});
on("sheet:opened", () => {
var updateAttrs = {}
for (i = 0; i < GLOBAL__HEALTH.length; i++) {
var key = `${GLOBAL__HEALTH[i]}`;
var translation = `${key}_i18n`;
updateAttrs[translation] = getTranslationByKey(key);
}
setAttrs(updateAttrs);
});
+418
View File
@@ -0,0 +1,418 @@
const GLOBAL__HEALTH = [ "blood", "guts" ];
const GLOBAL__APPROACHES = [ "creative", "careful", "concerted" ];
const GLOBAL__SKILLS = [
"academic", "culture", "observe", "tactics",
"charisma", "guile", "impose", "insight",
"acrobatics", "coordination", "physique", "weaponry",
"artistry", "survival", "tinker", "trade",
"arcana", "focus"
];
const GLOBAL__DIFFICULTIES = [ "tn_modifier+0", "tn_modifier-1", "tn_modifier-2", "tn_modifier-3", "tn_modifier+1", "tn_modifier+2", "tn_modifier+3" ];
const GLOBAL__APPROACH_QUERY = `[[?{Approach|${GLOBAL__APPROACHES.map((app, i) => `${getTranslationByKey(app)}, ${i}`).join("|")}}]]`;
const GLOBAL__DIFFICULTY_QUERY = `[[?{Modifiers|${GLOBAL__DIFFICULTIES.map((dif, i) => `${getTranslationByKey(dif)}, ${i}`).join("|")}}]]`;
const GLOBAL__DIFFICULTY_EFFECTS = {
"tn_modifier+0": +0,
"tn_modifier-1": -1,
"tn_modifier-2": -2,
"tn_modifier-3": -3,
"tn_modifier+1": +1,
"tn_modifier+2": +2,
"tn_modifier+3": +3,
};
const GLOBAL__INVENTORY_INPUTS = [
"name",
"type",
"description",
"first_boon",
"second_boon",
"complexity",
"base_effect",
"enhanced",
"ritual"
];
const GLOBAL__INVENTORY = {
combat_scowling_face: {
type: "damage_and_defense",
complexity: 0,
},
combat_pitchfork: {
type: "damage_and_defense",
complexity: 0,
},
combat_memories_of_hardship: {
type: "damage_and_defense",
complexity: 0,
},
combat_iron_briefs: {
type: "damage_and_defense",
complexity: 0,
},
combat_booming_voice: {
type: "damage_and_defense",
complexity: 0,
},
combat_well_rounded_education: {
type: "damage_and_defense",
complexity: 0,
},
combat_darts: {
type: "damage_and_defense",
complexity: 0,
},
combat_dagger: {
type: "damage_and_defense",
complexity: 0,
},
combat_self_esteem: {
type: "damage_and_defense",
complexity: 0,
},
combat_studden_leather_armor: {
type: "damage_and_defense",
complexity: 0,
},
combat_devastating_vocabulary: {
type: "damage_and_defense",
complexity: 0,
},
combat_critical_thinking: {
type: "damage_and_defense",
complexity: 0,
},
combat_sturdy_sword: {
type: "damage_and_defense",
complexity: 0,
},
combat_crossbow: {
type: "damage_and_defense",
complexity: 0,
},
combat_plate_armor: {
type: "damage_and_defense",
complexity: 0,
},
combat_love_letter: {
type: "damage_and_defense",
complexity: 0,
},
combat_cunning_wit: {
type: "damage_and_defense",
complexity: 0,
},
combat_flaming_sword: {
type: "damage_and_defense",
complexity: 0,
},
supplies_rations: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_artisans_tools: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_crowbar_and_lantern: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_rope_and_carpet: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_bedroll: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_backpack: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_thieves_tools: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_fine_clothes: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_traps: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_tent: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_fishing_pole: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_live_hen: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_board_games: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_alchemists_tools: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_encyclopeida: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_spyglass: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_coded_letters: {
type: "supplies_and_sundries",
complexity: 0,
},
supplies_horse: {
type: "supplies_and_sundries",
complexity: 0,
},
oddities_seashell_horn: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_dead_donkey: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_ancient_ring: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_songbird: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_human_teeth: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_hat: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_monkey_head: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_heavy_crown: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_giant_serpent_scales: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_silk_dress: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_tyrant_pants: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_shadow_mirror: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_darkvision_glasses: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_divine_blood: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_seeds: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_potion_brawn: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_troll_flesh: {
type: "oddities_and_valuables",
complexity: 0,
},
oddities_telepathic_yak: {
type: "oddities_and_valuables",
complexity: 0,
},
spells_trinket: {
type: "spells_and_techniques",
complexity: 0,
},
spells_trick_of_the_light: {
type: "spells_and_techniques",
complexity: 0,
},
spells_soundshift: {
type: "spells_and_techniques",
complexity: 0,
},
spells_lifebringer: {
type: "spells_and_techniques",
complexity: 0,
},
spells_whisper: {
type: "spells_and_techniques",
complexity: 0,
},
spells_bind_weapon: {
type: "spells_and_techniques",
complexity: 0,
},
spells_unmask_the_self: {
type: "spells_and_techniques",
complexity: 0,
},
spells_secret_door: {
type: "spells_and_techniques",
complexity: 0,
},
spells_burn_the_past: {
type: "spells_and_techniques",
complexity: 0,
},
spells_master_of_elements: {
type: "spells_and_techniques",
complexity: 0,
},
spells_little_escapologist: {
type: "spells_and_techniques",
complexity: 0,
},
spells_pierce_the_veil: {
type: "spells_and_techniques",
complexity: 0,
},
spells_manic_hands: {
type: "spells_and_techniques",
complexity: 0,
},
spells_shadowbind: {
type: "spells_and_techniques",
complexity: 0,
},
spells_compel: {
type: "spells_and_techniques",
complexity: 0,
},
spells_windstep: {
type: "spells_and_techniques",
complexity: 0,
},
spells_blackout: {
type: "spells_and_techniques",
complexity: 0,
},
spells_spirit_pact: {
type: "spells_and_techniques",
complexity: 0,
},
spells_from_dust_to_dust: {
type: "spells_and_techniques",
complexity: 0,
},
spells_true_miracle: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_only_ones_who_know: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_uncanny_alarm: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_weave_through_water: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_memory_seed: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_flowmotion: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_saving_grace: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_inspiration: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_bind_magic: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_stonewall: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_heartpiercer: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_deadly_focus: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_redo: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_turn_the_tide: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_dispel: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_interdiction: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_fluorescent_transcendence: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_netherwave: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_become_one: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_defy_the_fates: {
type: "spells_and_techniques",
complexity: 0,
},
techniques_doompause: {
type: "spells_and_techniques",
complexity: 0,
},
};
+81
View File
@@ -0,0 +1,81 @@
// thank you Scott C!
const initiateSkillRoll = async function (event) {
let skill = event.triggerName.replace(/clicked:/, "");
// figure out which approach to use -- so ask
let approachRoll = await startRoll(`!&template:default} {{query=${GLOBAL__APPROACH_QUERY}}}`);
// note that values for the query options above line up with their indexes in GLOBAL__APPROACHES
// also, this is an API message: it won't be visible to any user
// because it's so generic, it shouldn't trigger any API scripts
// finish approachRoll immediately vecause we aren't going to computee
// any values from it -- it's just a dummy roll
finishRoll(approachRoll.rollId);
// same song for difficulty
let difficultyRoll = await startRoll(`!&template:default} {{query=${GLOBAL__DIFFICULTY_QUERY}}}`);
finishRoll(difficultyRoll.rollId);
// parse the results
let approachValue = approachRoll.results.query.result;
let approach = GLOBAL__APPROACHES[approachValue];
let difficultyValue = difficultyRoll.results.query.result;
let difficulty = GLOBAL__DIFFICULTIES[difficultyValue];
let i18nApproach = getTranslationByKey(approach);
let i18nSkill = getTranslationByKey(skill);
let i18nDifficulty = getTranslationByKey("difficulty");
let i18nModifier = getTranslationByKey("modifier");
let finalTemplate = [
`&{template:skills}`,
`{{character_name=@{character_name}}}`,
`{{verb=^{tests}}}`,
`{{type=skill-test}}`,
`{{skill=${skill}}}`,
`{{roll=[[1d6]]}}`,
`{{flawless=[[1d6]]}}`,
`{{flawless=[[1d6]]}}`,
`{{TN=[[@{${skill}}[${i18nSkill}] + @{${approach}}[${i18nApproach}] +`,
`${GLOBAL__DIFFICULTY_EFFECTS[difficulty]}[${i18nModifier}]]]}}`,
`{{title=${approach}}}`,
`{{difficulty=${difficulty}}}`
].join("");
// now that we have all the helprmation, make the roll
let finalRoll = await startRoll(finalTemplate);
finishRoll(finalRoll.rollId);
};
// Functions added for code to make sense, not needed for getting regular and repeating sections.
// converts a value to a number, it's default value, or 0.
const value = function(val, def) {
return (+val||def||0);
};
// ===== PARAMETERS ==========
// destinations : the name of the attribute that stores the total quantity
// can be a single attribute, or an array: ["total_cost", "total_weight"]
// If more than one, the matching fields must be in the same order.
//
// section : name of repeating fieldset, without the repeating_
//
// fields : the name of the attribute field to be summed
// destination and fields both can be a single attribute: "weight"
// or an array of attributes: ["weight","number","equipped"]
const repeatingSum = (destinations, section, fields) => {
if (!Array.isArray(destinations)) destinations = [destinations.replace(/\s/g, "").split(",")];
if (!Array.isArray(fields)) fields = [fields.replace(/\s/g, "").split(",")];
getSectionIDs(`repeating_${section}`, idArray => {
const attrArray = idArray.reduce((m, id) => [...m, ...(fields.map(field => `repeating_${section}_${id}_${field}`))], []);
getAttrs([...attrArray], v => {
const getValue = (section, id, field) => v[`repeating_${section}_${id}_${field}`] === "on" ? 1 : parseFloat(v[`repeating_${section}_${id}_${field}`]) || 0;
const commonMultipliers = (fields.length <= destinations.length) ? [] : fields.splice(destinations.length, fields.length - destinations.length);
const output = {};
destinations.forEach((destination, index) => {
output[destination] = idArray.reduce((total, id) => total + getValue(section, id, fields[index]) * commonMultipliers.reduce((subtotal, mult) => subtotal * getValue(section, id, mult), 1), 0);
});
setAttrs(output);
});
});
};
+8822
View File
File diff suppressed because it is too large Load Diff
+37
View File
@@ -0,0 +1,37 @@
{
"name": "arc",
"version": "1.0.0",
"description": "Roll20 character sheet for ARC: Doom Tabletop RPG",
"main": "arc.html",
"scripts": {
"build": "gulp build",
"watch": "gulp watch"
},
"author": "Morgdalaine",
"funding": [
{
"type": "patreon",
"url": "https://www.patreon.com/morgdalaine"
},
{
"type": "ko-fi",
"url": "https://ko-fi.com/morgdalaine"
}
],
"repository": {
"type": "git",
"url": "https://github.com/morgdalaine/arc-doom-ttrpg",
"directory": "ARC/source"
},
"keywords": [
"Roll20"
],
"license": "MIT",
"devDependencies": {
"gulp": "4.0.2",
"gulp-pug": "5.0.0",
"gulp-sass": "5.0.0",
"pug": "3.0.2",
"sass": "1.37.0"
}
}
BIN
View File
Binary file not shown.
+34
View File
@@ -0,0 +1,34 @@
include components/common/elements
include components/common/functions
include components/common/inputs
include components/common/popups
include components/approaches
include components/background
include components/bonds
include components/consequences
include components/experience
include components/header
include components/health
include components/inventory
include components/skills
include components/toolbar
include meta/data
.arc
+hidden({ name: "version", value: "1.0" })
+hidden({ name: "sheet_type", value: "character" })
+hidden({ name: "setting_tooltips", value: 1 })
+toolbar
+header
main.arc__layout
+hidden({ name: "sheet_type" })
include layouts/character
//- Roll Templates
include layouts/roll-template
//- Sheet Workers
script(type="text/worker")
include ../js/globals.js
include ../js/sheetworkers.js
include ../js/eventhandlers.js
+18
View File
@@ -0,0 +1,18 @@
mixin approaches
article.approaches
each app in data.approaches
+approach(app)
+approach-popup(app)
mixin approach(type)
+help(type)
section.approach
.approach__label
+span({ data_i18n: type }).approach__label--span
.approach__value
+number({ name: type, min: 0, max: 3 }).approach__value--input
mixin approach-popup(type)
+popup({ name: type, title: "approach" })
+span({ data_i18n: `${type}_description` })
+18
View File
@@ -0,0 +1,18 @@
mixin background
article.background
section.background__differences
+label({ data_i18n: "makes_them_different", for: "different" }).background--label
+textarea({ name: "different", id: "different" })
section.background__rumors
+label({ data_i18n: "three_rumors" }).background--label
fieldset.repeating_rumors
.background__rumors--wrapper
+textbox({ name: "rumor" }).background__rumors--input
section.background__lesson
+label({ data_i18n: "painful_lesson", for: "lesson" }).background--label
+textarea({ name: "lesson", id: "lesson" })
//- section.portrait
//- +label({ data_i18n: "portrait" }).background--label
//- .portrait__image
//- +img({ name: "character_avatar" }).portrait__image--img
+26
View File
@@ -0,0 +1,26 @@
mixin bonds
article.bonds
.bonds__header
+span({ data_i18n: "bonds" }).bonds__header--span
+help("bonds")
fieldset.repeating_bonds
+relationship
+popup({ name: "bonds", title: "bonds" })
+span({ data_i18n: "bonds_description" })
mixin relationship
article.bond
.bond__with
+textbox({ name: "relationship", data_i18n_placeholder: "name_placeholder" }).bond__with--input
section.bond__levels
each lvl in range(3)
+bond-levels(lvl)
mixin bond-levels(lvl)
.bond__container
.bond__major
+hidden({ name: `level_${lvl}`, value: 0 }).bond__control
+radio({ name: `level_${lvl}`, value: 0, checked: true }).bond__minor.reset
each minor in [4, 3, 2, 1]
+radio({ name: `level_${lvl}`, value: minor, title: minor }).bond__minor
@@ -0,0 +1,92 @@
//- create [tag] with properties
//- [tag] is passed in the obj but removed to prevent adding it to the final html
//- [data_i18n] is shorthand for data-i18n
//- [data_i18n_title] allows for translated title on :hover
//- [name] is prepended with attr_
//- [title] defaults to the attribute @{...}
//- [locals] adds text programmatically instead of writing it yourself
mixin tag(obj)
- const tag = obj.tag;
- obj = handleTag(obj);
#{tag}&attributes(obj)(class!=attributes.class)=locals[obj["data-i18n"]]
block
mixin span(obj)
- obj.tag = "span";
+tag(obj)&attributes(attributes)
block
mixin label(obj)
- obj.tag = "label";
+tag(obj)&attributes(attributes)
block
mixin h1(obj)
- obj.tag = "h1";
+tag(obj)&attributes(attributes)
block
mixin h2(obj)
- obj.tag = "h2";
+tag(obj)&attributes(attributes)
block
mixin h3(obj)
- obj.tag = "h3";
+tag(obj)&attributes(attributes)
block
mixin h4(obj)
- obj.tag = "h4";
+tag(obj)&attributes(attributes)
block
mixin h5(obj)
- obj.tag = "h5";
+tag(obj)&attributes(attributes)
block
mixin img(obj)
- obj.tag = "img"
- obj.title = obj.src;
- obj.src = `${data.assets.folder}${data.assets[obj.src]}`;
+tag(obj)&attributes(attributes)
mixin div(obj)
- obj.tag = "div";
+tag(obj)&attributes(attributes)
block
mixin section(obj)
- obj.tag = "section";
+tag(obj)&attributes(attributes)
block
mixin article(obj)
- obj.tag = "article";
+tag(obj)&attributes(attributes)
block
mixin button(obj)
if obj.type === "action"
- obj.name = `act_${obj.name}`;
else
- obj.type = "roll";
- obj.title = obj.title || `%{${obj.name}}`;
- obj.name = `roll_${obj.name}`;
if !obj["data-i18n"]
- obj["data-i18n"] = obj.data_i18n ? obj.data_i18n : null;
- obj.data_i18n = null;
button&attributes(obj)(class!=attributes.class)
block
mixin action(obj)
- obj.type = "action";
+button(obj)&attributes(attributes)
block
mixin roll(obj)
- obj.type = "roll";
+button(obj)&attributes(attributes)
block
@@ -0,0 +1,64 @@
-
const
range = (length) => [...Array(length).keys()].map(n => n + 1);
//- handle input object transformation
- function handleInput(obj) {
- // only set default title for specific inputs
- if (obj.type !== "hidden" && obj.type !== "checkbox") {
- obj.title = obj.title || `@{${obj.name}}`;
- }
- // default number placeholder to 0
- if (obj.type === "number") {
- obj.placeholder = obj.placeholder || 0;
- }
- // set data-i18n to value when unavailable
- if (obj.type === "select") {
- obj.data_i18n = obj.data_i18n || obj.value
- }
- // handle data-i18n-title and clear title
- if (obj.data_i18n_title) {
- obj["data-i18n-title"] = obj.data_i18n_title;
- obj.data_i18n_title = null;
- obj.title = null;
- }
- // handle data-i18n-placeholder
- if (obj.data_i18n_placeholder) {
- obj["data-i18n-placeholder"] = obj.data_i18n_placeholder;
- obj.data_i18n_placeholder = null;
- }
- obj.name = `attr_${obj.name}`;
- return obj;
- };
//- handle element object transformation
- function handleTag(obj) {
- obj.tag = null;
- // set default title for attributes
- if (obj.name) {
- obj.title = obj.title || `@{${obj.name}}`;
- obj.name = `attr_${obj.name}`;
- }
- // handle data-i18n-title and clear title
- if (obj.data_i18n_title) {
- obj["data-i18n-title"] = obj.data_i18n_title;
- obj.data_i18n_title = null;
- obj.title = null;
- }
- // handle data-i18n
- if (obj.data_i18n) {
- obj["data-i18n"] = obj.data_i18n;
- obj.data_i18n = null;
- }
- // handle data-i18n-vars
- if (obj.data_i18n_vars) {
- obj["data-i18n-vars"] = obj.data_i18n_vars;
- obj.data_i18n_vars = null;
- }
- // handle data-i18n-value
- if (obj.data_i18n_value) {
- obj["data-i18n-value"] = obj.data_i18n_value;
- obj.data_i18n_value = null;
- }
- return obj;
- }
+65
View File
@@ -0,0 +1,65 @@
//- base mixin for all inputs
//- [name] is prepended with attr_
//- [title] defaults to the attribute @{...}
//- [id] is prepended with attr_ or left null to remove from html
//- the reference for calling it in chat and custom macros
//- (class!=attributes.class) allows you to pass classes with +input({}).class
mixin input(obj)
- obj = handleInput(obj);
input&attributes(obj)(class!=attributes.class)
mixin checkbox(obj)
- obj.type = "checkbox";
+input(obj)&attributes(obj)(class!=attributes.class)
mixin radio(obj)
- obj.type = "radio";
+input(obj)&attributes(obj)(class!=attributes.class)
mixin textbox(obj)
- obj.type = "text";
+input(obj)&attributes(obj)(class!=attributes.class)
mixin number(obj)
- obj.type = "number";
+input(obj)&attributes(obj)(class!=attributes.class)
mixin textarea(obj)
- obj = handleInput(obj);
textarea&attributes(obj)(class!=attributes.class)
mixin hidden(obj)
- obj.type = "hidden";
+input(obj)&attributes(obj)(class!=attributes.class)
mixin select(obj)
- obj = handleInput(obj);
select&attributes(obj)(class!=attributes.class)
if block
block
else
+option({ value: "empty select, pebkac", selected: true})
mixin option(obj)
- obj.tag = "option";
- obj.data_i18n = obj.data_i18n || obj.value;
+tag(obj)&attributes(obj)
mixin textarea(obj)
- obj = handleInput(obj);
textarea&attributes(obj)(class!=attributes.class spellcheck="false")
mixin fill-in-radios(obj)
+div({ class: obj.class }).radio__ranks
+radio({ name: obj.name, value: 0, checked: true, class: obj.class }).radio__rank.reset
each x in range(obj.max)
+radio({ name: obj.name, value: x, class: obj.class }).radio__rank
mixin alt-radios
.fill-in__container
.fill-in__major
+hidden({ name: `test`, value: 0 }).fill-in__control
+radio({ name: `test`, value: 0, checked: true }).fill-in__minor.reset
each minor in [4, 3, 2, 1]
+radio({ name: `test`, value: minor, title: minor }).fill-in__minor
+23
View File
@@ -0,0 +1,23 @@
mixin help(name)
+hidden({ name: "setting_tooltips" }).toggle-tooltip
div&attributes(attributes).help
+label({ }).help__label
- name = `show_${name}`;
+checkbox({ name }).help__label--input
+img({ src: "help" }).help__label--icon
mixin popup(obj)
- obj.header = obj.header || obj.name;
- obj.name = `show_${obj.name}`;
+hidden({ name: obj.name, value: 0}).toggle-popup
article.popup(class!=attributes.class)
.popup__title
+span({ data_i18n: obj.title }).popup__title--span
label.popup__close
+checkbox({ name: obj.name }).popup__close--btn
+img({ src: "close" }).popup__close--symbol
.popup__header
+span({ data_i18n: obj.header }).popup__header--span
.popup__content
block
+31
View File
@@ -0,0 +1,31 @@
mixin fallen-consequences
-
const roll__consequences = [
`&{template:fallen}`,
`{{character_name=@{character_name}}}`,
`{{title=^{fallen_consequences}}}`,
`{{verb=^{chooses}}}`,
`{{action=^{life}}}`,
`{{type=fallen}}`,
`{{consequence=[[1d6]]}}`,
].join("");
article.consequences
.consequences__header
+span({ data_i18n: "fallen_heroes" }).consequences__header--span
+help("consequences")
section.consequences__grid
+div({ data_i18n: "1d6" }).consequences__grid--header
.consequences__roll
+roll({ name: "consequence", value: roll__consequences }).consequences__roll--btn
+span({ data_i18n: "consequence" }).consequences__roll--span
each side in range(6)
- let name = `fallen_consequence_${side}`;
label.consequence__die
+checkbox({ name, value: 1, id: name }).consequence__die--input
.consequence__die--span=side
.consequence__die--square
+label({ data_i18n: name, for: name }).consequence__description
+popup({ name: "consequences", title: "life_and_death", header: "fallen_heroes" })
+span({ data_i18n: "fallen_heroes_description" })
+14
View File
@@ -0,0 +1,14 @@
mixin experience
article.experience
.experience__header
+span({ data_i18n: "xp" }).experience__header--span
+help("xp")
.experience__total
+input({ type: "number", name: "xp_max", min: 0 }).experience__total--input
+span({ data_i18n: "xp_total" }).experience__total--span
.experience__spent
+input({ type: "number", name: "xp", min: 0}).experience__spent--input
+span({ data_i18n: "xp_spent" }).experience__spent--span
+popup({ name: "xp", title: "xp", header: "experience" })
+span({ data_i18n: "xp_description" })
+21
View File
@@ -0,0 +1,21 @@
mixin header
header.arc__header.header
+hidden({ name: "sheet_type" })
article.header__character.character
.header__title
+label({ for: "pc_id_character_name" }).header__title--label
+h2({ data_i18n: "character_name" }).header__title--header
+textbox({ name: "character_name", id: "pc_id_character_name" }).header__title--input
.header__pronouns
+label({ for: "pronouns" }).header__pronouns--label
+h3({ data_i18n: "pronouns" }).header__pronouns--header
+textbox({ name: "pronouns", id: "pronouns" }).header__pronouns--input
.header__player
+label({ for: "player_name" }).header__player--label
+h3({ data_i18n: "player_name" }).header__player--header
+textbox({ name: "player_name", id: "player_name" }).header__player--input
article.header__npc.npc
+textbox({ name: "character_name", id: "npc_id_character_name" }).header__npc--input
article.header__name
.header__name
+span({ name: "character_name" }).header__name--span
+65
View File
@@ -0,0 +1,65 @@
mixin health
article.healths
+health-section("blood")
+health-section("guts")
+rests
mixin health-section(type)
section.health
.health__type
+span({ data_i18n: type }).health__type--span
+help(type)
//- .health__plus
//- span +
.health__mod
+span({ data_i18n: "mod" }).health__mod--span
+number({ name: `${type}_mod`, min: 0 }).health__mod--input
//- .health__equals
//- span="=".health__equals
.health__max
+span({ data_i18n: "max" }).health__max--span
+number({ name: `${type}_max`, min: 0 }).health__max--input
.health__current
+span({ data_i18n: "current" }).health__current--span
+number({ name: type, min: 0 }).health__current--input
- var title = (type == "blood" ? "physical_health" : "combat_health" )
+popup({ name: type, title })
+span({ data_i18n: `${type}_description` })
mixin rests
section.rests
-
const roll__short_rest = [
`&{template:recover}`,
`{{character_name=@{character_name}}}`,
`{{action=^{short_rest}}}`,
`{{verb=^{takes_a_rest}}}`,
`{{type=short-rest}}`,
`{{blood=[[1d6]]}}`,
`{{guts=[[1d6]]}}`
].join("");
-
const roll__long_rest = [
`&{template:recover}`,
`{{character_name=@{character_name}}}`,
`{{action=^{long_rest}}}`,
`{{type=long-rest}}`,
`{{verb=^{takes_a_rest}}}`,
`{{blood=[[2d6+@{blood_mod}[BLOOD]]]}}`,
`{{guts=[[2d6+@{guts_mod}[GUTS]]]}}`
].join("");
.rests__spacer
hr.rests__spacer--line
.rests__short
+roll({ name: "short_rest", value: roll__short_rest }).rests__short--button
+span({ data_i18n: "short_rest" }).rests__short--span
.rests__spacer
hr.rests__spacer--line
.rests__long
+roll({ name: "long_rest", value: roll__long_rest }).rests__long--button
+span({ data_i18n: "long_rest" }).rests__long--span
.rests__spacer
hr.rests__spacer--line
+114
View File
@@ -0,0 +1,114 @@
mixin inventory
article.inventory
datalist(id="datalist__inventory")
each item in data.inventory.items
option(value=item, data-i18n=item)
.inventory__header
+span({ data_i18n: "inventory" }).inventory__header--span
+help("inventory")
.inventory__type
+span({ data_i18n: "item_type" }).inventory__type--span
.inventory__qty
+span({ data_i18n: "item_quantity" }).inventory__qty--span
.inventory__edit
.inventory__items
fieldset.repeating_inventory
+item
+popup({ name: "inventory", title: "inventory" })
+span({ data_i18n: "inventory_description" })
mixin item
.item__wrapper
+hidden({ name: "item_expand", value: "0" })
+hidden({ name: "type" }).item__block--toggle
section.item
- let universals = Object.assign([], data.inventory.inputs.universal);
- universals = universals.sort((x, y) => { return x.sort - y.sort });
section.item__block.item__universal
each field in universals
+item-input(field)
.item__expand
+action({ name: "item-expand-toggle" }).item__expand--btn
+img({ src: "edit" }).item__expand--img
+img({ src: "close" }).item__close--img
+item-details
mixin item-details
section.item--details
each itemType in data.inventory.types
- let fields = [...data.inventory.inputs[itemType]];
- fields = fields.sort((x, y) => { return x.sort - y.sort });
+section({ class: `item__${itemType}` }).item__block
each field in fields
+item-input(field)
mixin item-input(obj)
- const field = Object.assign({}, obj);
- field.sort = null;
- field.id = `id_item_${field.name}`;
+div({ class: `item--${field.name}` })
if field.type === "select"
+field-select-block(field)
else
+field-block(field)
mixin field-block(obj)
- const data_i18n = obj.label || null;
- const data_i18n_title = obj.label_title || null;
.field
if data_i18n
+label({ data_i18n_title, for: obj.id }).field__label
+span({ data_i18n }).field__label--span
- obj.label = null;
- obj.label_title = null;
- obj.class = `field--${obj.type}`;
if (obj.type === "radios")
+fill-in-radios(obj)
else if (obj.type === "textarea")
- obj.type = null;
+textarea(obj)
else
+input(obj)
mixin field-select-block(obj)
- const data_i18n = obj.label || null;
.field
if data_i18n
+label({ data_i18n_title, for: obj.id }).field__label
+span({ data_i18n }).field__label--span
- const options = obj.options;
- obj.options = null;
+select(obj).field--select
each opt in options
+option(opt)
//- not used
mixin inventory-totals
footer.inventory__totals
.inventory__totals--empty
.inventory__totals--empty
.inventory__totals--pool
+number({ name: "inventory_points_max", min: 0 })
.inventory__totals--spent
+number({ name: "inventory_points", min: 0 })
.inventory__totals--empty
.inventory__totals--pool
+span({ data_i18n: "item_pool" })
.inventory__totals--spent
+span({ data_i18n: "item_pool" })
//- not used
mixin type-checkboxes
+label({ for: "supplies" }).item__is-supplies
+radio({ name: "type", value: "supplies", id: "supplies" }).item__type--radio
.item__type--square
+label({ for: "damage-defense" }).item__is-damage-defense
+radio({ name: "type", value: "damage", id: "damage-defense" }).item__type--radio
.item__type--square
+label({ for: "spell-technique" }).item__is-spell-technique
+radio({ name: "type", value: "spell", id: "spell-technique" }).item__type--radio
.item__type--square
+38
View File
@@ -0,0 +1,38 @@
mixin skills
article.skills
.skills__header
+span({ data_i18n: "skills" }).skills__header--span
+help("skills")
each skills, category in data.skills
header.skill-category__header
+span({ data_i18n: category }).skill-category__header--span
//- +help(`${category}_popup`)
hr.skill-category__header--line
//- +category-popup(category)
each skill in skills
+skill(skill)
+popup({ name: "skills", title: "skill", header: "skill_info" })
+span({ data_i18n: "skill_description" })
mixin category-popup(cat)
+popup({ name: cat, title: "skill_check" })
+span({ data_i18n: `${cat}_description` })
mixin skill(skill)
.skill__button
+action({ name: skill }).skill__button--btn
+span({ data_i18n: skill }).skill__button--span
+help(`${skill}`)
+skill-popup(skill)
+fill-in-radios({ name: skill, max: 3, class: "skill" })
//- .skill__ranks
//- +radio({ name: skill, value: 0, checked: true }).skill__rank.reset
//- each x in range(3)
//- +radio({ name: skill, value: x }).skill__rank
mixin skill-popup(skill)
+popup({ name: skill, title: "skill_info", header: skill })
+span({ data_i18n: `${skill}_description` })
+49
View File
@@ -0,0 +1,49 @@
mixin toolbar
nav.toolbar
.toolbar__labels
label.toolbar__glossary
+checkbox({ name: "show_glossary" })
+img({ src: "book" }).toolbar__glossary--icon g
label.toolbar__settings
+checkbox({ name: "show_settings" })
+img({ src: "settings" }).toolbar__settings--icon
label.toolbar__version
+span({ data_i18n: "version" }).toolbar__version--text
+span({ name: "version" }).toolbar__version--number
+glossary
+settings
mixin glossary
+popup({ name: "glossary", title: "quick_overview", header: "_" }).glossary
article.glossary--wrapper
each content in data.glossary
details
summary.glossary__entry
hr.glossary__entry--line
+h3({ data_i18n: content }).glossary__entry--header
hr.glossary__entry--line
.glossary__definition
+span({ data_i18n: `${content}_description` })
mixin settings
+popup({ name: "settings", title: "settings", header: "_" }).settings
article.settings--wrapper
section.settings__mode
+h3({ data_i18n: "sheet_mode" }).settings__mode--header
+select({ name: "sheet_type" }).settings__tooltips--select
each option in data.settings.sheet_type
+option(option)
section.settings__theme
+h3({ data_i18n: "theme" }).settings__theme--header
+span({ data_i18n: "use_sync" }).settings__theme--span
section.settings__tooltips
+h3({ data_i18n: "tooltips" }).settings__tooltips--header
+select({ name: "setting_tooltips" }).settings__tooltips--select
each option in data.settings.tooltips
+option(option)
section.settings__export
+roll({ data_i18n: "export_character", name: "api_export", value: "!arc .export @{character_id}" }).settings__export--btn
+hidden({ name: "export_show", value: "0" }).settings__export--toggle
+textarea({ name: "export", rows: 6, data_i18n_placeholder: "requires_arc_api" }).settings__export--json
+span({ data_i18n: "requires_arc_api" }).settings__export--span
+11
View File
@@ -0,0 +1,11 @@
article.arc__layout--left
+health
+approaches
+skills
+inventory
aside.arc__layout--right.character
+background
+bonds
+experience
+fallen-consequences
+97
View File
@@ -0,0 +1,97 @@
mixin tags(array)
each tag in array
| {{##{ tag }}}
if block
block
each tag in array.reverse()
| {{/#{ tag }}}
mixin roll-template-sentence
.sheet-arc__sentence
+tags(["character_name"])
.sheet-arc__sentence--name(class=`{{type}}`) {{ character_name }}
+tags(["verb"])
.sheet-arc__sentence--verb(class=`{{type}}`) {{ verb }}
+tags(["action"])
.sheet-arc__sentence--action(class=`{{type}}`) {{ action }}
rolltemplate.sheet-rolltemplate-recover
.sheet-arc__container
.sheet-arc__banner(class=`{{type}}`)
.sheet-arc__content(class=`{{type}}`)
+roll-template-sentence
.sheet-arc__recover(class=`{{type}}`)
.sheet-arc__recover--arrow &#x25B6;
.sheet-arc__recover--text
+span({ data_i18n: "recovery_{{type}}",
data_i18n_vars: "{{blood}}|{{guts}}" })
.sheet-arc__footnote
span.sheet-arc__footnote--mark &#x203B;
+span({ data_i18n: "update_character_sheet" }).sheet-arc__footnote--span
rolltemplate.sheet-rolltemplate-fallen
.sheet-arc__container
.sheet-arc__banner(class=`{{type}}`)
.sheet-arc__content(class=`{{type}}`)
+roll-template-sentence
.sheet-arc__fallen(class=`{{type}}`)
.sheet-arc__fallen--roll
span {{ consequence }}
each con in range(6)
+tags([`rollTotal() consequence ${con}`])
.sheet-arc__fallen--text
+span({ data_i18n: `fallen_consequence_${con}` })
.sheet-arc__footnote
span.sheet-arc__footnote--mark &#x203B;
+span({ data_i18n: "update_character_sheet" }).sheet-arc__footnote--span
rolltemplate.sheet-rolltemplate-skills
.sheet-arc__container
.sheet-arc__banner(class=`{{type}}`)
+tags(["rollLess() roll TN"])
span.sheet-display-control.sheet-success
+tags(["rollTotal() roll TN"])
span.sheet-display-control.sheet-tie
+tags(["rollGreater() roll TN"])
span.sheet-display-control.sheet-fail
.sheet-arc__content(class=`{{type}}`)
+roll-template-sentence
.sheet-arc__approach-skill(class=`{{type}}`)
.sheet-arc__approach-skill--arrow &#x25B6;
.sheet-arc__approach-skill--approach(class=`{{title}}`)
+div({ data_i18n: `{{skill}}` }).sheet-arc__approach-skill--text
.sheet-arc__results
//- text for success | tie | fail
.sheet-arc__results--text
+tags(["rollLess() roll TN"])
.sheet-arc__success
+span({ data_i18n: "roll_success" }).sheet-arc__success--span
+tags(["rollTotal() roll TN"])
.sheet-arc__tie
+span({ data_i18n: "roll_tie" }).sheet-arc__tie--span
+tags(["rollGreater() roll TN"])
.sheet-arc__fail
+span({ data_i18n: "roll_fail" }).sheet-arc__fail--span
//- dice results
.sheet-arc__results--values
+div({ data_i18n: "roll" }).sheet-arc__roll--header
+div({ data_i18n: "versus" }).sheet-arc__versus--header
+div({ data_i18n: "tn" }).sheet-arc__tn--header
each roll in range(6)
+tags([`rollTotal() roll ${roll}`])
.sheet-arc__roll--value
img(src=`https://raw.githubusercontent.com/morgdalaine/arc-momatoes/main/api-script/ARC/assets/die_${roll}.png`)
| {{roll}}
.sheet-arc__versus--value
+tags(["rollLess() roll TN"])
span.sheet-arc__versus--symbol.sheet-success="<"
+tags(["rollTotal() roll TN"])
span.sheet-arc__versus--symbol.sheet-tie="="
+tags(["rollGreater() roll TN"])
span.sheet-arc__versus--symbol.sheet-fail=">"
.sheet-arc__tn--value {{TN}}
+291
View File
@@ -0,0 +1,291 @@
-
const data = {
assets: {
folder: "https://raw.githubusercontent.com/morgdalaine/arc-momatoes/main/character-sheet/ARC/assets/",
add: "add.svg",
book: "book.svg",
close: "close.svg",
delete: "delete.svg",
download: "download.svg",
drag: "drag.svg",
edit: "edit.svg",
export: "export.svg",
help: "help.svg",
lock: "lock.svg",
move: "move.svg",
save: "save.svg",
settings: "settings.svg",
unlock: "unlock.svg",
bg_check_success: "bg_check_success.png",
bg_check_tie: "bg_check_tie.png",
bg_check_fail: "bg_check_fail.png",
bg_long_rest: "bg_long_rest.png",
bg_short_rest: "bg_short_rest.png",
tab_long_rest: "tab_long_rest.png",
tab_short_rest: "tab_short_rest.png",
tab_skill_check: "tab_skill_check.png",
text_careful: "text_careful.svg",
text_concerted: "text_concerted.svg",
text_creative: "text_creative.svg",
},
settings: {
sheet_type: [
{
value: "character",
data_i18n: "character_mode",
selected: true
},
{
value: "npc",
data_i18n: "npc_mode"
}
],
tooltips: [
{
value: "1",
data_i18n: "tooltip_show",
selected: true
},
{
value: "0",
data_i18n: "tooltip_hide"
}
]
},
glossary: [
"advantage",
"attack",
"complexity",
"conflict",
"consequence",
"damage",
"difficulty_modifier",
"doom",
"doomsday_clock",
"focus",
"group_skill_check",
"initiative_category",
"learning_spells_and_techniques",
"moment",
"movement_in_conflict",
"omen",
"opportunity",
"rest",
"ritual",
"skill_check",
"spells_and_techniques",
"spells_and_techniques_in_conflict",
"stand_ground",
"threshold_number",
"turn"
],
approaches: [ "creative", "careful", "concerted" ],
skills: {
knowledge: [ "academic", "culture", "observe", "tactics" ],
social: [ "charisma", "guile", "impose", "insight" ],
physical: [ "acrobatics", "coordination", "physique", "weaponry" ],
practical: [ "artistry", "survival", "tinker", "trade" ],
prowess: [ "arcana", "focus" ],
},
inventory: {
types: [ "supplies_and_sundries", "oddities_and_valuables", "damage_and_defense", "spells_and_techniques" ],
inputs: {
universal: [
{
sort: 1,
name: "name",
type: "text",
list: "datalist__inventory",
data_i18n_placeholder: "name_placeholder",
},
{
sort: 2,
name: "type",
type: "select",
options: [
{ data_i18n: "select_placeholder", value: "none", selected: true },
{ value: "supplies_and_sundries" },
{ value: "oddities_and_valuables" },
{ value: "damage_and_defense" },
{ value: "spells_and_techniques" },
]
},
{
sort: 3,
name: "quantity",
type: "number",
placeholder: "0",
min: 0,
}
],
supplies_and_sundries: [
{
sort: 4,
label: "description",
name: "description",
type: "text",
data_i18n_placeholder: "description_placeholder",
}
],
oddities_and_valuables: [
{
sort: 4,
label: "description",
name: "description",
type: "text",
data_i18n_placeholder: "description_placeholder",
}
],
damage_and_defense: [
{
sort: 4,
label: "boon",
name: "first_boon",
type: "textarea",
data_i18n_placeholder: "boon_placeholder",
},
{
sort: 5,
label: "boon",
name: "second_boon",
type: "textarea",
data_i18n_placeholder: "boon_placeholder",
},
{
sort: 6,
label: "description",
name: "description",
type: "text",
data_i18n_placeholder: "description_placeholder",
},
],
spells_and_techniques: [
{
sort: 4,
label: "complexity",
name: "complexity",
type: "radios",
class: "complexity",
max: 4,
},
{
sort: 5,
label: "base_effect",
name: "base_effect",
type: "textarea",
//- data_i18n_placeholder: "base_effect_placeholder",
},
{
sort: 6,
label: "enhanced",
name: "enhanced",
type: "textarea",
//- data_i18n_placeholder: "enhanced_placeholder",
},
{
sort: 7,
label: "ritual",
name: "ritual",
type: "textarea",
//- data_i18n_placeholder: "ritual_placeholder",
},
],
},
items: [
"combat_scowling_face",
"combat_pitchfork",
"combat_memories_of_hardship",
"combat_iron_briefs",
"combat_booming_voice",
"combat_well_rounded_education",
"combat_darts",
"combat_dagger",
"combat_self_esteem",
"combat_studden_leather_armor",
"combat_devastating_vocabulary",
"combat_critical_thinking",
"combat_sturdy_sword",
"combat_crossbow",
"combat_plate_armor",
"combat_love_letter",
"combat_cunning_wit",
"combat_flaming_sword",
"supplies_rations",
"supplies_artisans_tools",
"supplies_crowbar_and_lantern",
"supplies_rope_and_carpet",
"supplies_bedroll",
"supplies_backpack",
"supplies_thieves_tools",
"supplies_fine_clothes",
"supplies_traps",
"supplies_tent",
"supplies_fishing_pole",
"supplies_live_hen",
"supplies_board_games",
"supplies_alchemists_tools",
"supplies_encyclopeida",
"supplies_spyglass",
"supplies_coded_letters",
"supplies_horse",
"oddities_seashell_horn",
"oddities_dead_donkey",
"oddities_ancient_ring",
"oddities_songbird",
"oddities_human_teeth",
"oddities_hat",
"oddities_monkey_head",
"oddities_heavy_crown",
"oddities_giant_serpent_scales",
"oddities_silk_dress",
"oddities_tyrant_pants",
"oddities_shadow_mirror",
"oddities_darkvision_glasses",
"oddities_divine_blood",
"oddities_seeds",
"oddities_potion_brawn",
"oddities_troll_flesh",
"oddities_telepathic_yak",
"spells_trinket",
"spells_trick_of_the_light",
"spells_soundshift",
"spells_lifebringer",
"spells_whisper",
"spells_bind_weapon",
"spells_unmask_the_self",
"spells_secret_door",
"spells_burn_the_past",
"spells_master_of_elements",
"spells_little_escapologist",
"spells_pierce_the_veil",
"spells_manic_hands",
"spells_shadowbind",
"spells_compel",
"spells_windstep",
"spells_blackout",
"spells_spirit_pact",
"spells_from_dust_to_dust",
"spells_true_miracle",
"techniques_only_ones_who_know",
"techniques_uncanny_alarm",
"techniques_weave_through_water",
"techniques_memory_seed",
"techniques_flowmotion",
"techniques_saving_grace",
"techniques_inspiration",
"techniques_bind_magic",
"techniques_stonewall",
"techniques_heart_piercer",
"techniques_deadly_focus",
"techniques_redo",
"techniques_turn_the_tide",
"techniques_dispel",
"techniques_interdiction",
"techniques_fluorescent_transcendence",
"techniques_netherwave",
"techniques_become_one",
"techniques_defy_the_fates",
"techniques_doompause",
]
}
}
+80
View File
@@ -0,0 +1,80 @@
.arc {
@import "meta/reset";
// @import "meta/unset";
}
// shared variables and mixins
@import "meta/variables";
@import "meta/breakpoints";
@import "components/common/mixins";
@import "components/common/popups";
html {
font-size: 13px !important;
}
.ui-dialog {
.charsheet {
padding: 0px !important;
button[type=roll] {
&::before {
font-family: unset;
content: unset;
}
}
input {
height: unset;
width: 100%;
&[type=number] {
width: 100%;
}
}
}
}
@include repeatingSectionsButtons;
input[name*="sheet_type"] {
&[value="character"] {
~ .npc {
display: none;
}
}
&[value="npc"] {
~ .character {
display: none;
}
}
}
.arc {
position: relative;
font-family: $primary-sans-serif;
font-size: 13px;
@import "meta/buttons";
@import "components/common/inputs";
@media (prefers-color-scheme: light) {
color: $primary-color-light;
background: $primary-background-light;
}
@media (prefers-color-scheme: dark) {
color: $primary-color-dark;
background: $primary-background-dark;
}
h2 { font-size: 1.5rem; }
h3 { font-size: 1.17rem; }
h4 { font-size: 1rem; }
h5 {
font-size: 1rem;
text-transform: uppercase;
}
// Components
@import "components/toolbar";
@import "components/header";
}
@import "layouts/character";
@import "layouts/roll-template";
+52
View File
@@ -0,0 +1,52 @@
.approaches {
display: flex;
flex-direction: row;
justify-content: center;
width: 100%;
}
.approach {
display: flex;
flex-direction: row;
width: 25%;
align-items: center;
&__label {
&--span {
font-family: $primary-serif;
white-space: nowrap;
text-transform: uppercase;
writing-mode: vertical-rl;
@include rotate(180deg);
}
}
&__value {
display: flex;
align-items: center;
justify-content: center;
border: 5px double transparent;
border-radius: 50%;
aspect-ratio: 1 / 1;
width: 100%;
@media (prefers-color-scheme: light) {
border-color: $primary-accent-light;
}
@media (prefers-color-scheme: dark) {
border-color: $primary-accent-dark;
}
&--input[type="number"] {
@include square(100%);
padding: 0;
font-size: 4rem;
@media only screen and (max-width: $large) {
font-size: 3rem;
}
@media only screen and (max-width: $medium) {
font-size: 2rem;
}
}
}
}
+40
View File
@@ -0,0 +1,40 @@
.background {
display: grid;
grid-template-rows: repeat(3, auto);
row-gap: 8px;
height: fit-content;
padding: 8px;
@media (prefers-color-scheme: light) {
background: linear-gradient($tertiary-background-light 75%, transparent);
}
@media (prefers-color-scheme: dark) {
background: linear-gradient($tertiary-background-dark 75%, transparent);
}
&--label {
font-size: 1.2rem;
font-variant-caps: small-caps;
cursor: pointer;
}
&__rumors {
&--wrapper {
margin: 8px 0;
}
}
}
.portrait {
display: none;
justify-content: center;
align-items: center;
&__avi {
display: flex;
justify-content: center;
align-items: center;
position: relative;
&--img {
position: absolute;
}
}
}
+118
View File
@@ -0,0 +1,118 @@
.bonds {
&__header {
@include sectionHeader;
}
}
.bond {
display: grid;
grid-template-columns: 2fr 1fr;
gap: 1rem;
margin-bottom: 1rem;
&__with {
grid-column: 1 / 2;
}
&__levels {
grid-column: 2 / 3;
display: grid;
grid-template-columns: repeat(3, 1fr);
column-gap: 2px;
align-content: center;
}
&__container {
border: 2px solid transparent;
@include square(31px);
@media (prefers-color-scheme: light) {
border-color: $secondary-accent-light;
}
@media (prefers-color-scheme: dark) {
border-color: $secondary-accent-dark;
}
}
&__major {
display: grid;
gap: 1px;
grid-template-columns: repeat(2, 1fr);
grid-template-rows: repeat(2, 1fr);
grid-template-areas:
"minor1 minor2"
"minor4 minor3";
@include square(27px);
@media (prefers-color-scheme: light) {
background: linear-gradient($secondary-accent-light, $secondary-accent-light) center/100% 1px no-repeat, repeating-linear-gradient(to right, transparent 0 13px, $secondary-accent-light 0 14px);
}
@media (prefers-color-scheme: dark) {
background: linear-gradient($secondary-accent-dark, $secondary-accent-dark) center/100% 1px no-repeat, repeating-linear-gradient(to right,transparent 0 13px, $secondary-accent-dark 0 14px);
}
}
}
.bond__minor {
border: 1px solid transparent;
background: transparent;
@include square(13px);
cursor: pointer;
box-sizing: border-box;
appearance: none;
-moz-appearance: none;
-webkit-appearance: none;
&.reset { grid-area: minor1; }
&[value="1"] { grid-area: minor1; }
&[value="2"] { grid-area: minor2; }
&[value="3"] { grid-area: minor3; }
&[value="4"] { grid-area: minor4; }
&:checked { display: none; }
}
.bond__control {
&:not([value="0"]) ~ .bond__minor[value="1"] {
grid-area: minor2;
}
&:is([value="2"], [value="3"], [value="4"]) ~ .bond__minor[value="2"] {
grid-area: minor3;
}
&:is([value="3"], [value="4"]) ~ .bond__minor[value="3"] {
grid-area: minor4;
}
}
@media (prefers-color-scheme: light) {
.bond__minor.reset,
.bond__minor:not(.reset):checked ~ .bond__minor {
background: $secondary-highlight-light;
}
}
@media (prefers-color-scheme: dark) {
.bond__minor.reset,
.bond__minor:not(.reset):checked ~ .bond__minor {
background: $secondary-highlight-dark;
}
}
@media only screen and (max-width: $large) {
.bond {
display: flex;
flex-direction: column;
&__levels {
display: flex;
justify-content: center;
}
}
input.bond__with--input[type=text] {
padding-left: 0;
text-align: center;
font-size: 1.2rem;
}
}
// @media only screen and (max-width: $medium) {
// }
// @media only screen and (max-width: $small) {
// }
@@ -0,0 +1,90 @@
.consequences {
&__header {
@include sectionHeader;
}
&__grid {
display: grid;
grid-template-columns: auto 1fr;
gap: 0.5rem;
align-items: center;
justify-items: center;
&--header {
padding: 0 1rem;
text-align: center;
font-size: 1.17rem;
}
}
&__roll {
justify-self: start;
@include rollButton;
&--span {
text-transform: uppercase;
text-align: left;
font-size: 1.17rem;
}
}
}
.consequence {
&__die {
display: flex;
flex-direction: column;
align-items: center;
height: 100%;
cursor: pointer;
&--span {
position: relative;
top: 4px;
font-size: 1.17rem;
font-weight: bold;
z-index: 1;
@media (prefers-color-scheme: light) {
color: $secondary-accent-light;
}
@media (prefers-color-scheme: dark) {
color: $secondary-accent-dark;
}
}
&--input {
display: none;
&:checked {
+ .consequence__die--span {
@media (prefers-color-scheme: light) {
color: $secondary-color-light;
}
@media (prefers-color-scheme: dark) {
color: $secondary-color-dark;
}
}
~ .consequence__die--square {
@media (prefers-color-scheme: light) {
background: $secondary-accent-light;
}
@media (prefers-color-scheme: dark) {
background: $secondary-accent-dark;
}
}
}
}
&--square {
position: absolute;
border: 2px solid transparent;
@include square(24px);
@media (prefers-color-scheme: light) {
border-color: $secondary-accent-light;
}
@media (prefers-color-scheme: dark) {
border-color: $secondary-accent-dark;
}
}
}
&__description {
display: flex;
align-items: start;
font-variant-caps: small-caps;
width: 100%;
min-height: 4rem;
cursor: pointer;
}
}
+43
View File
@@ -0,0 +1,43 @@
.experience {
width: 100%;
display: grid;
grid-template-columns: auto 1fr 1fr;
gap: 0.5rem;
&__header {
grid-row: 1;
grid-column: 1 / 2;
@include sectionHeader;
}
&__total, &__spent {
display: flex;
flex-direction: column;
&--input {
border: none;
font-size: 2rem;
}
&--span {
margin-top: 4px;
text-align: center;
text-transform: uppercase;
font-size: 0.8rem;
}
}
&__total--input {
border: 5px solid transparent;
@media (prefers-color-scheme: light) {
border-color: $secondary-border-light;
}
@media (prefers-color-scheme: dark) {
border-color: $secondary-border-dark;
}
}
&__spent--input {
border: 5px double transparent;
@media (prefers-color-scheme: light) {
border-color: $primary-border-light;
}
@media (prefers-color-scheme: dark) {
border-color: $primary-border-dark;
}
}
}
+147
View File
@@ -0,0 +1,147 @@
.header {
&__character {
display: grid;
grid-template-columns: 3fr 2fr;
grid-template-rows: auto auto;
grid-gap: 0.5rem;
}
&__npc {
display: flex;
align-items: center;
&--input {
text-align: center;
font-size: 2rem;
font-family: $primary-serif;
padding-left: 0 !important;
}
}
&__title {
grid-row: 1 / 3;
display: flex;
flex-wrap: wrap;
align-content: space-between;
&--header {
font-family: $primary-serif;
text-transform: uppercase;
}
&--input[type=text] {
font-size: 2rem;
}
}
&__pronouns, &__player {
&--input {
font-size: 1rem;
font-family: $primary-serif;
padding: 0.5rem;
}
}
&__pronouns {
grid-row: 1;
grid-column: 2 / 3;
}
&__player {
grid-row: 2;
grid-column: 2 / 3;
}
&__name {
display: none;
&--span {
font-size: 2rem;
font-family: $primary-serif;
text-transform: uppercase;
}
}
@media only screen and (max-width: $medium) {
grid-template-columns: repeat(2, 1fr);
grid-template-rows: 1fr auto auto;
&__title, &__pronouns, &__player {
&--label {
padding-bottom: 1rem;
text-align: center;
}
&--input {
text-align: center;
}
}
&__title {
grid-row: 1;
grid-column: 1 / 3;
}
&__pronouns {
grid-row: 2;
grid-column: 1 / 2;
}
&__player {
grid-row: 2;
grid-column: 2 / 3;
}
}
@media only screen and (max-width: $small) {
&__character.character, &__npc.npc {
display: none;
}
&__name {
display: flex;
justify-content: center;
}
}
}
@media (prefers-color-scheme: light) {
.header {
&__title {
&--input {
border-color: $primary-accent-light;
}
&--header {
color: $primary-accent-light !important;
}
}
&__pronouns, &__player {
&--input {
border-color: $primary-accent-light;
}
}
&__name {
color: $primary-accent-light !important;
}
&__npc--input {
border-color: $primary-accent-light;
}
}
}
@media (prefers-color-scheme: dark) {
.header {
&__title {
&--input {
border-color: $primary-accent-dark;
}
&--header {
color: $primary-accent-dark !important;
}
}
&__pronouns, &__player {
&--input {
border-color: $primary-accent-dark;
}
}
&__name {
color: $primary-accent-dark !important;
}
&__npc--input {
border-color: $primary-accent-dark;
}
}
}
+227
View File
@@ -0,0 +1,227 @@
.healths {
display: grid;
grid-template-columns: 1fr;
justify-content: center;
@include fill-x;
row-gap: 0.5rem;
}
.rests {
display: grid;
grid-template-columns: repeat(2, 1fr auto ) 1fr;
width: 100%;
&__spacer {
align-self: center;
&--line {
border-bottom: 2px solid transparent;
}
}
&__short, &__long {
&--span {
font-family: $primary-serif;
font-size: 1.2rem;
font-weight: bold;
text-align: center;
text-transform: uppercase;
padding: 0 1rem;
}
}
&__short {
grid-column: 2 / 3;
&--button {
border: 2px solid transparent;
}
}
&__long {
grid-column: 4 / 5;
&--button {
border: 2px solid transparent;
}
}
}
.health {
display: flex;
flex-direction: row;
justify-content: center;
@include fill-x;
&__type, &__mod, &__max, &__current {
display: flex;
flex-direction: column;
justify-content: center;
border: 5px double transparent;
width: 6rem;
&--span {
padding: 0.2rem 0;
text-align: center;
text-transform: uppercase;
white-space: nowrap;
}
}
&__mod, &__max, &__current {
&--span {
font-size: 0.7rem;
}
&--input {
font-size: 1.2rem;
}
}
&__type {
flex-direction: row;
justify-content: start;
&--span {
margin-right: 0.5rem;
}
}
}
@media only screen and (max-width: $medium) {
.healths {
justify-items: center;
}
.health {
display: grid;
grid-template-columns: repeat(3, 1fr);
width: 80%;
&__type, &__mod, &__max, &__current {
border-width: 3px;
}
&__type {
grid-row: 1 / 2;
grid-column: 1 / 4;
justify-content: center;
width: auto;
border: none;
&--span {
font-size: 1.2rem;
text-align: left;
letter-spacing: 0.5rem;
}
}
&__mod, &__max, &__current {
grid-row: 2 / 3;
width: auto;
}
&__mod {
grid-column: 1 / 2;
}
&__max {
grid-column: 2 / 3;
}
&__current {
grid-column: 3 / 4;
}
}
}
@media only screen and (max-width: $small) {
.rests {
grid-template-columns: auto;
row-gap: 0.5rem;
&__spacer {
display: none;
}
&__short, &__long {
&--button {
width: 100%;
}
}
&__short {
grid-column: auto;
}
&__long {
grid-column: auto;
}
}
}
@media (prefers-color-scheme: light) {
.rests {
&__spacer {
&--line {
border-color: $primary-border-light;
}
}
&__short, &__long {
&--button:hover {
border-color: $primary-highlight-light;
background: $primary-highlight-light;
color: $primary-color-light;
}
}
&__short {
&--button {
border-color: $primary-border-light;
background: $primary-border-light;
color: $secondary-color-light;
}
}
&__long {
&--button {
border-color: $primary-border-light;
background: $primary-background-light;
color: $primary-border-light;
}
}
}
.health {
&__type {
background: $primary-background-light;
}
&__mod, &__max {
background: $secondary-background-light;
}
&__current {
background: $primary-background-light;
border-color: $primary-border-light;
}
}
}
@media (prefers-color-scheme: dark) {
.rests {
&__spacer {
&--line {
border-color: $primary-border-dark;
}
}
&__short, &__long {
&--button:hover {
border-color: $primary-highlight-dark;
background: $primary-highlight-dark;
color: $primary-color-dark;
}
}
&__short {
&--button {
border-color: $primary-border-dark;
background: $primary-border-dark;
color: $secondary-color-dark;
}
}
&__long {
&--button {
border-color: $primary-border-dark;
background: $primary-background-dark;
color: $primary-border-dark;
}
}
}
.health {
&__type {
background: $primary-background-dark;
}
&__mod, &__max {
background: $secondary-background-dark;
}
&__current {
background: $primary-background-dark;
border-color: $primary-border-dark;
}
}
}
+254
View File
@@ -0,0 +1,254 @@
.inventory {
display: grid;
grid-template-columns: repeat(3, 1fr);
row-gap: 8px;
width: 100%;
align-items: flex-end;
&__header {
grid-row: 1;
grid-column: 1 / 2;
white-space: nowrap;
@include sectionHeader;
}
&__type, &__short-desc, &__qty {
&--span {
font-variant-caps: small-caps;
}
}
&__type {
grid-row: 1;
grid-column: 2 / 3;
display: flex;
justify-content: center;
// &--supplies, &--defense, &--spells {
// grid-row: 1;
// @include rotate(-45deg);
// }
// &--supplies {
// grid-column: 2 / 3;
// }
// &--defense {
// grid-column: 3 / 4;
// }
// &--spells {
// grid-column: 4 / 5;
// }
}
&__qty {
grid-row: 1;
grid-column: 3 / 4;
text-align: center;
width: 100%;
margin-right: 8px;
}
&__items {
grid-row: 2;
grid-column: 1 / 6;
padding: 0 8px;
}
}
input[name*="item_expand"] {
&[value="0"] {
~ .item--details {
display: none;
}
~ .item .item__expand--img {
display: inline;
}
~ .item .item__universal {
.item--type {
display: none;
}
}
}
&[value="on"] {
~ .item .item__close--img {
display: inline;
}
~ .item .item__universal {
grid-template-columns: 1fr auto;
.item--quantity {
grid-row: 2 / 3;
}
.item__expand {
grid-column: 2 / 3;
}
}
}
}
.item {
margin: 4px 0;
&__wrapper {
margin: 4px 0;
padding: 0 4px;
border: 2px solid transparent;
@media (prefers-color-scheme: light) {
border-color: $primary-accent-light;
}
@media (prefers-color-scheme: dark) {
border-color: $primary-accent-dark;
}
}
&--details {
display: flex;
flex-direction: column;
margin: 8px 0;
}
&__block {
grid-template-columns: repeat(4, 1fr);
gap: 0.5rem;
}
&__universal {
display: grid;
grid-template-columns: 1fr repeat(2, auto);
}
}
$itemTypes: "supplies_and_sundries", "oddities_and_valuables", "damage_and_defense", "spells_and_techniques";
@each $name in $itemTypes {
.item__#{$name} {
display: none;
}
.item__block--toggle {
&[value="#{$name}"] {
~ .item--details .item__#{$name} {
display: grid;
@media only screen and (max-width: $medium) {
display: flex;
flex-direction: column;
}
}
}
}
}
.item {
&--name, &--type, &--quantity {
.field { grid-template-rows: auto; }
}
&--name {
grid-row: 1 / 2;
grid-column: 1 / 2;
}
&--quantity {
grid-row: 1 / 2;
grid-column: 2 / 3;
.field--number {
font-size: 1.2rem;
padding: 0.2rem;
width: 3.5rem;
height: 3rem;
border: none;
border-bottom: 2px double transparent;
@media (prefers-color-scheme: light) {
border-color: $primary-border-light;
}
@media (prefers-color-scheme: dark) {
border-color: $primary-border-dark;
}
}
}
&--type {
grid-row: 2 / 3;
grid-column: 1 / 2;
}
&__expand {
grid-row: 1 / 2;
grid-column: 3 / 4;
display: flex;
align-items: center;
justify-content: center;
width: 3.5rem;
margin: 0 4px;
&--img {
display: none;
cursor: pointer;
@include square(20px);
@include imgHover;
}
}
&__close--img {
display: none;
cursor: pointer;
@include square(20px);
@include imgHover;
}
&--description {
grid-column: 1 / 5;
}
&--first_boon {
grid-row: 2;
grid-column: 1 / 3;
}
&--second_boon {
grid-row: 2;
grid-column: 3 / 5;
}
&--complexity {
grid-row: 2;
grid-column: 3 / 5;
margin: 0.5rem 0;
.field {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-around;
}
@include fill-in-radios;
.radio__rank {
border: 1px solid $primary-accent-light;
background: $primary-accent-light;
}
.radio__rank.reset {
background: $primary-accent-light;
}
}
&--base_effect {
grid-row: 2 / 5;
grid-column: 1 / 3;
.field--textarea { height: 100%; }
}
&--enhanced {
grid-row: 3 / 4;
grid-column: 3 / 5;
}
&--ritual {
grid-row: 4 / 5;
grid-column: 3 / 5;
}
}
.field {
display: grid;
grid-template-rows: auto 1fr;
@include square(100%);
&__label {
&--span {
text-transform: uppercase;
font-size: 0.8rem;
}
}
&--text, &--number, &--select, &--textarea {
width: 100%;
}
&--textarea {
font-family: $primary-serif;
}
}
@media only screen and (max-width: $small) {
.item {
&--complexity {
.field {
flex-direction: column;
}
}
}
}
+113
View File
@@ -0,0 +1,113 @@
.skills {
width: 100%;
display: grid;
grid-template-columns: repeat(4, auto);
align-items: center;
&__header {
grid-column: 1 / 5;
@include sectionHeader;
}
&__category {
display: grid;
}
}
.skill-category {
&__header {
grid-column: 1 / 5;
display: grid;
grid-template-columns: auto 2rem 1fr;
margin: 1rem 0;
&--span {
grid-column: 1;
margin-right: 0.5rem;
text-transform: uppercase;
white-space: nowrap;
}
&--line {
grid-column: 3;
border-bottom: 2px solid transparent;
align-self: center;
@media (prefers-color-scheme: light) {
border-color: $primary-border-light;
}
@media (prefers-color-scheme: dark) {
border-color: $primary-border-dark;
}
}
}
}
.skill__button {
display: flex;
flex-direction: row;
@include rollButton;
&__ranks {
display: flex;
align-self: center;
}
&__popup {
grid-column: 3;
}
}
.skills {
@include fill-in-radios;
.radio__rank {
border: 1px solid transparent;
border-radius: 50%;
}
@media (prefers-color-scheme: light) {
.radio__rank {
border-color: $primary-accent-light;
background: $primary-accent-light;
}
.radio__rank.reset {
background: $primary-accent-light;
}
}
@media (prefers-color-scheme: dark) {
.radio__rank {
border-color: $primary-accent-dark;
background: $primary-accent-dark;
}
.radio__rank.reset {
background: $primary-accent-dark;
}
}
}
@media only screen and (max-width: $small) {
.skills {
grid-template-columns: repeat(2, auto);
&__header {
grid-column: 1 / 3;
}
.radio__ranks {
justify-content: flex-end;
}
.radio__rank {
@include square(1.5rem);
}
}
.skill-category {
&__header {
grid-column: 1 / 3;
&--span {
font-size: 1.2rem;
}
}
}
.skill__button {
&--span {
font-size: 1.5rem;
}
}
}
+202
View File
@@ -0,0 +1,202 @@
.toolbar {
display: flex;
justify-content: flex-end;
&__labels {
display: inline-flex;
gap: 1rem;
align-items: center;
}
&__glossary, &__settings {
font-weight: normal;
padding: 0;
margin: 0;
white-space: nowrap;
cursor: pointer;
&--icon {
@include square(24px);
opacity: 0.5;
}
}
&__glossary {
input[type=checkbox] {
display: none;
&:checked + .toolbar__glossary--icon {
opacity: 1;
}
}
&--icon {
font-family: "pictos three";
}
}
&__settings {
input[type=checkbox] {
display: none;
&:checked + .toolbar__settings--icon {
opacity: 1;
}
}
&--icon {
font-family: pictos;
}
}
&__version {
display: inline-flex;
align-items: center;
opacity: 0.5;
white-space: nowrap;
&--text, &--number {
margin: 0 0.5rem;
font-variant: small-caps;
line-height: 2.5rem;
font-family: $primary-serif;
}
&--text::after {
content: ":";
}
}
.settings, .glossary {
left: auto;
right: 5rem;
}
.settings {
width: 250px !important;
&--wrapper {
padding: 0 0.5rem 0.5rem;
}
&__mode, &__theme, &__tooltips, &__export {
margin-top: 0.5rem;
&--header {
font-family: $primary-serif;
text-transform: uppercase;
}
&--span {
display: block;
margin: 1rem 0 0 0.5rem;
opacity: 0.5;
}
}
&__export {
&--span {
margin: 1rem 0 0 0.5rem;
opacity: 0.5;
}
&--btn {
font-size: 1.17rem;
font-family: $primary-serif;
font-weight: bold;
text-transform: uppercase;
}
&--json {
resize: none;
border: none;
font-size: 0.7rem;
line-height: 1rem;
margin-top: 0.5rem;
padding: 0;
white-space: normal;
font-family: $primary-monospace;
}
}
}
.settings__export--toggle {
&[value="0"] {
~ .settings__export--json { display: none; }
~ .settings__export--span { display: block; }
}
&[value="on"] {
~ .settings__export--json { display: block; }
~ .settings__export--span { display: none; }
}
}
.glossary {
width: 75% !important;
height: 75% !important;
&--wrapper {
margin-top: 2rem;
}
&__entry {
display: grid;
grid-template-columns: 1fr auto 1fr;
height: 2rem;
align-items: center;
cursor: pointer;
&--line {
border-bottom: 2px solid transparent;
margin: 0 1rem;
}
&--header {
font-family: $primary-serif;
text-transform: uppercase;
}
}
&__definition {
padding: 0 1.5rem;
text-align: justify;
@include firstLetter;
}
}
}
@media (prefers-color-scheme: light) {
.toolbar {
.settings {
&__mode, &__theme, &__tooltips {
&--header {
color: $primary-accent-light;
}
}
&__export{
&--btn {
color: $primary-accent-light;
}
&--json {
background: $tertiary-background-light;
}
}
}
.glossary {
&__entry {
&--line {
border-color: $primary-highlight-light;
}
&--header {
color: $primary-accent-light;
}
}
}
}
}
@media (prefers-color-scheme: dark) {
.toolbar {
.settings {
&__mode, &__theme, &__tooltips {
&--header {
color: $primary-accent-dark;
}
}
&__export{
&--btn {
color: $primary-accent-dark;
}
&--json {
background: $tertiary-background-dark;
}
}
}
.glossary {
&__entry {
&--line {
border-color: $primary-highlight-dark;
}
&--header {
color: $primary-accent-dark;
}
}
}
}
}
@@ -0,0 +1,45 @@
input, textarea, select {
box-sizing: border-box; // Opera/IE 8+
-moz-box-sizing: border-box; // Firefox, other Gecko
-webkit-box-sizing: border-box; // Safari/Chrome, other WebKit
font-family: $primary-sans-serif;
font-size: 1rem;
background: none;
border: none;
border-bottom: 2px solid transparent;
border-radius: 0;
text-decoration: none;
line-height: 1.5rem;
@include fill-x;
@media (prefers-color-scheme: light) {
border-color: $primary-border-light;
}
@media (prefers-color-scheme: dark) {
border-color: $primary-border-dark;
}
}
input[type=text] {
height:3rem;
padding: 0;
padding-left: 1rem;
}
textarea {
resize: none;
min-height: 5rem;
max-height: 15rem;
overflow-y: scroll;
padding-top: 0.5rem;
padding-left: 1rem;
}
select {
height:3rem;
}
input[type='checkbox'].hide-element,
input[type='radio'].hide-element,
.hide-element {
display: none;
}
+204
View File
@@ -0,0 +1,204 @@
@mixin sectionHeader {
display: flex;
&--span {
font-size: 1.33rem;
margin-right: 0.5rem;
}
}
@mixin fill-x {
width: -moz-available; // WebKit-based browsers will ignore this.
width: -webkit-fill-available; // Mozilla-based browsers will ignore this.
// width: stretch;
}
@mixin fill-y {
height: -moz-available; // WebKit-based browsers will ignore this.
height: -webkit-fill-available; // Mozilla-based browsers will ignore this.
// height: fill-available;
height: 40px;
}
@mixin rotate($deg: -90deg) {
transform: rotate($deg);
// Legacy vendor prefixes
-webkit-transform: rotate($deg); // Safari
-moz-transform: rotate($deg); // Firefox
-ms-transform: rotate($deg); // IE
-o-transform: rotate($deg); // Opera
}
@mixin square($length: 1rem) {
width: $length;
height: $length;
}
@mixin contentImage($img) {
background-image: url("#{$root-url}#{$img}");
background-size: 18px;
background-repeat: no-repeat;
@include square(18px);
}
@mixin firstLetter {
&::first-letter {
font-family: $primary-serif;
font-size: 1.5rem;
font-weight: bold;
}
}
@mixin imgHover {
opacity: 0.5;
&:hover {
opacity: 1;
}
}
@mixin rollButton {
&--btn {
text-align: left;
white-space: nowrap;
margin-right: 0.5rem;
border: 1px solid transparent;
padding: 4px;
&:hover {
font-weight: bold;
@media (prefers-color-scheme: light) {
background: $primary-highlight-light;
border-color: $primary-highlight-light
}
@media (prefers-color-scheme: dark) {
background: $primary-highlight-dark;
border-color: $primary-highlight-dark
}
}
}
}
@mixin repeatingSectionsButtons {
.ui-dialog .charsheet {
.repcontainer .repitem .itemcontrol {
.repcontrol_move, .repcontrol_del {
@include contentImage("unlock.svg");
font-size: 0;
&:hover {
background-color: transparent;
opacity: 1;
}
}
.repcontrol_move {
@include contentImage("move.svg");
opacity: 0.5;
}
.repcontrol_del {
@include contentImage("delete.svg");
opacity: 0.5;
}
}
.repcontainer.ui-sortable.editmode[data-groupname*="repeating_"] {
~ .repcontrol[data-groupname*="repeating_"] {
.repcontrol_edit {
font-size: 0;
opacity: 0.5;
@include contentImage("unlock.svg");
}
}
}
.repcontrol_add, .repcontrol_edit {
display: flex;
justify-content: center;
align-items: center;
padding: 0.25rem 1rem;
margin: 0.5rem 0.25rem;
box-shadow: none;
outline: none;
color: $jet;
font-family: $primary-serif;
font-weight: normal;
font-size: 0px;
letter-spacing: 0.04em;
text-shadow: none;
&::before, &::after {
visibility: visible;
font-family: $primary-serif;
text-transform: uppercase;
font-size: 14px;
line-height: 20px;
letter-spacing: 0.04em;
color: $jet;
}
&:hover {
background-color: transparent;
opacity: 1;
}
}
.repcontrol_add {
@include contentImage("add.svg");
opacity: 0.5;
float: left;
}
.repcontrol_edit {
@include contentImage("lock.svg");
opacity: 0.5;
}
}
}
@mixin fill-in-radios {
.radio__ranks {
display: flex;
}
.radio__rank {
order: 1;
@include square(13px);
margin: 0 0.25rem;
appearance: none;
-webkit-appearance: none;
cursor: pointer;
&:hover {
@media (prefers-color-scheme: light) {
background-color: $primary-highlight-light;
}
@media (prefers-color-scheme: dark) {
background-color: $primary-highlight-dark;
}
}
}
.radio__rank:checked {
display: none;
}
.radio__rank:checked ~ .radio__rank {
order: 3;
background-color: transparent;
&:hover {
@media (prefers-color-scheme: light) {
background-color: $primary-highlight-light;
}
@media (prefers-color-scheme: dark) {
background-color: $primary-highlight-dark;
}
}
}
.radio__rank.reset {
order: 2;
&:hover {
@media (prefers-color-scheme: light) {
background-color: $primary-highlight-light;
}
@media (prefers-color-scheme: dark) {
background-color: $primary-highlight-dark;
}
}
}
}
+152
View File
@@ -0,0 +1,152 @@
.toggle-popup[value="0"] + .popup {
display: none;
}
.toggle-tooltip[value="0"] + .help {
display: none;
}
.popup {
display: inline-flex;
flex-direction: column;
position: fixed;
top: 7rem;
left: 4rem;
border: 2px solid transparent;
padding: 0.5rem;
width: 50%;
z-index: 1000;
min-width: 255px;
box-shadow: 5px 5px 6px rgba($jet, 0.2);
&__title {
display: flex;
justify-content: center;
margin-top: -1.5rem;
height: 2rem;
align-items: end;
text-align: center;
&--span {
padding: 0.2rem 0.5rem;
border: 2px solid transparent;
font-family: $primary-serif;
text-transform: uppercase;
}
}
&__close {
white-space: nowrap;
cursor: pointer;
height: 2rem;
position: absolute;
right: 1rem;
width: fit-content !important;
&:hover {
transition: all 1s;
@include rotate(360deg);
}
&--btn {
display: none !important;
}
&--symbol {
float: right;
@include square(18px);
@include imgHover;
}
}
&__header {
font-family: $primary-serif;
text-transform: uppercase;
padding-bottom: 8px;
@include sectionHeader;
}
&__content {
overflow-y: scroll;
@include firstLetter;
}
}
.help {
@include square(12px);
&__label {
&--input{
display: none !important;
}
&--icon {
@include square(12px);
cursor: help;
@include imgHover;
}
}
}
@media (prefers-color-scheme: light) {
.popup {
border-color: $primary-highlight-light;
background: $primary-background-light !important;
color: $jet;
&__title {
&--span {
color: $primary-color-light;
background: $primary-highlight-light;
border-color: $primary-highlight-light;
}
}
&__header {
&--span {
color: $primary-accent-light;
}
}
&__close:hover {
color: $primary-accent-light;
fill: $primary-accent-light;
}
}
}
@media (prefers-color-scheme: light) {
.popup {
border-color: $primary-highlight-light;
background: $primary-background-light !important;
color: $jet;
&__title {
&--span {
color: $primary-color-light;
background: $primary-highlight-light;
border-color: $primary-highlight-light;
}
}
&__header {
&--span {
color: $primary-accent-light;
}
}
&__close:hover {
color: $primary-accent-light;
fill: $primary-accent-light;
}
}
}
@media (prefers-color-scheme: dark) {
.popup {
border-color: $primary-highlight-dark;
background: $primary-background-dark !important;
color: $jet;
&__title {
&--span {
color: $primary-color-dark;
background: $primary-highlight-dark;
border-color: $primary-highlight-dark;
}
}
&__header {
&--span {
color: $primary-accent-dark;
}
}
&__close:hover {
color: $primary-accent-dark;
fill: $primary-accent-dark;
}
}
}
+24
View File
@@ -0,0 +1,24 @@
.arc {
.arc__layout {
&--left {
display: grid;
grid-template-rows: repeat(4, auto) 1fr;
row-gap: 24px;
height: fit-content;
}
&--right {
display: grid;
grid-template-rows: repeat(4, auto);
row-gap: 24px;
height: fit-content;
}
@import "../components/health";
@import "../components/approaches";
@import "../components/skills";
@import "../components/background";
@import "../components/bonds";
@import "../components/experience";
@import "../components/consequences";
@import "../components/inventory";
}
}
+423
View File
@@ -0,0 +1,423 @@
@mixin templateContainer {
width: 100%;
max-width: 400px;
.sheet-arc {
&__container {
display: grid;
box-sizing: border-box;
gap: 0;
padding: 4px;
border: 1px solid transparent;
}
&__banner {
height: 30px;
background-repeat: no-repeat;
background-size: contain;
height: 30px;
&.sheet-short-rest {
background-image: url("#{$root-url}tab_short_rest.png");
}
&.sheet-long-rest {
background-image: url("#{$root-url}tab_long_rest.png");
}
&.sheet-skill-test {
background-image: url("#{$root-url}tab_skill_check.png");
}
}
&__content {
display: grid;
grid-template-rows: auto 1fr;
row-gap: 12px;
background-repeat: no-repeat;
background-size: cover;
padding: 24px 8px 16px 8px;
min-height: 200px;
&.sheet-short-rest {
background-image: url("#{$root-url}bg_short_rest.png");
}
&.sheet-long-rest {
background-image: url("#{$root-url}bg_long_rest.png");
}
&.sheet-skill-test {
grid-template-rows: auto auto 1fr;
}
&.sheet-fallen {
background-image: url("#{$root-url}bg_fallen.png");
}
}
&__sentence {
display: flex;
flex-direction: row;
flex-wrap: wrap;
align-items: baseline;
padding: 4px;
&--name {
font-family: $secondary-serif;
font-size: 3em;
color: $primary-accent-light;
text-align: left;
line-height: 1em;
font-weight: 900;
}
&--verb {
font-family: $primary-sans-serif;
font-size: 1.33em;
padding: 0 0.25em;
text-align: left;
font-style: oblique;
&.sheet-short-rest {
color: $short-rest-primary-color;
}
&.sheet-long-rest {
color: $long-rest-primary-color;
}
&.sheet-skill-test {
color: $skill-test-primary-color;
}
&.sheet-fallen {
color: $fallen-primary-color;
}
}
&--action {
font-family: $primary-sans-serif;
font-size: 2em;
font-weight: bold;
text-align: left;
font-style: oblique;
text-transform: lowercase;
&.sheet-short-rest {
color: $short-rest-primary-color;
}
&.sheet-long-rest {
color: $long-rest-primary-color;
}
&.sheet-skill-test {
color: $skill-test-primary-color;
}
&.sheet-fallen {
color: $fallen-primary-color;
}
&::after {
content: ".";
}
}
}
&__footnote {
font-family: $secondary-serif;
text-align: end;
margin: 4px 0;
&--span { font-size: 0.8em; }
}
}
}
%sheetResult {
flex: none;
order: 1;
flex-grow: 1;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
%inlinerollresult {
font-style: normal;
background: transparent;
border: 0px solid transparent;
box-sizing: border-box;
--box-shadow-color: transparent;
box-shadow: none;
cursor: help;
}
%fullfail {
background: transparent;
border-color:transparent;
box-sizing: border-box;
--box-shadow-color:transparent;
border-radius: 0;
}
%fullcrit {
background:transparent;
border-color:transparent;
box-sizing: border-box;
--box-shadow-color:transparent;
border-radius: 0;
background: none;
}
.sheet-rolltemplate {
&-recover,
&-skills,
&-fallen {
@include templateContainer;
}
}
.sheet-rolltemplate-recover {
.sheet-arc {
&__recover {
display: grid;
grid-template-columns: auto 1fr;
align-items: center;
column-gap: 4px;
font-family: $primary-sans-serif;
&--arrow, &--text {
line-height: 1.8em;
}
&.sheet-short-rest {
color: $primary-color-light;
.inlinerollresult {
border-color: $primary-color-light;
}
}
&.sheet-long-rest {
color: $secondary-color-light;
.inlinerollresult {
border-color: $tertiary-background-light;
}
}
.inlinerollresult {
@extend %inlinerollresult;
padding: 0 4px;
font-family: $primary-sans-serif;
font-weight: bold;
font-size: 1.33em;
border-bottom: 2px solid transparent;
}
}
}
}
.sheet-rolltemplate-fallen {
.sheet-arc {
&__fallen {
display: grid;
grid-template-columns: auto 1fr;
align-items: flex-start;
column-gap: 4px;
font-family: $secondary-serif;
font-style: italic;
&--roll, &--text {
line-height: 1.8em;
}
&--text {
font-family: $primary-sans-serif;
}
&.sheet-fallen {
color: $secondary-color-light;
}
.inlinerollresult {
@extend %inlinerollresult;
padding: 0 4px;
font-weight: bold;
font-size: 3em;
}
}
}
}
.sheet-rolltemplate-skills {
.sheet-display-control {
display: none;
&.sheet-success ~ .sheet-arc__content {
&.sheet-skill-test {
background-image: url("#{$root-url}bg_check_success.png");
}
.sheet-arc__roll--value {
box-shadow: 0 0 4px 4px $skill-test-success-border;
border-color: $skill-test-success-shadow;
}
}
&.sheet-tie ~ .sheet-arc__content {
&.sheet-skill-test {
background-image: url("#{$root-url}bg_check_tie.png");
}
.sheet-arc__roll--value {
border: 1px solid $skill-test-tie-border;
box-shadow: 0px 0px 4px 4px $skill-test-tie-shadow;
}
}
&.sheet-fail ~ .sheet-arc__content {
&.sheet-skill-test {
background-image: url("#{$root-url}bg_check_fail.png");
}
.sheet-arc__roll--value {
border: 1px solid $skill-test-fail-border;
box-shadow: 0px 0px 4px 4px $skill-test-fail-shadow;
}
}
}
.sheet-arc {
&__approach-skill {
display: grid;
grid-template-columns: auto 1fr;
grid-template-rows: 35px auto 1fr;
align-items: center;
column-gap: 4px;
font-family: $primary-sans-serif;
&--arrow {
grid-row: 1 / 3;
grid-column: 1 / 2;
color: $secondary-color-light;
}
&--approach {
background-repeat: no-repeat;
background-size: contain;
height: 35px;
&.sheet-creative {
background-image: url("#{$root-url}text_creative.svg");
}
&.sheet-careful {
background-image: url("#{$root-url}text_careful.svg");
}
&.sheet-concerted {
background-image: url("#{$root-url}text_concerted.svg");
}
}
&--text {
font-family: $secondary-serif;
font-size: 2em;
text-transform: uppercase;
color: $secondary-color-light;
&::before {
content: "& ";
font-family: $secondary-serif;
color: $primary-accent-light;
}
}
}
&__results {
display: grid;
grid-template-columns: 1fr auto;
column-gap: 4px;
align-content: center;
&--text {
grid-column: 1 / 2;
display: flex;
align-items: flex-end;
justify-content: flex-start;
}
&--values {
grid-column: 2 / 3;
display: grid;
grid-template-columns: 1fr auto 1fr;
grid-template-rows: auto 1fr;
row-gap: 4px;
align-content: center;
}
}
// sheet-arc__results--text
&__success, &__tie, &__fail {
font-size: 2em;
line-height: 1em;
font-family: $primary-sans-serif;
&--span {
white-space: nowrap;
padding-right: 8px;
}
}
&__success--span {
color: $skill-test-success-color;
}
&__tie--span {
color: $skill-test-tie-color;
}
&__fail--span {
color: $skill-test-fail-color;
}
// sheet-arc__results--values
&__flawless, &__roll, &__versus, &__tn {
display: flex;
flex-direction: column;
&--header {
grid-row: 1 / 2;
display: flex;
justify-content: center;
font-family: $primary-sans-serif;
color: $secondary-border-light;
}
}
&__flawless, &__roll, &__tn {
&--value {
grid-row: 2 / 3;
font-family: serif;
height: 42px;
width: 42px;
display: flex;
align-items: center;
justify-content: center;
position: relative;
.inlinerollresult {
@extend %inlinerollresult;
font-size: 36px;
line-height: 36px;
position: absolute;
bottom: 0;
}
}
}
&__roll {
&--header {
color: $secondary-color-light;
}
&--value {
color: transparent;
}
}
&__tn {
&--value {
border: 1px solid $skill-test-threshold-border;
box-shadow: 0 0 4px 4px $skill-test-threshold-shadow;
color: $skill-test-threshold-color;
background: rgba($skill-test-threshold-background, 0.7);
}
}
&__versus {
&--value {
grid-row: 2 / 3 ;
display: flex;
align-items: center;
justify-content: center;
z-index: 1;
}
&--symbol {
position: absolute;
font-family: $primary-sans-serif;
font-weight: bold;
text-align: center;
font-size: 24px;
padding: 2px;
color: $secondary-color-light;
@include square(18px);
&.sheet-success {
background: $skill-test-success-symbol;
}
&.sheet-tie {
background: $skill-test-tie-symbol;
}
&.sheet-fail {
background: $skill-test-fail-symbol;
}
}
}
}
}
+135
View File
@@ -0,0 +1,135 @@
.arc {
max-width: $xlarge;
display: grid;
grid-template-columns: 1rem 1fr 1rem;
grid-template-rows: auto auto 1fr;
row-gap: 1rem;
.toolbar {
grid-row: 1;
grid-column: 2;
}
&__header {
grid-row: 2;
grid-column: 2;
}
&__layout {
grid-column: 2;
grid-row: 3;
display: grid;
grid-template-columns: 3fr 2fr;
column-gap: 1rem;
width: 100%;
justify-content: center;
&--left {
grid-row: 1 / 2;
grid-column: 1 / 2;
.healths {
grid-row: 1;
}
.approaches {
grid-row: 2;
}
.skills {
grid-row: 3;
}
.inventory {
grid-row: 4;
}
}
&--right {
grid-row: 1 / 2;
grid-column: 2 / 3;
.background {
grid-row: 1;
}
.bonds {
grid-row: 2;
}
.experience {
grid-row: 3;
}
.consequences {
grid-row: 4;
}
}
}
input[name*="sheet_type"] {
&[value="npc"] {
~ .arc__layout {
grid-template-columns: auto;
}
~ .arc__layout--right {
display: none;
}
}
}
}
@media only screen and (max-width: $medium) {
.arc {
display: grid;
grid-template-columns: 1rem 1fr 1rem;
grid-template-rows: auto auto 1fr;
row-gap: 1rem;
.toolbar {
grid-row: 1;
grid-column: 2;
}
&__header {
grid-row: 2;
grid-column: 2;
}
&__layout {
grid-column: 2;
grid-row: 3;
display: grid;
grid-template-columns: auto;
width: 100%;
&--left {
grid-row: 1;
grid-column: 1;
.healths {
grid-row: 1;
}
.approaches {
grid-row: 2;
}
.skills {
grid-row: 3;
}
.inventory {
grid-row: 4;
}
}
&--right {
grid-column: 1;
grid-row: 2;
.background {
grid-row: 1;
}
.bonds {
grid-row: 2;
}
.experience {
grid-row: 3;
}
.consequences {
grid-row: 4;
}
}
}
}
}
+17
View File
@@ -0,0 +1,17 @@
button[type=roll], button[type=action] {
font-size: 1rem;
outline: none;
border: none;
border-radius: 0;
margin: 0;
padding: 0;
text-shadow: none;
box-shadow: none;
background: none;
&::before {
font-family: none;
content: none;
}
}
+87
View File
@@ -0,0 +1,87 @@
* {
box-sizing: border-box;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
height: unset;
width: unset;
padding: unset;
margin: unset;
font-family: unset;
font-size: 1rem;
font-weight: unset;
line-height: unset;
color: unset;
border: unset;
border-radius: unset;
background: unset;
background-color: unset;
}
h1, h2, h3, h4, h5 {
font-size: unset;
line-height: unset;
color: unset;
}
label, input, input[type=number],
select, textarea, button, button[type=roll] {
display: unset;
width: unset;
height: unset;
padding: unset;
margin-bottom: unset;
font-family: unset;
font-size: unset;
font-weight: unset;
line-height: unset;
color: unset;
border: unset;
border-radius: unset;
background: unset;
background-color: unset;
box-shadow: unset;
}
button[type=roll] {
&::before {
display: none;
}
}
input[disabled], select[disabled], textarea[disabled],
input[readonly], select[readonly], textarea[readonly] {
background-color: unset;
border-color: unset;
}
fieldset {
background: transparent;
}
span {
word-break: break-word;
}
// Firefox
input[type=number] {
text-align: center;
width: 100%;
-moz-appearance: textfield;
&::-webkit-outer-spin-button,
&::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}
}
.btn:hover {
background-position: 0 0;
background-color: transparent;
}
+93
View File
@@ -0,0 +1,93 @@
// BREAKPOINTS
$xlarge: 960px;
$large: 720px;
$medium: 540px;
$small: 375px;
// FONTS
@import url("https://fonts.googleapis.com/css?family=Josefin+Sans:ital,wght@0,400;0,700;1,400;1,700&display=swap");
@import url("https://fonts.googleapis.com/css?family=Piazzolla:ital,wght@0,400;0,700;1,400;1,700&display=swap");
@import url("https://fonts.googleapis.com/css?family=Playfair+Display:ital,wght@0,400;0,700;1,400;1,700&display=swap");
@import url("https://fonts.googleapis.com/css?family=Fira+Code&display=swap");
$primary-sans-serif: "Josefin Sans", sans-serif;
$primary-serif: "Piazzolla", serif;
$secondary-serif: "Playfair Display", serif;
$primary-monospace: "Fira Code", monospace;
// ASSETS
// Icons made by Pixel Perfect
// https://flaticon.com/authors/pixel-perfect
$root-url: "https://raw.githubusercontent.com/morgdalaine/arc-momatoes/main/character-sheet/ARC/assets/";
// COLORS
// https://coolors.co/171212-32635b-358b6d-82a677-dabb3d-efdd86-acb7b1-eaebe8-f6f7f6-fefeff
$ash: #acb7b1;
$asparagus: #82a677;
$buff: #efdd86;
$cultured: #f6f7f6;
$emerald: #358b6d;
$jet: #171212;
$lionet: #dabb3d;
$myrtle: #32635b;
$platinum: #eaebe8;
$snow: #fefeff;
// LIGHT
$primary-color-light: $jet; // JET
$secondary-color-light: $snow; // SNOW
$primary-accent-light: $lionet; // LIONET
$primary-highlight-light: $buff; // BUFF
$primary-border-light: $ash; // ASH
$primary-background-light: $snow; // SNOW
$secondary-accent-light: $myrtle; // MYRTLE
$secondary-highlight-light: $emerald; // EMERALD
$secondary-border-light: $platinum; // PLATINUM
$secondary-background-light: $platinum; // PLATINUM
$tertiary-background-light: $cultured; // CULTURED
// DARK
$primary-color-dark: $jet; // JET
$secondary-color-dark: $snow; // SNOW
$primary-accent-dark: $lionet; // LIONET
$primary-highlight-dark: $buff; // BUFF
$primary-border-dark: $ash; // ASH
$primary-background-dark: $snow; // SNOW
$secondary-accent-dark: $myrtle; // MYRTLE
$secondary-highlight-dark: $emerald; // EMERALD
$secondary-border-dark: $platinum; // PLATINUM
$secondary-background-dark: $platinum; // PLATINUM
$tertiary-background-dark: $cultured; // CULTURED
// ROLL TEMPLATE
$fallen-primary-color: $snow;
$long-rest-primary-color: $asparagus;
$short-rest-primary-color: $myrtle;
$skill-test-primary-color: $snow;
$skill-test-success-color: $lionet;
$skill-test-success-border: #7f690b;
$skill-test-success-shadow: #7f690b;
$skill-test-success-symbol: #7f690b;
$skill-test-tie-color: #89a57d;
$skill-test-tie-border: #2b4434;
$skill-test-tie-shadow: #2b4434;
$skill-test-tie-symbol: #2b4434;
$skill-test-fail-color: $ash;
$skill-test-fail-border: #3c2f27;
$skill-test-fail-shadow: #3c2f27;
$skill-test-fail-symbol: #314d3c;
$skill-test-threshold-color: #6a878e;
$skill-test-threshold-background: #192120;
$skill-test-threshold-border: #394143;
$skill-test-threshold-shadow: #2b3639;
+357
View File
@@ -0,0 +1,357 @@
{
"1d6": "d6",
"2d6": "2d6",
"_": "",
"academic": "Academic",
"academic_description": "The pursuit of formal knowledge, primarily scientific or historical in nature—for example, recalling precolonial orcish history, theorizing a scientific principle, or understanding formal chemistry. <br /><br />As with other Knowledge Skills, when used with the Creative Approach, the hero: theorizes, shifts, thinks laterally; with Careful, they: assess, inquire, analyze; and for Concerted: recalls, restores, overwrites.",
"acrobatics": "Acrobatics",
"acrobatics_description": "Dynamic balance, gymnastics, or other incredible and immediate feats of agility—for example, performing a somersault through the air, jumping from one tree to another, or balancing on a precarious ledge. <br /><br />As with other Physical Skills, when used with the Creative Approach, the hero: bedazzles, innovates, exceeds expectations; with Careful, they: optimize, safeguard, follow best practice; and for Concerted: charges, endures, overwhelms.",
"acting_beyond_attacks": "Acting beyond attacks",
"advantage": "Advantage",
"advantage_description": "Advantages give bonuses to the TN of subsequent Skill Checks by allies. Creating an Advantage uses up an action in Conflict, and typically requires a Skill Check—for example, distracting an enemy with Guile. If successful, the hero improves the TN of their allies' Skill Checks by a number equal to the Skill Ranks they used. <br /><br />If the Advantage can be made with minimal risk—like stringing tripwire away from the scuffle—then the Advantage can be made without requiring a Skill Check. TN improvement would then be +1 for Advantages impairing enemies' actions; +2 for Advantages completely preventing an enemy action.",
"approach": "Approach",
"approach_description": "Approaches represent the hero's aptitude for solving problems in a specific way: whether towards Creative solutions, Careful and detail-oriented approach, or sheer Concerted willpower. They also directly determine how easy a Skill Check can be. Approach Scores range from +0 to +3—zero means no aptitude, +1 is average, +2 is gifted, and +3 is expert. <br /><br />If all Approach Scores are reduced to zero, typically through extensive damage exceeding the hero's Blood or Guts, then the hero falls. Approach Scores are determined at Hero Creation and may be increased through Experience Points (XP).",
"arcana": "Arcana",
"arcana_description": "Recall lore, sense spirits, channel magic; required to perform enhanced Spells as well as learning completely new instances. Other applications include—reading magical runes, detecting if magic was recently cast, or gathering ingredients for a ritual. <br /><br />When used with the Creative approach, the hero: explores, expands, creates; with Careful, they: sense, attune, investigate; for Concerted: memorizes, remembers, commits.",
"artistry": "Artistry",
"artistry_description": "Crafting, design, painting or other creative expressions—for example, painting the moon duke's portrait, writing an evocative love poem, or identifying intentional designs in someone's cryptic artwork. <br /><br />As with other Pragmatic Skills, when used with the Creative Approach, the hero: invents, adapts, experiments; with Careful, they: soothe, refine, survey; and for Concerted: rushes, withstands, or brute forces.",
"assistance": "Assistance",
"assistance_description": "Whenever someone rolls a Skill Check, one player may choose to Assist and add their hero's major levels of Bond to the Threshold Number (TN). Assistance can also occur during Conflict. In Conflict, Assistance must be declared as an action for their Turn so an Assisting player can add their bonus to an ally's next Skill Check. <br /><br />Sacrificing minor levels of Bond for a reroll may occur anytime and instantly.",
"attack": "Attack",
"attack_description": "Attacking an enemy to inflict Damage to Blood or Guts. Attacks require a successful Skill Check to succeed, either with Physique or Weaponry to harm Blood, or Insight or Impose for Guts. Other Skills may be used with sufficient justification and if the target is particularly vulnerable to it. <br /><br />Like with all Skill Checks, Difficulty Modifiers may apply, as well as Assistance, though that requires an ally to declare it as their action for their Turn. Defense items, such as armor, reduce TN by their rating (e.g. +3).",
"base_effect": "Base Effect",
"blood": "Blood",
"blood_description": "Blood is a number representing the hero's ability to withstand physical harm: a spear thrust, a devastating punch, or even a bucket thrown to the head. The higher it is, the \"healthier\" the hero is. Physical damage reduces Blood directly; when Blood is zero, any further Blood damage harms Approach Scores directly instead. <br /><br />Blood, like Guts, can be restored by resting and can even vary from day to day. When a hero wakes up from a Long Rest, their player may roll 2d6 plus a Blood modifier determined at Hero Creation. The modifier can be improved with experience points (XP) and also has an impact on how much time Long Rest needs, which is equal to 10 in-story hours minus whichever is lower between Blood and Guts modifier.",
"bonds": "Bonds",
"bonds_description": "Bonds represent two heroes' relationships, and are tracked through big boxes divided in quadrants. Every minor level of Bond fills a quadrant; when four quadrants of a box are filled, that counts as a major level. Having deeper Bonds is helpful and contributes to more successful Assistance during Skill Checks and even Conflict. <br /><br />Bonds can be increased during play whenever a hero accepts an inconvenience for an ally (+1 minor level up to 1st big box/major level) or accepts harm or serious risk (+2 minor levels up to the 2nd big box/2nd major level). Making a permanently life-changing, greatly difficult personal choice or even likely fatal sacrifice adds +4 minor levels of Bond and is the only way to complete the last, 3rd major level of relationship.",
"boon": "Boon",
"boon_placeholder": "Damage or defense modifier, e.g. +1 Guts Damage",
"careful": "Careful",
"careful_description": "One of three Approaches that can be declared when using a Skill and that directly contributes to the base Threshold Number (TN). <br /><br />Skills using this approach utilize close attention to detail, analyzing variables and ensuring the action does not trigger any unwanted consequences. Like every Approach Scores, it can have a value of +0 (no aptitude) to +3 (expert), and can be reduced if the hero sustains extensive damage.",
"character_mode": "Character",
"character_name": "A hero rises to save the world, thus named:",
"charisma": "Charisma",
"charisma_description": "Appealing or approachable charm, with a penchant for smooth talk, humor and wit. For example—convincing the witch to join your cause through eloquent argument, flattering the errant knight's sense of justice, mediating between warring kings with a winning smile. <br /><br />As with other Social Skills, when used with the Creative Approach, the hero: charms, incites, inspires; with Careful, they: reason, detail, guide; and for Concerted: intimidates, enforces, invades.",
"chooses": "chooses",
"combat_booming_voice": "Booming voice [+1 Physical damage]",
"combat_critical_thinking": "Critical thinking [+2 Psychosocial resist]",
"combat_crossbow": "Crossbow [+2 Physical damage]",
"combat_cunning_wit": "Cunning wit [+3 Psychosocial damage]",
"combat_dagger": "Dagger [+1 Physical damage] and a toga [+1 Physical resist]",
"combat_darts": "8 darts [+1 Physical damage each]",
"combat_devastating_vocabulary": "Devastating vocabulary [+2 Psychosocial damage]",
"combat_flaming_sword": "Flaming sword [+3 physical damage]",
"combat_health": "Psychosocial Health",
"combat_iron_briefs": "Iron briefs [+1 Physical resist]",
"combat_love_letter": "Loving letter from a dearly beloved person [+3 Psychosocial resist]",
"combat_memories_of_hardship": "Memories of hardship [+1 Psychosocial resist]",
"combat_pitchfork": "Pitchfork [+0 Physical damage]",
"combat_plate_armor": "Plate armor [+2 Physical resist]",
"combat_scowling_face": "A scowling face [+0 Psychosocial damage]",
"combat_self_esteem": "Self-esteem [+1 Psychosocial damage] and personal growth [+1 Psychosocial resist]",
"combat_studden_leather_armor": "Studded leather armor [+1 Physical resist] and stoicism [+1 Psychosocial resist]",
"combat_sturdy_sword": "Sturdy sword [+2 Physical damage]",
"combat_well_rounded_education": "Well-rounded education [+1 Psychosocial damage]",
"complexity": "Complexity",
"complexity_description": "Complexity measures its approximate power level from 1 to 4, whether the Spell or Technique is lowly or affects the entire world.",
"concerted": "Concerted",
"concerted_description": "One of three Approaches that can be declared when using a Skill and that directly contributes to the base Threshold Number (TN). <br /><br />Skills using this approach exemplify effort, grit and willpower. Any obstacle is surmountable when there's the drive to succeed. Like every Approach Scores, it can have a value of +0 (no aptitude) to +3 (expert), and can be reduced if the hero sustains extensive damage.",
"conflict": "Conflict",
"conflict_description": "Conflicts occur when danger is imminent and victory is on the line—such as a tavern fight or even a showdown with courtesans. Conflicts require unique rules that carefully sequence everyone's actions according to Rounds and Turns. <br /><br />Characters can take one action on their Turn and move up to 2 heights freely; all characters have one Turn per Round. A character's choice of action for their Turn determines when their Turn begins—known as Initiative Category.",
"consequence": "Consequence",
"consequence_description": "When the die roll for a Skill Check is tied with the TN, the player may choose to Succeed with a Consequence complicating the hero and their allies' situation. This may include delays or inefficiency, permanent or temporary loss of a resource, discord and misunderstanding, overskill or overspill, or perhaps even a mystery complication that will only be made apparent later.",
"coordination": "Coordination",
"coordination_description": "Delicate positioning and control of body, hand and instincts for smooth or purposeful movements. For example—moving quietly and efficiently to avoid detection, playing sleight of hand tricks, winning a sport requiring accurate hand-eye coordination. <br /><br />As with other Physical Skills, when used with the Creative Approach, the hero: bedazzles, innovates, exceeds expectations; with Careful, they: optimize, safeguard, follow best practice; and for Concerted: charges, endures, overwhelms.",
"creative": "Creative",
"creative_description": "One of three Approaches that can be declared when using a Skill and that directly contributes to the base Threshold Number (TN). <br /><br />Skills using this approach are performed in interesting, unusual and surprising ways. Cleverness also applies. Like every Approach Scores, it can have a value of +0 (no aptitude) to +3 (expert), and can be reduced if the hero sustains extensive damage.",
"culture": "Culture",
"culture_description": "The ability to attune with a community's beliefs, customs and stories. For example—bowing perfectly in front of the witch-warriors of legend, noticing the elder's coded folksong, and realizing the truth behind a creature's folklore. <br /><br />As with other Knowledge Skills, when used with the Creative Approach, the hero: theorizes, shifts, thinks laterally; with Careful, they: assess, inquire, analyze; and for Concerted: recalls, restores, overwrites.",
"current": "Current",
"damage": "Damage",
"damage_and_defense": "Damage & Defense",
"damage_and_defense_description": "DAMAGE ITEMS provide bonuses to damage whenever you attack a creature. Meanwhile, DEFENSE ITEMS reduce damage and also make it harder for you to be hit.",
"damage_description": "Whenever an Attack is successful, it depletes the victim's Blood or Guts—depending on the nature of the Attack—with Damage. Damage is equal to the TN of the Attack, plus any applicable bonuses from Damage items such as weaponry. A +2 mace, for example, adds +2 to total Damage. Damage can reduce Blood or Guts to zero or less; if this happens, the next successful Attack harms the victim's Approach Scores directly.<br /><br />On the other hand, Defense items such as shields reduce the TN of the Attack itself, meaning it also helps reduce the total Damage.",
"defending_attacking": "Defending/Attacking",
"description": "Description",
"description_placeholder": "Description...",
"difficulty": "Difficulty",
"difficulty_modifier": "Difficulty Modifier",
"difficulty_modifier_description": "The Difficulty Modifier reflects if a particular Skill Check is extra challenging or easy, and is determined by the Guide prior to rolling to determine the total TN. If the hero is ill-prepared or has the wrong tools for the job, for example, the Difficulty Modifier may reduce the TN for a more punishing Skill Check. <br /><br />A +1 Difficulty Modifier means the Skill Check is easier; -1 to -3 mean it's more difficult than expected, possibly because of missing or incorrect tools and preparation; the target of the action having resistances specific to that task, or even other, perilous risks.",
"doom": "Doom",
"doom_description": "A cataclysmic event threatening to devastate the world of the heroes or their people. It can be large in scope—for example, a world-sundering earthquake triggered by a goddess death—or more intimate—a cruel heartbreak, or the farewell of an era.<br /><br />If Doom is vanquished, congratulations: the heroes may bask in success, or perhaps even use it as springboard for grander adventures. If Doom vanquishes all? Decide: accept an epilogue, create beginnings from this scorched world, or even defy fate and rewind time itself.",
"doomsday_clock": "Doomsday Clock",
"doomsday_clock_description": "Tracks time left until the Doom. The Doomsday Clock is made up of \"Moments\" and advances at a set pace determined by the game's intended number of sessions. Each time the Clock advances, one Moment is consumed, and an Omens roll is made to determine if more disappear. When all Moments are gone, the apocalypse is unleashed.",
"enhanced": "Enhanced Version",
"experience": "Experience",
"export_character": "Export Character",
"fallen_consequence_1": "Can no longer verbally or visibly communicate but gains telepathy.",
"fallen_consequence_2": "Bears a constantly bleeding wound that deals no damage.",
"fallen_consequence_3": "Gains an unnerving presence; children and animals flee from them.",
"fallen_consequence_4": "Has a prophetic vision of three pale girls clawing their way up from the soil.",
"fallen_consequence_5": "No longer blinks and must constantly apply water to their eyes.",
"fallen_consequence_6": "May now speak to the dead.",
"fallen_consequences": "Fallen Consequences",
"fallen_heroes": "Fallen Heroes",
"fallen_heroes_description": "Whenever a hero's Blood or Guts is reduced to zero or less, and they get hit with a subsequent attack that depletes all their Approach Scores, they Fall, and the player must choose whether the hero lives with randomly-rolled consequences, or they die. If life, then the consequence is rolled, Approach Scores are restored to their prior value, and the hero wakes up after 5 real-time minutes and an in-story hour; if death, all other heroes gain XP equal to 3x the fallen hero's minor levels of Bond—and the Doomsday Clock consumes a Moment.",
"focus": "Focus",
"focus_description": "Hone attention, concentrate mental spirit; required to perform Enhanced Techniques as well as learning completely new instances. Other applications include—enduring intense mental duress, resisting distraction and committing to the present objective, and pushing the body past its limits. <br /><br />When used with the Creative approach, the hero: explores, expands, creates; with Careful, they: sense, attune, investigate; for Concerted: memorizes, remembers, commits.",
"glossary": "Glossary",
"group_skill_check": "Group Skill Check",
"group_skill_check_description": "If heroes wish to tackle a task collectively—for example, scouring the woods together for supplies—a Group Skill Check applies. A Group Skill Check consists of all players making individual Skill Checks with any relevant Approach or Skill; if more than half succeed, the party also succeeds as a whole. However, each failed Skill Check may incur unusual complications.",
"guile": "Guile",
"guile_description": "Deception and manipulation through lies, bluffs or other chicanery and trickery. For example—lying to the tindero, bluffing about a possessing a weapon that vaporizes enemies, tricking misguided youth to plant false evidence on the blacksmith. <br /><br />As with other Social Skills, when used with the Creative Approach, the hero: charms, incites, inspires; with Careful, they: reason, detail, guide; and for Concerted: intimidates, enforces, invades.",
"guts": "Guts",
"guts_description": "Guts is a number representing the hero's ability to withstand combat harm: a devastating comeback, a piercing betrayal, even fear. Enhancing Spells & Techniques typically incurs damage to Guts as well. The higher Guts is, the \"healthier\" the hero is. Psychosocial damage reduces Guts directly; when Guts is zero, any further Guts damage harms Approach Scores directly instead. <br /><br />Guts, like Blood, can be restored by resting and can even vary from day to day. When a hero wakes up from a Long Rest, their player may roll 2d6 plus a Guts modifier determined at Hero Creation. The modifier can be improved with experience points (XP) and also has an impact on how much time Long Rest needs, which is equal to 10 in-story hours minus whichever is lower between Blood and Guts modifier.",
"impose": "Impose",
"impose_description": "Radiating a sense of authority and confidence that can enforce opinion, cut down others, or tower over everyone. Impose is one of two Skills that can automatically inflict Guts Damage during Conflict; the other is Insight. Other applications—intimidating the devil with a swagger, gaining the attention of the elitist bard, distracting the guard captain with a devastating remark. <br /><br />As with other Social Skills, when used with the Creative Approach, the hero: charms, incites, inspires; with Careful, they: reason, detail, guide; and for Concerted: intimidates, enforces, invades.",
"initiative_category": "Initiative Category",
"initiative_category_description": "Initiative Category determines whose Turn is next in any Round during Conflict. In order: 1st—those who Stand Ground, 2nd—those taking non-harmful actions, including creating Advantages, 3rd—those attacking others, 4th—those using a Spell or Technique, and last—those moving far. Multiple characters can act in the same Category, though heroes and allies always act first and can decide among themselves how to sequence their actions. <br /><br />Before each Round, players may decide beforehand what everyone's Initiative Category is.",
"insight": "Insight",
"insight_description": "Attunement to others' emotional states; inner grace and maturity in interactions. Insight is one of two Skills that can automatically inflict Guts Damage during Conflict; the other is Impose. Other applications—realizing the mambabarang is lying, knowing how to comfort a grieving widow, appearing calm and composed. <br /><br />As with other Social Skills, when used with the Creative Approach, the hero: charms, incites, inspires; with Careful, they: reason, detail, guide; and for Concerted: intimidates, enforces, invades.",
"inventory": "Inventory",
"inventory_description": "Useful items that create new opportunities or capabilities for a hero. Surviving a cold night in wilderness, for example, is much easier with a tent and flint & tinder. Spells & Techniques also count for inventory. Other types of inventory include: Damage & Defense items which include weaponry and protection, Supplies & Sundries such as rations and bedrolls, and Oddities and Valuables, which are very strange indeed.",
"item_name": "Name",
"item_points": "Points",
"item_pool": "Pool",
"item_quantity": "Qty.",
"item_type": "Item Type",
"item_used": "Spent",
"knowledge": "Knowledge",
"knowledge_description": "Careful: assess, inquire, analyze<br />Concerted: recall, memorize, restore<br />Creative: theorize, shift, make logical connections",
"learning_spells_and_techniques": "Learning Spells & Techniques",
"learning_spells_and_techniques_base_effect": "To gain a new Spell or Technique—either an additional instance or a brand-new power—the hero must have access to a source that can teach them, as well as a number of successful, special Skill Checks equal to the Spell or Technique's Complexity, and with TN equal to pure Arcana or pure Focus; Approach doesn't factor. <br /><br />The teaching source must be available whenever the special Skill Check is made, for example as a spellbook that the hero carries, or even a living mentor who accompanies them.",
"life": "Life",
"life_and_death": "Life & Death: Fallen Heroes",
"long_rest": "Long Rest",
"makes_them_different": "What makes them different?",
"max": "Max",
"mod": "Mod",
"modifier": "Modifier",
"moment": "Moment",
"moment_description": "Makes up the Doomsday Clock. Whenever the Clock advances, one Moment is automatically consumed, and a number of dice is rolled equal to Omens still in play; for every 5 or 6, another Moment is depleted. When all Moments are gone, so is time to save the world—as the Doom finally arrives. <br /><br />The number of Moments in play is determined at the start by the length of the game in sessions and/or hours.",
"movement_in_conflict": "Movement in Conflict",
"movement_in_conflict_description": "In Conflict, heroes may move up to 2 heights freely during their Turn. However, moving further away and up to 5 heights is an action of its own. If the hero is being attacked or targeted by an enemy, they must succeed at a Skill Check such as Acrobatics to successfully move away; otherwise, they may opt to move anyway but allow enemies within 2 heights to roll for a free Attack on them.",
"name_placeholder": "Name...",
"npc_mode": "NPC",
"npc_name": "Name",
"observe": "Observe",
"observe_description": "Aptitude in observing the world and detecting the smallest details across all senses—for example, detecting a strange whiff, a faint sound or an unusual taste; searching a murder scene for physical clues; or recalling a scene's details hours later. <br /><br />As with other Knowledge Skills, when used with the Creative Approach, the hero: theorizes, shifts, thinks laterally; with Careful, they: assess, inquire, analyze; and for Concerted: recalls, restores, overwrites.",
"oddities_ancient_ring": "An ancient and unbreakable ring",
"oddities_and_valuables": "Oddities & Valuables",
"oddities_and_valuables_description": "ODDITIES AND VALUABLES are exactly what it says on the tin: strange, fantastical yet oftentimes high-value items. Some may be magical in nature.",
"oddities_darkvision_glasses": "A pair of glasses granting darkvision",
"oddities_dead_donkey": "The bottom half of a dead donkey",
"oddities_divine_blood": "A vial of a divine beings blood",
"oddities_giant_serpent_scales": "Worn skin and scales of a giant serpent",
"oddities_hat": "A hat that somehow always keeps your head dry",
"oddities_heavy_crown": "A heavy crown with an oppressive aura",
"oddities_human_teeth": "A pouch of human teeth",
"oddities_monkey_head": "Shrunken monkey heads",
"oddities_potion_brawn": "A Potion of Brawn that adds +2 to Physical damage and +2 to Physical resist for the next real-time hour",
"oddities_seashell_horn": "A seashell horn good luck charm",
"oddities_seeds": "A fistful of seeds that when planted instantly become 6-height tall stalks",
"oddities_shadow_mirror": "A mirror that shows a normal reflection except with dark, roaming shadowy beings",
"oddities_silk_dress": "A constantly-glowing silk dress",
"oddities_songbird": "A songbird in a cage",
"oddities_telepathic_yak": "A telepathic yak",
"oddities_troll_flesh": "A pound of constantly-regenerating troll flesh. Its edible but the flavor is atrocious",
"oddities_tyrant_pants": "The pants of a local tyrant",
"omen": "Omen",
"omen_description": "Omens are story fronts—arcs that can develop independently from player action—that speed the arrival of the Doom. Whenever the Doomsday Clock advances, one Moment is consumed, and a number of dice is rolled equal to Omens still in play. For every 5 or 6, an additional Moment may be consumed. <br /><br />Games typically start with 3 Omens in play, though short games (e.g. less than 3 hours) may have only two.",
"opportunity": "Opportunity",
"opportunity_description": "When the die roll for a Skill Check is tied with TN, the player may choose to Fail their action but gain an Opportunity improving the hero and their allies' situation. This may include risk reduction (such as deescalating tensions), risk redirection (like putting someone else on the spot), gaining trust or respect from allies or onlookers, gaining new knowledge, or even a mystery boon that will only be made apparent later.",
"painful_lesson": "Most painful lesson",
"physical": "Physical",
"physical_description": "Careful: assess, be safe, be calm, follow guidelines<br />Concerted: charge, endure, overwhelm<br />Creative: bedazzle, innovate, exceed expectations",
"physical_health": "Physical Health",
"physique": "Physique",
"physique_description": "Exertion of physical strength, stamina and constitution. Physique is one of two Skills that can automatically inflict Blood Damage during Conflict; the other is Weaponry. Other applications include: striking an enemy with a hard punch, smashing a door with a battering ram, holding breath deep underwater. <br /><br />As with other Physical Skills, when used with the Creative Approach, the hero: bedazzles, innovates, exceeds expectations; with Careful, they: optimize, safeguard, follow best practice; and for Concerted: charges, endures, overwhelms.",
"player_name": "Player Name",
"portrait": "Portrait",
"practical": "Practical",
"practical_description": "Careful: soothe, refine, survey<br />Concerted: rush, withstand, brute force<br />Creative: invent, adapt, experiment",
"pronouns": "Pronouns",
"prowess": "Prowess",
"prowess_description": "Careful: sense, attune, investigate<br />Concerted: assail, subsist, give all<br />Creative: explore, expand, create",
"quick_overview": "A Quick Overview of Essential Mechanics",
"recovery_long-rest": "Waking with {{0}} Blood and {{1}} Guts for the day.",
"recovery_short-rest": "Recovering {{0}} Blood and {{1}} Guts in the process.",
"requires_arc_api": "This feature requires the ARC API.",
"rest": "Rest",
"rest_and_recovery": "Rest and Recovery",
"rest_description": "Heroes may replenish health by resting: a Short Rest to restore 1d6 to Blood and 1d6 to Guts, or a Long Rest to reroll new Blood & Guts or freely distribute 7 points of health to either stat. The reroll is a 2d6 plus the Blood/Guts modifier and determines the new maximum for the hero. <br /><br />Blood & Guts modifier also affects how much in-story time a Long Rest takes: 10 hours minus the lowest modifier. Long Rests take up 5 real-time minutes, while a Short Rest uses up 2 real-time minutes and one in-story hour only.",
"ritual": "Ritual",
"ritual_description": "Rituals are unique rites or ceremonies that must be done to replenish a Spell or Technique. If performed successfully, all instances are replenished, though no more than what was previously held.",
"ritual_placeholder": "Replenishing requires a RITUAL and restores all instances of a SPELL or TECHNIQUE.",
"roll": "Roll",
"roll_fail": "It fails...",
"roll_success": "Success!",
"roll_tie": "It's a tie.",
"rolls": "rolls",
"select_placeholder": "Select...",
"settings": "Settings",
"sheet_mode": "Sheet Mode",
"short_desc": "Short Description",
"short_rest": "Short Rest",
"skill": "Skill",
"skill_check": "Skill Check",
"skill_check_description": "A Skill Check is a roll to determine the outcome of a hero's action, if it's particularly risky or has a chance for an interesting success or failure. Sneaking past a troll, for example, may incur a Skill Check especially if there is peril or complication involved. <br /><br />When Skill Checks happen, a Threshold Number (TN) is determined to set its relative ease. The player makes a roll: if the number is under the TN, the hero's action is a pure success! If it's equal, then the player or Guide may suggest or choose whether it's a success with Consequence or failure with Opportunity. If it's over the TN, then it failed, which may incur additional complications depending on the situation. <br /><br />If the player rolls a \"1\" with a ranked Skill, they may roll the dice again; if it's another \"1\", then the outcome is a Flawless Success and the hero succeeds with additional Opportunity. Tied or failed rolls may be upgraded by one step by sacrificing 3 Blood or Guts, and anyone may spend a minor level of Bond to allow a reroll.",
"skill_description": "Skills are capabilities across various, distinct areas: whether knowledge of strange rituals, haggling with strangers, or even building a beautiful statue out of wisterias. The hero's aptitude with a particular Skill is indicated by Skill Ranks: +0 means no skill, +1 is average, +2 is gifted and +3 is expert. <br /><br />Skill Ranks directly contribute to Threshold Number (TN) needed to succeed at a Skill Check; the higher the Rank, the easier it is to succeed. Skill Ranks may be increased directly through Experience Points (XP).",
"skill_info": "Skill Info",
"skills": "Skills",
"social": "Social",
"social_description": "Careful: reason, detail, guide<br />Concerted: intimidate, enforce, invade<br />Creative: charm, incite, inspire",
"spells_and_techniques": "Spells & Techniques",
"spells_and_techniques_base_effect": "Spells & Techniques are unique powers that are tracked in inventory. Its number of instances (copies) denote how many times it can be used before requiring replenishment through a Ritual. Spells & Techniques have a base and an enhanced version that may be performed typically at a small sacrifice to Guts and an additional Skill Check, either Arcana for Spells, or Focus for Techniques. Completely new Spells & Techniques or additional instances may be learned through dedicated, difficult Skill Checks.",
"spells_and_techniques_in_conflict": "Spells & Techniques in Conflict",
"spells_and_techniques_in_conflict_base_effect": "On a hero's Turn, they may use a Spell or Technique in ther inventory. However, if they are attacked before their Turn, they must succeed at a random, unskilled roll with TN = 6. This TN reduces by 1 for each subsequent attack, whether or not they hit. If the roll fails, then the hero loses their Turn though no instance of the Spell or Technique is used.",
"spells_bind_weapon": "Bind Weapon",
"spells_bind_weapon_base_effect": "Suddenly you feel it on your palm: the heft of a magical weapon",
"spells_blackout": "Blackout",
"spells_blackout_base_effect": "Stop others by making them fall asleep",
"spells_burn_the_past": "Burn The Past",
"spells_burn_the_past_base_effect": "Remove memory and remembrance from a poor target",
"spells_compel": "Compel",
"spells_compel_base_effect": "Compel your target to act in a particular manner, for your particular need",
"spells_from_dust_to_dust": "From Dust To Dust",
"spells_from_dust_to_dust_base_effect": "Craft any object youve seen from a handful of dust",
"spells_lifebringer": "Lifebringer",
"spells_lifebringer_base_effect": "Wounds can be healed through your hands power",
"spells_little_escapologist": "Little Escapologist",
"spells_little_escapologist_base_effect": "Disappear from sight",
"spells_manic_hands": "Manic Hands",
"spells_manic_hands_base_effect": "Arms and hands burst forth from your face, allowing you more actions",
"spells_master_of_elements": "Master Of Elements",
"spells_master_of_elements_base_effect": "Air, earth, water and fire may be manipulated by your will",
"spells_pierce_the_veil": "Pierce The Veil",
"spells_pierce_the_veil_base_effect": "See anywhere, any time",
"spells_secret_door": "Secret Door",
"spells_secret_door_base_effect": "A portal manifests through a door. Where does it lead?",
"spells_shadowbind": "Shadowbind",
"spells_shadowbind_base_effect": "Restrain a being of your choice",
"spells_soundshift": "Soundshift",
"spells_soundshift_base_effect": "Sound is your plaything. You decide its shape",
"spells_spirit_pact": "Spirit Pact",
"spells_spirit_pact_base_effect": "You are connected to a spirit: your loyal and ethereal servant",
"spells_trick_of_the_light": "Trick Of The Light",
"spells_trick_of_the_light_base_effect": "You mold light like water, creating auras and illusions",
"spells_trinket": "Trinket",
"spells_trinket_base_effect": "Minor magical effects certain to delight anyone",
"spells_true_miracle": "True Miracle",
"spells_true_miracle_base_effect": "Bring your wish to reality",
"spells_unmask_the_self": "Unmask The Self",
"spells_unmask_the_self_base_effect": "Know the name and hidden desire of any one being you see",
"spells_whisper": "Whisper",
"spells_whisper_base_effect": "A message, spoken to the ear, like a sirens song",
"spells_windstep": "Windstep",
"spells_windstep_base_effect": "With concentration you step out and appear anywhere at will",
"stand_ground": "Stand Ground",
"stand_ground_description": "Standing Ground during a Turn in Conflict puts the hero on a defensive stance that reduces the TN of enemies' attacks by 1. Stand Ground affects a 2-height radius around the hero. Every time an attack is foiled this way, the hero gains 1 minor level of bond with the targeted ally, up to the 1st major level. <br /><br />Characters who choose to Stand Ground begin their Turn first in the Round.",
"success_fail": "Success/Fail",
"supplies_alchemists_tools": "Alchemists tools and one dose of a rare drug",
"supplies_and_oddities": "Supplies & Oddities",
"supplies_and_sundries": "Supplies & Sundries",
"supplies_and_sundries_description": "SUPPLIES AND SUNDRIES help you explore and last longer in the adventure.",
"supplies_artisans_tools": "Artisans tools and playing cards",
"supplies_backpack": "Large backpack and a blank book",
"supplies_bedroll": "Bedroll and local map",
"supplies_board_games": "Board games and a gallon of beer",
"supplies_coded_letters": "Stack of coded letters, a signet ring and noble clothes",
"supplies_crowbar_and_lantern": "Crowbar and lantern",
"supplies_encyclopeida": "Complete encyclopedia set",
"supplies_fine_clothes": "Mirror and fine clothes",
"supplies_fishing_pole": "Fishing pole and flint & tinder",
"supplies_horse": "Horse and riding gear",
"supplies_live_hen": "Live hen and its cage",
"supplies_rations": "3 days rations",
"supplies_rope_and_carpet": "10-height rope and a rolled-up carpet",
"supplies_spyglass": "Spyglass and magic reagents",
"supplies_tent": "2-person tent and a bottle of wine",
"supplies_thieves_tools": "Thieves tools, disguise kit and manacles",
"supplies_traps": "Traps and animal bait",
"survival": "Survival",
"survival_description": "Aptitude for rugged living off the land; self-reliant outdoorsmanship and survival across the harshest seasons. For example—scavenging safe food and water in the perilous forest, skinning a deer, or navigating the wilderness. <br /><br />As with other Pragmatic Skills, when used with the Creative Approach, the hero: invents, adapts, experiments; with Careful, they: soothe, refine, survey; and for Concerted: rushes, withstands, or brute forces.",
"tactics": "Tactics",
"tactics_description": "Knowledge of battle and conflict—for example, leading the Rook Prince's troops with sophisticated strategy, knowing how to position oneself in a heated battle, instructing other characters how to field an oncoming attack. <br /><br />As with other Knowledge Skills, when used with the Creative Approach, the hero: theorizes, shifts, thinks laterally; with Careful, they: assess, inquire, analyze; and for Concerted: recalls, restores, overwrites.",
"takes_a_rest": "takes a",
"techniques_become_one": "Become One",
"techniques_become_one_base_effect": "Uncover and obtain the Spells and Technique of someone else",
"techniques_bind_magic": "Bind Magic",
"techniques_bind_magic_base_effect": "Prevent any being from performing a Spell or Technique",
"techniques_deadly_focus": "Deadly Focus",
"techniques_deadly_focus_base_effect": "Damage is doubled",
"techniques_defy_the_fates": "Defy The Fates",
"techniques_defy_the_fates_base_effect": "Rewind time",
"techniques_dispel": "Dispel",
"techniques_dispel_base_effect": "Nullify the effects of a Spell or Technique",
"techniques_doompause": "Doompause",
"techniques_doompause_base_effect": "Hold off the Doom",
"techniques_flowmotion": "Flowmotion",
"techniques_flowmotion_base_effect": "Move fast—very fast",
"techniques_fluorescent_transcendence": "Fluorescent Transcendence",
"techniques_fluorescent_transcendence_base_effect": "Enhance all Spells and Techniques for a brief moment",
"techniques_heartpiercer": "Heartpiercer",
"techniques_heartpiercer_base_effect": "Hit where it hurts, ignoring armor and resist",
"techniques_inspiration": "Inspiration",
"techniques_inspiration_base_effect": "Buoy yourself or an ally with inspiration to improve their next action",
"techniques_interdiction": "Interdiction",
"techniques_interdiction_base_effect": "Bar an opponent from using a specific approach",
"techniques_memory_seed": "Memory Seed",
"techniques_memory_seed_base_effect": "Implant one false memory to a being you interact with",
"techniques_netherwave": "Netherwave",
"techniques_netherwave_base_effect": "A pulse of energy so strong it knocks everyone off their feet",
"techniques_only_ones_who_know": "Only Ones Who Know",
"techniques_only_ones_who_know_base_effect": "Either everybody knows about your action or nobody does",
"techniques_redo": "Redo",
"techniques_redo_base_effect": "Reroll the last skill check",
"techniques_saving_grace": "Saving Grace",
"techniques_saving_grace_base_effect": "Protect your allies by redirecting all damage to you",
"techniques_stonewall": "Stonewall",
"techniques_stonewall_base_effect": "Limit damage. Grow a thick skin—figuratively or literally",
"techniques_turn_the_tide": "Turn The Tide",
"techniques_turn_the_tide_base_effect": "Opportunity comes with every action you take",
"techniques_uncanny_alarm": "Uncanny Alarm",
"techniques_uncanny_alarm_base_effect": "Ask the fates whether your next action will cause conflict",
"techniques_weave_through_water": "Weave Through Water",
"techniques_weave_through_water_base_effect": "Learn to walk or breathe through water",
"tests": "tests",
"theme": "Theme",
"three_rumors": "Persistent rumors",
"threshold_number": "Threshold Number",
"threshold_number_description": "The Threshold Number (TN) indicates the relative ease of a risky action: the higher the TN, the easier it is to accomplish. TN is determined by the Approach Score as well as Skill Ranks the player would like to use. The Guide may also apply a Difficulty Modifier to reflect situational or positional circumstances.<br /><br />Lastly, the TN can also be affected if an ally chooses to Assist; if this happens, that ally's major levels of Bond with the hero is automatically added to the TN. When the TN is known, the player can roll for the Skill Check.",
"tinker": "Tinker",
"tinker_description": "Engineering expertise over mechanical or clockwork devices, schema and structures. <br /><br />As with other Pragmatic Skills, when used with the Creative Approach, the hero: invents, adapts, experiments; with Careful, they: soothe, refine, survey; and for Concerted: rushes, withstands, or brute forces.",
"tn": "TN",
"tn_difficult": "Difficult [TN +0]",
"tn_easy": "Easy [TN +1]",
"tn_impossibly_difficult": "Impossibly Difficult [TN -3]",
"tn_modifier+0": "[+0 to TN] No change ",
"tn_modifier+1": "[+1 to TN] Easy",
"tn_modifier+2": "[+2 to TN] Intensely easy",
"tn_modifier+3": "[+3 to TN] Exceptionally easy ",
"tn_modifier-1": "[-1 to TN] Very difficult",
"tn_modifier-2": "[-2 to TN] Staggeringly difficult",
"tn_modifier-3": "[-3 to TN] Extremely difficult",
"tn_no_change": "No change",
"tn_staggeringly_difficult": "Staggeringly Difficult [TN -2]",
"tn_very_difficult": "Very Difficult [TN -1]",
"tooltip_hide": "Hide",
"tooltip_show": "Show",
"tooltips": "Toggle Tooltip",
"trade": "Trade",
"trade_description": "Experience in commerce, animal handling and other industrial or market pursuits—for example, intuitively knowing whether something is overpriced, recalling processes for leather- and metal-working, and performing a quality check on mundane items. <br /><br />As with other Pragmatic Skills, when used with the Creative Approach, the hero: invents, adapts, experiments; with Careful, they: soothe, refine, survey; and for Concerted: rushes, withstands, or brute forces.",
"turn": "Turn",
"turn_description": "A Turn marks a character's action and/or movement during Conflict. Different actions include: Stand Ground, Harm Others (Attack), Non-harmful Actions (creating Advantage, Assisting, or doing something else) using a Spell or Technique, and even moving an additional 5 heights. <br /><br />Turns are sequenced according to an Initiative Category based on the intended action. Before the Round begins, players may also strategize who acts in which Initiative Category. Rounds end and begin anew once every character has used their Turn.",
"update_character_sheet": "Don't forget to update your hero's character sheet.",
"use_dark": "Dark",
"use_light": "Light",
"use_sync": "Sync with Browser",
"version": "Version",
"versus": "vs",
"weaponry": "Weaponry",
"weaponry_description": "Proficiency in the use and maintenance of weaponry. Weaponry is one of two Skills that can automatically inflict Blood Damage during Conflict; the other is Physique. Other applications include: applying sword care and maintenance, mastering an unwieldy warhammer, and knowing a weapon's weak points. <br /><br />As with other Physical Skills, when used with the Creative Approach, the hero: bedazzles, innovates, exceeds expectations; with Careful, they: optimize, safeguard, follow best practice; and for Concerted: charges, endures, overwhelms.",
"xp": "XP",
"xp_description": "Experience Points (XP) represent the hero's growth throughout the adventure. They may be awarded hourly (for games with 1-3 sessions) or at the end of every session. Players may spend them anytime to improve Approach Scores (costing 3x the next value) Skill Rank (costing 2x the next value) or modifier for Blood or Guts (costing the next value).",
"xp_spent": "Spent",
"xp_total": "Total"
}