KICKFLIP A QUANTUM CENTIPEDE
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"bracketSpacing": true,
|
||||
"printWidth": 120,
|
||||
"pugAttributeSeparator": "always",
|
||||
"pugSortAttributes": "asc",
|
||||
"pugWrapAttributesThreshold": -1,
|
||||
"quoteProps": "consistent",
|
||||
"semi": true,
|
||||
"singleQuote": true,
|
||||
"tabWidth": 2,
|
||||
"trailingComma": "es5"
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
# Welcome to Slugblaster
|
||||
|
||||

|
||||
[](https://opensource.org/license/MIT)
|
||||
|
||||
The Official Roll20 character sheet for [Slugblaster by Mikey Hamm](https://slugblaster.com)!
|
||||
|
||||
## Install
|
||||
|
||||
```sh
|
||||
# Install all of the npm packages
|
||||
$ npm install
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
> [!WARNING]
|
||||
> This sheet uses `pug` and SCSS to build the HTML and CSS files respectively. Please do not directly edit the HTML or CSS directly: it will be **wiped away** when the `npm` scripts are ran.
|
||||
|
||||
```sh
|
||||
# Run the development environment
|
||||
$ npm run dev
|
||||
```
|
||||
|
||||
<a href='https://ko-fi.com/R5R54NXP1' target='_blank'><img height='20' style='border:0px;height:20px;' src='https://storage.ko-fi.com/cdn/brandasset/v2/kofi_symbol.png' border='0' alt='Buy Me a Coffee at ko-fi.com' /></a>
|
||||
[](https://github.com/morgdalaine)
|
||||
[](https://discordapp.com/users/186973853011017729)
|
||||
|
||||
[^0]: This README was generated with ♥︎ by [readme-md-generator](https://github.com/kefranabg/readme-md-generator)
|
||||
@@ -0,0 +1,36 @@
|
||||
<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 35 35" width="35" height="35">
|
||||
<title>Dice, Kick</title>
|
||||
<defs>
|
||||
<clipPath clipPathUnits="userSpaceOnUse" id="cp1">
|
||||
<path d="m-1 40.16h34.04v34.47h-34.04z"/>
|
||||
</clipPath>
|
||||
<clipPath clipPathUnits="userSpaceOnUse" id="cp2">
|
||||
<path d="m39.74 40.16h34.04v34.47h-34.04z"/>
|
||||
</clipPath>
|
||||
<clipPath clipPathUnits="userSpaceOnUse" id="cp3">
|
||||
<path d="m1.22 1h31.6v32.53h-31.6z"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
<style>
|
||||
.s0 { fill: #ffffff }
|
||||
</style>
|
||||
<g id="Layer_1-2">
|
||||
<g id="Clip-Path" clip-path="url(#cp1)">
|
||||
<g>
|
||||
<path class="s0" d="m24 47.6q-2 3.1-4 6.3 0 0 0 0 3.6 0.3 7.4 0.5-0.2 0.1-0.3 0.3c-1.6 1.7-3.2 3.4-4.8 5.1-1 1.1-1.9 2.1-2.9 3.1-1 0.9-2.1 1.9-3.1 2.8-0.6 0.6-1.3 1.2-1.9 1.8q-1.7 1.8-3.5 3.6-0.9 1-1.9 2 2 0.8 4.1 1.1c0.8 0.1 1.6 0.2 2.4 0.3q1.6 0.2 3.3 0c3-0.4 5.7-1.6 8-3.5q2.2-1.7 3.6-4.1 2.3-3.4 2.6-7.5 0.2-2.2-0.3-4.4 0 0 0-0.1 0-0.2-0.1-0.4-0.1-0.2-0.1-0.4-0.4-1.2-0.8-2.3-0.3-0.9-0.6-1.7-0.8-1.9-2.1-3.6-1.3-1.5-2.9-2.7c-0.5 1.3-1.3 2.6-2 3.8"/>
|
||||
<path class="s0" d="m-0.7 60.9c0 0 0 0.1 0 0.1q0.2 0.7 0.3 1.3 0.1 0.1 0.1 0.1 0.9 3.3 3.1 6 1.3 1.5 2.8 2.7 0.4-0.5 0.7-1.1c0.9-1.4 1.8-2.8 2.7-4.3 0.7-1.2 1.4-2.4 2.1-3.7q0.1-0.1 0.2-0.4c-3-0.3-5.9-0.6-8.8-0.7q0 0 0 0 0.2-0.3 0.5-0.5 1.6-1.4 3.1-2.9 1-0.9 1.9-1.9c1.8-1.9 3.6-3.6 5.7-5 0.5-0.3 1-0.6 1.5-0.9 0.2-0.1 0.3-0.3 0.5-0.5 1.3-1.2 2.6-2.5 4-3.7 1-0.9 2.1-1.8 3.3-2.5q0.5-0.3 1-0.4 0 0 0.1-0.1-1.7-0.9-3.6-1.3c-0.5-0.1-1.1-0.2-1.6-0.3q-0.1 0-0.2 0c-1.2-0.6-2.6-0.8-4-0.7-1.4 0-2.8 0.2-4.2 0.7-1.9 0.6-3.7 1.6-5.3 2.9-0.7 0.6-1.4 1.2-2 1.9-0.7 0.9-1.2 1.8-1.5 2.9q-0.2 0.4-0.1 0.9 0 0.1 0 0.2 0.2 0.3 0.4 0.2 0.1 0 0.1 0c-0.1 0.2-0.1 0.3-0.3 0.4-0.3 0.2-0.6 0.5-0.9 0.8-0.5 0.6-0.9 1.4-1.2 2.1-0.4 1.1-0.6 2.3-0.7 3.5q-0.1 2.1 0.3 4.2"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Clip-Path" clip-path="url(#cp2)">
|
||||
<g>
|
||||
<path class="s0" d="m48.8 67.2q2-3.1 4-6.3 0 0 0-0.1-3.7-0.2-7.4-0.4 0.2-0.1 0.3-0.3c1.6-1.7 3.2-3.4 4.8-5.2 1-1 1.9-2 2.9-3 1-0.9 2.1-1.9 3.1-2.8q1-0.9 1.9-1.8 1.7-1.8 3.5-3.6 0.9-1 1.9-2-2-0.8-4.1-1.1c-0.8-0.1-1.6-0.2-2.4-0.3q-1.6-0.2-3.3 0c-3 0.4-5.7 1.5-8 3.5q-2.2 1.7-3.6 4-2.3 3.5-2.6 7.6-0.2 2.2 0.3 4.4 0 0 0 0.1 0 0.2 0.1 0.4 0.1 0.2 0.1 0.4 0.4 1.2 0.8 2.3 0.3 0.9 0.6 1.7 0.8 1.9 2.1 3.6 1.3 1.5 2.9 2.7c0.5-1.3 1.3-2.6 2-3.8"/>
|
||||
<path class="s0" d="m73.5 53.9c0 0 0-0.1 0-0.1q-0.2-0.7-0.3-1.3-0.1-0.1-0.1-0.1-1-3.3-3.1-6-1.3-1.5-2.8-2.7-0.4 0.5-0.7 1.1c-0.9 1.4-1.8 2.8-2.7 4.3-0.7 1.2-1.4 2.4-2.1 3.7q-0.1 0.1-0.2 0.4c3 0.3 5.9 0.6 8.8 0.7q0 0 0 0-0.2 0.3-0.5 0.5-1.6 1.4-3.1 2.9c-0.7 0.6-1.3 1.5-2.1 2-0.7 0.4-1.5 0.8-2.3 1.2-0.5 0.3-1 0.6-1.4 1.2-0.2 0.4-0.4 0.9-0.8 1.3-0.8 0.9-1.5 1.5-2.5 2.1-0.2 0.1-0.4 0.3-0.5 0.5-1.3 1.2-2.6 2.5-4 3.7-1 0.9-2.1 1.8-3.3 2.5q-0.5 0.3-1 0.4-0.1 0-0.1 0.1 1.7 0.8 3.5 1.3c0.6 0.1 1.2 0.2 1.7 0.3q0.1 0 0.1 0c1.3 0.5 2.6 0.7 4 0.7 1.5 0 2.9-0.2 4.2-0.7 2-0.6 3.7-1.6 5.3-2.9 0.8-0.6 1.4-1.2 2-1.9 0.6-0.8 1.2-1.6 1.5-2.6 0.3-0.9 0.9-1.7 1.4-2.6 0.2-0.5 0.4-0.8 0.5-1.3 0.2-1.5 0.7-2.9 0.8-4.5q0.2-2.1-0.3-4.2"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Clip-Path" clip-path="url(#cp3)">
|
||||
<g>
|
||||
<path class="s0" d="m1.2 27.1q0 0.2 0 0.5 0 0.2 0.1 0.4 0 0.2 0.1 0.5l0.1 0.4q0.2 0.9 0.8 1.6c0.3 0.5 0.8 1 1.4 1.4q0.8 0.5 1.7 0.7 0.3 0.1 0.6 0.1 0.1 0.1 0.2 0.1 0.1 0 0.3 0 0.2 0.1 0.4 0.1 0.4 0 0.4 0c0.8 0.1 1.6 0.2 2.5 0.3 3.4 0.3 7.4 0.3 11 0.3q2.8 0 5.6 0h0.2 0.2 0.3q0.1 0 0.2 0 0.2 0 0.5-0.1 0.2 0 0.4-0.1 1-0.3 1.8-0.8 0.8-0.5 1.4-1.3 0.2-0.2 0.3-0.4 0.2-0.2 0.3-0.4v-0.1l0.1-0.1 0.1-0.2 0.1-0.3 0.1-0.2 0.1-0.2v-0.1-0.2q0.1-0.2 0.2-0.5 0-0.2 0-0.4v-0.2-0.1l0.1-0.2v-0.3-0.2-0.3q-0.1-0.4-0.1-0.7 0-1.5-0.1-2.8-0.1-1.1-0.2-2.1c0 0 0-0.2 0-0.3 0-0.4 0-1.2 0-1.3 0 0 0-0.4 0-0.6 0-0.2 0.1-0.4 0.1-0.4q0-0.9 0.1-1.8c0.2-2.1 0.2-4.2 0.2-6.3q0-1.1 0-2.2 0-0.3 0-0.6v-0.1-0.2q0-0.2-0.1-0.4 0-0.1 0-0.3 0-0.2-0.1-0.4c-0.1-0.2-0.1-0.4-0.2-0.7-0.4-0.9-0.9-1.7-1.6-2.3-0.7-0.6-1.5-1.1-2.4-1.3q-0.2-0.1-0.4-0.2-0.2 0-0.3-0.1-0.1 0-0.2-0.1-0.2-0.1-0.5-0.1-0.1 0-0.3-0.1-0.1 0-0.2 0-0.8-0.1-2-0.2c-1.6-0.2-3.4-0.2-5.1-0.2-3.1 0.1-6.2 0.1-9.4 0.4-0.6 0.1-1.2 0.2-1.8 0.2-0.4-0.1-0.8-0.2-1.2-0.1-0.4 0-0.5 0.5-0.9 0.6-0.5 0.2-1 0.1-1.4 0.2-1 0.3-1.9 0.7-2.5 1.5-0.6 0.7-0.4 1.5-0.6 2.3-0.1 0.6-0.4 1-0.4 1.7v10.8q0 2.8 0 5.7 0 1.4 0 2.8zm5.6-3.4c0.1-0.4 0.3-0.8 0.6-1.1q0-0.1 0.1-0.1 0-0.1 0.1-0.1 0 0 0.1-0.1 0 0 0 0v-0.1c0 0 0.1-0.1 0.2-0.1q0-0.1 0-0.1 0.1-0.1 0.3-0.3 0.3-0.4 0.9-0.6 0.5-0.2 1.1-0.2 0.5 0 1 0.2 0.6 0.2 1 0.6 0.4 0.4 0.6 0.8 0 0.1 0 0.2 0.1 0.2 0.1 0.3c0 0 0 0.1 0 0.2q0 0 0 0.1 0.1 0 0.1 0.1 0 0 0.1 0.1 0 0.1 0 0.1 0 0.1 0 0.2c0.2 0.6 0 1.4-0.3 2-0.4 0.6-0.9 1-1.5 1.3-0.3 0.1-0.7 0.1-0.9 0-0.1-0.1-0.2-0.3-0.2-0.4q-0.1 0-0.1 0 0 0 0 0 0 0.1 0 0.2 0 0.3-0.3 0.5c-0.3 0.1-0.6 0.2-0.9 0q-0.2 0-0.3 0-0.1-0.1-0.1-0.1-0.1 0-0.2-0.1-0.1 0-0.1 0-0.1-0.1-0.2-0.1-0.1-0.1-0.1-0.1-0.1-0.1-0.1-0.1c-0.3-0.2-0.6-0.5-0.7-0.9-0.1-0.3-0.1-0.5 0-0.7-0.3-0.4-0.4-1-0.3-1.6m6.4-11.6q0 0.1 0 0.1-0.1 0.1-0.1 0.2c0 0-0.1 0-0.1 0.1q0 0 0 0 0 0 0 0c0 0.1-0.1 0.2-0.1 0.3q0 0 0 0-0.1 0.2-0.2 0.4c-0.2 0.3-0.4 0.6-0.7 0.8q-0.5 0.3-1 0.5-0.6 0.1-1.1 0.1-0.6-0.1-1.1-0.3-0.5-0.3-0.8-0.7 0-0.1-0.1-0.2 0-0.1-0.1-0.2c0 0 0-0.1-0.1-0.2q0 0 0-0.1-0.1 0-0.1-0.1-0.1 0-0.1-0.1 0 0-0.1-0.1 0-0.1-0.1-0.1c-0.3-0.6-0.3-1.4-0.1-2 0.1-0.7 0.5-1.3 1.1-1.7 0.2-0.2 0.6-0.3 0.8-0.2q0.2 0.1 0.3 0.3 0.1 0 0.1-0.1 0 0 0 0 0 0-0.1-0.1c0-0.2 0-0.5 0.2-0.6 0.2-0.2 0.6-0.3 0.9-0.3q0.1 0 0.3 0 0.1 0 0.1 0.1 0.1 0 0.2 0 0.1 0 0.2 0 0 0 0.1 0.1 0.1 0 0.2 0 0.1 0 0.1 0.1c0.3 0.1 0.7 0.4 0.8 0.6 0.2 0.3 0.3 0.5 0.3 0.7 0.3 0.4 0.6 0.9 0.7 1.5 0 0.4-0.1 0.8-0.2 1.2m0.5 5.6q0-0.1 0-0.3 0 0 0-0.1 0-0.1 0-0.2 0-0.1 0-0.1 0-0.1 0-0.2 0-0.1 0.1-0.2 0-0.1 0-0.1c0.1-0.4 0.4-0.7 0.6-0.9 0.3-0.2 0.5-0.3 0.7-0.3q0.5-0.6 1.4-0.7c0.4-0.1 0.9-0.1 1.2 0.1q0.1 0 0.2 0 0.1 0.1 0.1 0.1 0.1 0 0.1 0.1 0 0 0.1 0 0 0 0 0c0 0 0.2 0.1 0.2 0.1q0.1 0 0.1 0 0.2 0.1 0.4 0.1c0.3 0.2 0.6 0.4 0.8 0.7q0.4 0.5 0.5 1 0.2 0.5 0.2 1.1 0 0.5-0.2 1.1-0.3 0.5-0.6 0.8-0.1 0.1-0.2 0.1-0.1 0.1-0.2 0.1c0 0-0.1 0.1-0.2 0.1q0 0.1-0.1 0.1 0 0.1-0.1 0.1 0 0-0.1 0.1 0 0-0.1 0.1 0 0-0.1 0.1c-0.6 0.3-1.3 0.4-2 0.3-0.7-0.2-1.3-0.5-1.8-1.1-0.2-0.2-0.2-0.5-0.2-0.7q0.1-0.3 0.3-0.4 0 0-0.1 0 0-0.1 0-0.1 0 0.1-0.1 0.1-0.3 0.1-0.6-0.1c-0.2-0.2-0.4-0.5-0.3-0.9zm6.9-5.8c-0.2-0.2-0.4-0.5-0.3-0.9q0-0.1 0-0.2 0-0.1 0-0.2 0-0.1 0-0.1 0-0.1 0-0.2 0-0.1 0.1-0.2 0-0.1 0-0.1 0-0.1 0.1-0.2c0.1-0.3 0.3-0.6 0.6-0.8 0.2-0.2 0.4-0.3 0.6-0.3q0.6-0.6 1.5-0.8c0.4 0 0.8 0 1.2 0.2q0.1 0 0.1 0 0.1 0.1 0.2 0.1 0 0 0.1 0.1 0 0 0 0 0 0 0.1 0c0 0 0.1 0.1 0.2 0.1q0 0 0 0 0.2 0.1 0.4 0.2c0.3 0.1 0.6 0.3 0.9 0.6q0.3 0.5 0.5 1 0.1 0.5 0.1 1.1 0 0.5-0.2 1.1c-0.2 0.3-0.4 0.6-0.6 0.8q-0.1 0.1-0.2 0.1-0.1 0.1-0.2 0.1c0 0-0.1 0.1-0.2 0.1q-0.1 0-0.1 0.1 0 0-0.1 0.1 0 0-0.1 0.1 0 0-0.1 0.1 0 0-0.1 0c-0.6 0.4-1.3 0.4-2 0.3-0.7-0.1-1.3-0.5-1.8-1-0.2-0.3-0.2-0.6-0.2-0.8q0.1-0.2 0.3-0.4 0 0 0 0 0 0 0 0-0.1 0-0.2 0-0.3 0.2-0.6-0.1m0.2 11.4c0.1-0.3 0.3-0.5 0.5-0.6q0.3-0.1 0.5 0 0 0 0 0 0 0 0 0-0.1-0.1-0.1-0.1-0.3-0.2-0.2-0.6c0-0.3 0.3-0.6 0.6-0.8q0.1 0 0.2-0.1 0 0 0.1 0 0.1-0.1 0.2-0.1 0-0.1 0.1-0.1 0.1 0 0.2 0 0.1-0.1 0.1-0.1 0.1 0 0.2 0c0.3-0.1 0.7-0.1 1 0 0.3 0.2 0.5 0.3 0.6 0.5 0.5 0.1 1 0.4 1.4 0.8 0.3 0.3 0.5 0.7 0.5 1.1q0 0.1 0 0.2 0 0.1 0 0.2c0 0 0 0 0 0q0 0.1 0.1 0.1 0 0 0 0c0 0 0 0.2 0 0.3q0 0 0 0 0.1 0.2 0.1 0.4c0 0.4 0 0.7-0.1 1.1q-0.2 0.5-0.6 0.9-0.4 0.5-0.9 0.7-0.4 0.3-1 0.4c-0.3 0-0.7 0-1-0.1q-0.1 0-0.2-0.1-0.1 0-0.2-0.1c0 0-0.1-0.1-0.2-0.1q-0.1 0-0.1 0-0.1 0-0.1-0.1-0.1 0-0.2 0 0 0-0.1-0.1 0 0-0.1 0c-0.6-0.3-1.1-0.9-1.3-1.6-0.3-0.6-0.3-1.3-0.1-2"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 7.3 KiB |
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M21.0039 12C21.0039 16.9706 16.9745 21 12.0039 21C9.9675 21 3.00463 21 3.00463 21C3.00463 21 4.56382 17.2561 3.93982 16.0008C3.34076 14.7956 3.00391 13.4372 3.00391 12C3.00391 7.02944 7.03334 3 12.0039 3C16.9745 3 21.0039 7.02944 21.0039 12Z" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 563 B |
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M6 9L12 15L18 9" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 337 B |
@@ -0,0 +1,3 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg width="800px" height="800px" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" fill="none"><path fill="#000000" d="M8 0a8 8 0 100 16A8 8 0 008 0z"/></svg>
|
||||
|
After Width: | Height: | Size: 284 B |
|
After Width: | Height: | Size: 14 KiB |
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg width="800px" height="800px" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" fill="none">
|
||||
|
||||
<g fill="#000000">
|
||||
|
||||
<path d="M11.28 4.72a.75.75 0 010 1.06L9.06 8l2.22 2.22a.75.75 0 11-1.06 1.06L8 9.06l-2.22 2.22a.75.75 0 01-1.06-1.06L6.94 8 4.72 5.78a.75.75 0 011.06-1.06L8 6.94l2.22-2.22a.75.75 0 011.06 0z"/>
|
||||
|
||||
<path fill-rule="evenodd" d="M.25 8a7.75 7.75 0 1115.5 0A7.75 7.75 0 01.25 8zM8 1.75a6.25 6.25 0 100 12.5 6.25 6.25 0 000-12.5z" clip-rule="evenodd"/>
|
||||
|
||||
</g>
|
||||
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 603 B |
|
After Width: | Height: | Size: 7.3 KiB |
@@ -0,0 +1,3 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg width="800px" height="800px" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" fill="none"><path fill="#000000" d="M6.407.753L.75 6.409a2.25 2.25 0 000 3.182l5.657 5.657a2.25 2.25 0 003.182 0l5.657-5.657a2.25 2.25 0 000-3.182L9.589.753a2.25 2.25 0 00-3.182 0z"/></svg>
|
||||
|
After Width: | Height: | Size: 398 B |
@@ -0,0 +1,3 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg width="800px" height="800px" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" fill="none"><path fill="#000000" fill-rule="evenodd" d="M7.468 1.813L1.81 7.47a.75.75 0 000 1.06l5.657 5.657a.75.75 0 001.06 0l5.657-5.656a.75.75 0 000-1.061L8.528 1.813a.75.75 0 00-1.06 0zM.75 6.41L6.407.753a2.25 2.25 0 013.182 0l5.657 5.656a2.25 2.25 0 010 3.182l-5.657 5.657a2.25 2.25 0 01-3.182 0L.75 9.591a2.25 2.25 0 010-3.182z" clip-rule="evenodd"/></svg>
|
||||
|
After Width: | Height: | Size: 571 B |
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="a" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 26.82 27.34">
|
||||
<defs>
|
||||
<style>
|
||||
.b {
|
||||
fill: #7c5fa9;
|
||||
}
|
||||
</style>
|
||||
</defs>
|
||||
<rect x="-.9" y="-.64" width="28.63" height="28.63"/>
|
||||
<path class="b" d="M12.6,20.4l-.61.37s-.09-.11-.15-.17l.54-1.54c-.46-.09-.67.65-.8,1.32-.33-.28-.7-.57-.93-.74,0-.35-.09-.46-.44-.24-.02-.3-.13-.59-.13-.85s.43-.52.43-1c0-1.43,1.59-5.06,2.72-6.97-.37-.04-1.46.52-2.06.87-.85-.87-1.48-2.69-.33-3,1.56-.41,3.11-1.45,4.71-1.89.5,0,1.04.22,1.3.3.17.57.33,1.26.39,2.06-1.85,4.74-3.37,6.21-4.65,11.47Z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 631 B |
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="a" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 26.82 27.34">
|
||||
<defs>
|
||||
<style>
|
||||
.b {
|
||||
fill: #7c5fa9;
|
||||
}
|
||||
</style>
|
||||
</defs>
|
||||
<rect x="-.9" y="-.64" width="28.63" height="28.63"/>
|
||||
<path class="b" d="M18.29,17.13c-.98.13-1.22.85-2.65,1.32v-.2c.39-.15.8-.35,1.04-.52l-.07-.15c-1.24.65-1.59.15-1.74,1.06-.89.17-.3-.39-1.3-.39l-.54.57c-1.17.24-2.65.61-4,.8-.39-.39-.83-.3-.74.09-.3.02-.63.04-.91.04-.61,0-.91-.87-1.37-1.56.22-.33.37-.67-.07-.76,2.3-3.48,8.41-5.56,8.41-6.91-.22-.3-.57-.46-1-.46-.89,0-2.11.54-3.06,1.06-.46.26-.48-.28-1.04-1.09-.43-.61-.02-.76-.46-1.09.3-.26.26-.63.72-.89,1.26-.74,4.37-.89,6.15-1.06l-.09.24c1.65,0,2.74,1.02,2.74,2,0,.89-.24,1.82-.78,2.5-.65.09-1.11.65-1.15,1.3l-1.22.67-.06-.2c.33-.2.7-.41.67-.74-1.8.96-4,1.93-5.17,3.3,2.09.13,5.08-.52,6.91-.7.87.37,1.24.52,2.17.52l.09.2h-.91l.15.22,1.56.09c-.3.67-1.17.57-2.28.72ZM14.03,14.35l-.04-.13.83-.54.04.24-.83.43ZM19.33,17.26l1.02-.2.09.2c-.46.04-.98.15-1.11,0Z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.0 KiB |
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="a" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 26.82 27.34">
|
||||
<defs>
|
||||
<style>
|
||||
.b {
|
||||
fill: #7c5fa9;
|
||||
}
|
||||
</style>
|
||||
</defs>
|
||||
<rect x="-.86" y="-.64" width="28.63" height="28.63"/>
|
||||
<path class="b" d="M18.56,17.16l-.28-.13c-1.22,1.06-2.32,1.5-3.61,2.15l-.11-.24c-.65.28-1.39.57-2.13.83l-.11-.37c-.24.02-.46.24-.5.57-1.43.46-2.76.78-4.21.98-.13.02-.26-.04-.24-.26.02-.24.54-.61.41-.87l-.65.28c-.35-.85-.26-1.61-.04-2.3,1.54,0,3.3.04,4.58-.63.09.22.39.22.85.09,1.28-.37,4.61-1.5,4.89-2.83-.57-.65-1.96-.46-3.58-.65l-.11.26c-1.17-.59-1.54-.39-1.95-1.52l.22-.96c1.17-.3,2.91-1.67,3.32-2.56-1.52,0-3.93.85-5.11,1.45-.06-.13-.13-.3-.17-.43l1.5-.72c-.35-.3-.96.11-1.56.5-.13-.52-.17-1.09-.17-1.65,0-.83,2.06-1.76,3.67-1.76.35,0,.7.02,1.04.04l.17.2c1.06,0,2.19.15,2.96.22.41.5.67,1.02.78,1.61-.2.93-.57,1.87-.89,2.52,1.24.41,1.95,1.09,2.52,1.91,0,1.65-.22,3.15-1.48,4.28ZM11.11,19.6c-.15.02-.3.07-.5.11l.04.24.89-.24c-.13-.11-.28-.13-.43-.11ZM15.13,18.29l-.67.28.13.24.61-.33-.07-.2Z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="a" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 26.82 27.34">
|
||||
<defs>
|
||||
<style>
|
||||
.b {
|
||||
fill: #f281b3;
|
||||
}
|
||||
</style>
|
||||
</defs>
|
||||
<rect x="-1.13" y="-.64" width="28.63" height="28.63"/>
|
||||
<path class="b" d="M18.53,14.47c-.39.17-.91.44-1.22,1.04-.28.57-.8,1.2-1.26,1.96-.41-.02-.76.09-.89.5l.48.22c-.04.09-.09.22-.13.3l-.46-.24-.17.48.37.26c-.2.57-.28,1.15-.22,1.74-1.22.46-.85-.48-1.59.02-.33-.56-.67-.98-1.32-1.26,0-1.26,1.22-2.46,1.5-3.67-.83-.24-.67.02-2.11.04l-.11.39c-.63-.09-.96-.15-1.06.02-.11.18-.54.07-1.39-.59l-.24.19c-1.17-.61-2.11-1.72-2.11-2.46,0-.82,3.89-5.69,6.04-7.52.26.15.72.13.98.07.63.39.5,1.13.2,2.24l-.22-.13c-.72,1.48-2.3,3.63-3.26,5.3,1,0,2.06-.04,2.89-.35l-.04.3c1.63.11,2.78-2.3,3.17-3.65l.87-.59c.87,1.17,1.24,1.94,1.04,3.06.63.09,1.5-.63,2.06-1.04.09.3.09.56.37.48-.15,1.67-1.76,2.69-2.17,2.87ZM10.78,15.77l-.15.15.59.09.04-.17-.48-.07ZM13.43,13.1v-.17l.46-.24.07.24-.52.17ZM14.8,18.98l-.15.44.15.13.22-.46-.22-.11ZM18.18,12.62l-.06.24c.26.02.33-.11.46-.41l-.39.17Z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="a" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 26.82 27.34">
|
||||
<defs>
|
||||
<style>
|
||||
.b {
|
||||
fill: #f281b3;
|
||||
}
|
||||
</style>
|
||||
</defs>
|
||||
<rect x="-1" y="-.64" width="28.63" height="28.63"/>
|
||||
<path class="b" d="M12.29,9.87c-.31.42-.64.94-.46,1.45l.54,1.5c.3.92,1.37.84,2.38,1.19.65.74,1.07,1.72,1.18,2.71.15,1.58-1.81,3.23-3.78,4.25-1.76.24-2.77-.01-4.19-1.13-.01-.09-.03-.22-.06-.3l.83.28c-.2-.37-.54-.45-.93-.68-.04-.13-.06-.3-.08-.43l.51-.6.64.2c.57.18.35.79.82.72.15-.02,2.96-1.4,2.88-3.42-.6-1.19-1.76-1.47-3.07-2.06l-.97-2.23-1.21.32c-.54-1.05,0-1.78.52-2.57l.56-.21c.06-.49.33-1.08.48-1.6.32-.04.49-.13.64-.15.19-.03.42,0,.94.29l7.27-2.65c.88.03,1.69.95,1.73,1.27.02.17-.04.33-.11.45l.48.81c-2.02,1.61-5.72,1.97-7.56,2.6ZM13.78,19.14c-.52.07-.58.28-.98.99l1.02-.71-.04-.28ZM18.99,6.67l-1.08.57-.1.25,1.26-.59-.08-.23Z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 918 B |
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="a" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 26.82 27.34">
|
||||
<defs>
|
||||
<style>
|
||||
.b {
|
||||
fill: #ffd457;
|
||||
}
|
||||
</style>
|
||||
</defs>
|
||||
<rect x="-.9" y="-.64" width="28.63" height="28.63"/>
|
||||
<path class="b" d="M6.8,18.99l-.1-.58c.31.16.36.37.39.54l-.28.04ZM18.9,8.36l-4.04,2.95c.03.22-.12.46-.36.67l-.18-.2-.7.62.22.1c-.47.39-.99.84-1.15,1.41.12.14.32.22.53.22.08.01.24,0,1.54-.09l.1-.23c1.99-.26,2.86.61,3.05,2.05.12.09.23.15.26.41s-.41,1.45-.91,2.22l-.4-.03c-.67,1.28-3.76,2.47-5.63,3.07-.39-.17-.65-.13-.6.26-1.01-.09-3.62-1.39-3.78-2.57l.39-.05c.17-.86-.44-1.93.51-3.87h-.37c.96-1.45,2.42-3.3,3.97-5.06.49-.07.79-.19.5-.55,2.27-2.49,4.66-4.62,5.84-4.78.39-.05.83.13,1.28.32.15,1.09.08,2.16-.08,3.15ZM10.68,16.55l-1.19,2.3c.56.1.94.16,1.12-.26.82-.18,2.1-.59,3.02-1.16-.92-.38-1.11-1-2.95-.89ZM12.31,13.62c-.18.25-.25.52-.12.66l.33-.48-.21-.17ZM13.53,17.85l.22.08.55-.4c-.25-.08-.53.16-.77.32Z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 992 B |
@@ -0,0 +1,19 @@
|
||||
<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 35 35" width="35" height="35">
|
||||
<title>Dice, Kick</title>
|
||||
<defs>
|
||||
<clipPath clipPathUnits="userSpaceOnUse" id="cp1">
|
||||
<path d="m0 0.16h34.04v34.47h-34.04z"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
<style>
|
||||
.s0 { fill: #ffffff }
|
||||
</style>
|
||||
<g id="Layer_1-2">
|
||||
<g id="Clip-Path" clip-path="url(#cp1)">
|
||||
<g>
|
||||
<path class="s0" d="m25 7.6q-2 3.1-4 6.3 0 0 0 0 3.6 0.3 7.4 0.5-0.2 0.1-0.3 0.3c-1.6 1.7-3.2 3.4-4.8 5.1-1 1.1-1.9 2.1-2.9 3.1-1 0.9-2.1 1.9-3.1 2.8-0.6 0.6-1.3 1.2-1.9 1.8q-1.7 1.8-3.5 3.6-0.9 1-1.9 2 2 0.8 4.1 1.1c0.8 0.1 1.6 0.2 2.4 0.3q1.6 0.2 3.3 0c3-0.4 5.7-1.6 8-3.5q2.2-1.7 3.6-4.1 2.3-3.4 2.6-7.5 0.2-2.2-0.3-4.4 0 0 0-0.1 0-0.2-0.1-0.4-0.1-0.2-0.1-0.4-0.4-1.2-0.8-2.3-0.3-0.9-0.6-1.7-0.8-1.9-2.1-3.6-1.3-1.5-2.9-2.7c-0.5 1.3-1.3 2.6-2 3.8"/>
|
||||
<path class="s0" d="m0.3 20.9c0 0 0 0.1 0 0.1q0.2 0.7 0.3 1.3 0.1 0.1 0.1 0.1 0.9 3.3 3.1 6 1.3 1.5 2.8 2.7 0.4-0.5 0.7-1.1c0.9-1.4 1.8-2.8 2.7-4.3 0.7-1.2 1.4-2.4 2.1-3.7q0.1-0.1 0.2-0.4c-3-0.3-5.9-0.6-8.8-0.7q0 0 0 0 0.2-0.3 0.5-0.5 1.6-1.4 3.1-2.9 1-0.9 1.9-1.9c1.8-1.9 3.6-3.6 5.7-5 0.5-0.3 1-0.6 1.5-0.9 0.2-0.1 0.3-0.3 0.5-0.5 1.3-1.2 2.6-2.5 4-3.7 1-0.9 2.1-1.8 3.3-2.5q0.5-0.3 1-0.4 0 0 0.1-0.1-1.7-0.9-3.6-1.3c-0.5-0.1-1.1-0.2-1.6-0.3q-0.1 0-0.2 0c-1.2-0.6-2.6-0.8-4-0.7-1.4 0-2.8 0.2-4.2 0.7-1.9 0.6-3.7 1.6-5.3 2.9-0.7 0.6-1.4 1.2-2 1.9-0.7 0.9-1.2 1.8-1.5 2.9q-0.2 0.4-0.1 0.9 0 0.1 0 0.2 0.2 0.3 0.4 0.2 0.1 0 0.1 0c-0.1 0.2-0.1 0.3-0.3 0.4-0.3 0.2-0.6 0.5-0.9 0.8-0.5 0.6-0.9 1.4-1.2 2.1-0.4 1.1-0.6 2.3-0.7 3.5q-0.1 2.1 0.3 4.2"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.6 KiB |
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="Layer_2" data-name="Layer 2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 699.83 7.84">
|
||||
<defs>
|
||||
<style>
|
||||
.cls-1 {
|
||||
fill: none;
|
||||
}
|
||||
|
||||
.cls-2 {
|
||||
clip-path: url(#clippath);
|
||||
}
|
||||
|
||||
.cls-3 {
|
||||
fill: #231f20;
|
||||
}
|
||||
</style>
|
||||
<clipPath id="clippath">
|
||||
<rect class="cls-1" width="699.83" height="7.84"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
<g id="Layer_1-2" data-name="Layer 1">
|
||||
<g class="cls-2">
|
||||
<path class="cls-3" d="M688.43,7.06c-10.11,.22-15.03,.82-26.22,.78-9.89-.04-16.35-.49-26.07-.44-19.62,.11-37.92,.53-57.66,.06-11.1-.26-18.31-.49-29.57-.33-12.02,.16-25.03,.33-37.15,.28-10.08-.04-20.76-.18-30.77-.31-7.12-.09-13.69-.3-19.81-.68-.3-.02-1.2-.09-2.28-.17-6.85,.05-14.13,.27-20.7,.3-9.23,.05-18.46-.04-27.69-.04-8.42,0-16.59,.07-24.83-.15-1.95-.07-3.9-.14-5.85-.2-.59,.02-1.19,.04-2.18,.06-1.45,.06-2.89,.12-4.34,.18-20.1,.83-35.51,1.08-57.28,.87-16.32-.16-33.91,.18-48.87-.61-3.63-.19-7.45-.61-11.13-.84-.2,0-.47,.01-.9,.02-9.42,.12-17.98,.42-27.62,.45-8.87,.03-17.74-.04-26.6-.04-8.07,0-15.63,.28-23.69,.27-9.44-.02-18.18-.66-27.14-.66-6.28,0-12.71,.59-19.97,.66-10.52,.12-17.99-.29-27.03-.74-2.09-.1-4.29-.22-6.6-.3-5.82,.56-10.35,1.17-20.56,1.23-8.32,.05-17.22-.29-23.85-.79-1.44-.11-2.9-.23-4.29-.36-.78,0-1.41,.03-1.73,.06C23.72,7.63-15.72,3.08,6.64,1.07,16.4,.19,30.59,.05,43.15,.2c5.95,.07,11.19,.24,16.43,.51,1.97-.18,4.03-.34,6.56-.45,8.41-.4,15.04-.25,23.77-.08,8.21,.16,15.74,.34,23.1,.75,.06,0,.07,0,.12,0,2.97-.16,8.4-.36,9.22-.38,16.56-.5,29.62,.61,44.96,.5,8.12-.06,15.33-.21,23.61-.19,8.26,.02,16.8,.08,25.03,0,18.51-.17,31.66-.77,49.88,.12,3.84,.19,8.47,.45,11.6,.73,.05,0,.1,0,.15,.01,6.72-.03,14.27,.05,20.37,.1,8.61,.07,17.97,.31,26.58,.15,8.45-.15,16.34-.62,24.28-.93,13.46-.52,24.89-.46,36.36,.07,9.49,.17,22.17,.05,31.39,.03,12.32-.02,24.27-.35,36.6-.28,7.89,.05,14.4,.25,20.91,.72,.7,.05,1.22,.11,1.89,.17,.38-.06,2.06-.06,5.2,0,6.56-.02,12.94,.21,19.44,.24,6.07,.02,12.3-.09,18.33-.15,13.92-.13,26.35-.38,40.29-.1,11.96,.24,21.63,.58,34,.53,9.57-.04,18.77-.25,28.32-.3,10.39-.05,18.56,.12,27.34,.39,3.48-.12,6.88-.4,10.71-.49,14.97-.33,28.88,.46,36.24,1.78,5.35,.96,7.39,3.07-7.41,3.39"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.2 KiB |
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M7 10V8C7 5.23858 9.23858 3 12 3C14.0503 3 15.8124 4.2341 16.584 6M12 14.5V16.5M8.8 21H15.2C16.8802 21 17.7202 21 18.362 20.673C18.9265 20.3854 19.3854 19.9265 19.673 19.362C20 18.7202 20 17.8802 20 16.2V14.8C20 13.1198 20 12.2798 19.673 11.638C19.3854 11.0735 18.9265 10.6146 18.362 10.327C17.7202 10 16.8802 10 15.2 10H8.8C7.11984 10 6.27976 10 5.63803 10.327C5.07354 10.6146 4.6146 11.0735 4.32698 11.638C4 12.2798 4 13.1198 4 14.8V16.2C4 17.8802 4 18.7202 4.32698 19.362C4.6146 19.9265 5.07354 20.3854 5.63803 20.673C6.27976 21 7.11984 21 8.8 21Z" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 872 B |
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M17 10V8C17 5.23858 14.7614 3 12 3C9.23858 3 7 5.23858 7 8V10M12 14.5V16.5M8.8 21H15.2C16.8802 21 17.7202 21 18.362 20.673C18.9265 20.3854 19.3854 19.9265 19.673 19.362C20 18.7202 20 17.8802 20 16.2V14.8C20 13.1198 20 12.2798 19.673 11.638C19.3854 11.0735 18.9265 10.6146 18.362 10.327C17.7202 10 16.8802 10 15.2 10H8.8C7.11984 10 6.27976 10 5.63803 10.327C5.07354 10.6146 4.6146 11.0735 4.32698 11.638C4 12.2798 4 13.1198 4 14.8V16.2C4 17.8802 4 18.7202 4.32698 19.362C4.6146 19.9265 5.07354 20.3854 5.63803 20.673C6.27976 21 7.11984 21 8.8 21Z" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 867 B |
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M12 3V21M12 3L16 7M12 3L8 7M12 21L8 17M12 21L16 17" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 372 B |
|
After Width: | Height: | Size: 2.8 MiB |
|
After Width: | Height: | Size: 4.7 MiB |
|
After Width: | Height: | Size: 1.3 MiB |
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M12 8V16M8 12H16M7.8 21H16.2C17.8802 21 18.7202 21 19.362 20.673C19.9265 20.3854 20.3854 19.9265 20.673 19.362C21 18.7202 21 17.8802 21 16.2V7.8C21 6.11984 21 5.27976 20.673 4.63803C20.3854 4.07354 19.9265 3.6146 19.362 3.32698C18.7202 3 17.8802 3 16.2 3H7.8C6.11984 3 5.27976 3 4.63803 3.32698C4.07354 3.6146 3.6146 4.07354 3.32698 4.63803C3 5.27976 3 6.11984 3 7.8V16.2C3 17.8802 3 18.7202 3.32698 19.362C3.6146 19.9265 4.07354 20.3854 4.63803 20.673C5.27976 21 6.11984 21 7.8 21Z" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 804 B |
|
After Width: | Height: | Size: 6.5 KiB |
@@ -0,0 +1 @@
|
||||
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 120" preserveAspectRatio="none" ><path d="M985.66,92.83C906.67,72,823.78,31,743.84,14.19c-82.26-17.34-168.06-16.33-250.45.39-57.84,11.73-114,31.07-172,41.86A600.21,600.21,0,0,1,0,27.35V120H1200V95.8C1132.19,118.92,1055.71,111.31,985.66,92.83Z" class="shape-fill" fill="#EC008B" fill-opacity="1"></path></svg>
|
||||
|
After Width: | Height: | Size: 389 B |
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg width="800px" height="800px" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" fill="none">
|
||||
|
||||
<g fill="#000000">
|
||||
|
||||
<path d="M11.78 5.22a.75.75 0 010 1.06l-4.5 4.5a.75.75 0 01-1.06 0l-2-2a.75.75 0 011.06-1.06l1.47 1.47 3.97-3.97a.75.75 0 011.06 0z"/>
|
||||
|
||||
<path fill-rule="evenodd" d="M1 3.25A2.25 2.25 0 013.25 1h9.5A2.25 2.25 0 0115 3.25v9.5A2.25 2.25 0 0112.75 15h-9.5A2.25 2.25 0 011 12.75v-9.5zm2.25-.75a.75.75 0 00-.75.75v9.5c0 .414.336.75.75.75h9.5a.75.75 0 00.75-.75v-9.5a.75.75 0 00-.75-.75h-9.5z" clip-rule="evenodd"/>
|
||||
|
||||
</g>
|
||||
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 665 B |
@@ -0,0 +1,4 @@
|
||||
<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg" fill="none">
|
||||
<path id="svg_1" clip-rule="evenodd" d="m1,3.25a2.25,2.25 0 0 1 2.25,-2.25l9.5,0a2.25,2.25 0 0 1 2.25,2.25l0,9.5a2.25,2.25 0 0 1 -2.25,2.25l-9.5,0a2.25,2.25 0 0 1 -2.25,-2.25l0,-9.5zm2.25,-0.75a0.75,0.75 0 0 0 -0.75,0.75l0,9.5c0,0.414 0.336,0.75 0.75,0.75l9.5,0a0.75,0.75 0 0 0 0.75,-0.75l0,-9.5a0.75,0.75 0 0 0 -0.75,-0.75l-9.5,0z" fill-rule="evenodd" fill="#000000"/>
|
||||
<rect id="svg_2" height="11.82525" width="11.51609" y="2.12602" x="2.43518" fill="#000000"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 550 B |
@@ -0,0 +1,3 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg width="800px" height="800px" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" fill="none"><path fill="#000000" fill-rule="evenodd" d="M1 3.25A2.25 2.25 0 013.25 1h9.5A2.25 2.25 0 0115 3.25v9.5A2.25 2.25 0 0112.75 15h-9.5A2.25 2.25 0 011 12.75v-9.5zm2.25-.75a.75.75 0 00-.75.75v9.5c0 .414.336.75.75.75h9.5a.75.75 0 00.75-.75v-9.5a.75.75 0 00-.75-.75h-9.5z" clip-rule="evenodd"/></svg>
|
||||
|
After Width: | Height: | Size: 514 B |
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M16 6V5.2C16 4.0799 16 3.51984 15.782 3.09202C15.5903 2.71569 15.2843 2.40973 14.908 2.21799C14.4802 2 13.9201 2 12.8 2H11.2C10.0799 2 9.51984 2 9.09202 2.21799C8.71569 2.40973 8.40973 2.71569 8.21799 3.09202C8 3.51984 8 4.0799 8 5.2V6M10 11.5V16.5M14 11.5V16.5M3 6H21M19 6V17.2C19 18.8802 19 19.7202 18.673 20.362C18.3854 20.9265 17.9265 21.3854 17.362 21.673C16.7202 22 15.8802 22 14.2 22H9.8C8.11984 22 7.27976 22 6.63803 21.673C6.07354 21.3854 5.6146 20.9265 5.32698 20.362C5 19.7202 5 18.8802 5 17.2V6" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 828 B |
@@ -0,0 +1,3 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg width="800px" height="800px" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" fill="none"><path fill="#000000" fill-rule="evenodd" d="M8 1a2.143 2.143 0 00-1.827 1.024l-5.88 9.768a2.125 2.125 0 00.762 2.915c.322.188.687.289 1.06.293h11.77a2.143 2.143 0 001.834-1.074 2.126 2.126 0 00-.006-2.124L9.829 2.028A2.149 2.149 0 008 1zM7 11a1 1 0 011-1h.007a1 1 0 110 2H8a1 1 0 01-1-1zm1.75-5.25a.75.75 0 00-1.5 0v2.5a.75.75 0 001.5 0v-2.5z" clip-rule="evenodd"/></svg>
|
||||
|
After Width: | Height: | Size: 592 B |
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg width="800px" height="800px" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" fill="none">
|
||||
|
||||
<g fill="#000000">
|
||||
|
||||
<path d="M7 11a1 1 0 011-1h.007a1 1 0 110 2H8a1 1 0 01-1-1zM8.75 5.75a.75.75 0 00-1.5 0v2.5a.75.75 0 001.5 0v-2.5z"/>
|
||||
|
||||
<path fill-rule="evenodd" d="M6.953 1.273a2.143 2.143 0 012.874.751l.002.004 5.884 9.774a2.126 2.126 0 01-.768 2.905c-.322.188-.687.289-1.06.293H2.115a2.143 2.143 0 01-1.833-1.074 2.125 2.125 0 01.006-2.124l.006-.01 5.878-9.764.002-.004c.191-.313.46-.571.78-.75zm.502 1.53l-.001.002-5.872 9.754a.626.626 0 00.231.853.644.644 0 00.314.088h11.746a.643.643 0 00.544-.32.626.626 0 000-.62l-5.87-9.755-.002-.001A.635.635 0 008 2.5a.643.643 0 00-.545.304z" clip-rule="evenodd"/>
|
||||
|
||||
</g>
|
||||
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 848 B |
@@ -0,0 +1,3 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg width="800px" height="800px" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" fill="none"><path fill="#000000" d="M8 1.25a2.101 2.101 0 00-1.785.996l.64.392-.642-.388-5.675 9.373-.006.01a2.065 2.065 0 00.751 2.832c.314.183.67.281 1.034.285h11.366a2.101 2.101 0 001.791-1.045 2.064 2.064 0 00-.006-2.072L9.788 2.25l-.003-.004A2.084 2.084 0 008 1.25z"/></svg>
|
||||
|
After Width: | Height: | Size: 488 B |
@@ -0,0 +1,3 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg width="800px" height="800px" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" fill="none"><path fill="#000000" fill-rule="evenodd" d="M6.978 1.515a2.101 2.101 0 012.807.731l.002.004 5.681 9.383a2.065 2.065 0 01-.751 2.832c-.314.183-.67.281-1.034.285H2.317a2.101 2.101 0 01-1.791-1.045 2.065 2.065 0 01.006-2.072l.006-.01L6.213 2.25l.002-.004c.187-.305.45-.557.763-.73zm.517 1.514l-.001.001-5.67 9.363a.565.565 0 00.214.776c.088.051.189.08.292.081h11.34a.601.601 0 00.504-.294.564.564 0 00.001-.563L8.506 3.03V3.03A.584.584 0 008 2.75a.601.601 0 00-.505.279z" clip-rule="evenodd"/></svg>
|
||||
|
After Width: | Height: | Size: 717 B |
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"name": "slugblaster",
|
||||
"version": "1.0.0",
|
||||
"description": "Roll20 character sheet for Slugblaster by Mikey Hamm",
|
||||
"scripts": {
|
||||
"dev": "run-p compile:* postcss",
|
||||
"compile:sass": "npx sass ./src/scss/slugblaster.scss ./slugblaster.css --watch --no-source-map --no-charset",
|
||||
"compile:pug": "npx pug3 ./src/pug/slugblaster.pug --out ./ --watch --pretty",
|
||||
"compile:i18n": "i18ntool -i slugblaster.html -a > /dev/null",
|
||||
"postcss": "npx postcss slugblaster.css --output slugblaster.css --use autoprefixer --watch --verbose --no-map",
|
||||
"prettier": "npx prettier --write 'src/**/*.{js,pug,scss}' --plugin='@prettier/plugin-pug'"
|
||||
},
|
||||
"keywords": [
|
||||
"roll20"
|
||||
],
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"@anduh/pug-cli": "^1.0.0-alpha8",
|
||||
"@prettier/plugin-pug": "^2.3.0",
|
||||
"autoprefixer": "^10.4.7",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"postcss": "^8.4.14",
|
||||
"postcss-cli": "^9.1.0",
|
||||
"prettier": "^2.8.0",
|
||||
"pug": "^3.0.2",
|
||||
"pug-cli": "^1.0.0-alpha6",
|
||||
"sass": "^1.56.1"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"html": "slugblaster.html",
|
||||
"css": "slugblaster.css",
|
||||
"preview": "slugblaster.png",
|
||||
"authors": "morgdalaine",
|
||||
"roll20userid": "61327",
|
||||
"instructions": "Slugblaster by Mikey Hamm @ MythWorks",
|
||||
"tipeee": "https://ko-fi.com/morgdalaine"
|
||||
}
|
||||
|
After Width: | Height: | Size: 1.8 MiB |
@@ -0,0 +1,11 @@
|
||||
on('clicked:roll-character', async (eventInfo) => {
|
||||
makeCharacterRoll();
|
||||
});
|
||||
|
||||
on('clicked:roll-character-trick', async (eventInfo) => {
|
||||
makeCharacterRoll(true);
|
||||
});
|
||||
|
||||
on('clicked:disaster', async (eventInfo) => {
|
||||
makeDisasterRoll();
|
||||
});
|
||||
@@ -0,0 +1,103 @@
|
||||
/**
|
||||
*
|
||||
* @param {*} params
|
||||
* @returns
|
||||
*/
|
||||
const makeRollTemplate = (params) => {
|
||||
const { title, subtitle, type, trick, dice, boosts, kicks } = params;
|
||||
const roll = params.roll || '[[1d6]]';
|
||||
|
||||
const template = [
|
||||
'&{template:slugblaster}',
|
||||
'{{character=@{character_name}}}',
|
||||
`{{title=${title}}}`,
|
||||
subtitle ? `{{subtitle=${subtitle}}}` : '',
|
||||
`{{${type}=true}}`,
|
||||
`{{roll=${roll}}}`,
|
||||
'{{result=[[0]]}}',
|
||||
];
|
||||
|
||||
if (trick) template.push('{{trick=true}}');
|
||||
if (type === 'action') {
|
||||
template.push('{{@{dicetray_dare}=true}}');
|
||||
template.push(`{{boosts=${boosts}}}`);
|
||||
template.push(`{{kicks=${kicks}}}`);
|
||||
}
|
||||
|
||||
Array.from(Array(dice).keys(), (die) => {
|
||||
template.push(`{{die${die + 1}=[[0]]}}`);
|
||||
});
|
||||
|
||||
return template.filter((line) => line).join(' ');
|
||||
};
|
||||
|
||||
const handleRollResults = async (results) => {
|
||||
const final = {};
|
||||
const { result, dice } = results.roll;
|
||||
|
||||
dice.forEach((die, index) => {
|
||||
const key = `die${index + 1}`;
|
||||
final[key] = die;
|
||||
});
|
||||
|
||||
final.result = result <= 3 ? 'fail' : result <= 5 ? 'mixed' : result === 6 ? 'success' : 'unk';
|
||||
|
||||
return final;
|
||||
};
|
||||
|
||||
const makeRoll = async (template) => {
|
||||
const result = await startRoll(template);
|
||||
const { rollId, results } = result;
|
||||
const parsed = await handleRollResults(results);
|
||||
finishRoll(rollId, parsed);
|
||||
};
|
||||
|
||||
const makeCharacterRoll = (trick = false) => {
|
||||
const request = ['dicetray_boosts', 'dicetray_kicks', 'dicetray_dare'];
|
||||
getAttrs(request, (values) => {
|
||||
const boosts = +values.dicetray_boosts || 0;
|
||||
const kicks = +values.dicetray_kicks || 0;
|
||||
const dare = values.dicetray_dare || '';
|
||||
|
||||
const dice = 1 + boosts + (dare === 'plus_1d6' ? 1 : 0);
|
||||
const kick = 0 + kicks + (dare === 'plus_kick' ? 1 : 0);
|
||||
const params = {
|
||||
title: 'Action Roll',
|
||||
// subtitle: 'Slugblaster Subtitle',
|
||||
type: 'action',
|
||||
dice: dice,
|
||||
roll: `[[${dice}d6kh1sd]]`,
|
||||
trick: trick,
|
||||
boosts: dice - 1,
|
||||
kicks: kick,
|
||||
};
|
||||
|
||||
const template = makeRollTemplate(params);
|
||||
makeRoll(template);
|
||||
|
||||
setAttrs({
|
||||
dicetray_boosts: 0,
|
||||
dicetray_kicks: 0,
|
||||
dicetray_dare: '',
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
const makeDisasterRoll = () => {
|
||||
const request = ['trouble', 'trouble_max'];
|
||||
getAttrs(request, (values) => {
|
||||
const trouble = +values.trouble || 0;
|
||||
const troubleMax = +values.trouble_max || G_CONSTANTS.trouble_max;
|
||||
const dice = troubleMax - trouble;
|
||||
const params = {
|
||||
title: 'Disaster Strikes!',
|
||||
subtitle: 'Everyone’s luck runs out eventually',
|
||||
type: 'disaster',
|
||||
dice: dice,
|
||||
roll: `[[${dice}d6kh1sd]]`,
|
||||
};
|
||||
|
||||
const template = makeRollTemplate(params);
|
||||
makeRoll(template);
|
||||
});
|
||||
};
|
||||
@@ -0,0 +1,107 @@
|
||||
// Switch between sheet modes
|
||||
for (const mode of G_SHEET_MODES) {
|
||||
on(`clicked:${mode}`, (eventInfo) => {
|
||||
setAttrs({ sheet_mode: mode });
|
||||
});
|
||||
}
|
||||
|
||||
// Edit / View panel modes
|
||||
// QUESTION: should the editor and minimizer be linked?
|
||||
for (const toggle of G_EDITORS) {
|
||||
on(`clicked:${toggle}-editor`, (eventInfo) => {
|
||||
getAttrs([`${toggle}_editor`, `${toggle}_minimizer`], (values) => {
|
||||
const isMinimized = values[`${toggle}_minimized`] === 'on';
|
||||
|
||||
const value = values[`${toggle}_editor`] === '0' ? 'on' : '0';
|
||||
setAttrs({ [`${toggle}_editor`]: value });
|
||||
});
|
||||
});
|
||||
|
||||
on(`clicked:${toggle}-minimizer`, (eventInfo) => {
|
||||
getAttrs([`${toggle}_minimizer`], (values) => {
|
||||
const value = values[`${toggle}_minimizer`] === '0' ? 'on' : '0';
|
||||
setAttrs({ [`${toggle}_minimizer`]: value });
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
for (const toggle of G_BLADES) {
|
||||
on(`clicked:${toggle}-blade`, (eventInfo) => {
|
||||
getAttrs([`${toggle}_blade`], (values) => {
|
||||
const value = values[`${toggle}_blade`] === '0' ? 'on' : '0';
|
||||
setAttrs({ [`${toggle}_blade`]: value });
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// Update empty fieldsets
|
||||
for (const fieldset of G_REPEATING_FIELDSETS) {
|
||||
on(`change:repeating_${fieldset} remove:repeating_${fieldset}`, async (eventInfo) => isFieldsetEmpty(fieldset));
|
||||
}
|
||||
|
||||
// Load personality data
|
||||
on('change:personality change:personality_custom', (eventInfo) => {
|
||||
const personality = eventInfo.newValue;
|
||||
if (personality) loadPersonality(personality);
|
||||
});
|
||||
|
||||
on('change:attitude_override', (eventInfo) => {
|
||||
setAttitude(undefined, eventInfo.newValue === 'on');
|
||||
});
|
||||
|
||||
on('change:attitude_boost_set change:attitude_kick_set', (eventInfo) => {
|
||||
setAttitude(undefined, true);
|
||||
});
|
||||
|
||||
// Update dice tray from attitude, turbo, hype
|
||||
for (const [key, fields] of Object.entries(G_ATTITUDE_TURBO)) {
|
||||
for (const field of fields) {
|
||||
on(`change:${field}`, (eventInfo) => {
|
||||
if (eventInfo.sourceType !== 'player') return;
|
||||
getAttrs(['dicetray_boosts', 'dicetray_kicks'], (values) => {
|
||||
const original = +values[`dicetray_${key}`] || 0;
|
||||
const delta = eventInfo.newValue === 'on' ? 1 : -1;
|
||||
const final = Math.max(0, original + delta);
|
||||
setAttrs({ [`dicetray_${key}`]: final }, { silent: true });
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Load signature data
|
||||
on('change:signature', (eventInfo) => {
|
||||
let signature = eventInfo.newValue;
|
||||
signature = signature.trim().replace(' ', '_').toLowerCase();
|
||||
if (signature) loadSignature(signature);
|
||||
});
|
||||
|
||||
// Load faction data
|
||||
on('clicked:load-factions', () => loadFactions());
|
||||
|
||||
// Update Autogen rows
|
||||
for (const fieldset of Object.values(G_AUTOGEN_FIELDSET)) {
|
||||
for (const { section, fields } of fieldset) {
|
||||
const events = fields.map((field) => `change:${section}:${field}`).join(' ');
|
||||
on(events, (eventInfo) => {
|
||||
if (eventInfo.sourceType !== 'player') return;
|
||||
const autogen = `${eventInfo.sourceAttribute.split('_').slice(0, 4).join('_')}_autogen`;
|
||||
setAttrs({ [autogen]: '' }, { silent: true });
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Style & Trouble
|
||||
on('clicked:nope', (eventInfo) => nopeTrouble());
|
||||
|
||||
// Progress Tracks / SKATE / tracks
|
||||
on('change:repeating_tracks:track_name clicked:repeating_tracks:track-reset', (eventInfo) => {
|
||||
const sectionId = getSectionID(eventInfo);
|
||||
makeTrack(sectionId);
|
||||
});
|
||||
|
||||
Array.from(Array(G_CONSTANTS.progress_track_max).keys(), (index) => {
|
||||
on(`change:repeating_tracks:track_marker_${index + 1}`, (eventInfo) => {
|
||||
const sectionId = getSectionID(eventInfo);
|
||||
makeTrackString(sectionId);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,361 @@
|
||||
const G_SHEET_MODES = ['character', 'crew', 'options'];
|
||||
|
||||
const G_EDITORS = [
|
||||
'angst-arc',
|
||||
'authority-factions',
|
||||
'crew-beats',
|
||||
'crew-factions',
|
||||
'header-crew',
|
||||
'crowd-factions',
|
||||
'dicetray',
|
||||
'doom',
|
||||
'family-arc',
|
||||
'gear',
|
||||
'header',
|
||||
'fame',
|
||||
'legacy',
|
||||
'mods',
|
||||
'notes',
|
||||
'other-beats',
|
||||
'personality-arc',
|
||||
'signature',
|
||||
'sponsor-factions',
|
||||
'tracks',
|
||||
'trait-beats',
|
||||
'traits',
|
||||
];
|
||||
|
||||
const G_BLADES = ['downtimes', 'epilogue', 'factions', 'diary', 'multiverse'];
|
||||
|
||||
const G_REPEATING_FIELDSETS = [
|
||||
// character
|
||||
'doom',
|
||||
'gear',
|
||||
'legacy',
|
||||
'mods',
|
||||
'traits',
|
||||
|
||||
// common
|
||||
'tracks',
|
||||
'notes',
|
||||
|
||||
// downtime
|
||||
'trait-beats',
|
||||
'personality-arc',
|
||||
'family-arc',
|
||||
'angst-arc',
|
||||
'crew-beats',
|
||||
'other-beats',
|
||||
|
||||
// crew sheet
|
||||
'crew-factions',
|
||||
'authority-factions',
|
||||
'sponsor-factions',
|
||||
'crowd-factions',
|
||||
];
|
||||
|
||||
const G_OPTIONS = ['attitude_override'];
|
||||
|
||||
const G_CONSTANTS = {
|
||||
trouble_max: 8,
|
||||
progress_track_max: 12,
|
||||
};
|
||||
|
||||
const G_PLAYBOOKS = {
|
||||
grit: {
|
||||
attitude: { boost: 3, kick: 1 },
|
||||
traits: ['patient', 'sacrifice_your_body', 'diligent', 'walk_it_off', 'skill', 'personal_growth'],
|
||||
gear: ['something_everyone_else_forgot', 'backup_portaling_device'],
|
||||
vibes: [
|
||||
'one_song_on_repeat',
|
||||
'never_smile',
|
||||
'your_drink_matches_your_shoes',
|
||||
'sleep_when_youre_dead',
|
||||
'adult_in_residence',
|
||||
'overachiever',
|
||||
],
|
||||
},
|
||||
guts: {
|
||||
attitude: { boost: 1, kick: 3 },
|
||||
traits: ['show_off', 'snake', 'double_dare', 'walking_disaster', 'raw_talent', 'personal_growth'],
|
||||
gear: ['something_youre_not_supposed_to_have', 'a_portable_speaker'],
|
||||
},
|
||||
smarts: {
|
||||
attitude: { boost: 2, kick: 2 },
|
||||
traits: [
|
||||
'lateral_thinking',
|
||||
'technobabble',
|
||||
'power_user',
|
||||
'actually_reads_the_manual',
|
||||
'know_how',
|
||||
'personal_growth',
|
||||
],
|
||||
gear: ['a_work_in_progress', 'a_vital_screenshot_or_image_file'],
|
||||
},
|
||||
heart: {
|
||||
attitude: { boost: 1, kick: 2 },
|
||||
traits: ['team_player', 'pep_talk', 'middle_finger', 'intuition', 'passion', 'personal_growth'],
|
||||
gear: ['something_from_someone_special', 'an_important_pamphlet'],
|
||||
},
|
||||
chill: {
|
||||
attitude: { boost: 1, kick: 0 },
|
||||
traits: ['steezey', 'umm_guys', 'button_masher', 'lucky', 'quirk', 'personal_growth'],
|
||||
gear: ['something_you_found_on_your_way_here', 'a_pet'],
|
||||
},
|
||||
custom: {
|
||||
attitude: { boost: 2, kick: 2 },
|
||||
traits: ['personal_growth'],
|
||||
},
|
||||
};
|
||||
|
||||
const G_SIGNATURES = {
|
||||
gravity_blaster: {
|
||||
mods: [
|
||||
'endurance_engine',
|
||||
'agility_pin',
|
||||
'impulse_rig',
|
||||
'gravity_spasm',
|
||||
'field_inverter',
|
||||
'power_cell',
|
||||
'stabilizer',
|
||||
'kitbashed',
|
||||
],
|
||||
},
|
||||
hardlight_board: {
|
||||
mods: [
|
||||
'photon_vent',
|
||||
'energy_lattice',
|
||||
'photon_exciter',
|
||||
'flicker_switch',
|
||||
'matter_photonizer',
|
||||
'power_cell',
|
||||
'stabilizer',
|
||||
'kitbashed',
|
||||
],
|
||||
},
|
||||
hyperoptic_visor: {
|
||||
mods: [
|
||||
'realmware_lens',
|
||||
'omniscience_aperture',
|
||||
'spacetime_periscope',
|
||||
'powered_crunk_filter',
|
||||
'adv._neural_imaging',
|
||||
'power_cell',
|
||||
'stabilizer',
|
||||
'kitbashed',
|
||||
],
|
||||
},
|
||||
kinetic_deck: {
|
||||
mods: [
|
||||
'proximity_lock',
|
||||
'stasis_anchor',
|
||||
'density_pedal',
|
||||
'inertial_vortex',
|
||||
'dimensional_ballast',
|
||||
'power_cell',
|
||||
'stabilizer',
|
||||
'kitbashed',
|
||||
],
|
||||
},
|
||||
negafriction_sword: {
|
||||
mods: [
|
||||
'slip_rattle',
|
||||
'field_projector',
|
||||
'ref_coating',
|
||||
'negafriction_wake',
|
||||
'subdimensional_edge',
|
||||
'power_cell',
|
||||
'stabilizer',
|
||||
'kitbashed',
|
||||
],
|
||||
},
|
||||
photonic_jacket: {
|
||||
mods: [
|
||||
'flash_patterns',
|
||||
'ambiance_panel',
|
||||
'photo_bypass',
|
||||
'hardlight_upscaling',
|
||||
'concept_prism',
|
||||
'power_cell',
|
||||
'stabilizer',
|
||||
'kitbashed',
|
||||
],
|
||||
},
|
||||
powered_armour: {
|
||||
mods: [
|
||||
'heavy_duty_servos',
|
||||
'weapons_system',
|
||||
'mobility_booster',
|
||||
'ablatine_plates',
|
||||
'omega_engine',
|
||||
'power_cell',
|
||||
'stabilizer',
|
||||
'kitbashed',
|
||||
],
|
||||
},
|
||||
reality_cannon: {
|
||||
mods: [
|
||||
'parameter_dial',
|
||||
'exponent_coil',
|
||||
'subjectivity_diode',
|
||||
'matter_lens',
|
||||
'concept_inverter',
|
||||
'power_cell',
|
||||
'stabilizer',
|
||||
'kitbashed',
|
||||
],
|
||||
},
|
||||
riftninja_sneakers: {
|
||||
mods: [
|
||||
'hyperphaser',
|
||||
'anti_negafriction_outsoles',
|
||||
'powered_midsoles',
|
||||
'reaction_switch',
|
||||
'plane_haunt',
|
||||
'power_cell',
|
||||
'stabilizer',
|
||||
'kitbashed',
|
||||
],
|
||||
},
|
||||
robotic_companion: {
|
||||
mods: [
|
||||
'weapons',
|
||||
'mobility_boosters',
|
||||
'heavy_duty_servos',
|
||||
'guardian_mode',
|
||||
'neural_network',
|
||||
'power_cell',
|
||||
'stabilizer',
|
||||
'kitbashed',
|
||||
],
|
||||
},
|
||||
skipmode_runners: {
|
||||
mods: [
|
||||
'anti_negafriction_outsoles',
|
||||
'energy_tenser',
|
||||
'temporal_scrubber',
|
||||
'chrono_clip',
|
||||
'causality_hoop',
|
||||
'power_cell',
|
||||
'stabilizer',
|
||||
'kitbashed',
|
||||
],
|
||||
},
|
||||
voidwear_backpack: {
|
||||
mods: [
|
||||
'astral_intake',
|
||||
'omni_siphon',
|
||||
'chaos_vent',
|
||||
'collapsible_panels',
|
||||
'reversible_zipper',
|
||||
'power_cell',
|
||||
'stabilizer',
|
||||
'kitbashed',
|
||||
],
|
||||
},
|
||||
custom: {
|
||||
mods: ['power_cell', 'stabilizer', 'kitbashed'],
|
||||
},
|
||||
};
|
||||
|
||||
const G_EXTRA_GEAR = [
|
||||
'your_phone',
|
||||
'personal_gear_1',
|
||||
'personal_gear_2',
|
||||
'grappling_hook',
|
||||
'spacetime_ampimeter',
|
||||
'hacking_tools',
|
||||
'multiversal_maps',
|
||||
'repair_tools',
|
||||
'small_drone',
|
||||
'pro_camera_gear',
|
||||
'peel_back_kit',
|
||||
'hazwear',
|
||||
'backup_portaling_device',
|
||||
'logic_binder',
|
||||
'advanced_portal_tech',
|
||||
'hardecker_sludge_flares',
|
||||
'hardlight_marker',
|
||||
'maser_grenades',
|
||||
'smartcord',
|
||||
'the_fust_mix',
|
||||
'beam_filter',
|
||||
'wilkies_gravity_stickers',
|
||||
'panic_energy_fuel_line',
|
||||
'fust_stasis_stickers',
|
||||
'aug_band',
|
||||
'particle_bond_tights',
|
||||
'3d_printed_ablatine',
|
||||
'knock_off_scram_cat_tee',
|
||||
'miper_escape_bag',
|
||||
'awf_bracelet',
|
||||
'duraweave_jacket',
|
||||
'link_patch_duo',
|
||||
'slam_patch',
|
||||
];
|
||||
|
||||
const G_FACTIONS = {
|
||||
crew: ['brb', 'jet_collective', 'null_range', 'lazy_bunny', 'the_wicks'],
|
||||
sponsor: ['miper', 'hardecker', 'wilkies', 'scram_cat', 'fust'],
|
||||
authority: ['dara', 'the_arborists', 'shimmer', 'doorways', 'the_old_guard'],
|
||||
crowd: ['the_thrashers', 'the_heads', 'the_mavens', 'the_freaks', 'the_normies'],
|
||||
};
|
||||
|
||||
const G_FACTION_FIELDSET = [
|
||||
{
|
||||
section: 'repeating_crew-factions',
|
||||
fields: ['faction_name', 'faction_description', 'faction_autogen'],
|
||||
},
|
||||
];
|
||||
|
||||
const G_AUTOGEN_FIELDSET = {
|
||||
traits: [
|
||||
{
|
||||
section: 'repeating_traits',
|
||||
fields: ['trait_autogen', 'trait_check', 'trait_name', 'trait_description'],
|
||||
},
|
||||
],
|
||||
gear: [
|
||||
{
|
||||
section: 'repeating_gear',
|
||||
fields: ['gear_autogen', 'gear_check', 'gear_name', 'gear_cost', 'gear_description'],
|
||||
},
|
||||
],
|
||||
factions: [
|
||||
{
|
||||
section: 'repeating_crew-factions',
|
||||
fields: ['faction_autogen', 'faction_name', 'faction_relationship', 'faction_description'],
|
||||
},
|
||||
{
|
||||
section: 'repeating_sponsor-factions',
|
||||
fields: ['faction_autogen', 'faction_name', 'faction_relationship', 'faction_description'],
|
||||
},
|
||||
{
|
||||
section: 'repeating_authority-factions',
|
||||
fields: ['faction_autogen', 'faction_name', 'faction_relationship', 'faction_description'],
|
||||
},
|
||||
{
|
||||
section: 'repeating_crowd-factions',
|
||||
fields: ['faction_autogen', 'faction_name', 'faction_relationship', 'faction_description'],
|
||||
},
|
||||
],
|
||||
mods: [
|
||||
{
|
||||
section: 'repeating_mods',
|
||||
fields: ['mod_autogen', 'mod_check', 'mod_name', 'mod_cost', 'mod_description'],
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
const G_ATTITUDE_TURBO = {
|
||||
boosts: [
|
||||
...Array.from(Array(4).keys(), (key) => `attitude_boost_${key + 1}`),
|
||||
...Array.from(Array(4).keys(), (key) => `turbo_boost_${key + 1}`),
|
||||
...Array.from(Array(4).keys(), (key) => `hype_boost_${key + 1}`),
|
||||
],
|
||||
kicks: [
|
||||
...Array.from(Array(4).keys(), (key) => `attitude_kick_${key + 1}`),
|
||||
...Array.from(Array(4).keys(), (key) => `turbo_kick_${key + 1}`),
|
||||
...Array.from(Array(4).keys(), (key) => `hype_kick_${key + 1}`),
|
||||
],
|
||||
};
|
||||
@@ -0,0 +1,86 @@
|
||||
/**
|
||||
* Checks if a repcontain (e.g. repeating_weapons) is empty.
|
||||
* This is calculated by looking at the length of IDs in fieldset.
|
||||
* @param {string} section name of a repeating fieldset (repcontainer)
|
||||
* @param {string} suffix attribute name as section_suffix (e.g. weapons_count)
|
||||
**/
|
||||
const isFieldsetEmpty = (section, suffix = 'empty') => {
|
||||
getSectionIDs(section, (id) => {
|
||||
setAttrs({ [`${section}_${suffix}`]: id.length });
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Combines [getAttrs()](https://wiki.roll20.net/Sheet_Worker_Scripts#getAttrs.28attributeNameArray.2C_callback.29)
|
||||
* and [getSectionIDs](https://wiki.roll20.net/Sheet_Worker_Scripts#getSectionIDs.28section_name.2Ccallback.29)
|
||||
* @param {Object} sectionDetails repeating section request
|
||||
* @example
|
||||
* // example of sectionDetails object
|
||||
* const G_DEFAULT_REPEATING = [
|
||||
* { section: "repeating_inventory", fields: ["weight", "name", "quantity"] },
|
||||
* { section: "repeating_attack", fields: ["bonus", "damage", "name"] },
|
||||
* ];
|
||||
* @param {string[]} getArray optional global attribute request
|
||||
* @param {callback} callback
|
||||
* @returns {(Object|Object)}
|
||||
*/
|
||||
const getAllAttrs = (sectionDetails, getArray, callback) => {
|
||||
const sectionClone = structuredClone(sectionDetails);
|
||||
|
||||
if (typeof callback !== 'function') return;
|
||||
|
||||
getSections(getArray, sectionClone, (getArr, sections) => {
|
||||
getAttrs(getArr, (attributes) => {
|
||||
// call the callback function to finally do what we wanted to do.
|
||||
callback(attributes, sections);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Gets the rowIDs for all the sections passed to it,
|
||||
* and assembles an array of repeating attributes to get.
|
||||
* Does this via a work queue or burndown set up.
|
||||
* Arguments are the same as for getAllAttrs with the addition of sections.
|
||||
* @param {*} getArray
|
||||
* @param {*} sectionDetails
|
||||
* @param {callback} callback
|
||||
* @param {*} sections accumulates the idArrays for each section
|
||||
*/
|
||||
const getSections = (getArray, sectionDetails, callback, sections = {}) => {
|
||||
// grab the first section to work;
|
||||
const section = sectionDetails.shift();
|
||||
getSectionIDs(section.section, (idArray) => {
|
||||
// store the idArray for use later on if needed.
|
||||
sections[section.section] = [...idArray];
|
||||
|
||||
// add the sections reporder to the getArray so that we can order the idArray later.
|
||||
getArray.push(`_reporder_${section.section}`);
|
||||
// iterate through the ids
|
||||
|
||||
for (const id of idArray) {
|
||||
// Iterate through each of the fields for the repeating section
|
||||
for (const field of section.fields) {
|
||||
// add the repeating attribute for this id to the getArray
|
||||
getArray.push(`${section.section}_${id}_${field}`);
|
||||
}
|
||||
}
|
||||
|
||||
if (sectionDetails[0]) {
|
||||
// If there's another section to work through, go through the burndown again
|
||||
getSections(getArray, sectionDetails, callback, sections);
|
||||
} else {
|
||||
// If no sections are left, call the callback
|
||||
callback(getArray, sections);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Splits a comma delimited string into an array
|
||||
* @param {string} string
|
||||
* @returns {Array}
|
||||
*/
|
||||
const commaArray = (string = '') => {
|
||||
return string.toLowerCase().split(/\s*,\s*/);
|
||||
};
|
||||
@@ -0,0 +1,210 @@
|
||||
const getSectionID = (eventInfo) => eventInfo.sourceAttribute.split('_').at(2);
|
||||
|
||||
const doNumcontrol = (numcontrol, step, min = null, max = null) => {
|
||||
getAttrs([numcontrol, `${numcontrol}_max`], (values) => {
|
||||
let value = +values[numcontrol] || 0;
|
||||
value += step;
|
||||
|
||||
if (min !== null) value = Math.max(value, min);
|
||||
|
||||
if (max !== null) {
|
||||
if (Number.isNaN(max)) {
|
||||
const value_max = +values[max];
|
||||
value = Math.min(value, value_max);
|
||||
} else value = Math.min(value, max);
|
||||
}
|
||||
|
||||
setAttrs({ [numcontrol]: value });
|
||||
});
|
||||
};
|
||||
|
||||
const nopeTrouble = () => {
|
||||
getAttrs(['trouble', 'trouble_max'], (values) => {
|
||||
const max = +values.trouble_max || G_CONSTANTS.trouble_max;
|
||||
const current = +values.trouble || 0;
|
||||
const newValue = Math.min(current + 2, max);
|
||||
setAttrs({ trouble: newValue });
|
||||
});
|
||||
};
|
||||
|
||||
const makeTrack = (sectionId) => {
|
||||
const repeatingPrefix = `repeating_tracks_${sectionId}_`;
|
||||
const request = [`${repeatingPrefix}track_name`];
|
||||
getAttrs(request, (values) => {
|
||||
const update = {};
|
||||
const trackName = values[`${repeatingPrefix}track_name`];
|
||||
update[`${repeatingPrefix}track_name`] = trackName.trim().toUpperCase();
|
||||
update[`${repeatingPrefix}track_size`] = trackName.length;
|
||||
|
||||
for (let index = 0; index < G_CONSTANTS.progress_track_max; index++) {
|
||||
const key = `${repeatingPrefix}track_letter_${index + 1}`;
|
||||
const letter = trackName[index];
|
||||
|
||||
update[key] = letter ? letter.toUpperCase() : '';
|
||||
if (!letter) update[`${repeatingPrefix}track_marker_${index + 1}`] = 0;
|
||||
}
|
||||
|
||||
setAttrs(update);
|
||||
});
|
||||
};
|
||||
|
||||
const makeTrackString = (sectionId) => {
|
||||
const repeatingPrefix = `repeating_tracks_${sectionId}_`;
|
||||
const markers = Array.from(Array(G_CONSTANTS.progress_track_max).keys(), (index) => `track_marker_${index + 1}`);
|
||||
|
||||
const request = ['track_name', 'track_size', ...markers].map((r) => repeatingPrefix + r);
|
||||
getAttrs(request, (values) => {
|
||||
const update = {};
|
||||
const trackName = values[`${repeatingPrefix}track_name`];
|
||||
const trackDisplay = Array(trackName.length);
|
||||
let trackCompleted = 0;
|
||||
|
||||
Array.from(trackName, (letter, index) => {
|
||||
const marked = values[`${repeatingPrefix}track_marker_${index + 1}`];
|
||||
|
||||
trackDisplay[index] = marked === 'on' ? 'X' : trackName[index];
|
||||
if (marked === 'on') trackCompleted++;
|
||||
});
|
||||
|
||||
update[`${repeatingPrefix}track_display`] = trackDisplay.join(' ');
|
||||
update[`${repeatingPrefix}track_completed`] = trackCompleted;
|
||||
setAttrs(update);
|
||||
});
|
||||
};
|
||||
|
||||
const setAttitude = (personality = undefined, custom = false) => {
|
||||
getAttrs(['personality', 'attitude_override', 'attitude_boost_set', 'attitude_kick_set'], (values) => {
|
||||
const update = {};
|
||||
|
||||
const data = G_PLAYBOOKS[personality ?? values.personality];
|
||||
|
||||
// attitude
|
||||
if (custom || values.attitude_override === 'on') {
|
||||
update.attitude_boost = values.attitude_boost_set;
|
||||
update.attitude_kick = values.attitude_kick_set;
|
||||
} else {
|
||||
const { boost, kick } = data.attitude;
|
||||
update.attitude_boost = boost;
|
||||
update.attitude_kick = kick;
|
||||
}
|
||||
|
||||
setAttrs(update, {}, () => {});
|
||||
});
|
||||
};
|
||||
|
||||
const loadPersonality = (field) => {
|
||||
const update = {};
|
||||
const personality = field.trim().replace(' ', '_').toLowerCase();
|
||||
|
||||
const data = G_PLAYBOOKS[personality];
|
||||
|
||||
// attitude
|
||||
update.attitude_subtitle = getTranslationByKey(`${personality}_attitude`) || '';
|
||||
|
||||
// style & trouble
|
||||
update.style_run_bonus = getTranslationByKey(`${personality}_style`) || '';
|
||||
|
||||
// traits
|
||||
importFieldset('traits', 'trait', data.traits);
|
||||
|
||||
// personal gear
|
||||
importFieldset('gear', 'gear', data.gear);
|
||||
|
||||
setAttrs(update, {}, () => {
|
||||
setAttitude(personality);
|
||||
});
|
||||
};
|
||||
|
||||
const loadSignature = (signature) => {
|
||||
const isValid = Object.hasOwn(G_SIGNATURES, signature);
|
||||
if (!isValid) return;
|
||||
|
||||
const update = {};
|
||||
const data = G_SIGNATURES[signature];
|
||||
|
||||
// text stuff
|
||||
update.signature_function = getTranslationByKey(`${signature}_function`) || '';
|
||||
update.signature_description = getTranslationByKey(`${signature}_description`) || '';
|
||||
|
||||
importFieldset('mods', 'mod', data.mods, ['cost']);
|
||||
|
||||
setAttrs(update);
|
||||
};
|
||||
|
||||
/**
|
||||
* Need to map from attribute data map to populate translations
|
||||
* getAllAttrs to leave user created rows in the repeating section
|
||||
* https://wiki.roll20.net/Sheet_Worker_Scripts#WARNING
|
||||
* @param {*} fieldset
|
||||
* @param {*} data
|
||||
*/
|
||||
const importFieldset = (fieldset, prefix, data, additionalFields = []) => {
|
||||
getAllAttrs(G_AUTOGEN_FIELDSET[fieldset], [], (attributes, sections) => {
|
||||
const update = {};
|
||||
|
||||
const section = sections[`repeating_${fieldset}`];
|
||||
const idArray = new Set(section) ?? new Set([]);
|
||||
|
||||
// remove all autogen rows
|
||||
for (let rowId = 0; rowId < section.length; rowId++) {
|
||||
const repItem = `repeating_${fieldset}_${section[rowId]}`;
|
||||
if (attributes[`${repItem}_${prefix}_autogen`]) {
|
||||
removeRepeatingRow(repItem);
|
||||
}
|
||||
}
|
||||
|
||||
// add new records
|
||||
for (const key of data) {
|
||||
const rowId = createRowId(idArray);
|
||||
idArray.add(rowId);
|
||||
const repeating = `repeating_${fieldset}_${rowId}_${prefix}`;
|
||||
update[`${repeating}_autogen`] = 1;
|
||||
update[`${repeating}_name`] = getTranslationByKey(key) || '';
|
||||
update[`${repeating}_description`] = getTranslationByKey(`${key}_description`) || '';
|
||||
|
||||
for (const field of additionalFields) {
|
||||
update[`${repeating}_${field}`] = getTranslationByKey(`${key}_${field}`) || '';
|
||||
}
|
||||
}
|
||||
|
||||
setAttrs(update);
|
||||
});
|
||||
};
|
||||
|
||||
const createRowId = (sections) => {
|
||||
let rowId = generateRowID();
|
||||
while (sections.has(rowId)) {
|
||||
rowId = generateRowID();
|
||||
}
|
||||
return rowId;
|
||||
};
|
||||
|
||||
const loadFactions = () => {
|
||||
for (const factions of Object.keys(G_FACTIONS)) {
|
||||
const section = `repeating_${factions}-factions`;
|
||||
const sectionDetails = { ...G_FACTION_FIELDSET.at(0) };
|
||||
sectionDetails.section = section;
|
||||
|
||||
getAllAttrs([{ ...sectionDetails }], [], (values, sections) => {
|
||||
const update = {};
|
||||
const createdIds = [];
|
||||
|
||||
for (const faction of G_FACTIONS[factions]) {
|
||||
let rowId = generateRowID();
|
||||
while (rowId in createdIds) {
|
||||
rowId = generateRowID();
|
||||
}
|
||||
createdIds.push(rowId);
|
||||
|
||||
const repeatingPrefix = `repeating_${factions}-factions_${rowId}_faction_`;
|
||||
update[`${repeatingPrefix}autogen`] = 1;
|
||||
update[`${repeatingPrefix}name`] = getTranslationByKey(faction) || '';
|
||||
update[`${repeatingPrefix}description`] = getTranslationByKey(`${faction}_description`) || '';
|
||||
}
|
||||
|
||||
setAttrs(update);
|
||||
});
|
||||
|
||||
setAttrs({ load_factions: 1 }, { silent: true });
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,31 @@
|
||||
-
|
||||
data = {};
|
||||
data.global = {};
|
||||
data.options = {};
|
||||
data.character = {};
|
||||
data.crew = {};
|
||||
data.common = {};
|
||||
data.translation = {};
|
||||
|
||||
include data/global.data.pug
|
||||
include data/options.data.pug
|
||||
|
||||
include data/character.data.pug
|
||||
include data/character/downtime.data.pug
|
||||
include data/character/gear.data.pug
|
||||
include data/character/dicetray.data.pug
|
||||
include data/character/traits.data.pug
|
||||
include data/character/signature.data.pug
|
||||
include data/character/slams.data.pug
|
||||
|
||||
include data/common/tracks.data.pug
|
||||
include data/common/notes.data.pug
|
||||
|
||||
include data/crew.data.pug
|
||||
include data/crew/fractures.data.pug
|
||||
include data/crew/factions.data.pug
|
||||
|
||||
include data/translations/personalities.translation.pug
|
||||
include data/translations/gear.translation.pug
|
||||
include data/translations/signatures.translation.pug
|
||||
include data/translations/factions.translation.pug
|
||||
@@ -0,0 +1,159 @@
|
||||
-
|
||||
const doomBroadcast = [
|
||||
'&{template:slugcast}',
|
||||
'{{character=@{character_name}}}',
|
||||
'{{title=^{doom}}}',
|
||||
'{{^{doom_name}=@{doom_name}}}',
|
||||
'{{^{doom_description}=@{doom_description}}}',
|
||||
].join(' ');
|
||||
const legacyBroadcast = [
|
||||
'&{template:slugcast}',
|
||||
'{{character=@{character_name}}}',
|
||||
'{{title=^{legacy}}}',
|
||||
'{{^{legacy_name}=@{legacy_name}}}',
|
||||
'{{^{legacy_description}=@{legacy_description}}}',
|
||||
].join(' ');
|
||||
|
||||
data.character = {
|
||||
//- finish run clean up button?
|
||||
personalities: ['grit', 'guts', 'smarts', 'heart', 'chill'],
|
||||
header: {
|
||||
hidden: ['personality'],
|
||||
personality: {
|
||||
name: 'personality',
|
||||
dynamic: true,
|
||||
blockName: 'header',
|
||||
},
|
||||
custom: {
|
||||
name: 'personality_custom',
|
||||
label: 'Custom Personality',
|
||||
placeholder: 'Custom Personality',
|
||||
type: 'text',
|
||||
blockName: 'header',
|
||||
},
|
||||
fields: [
|
||||
{
|
||||
name: 'personality',
|
||||
label: 'Personality',
|
||||
placeholder: 'Personality',
|
||||
options: [
|
||||
{ name: 'select_playbook', text: 'Pick Your Personality' },
|
||||
{ name: 'grit', text: 'The Grit' },
|
||||
{ name: 'guts', text: 'The Guts' },
|
||||
{ name: 'smarts', text: 'The Smarts' },
|
||||
{ name: 'heart', text: 'The Heart' },
|
||||
{ name: 'chill', text: 'The Chill' },
|
||||
{ name: 'custom', text: 'Custom' },
|
||||
],
|
||||
type: 'select',
|
||||
blockName: 'header',
|
||||
},
|
||||
{
|
||||
name: 'character_name',
|
||||
label: 'Name',
|
||||
placeholder: 'Farrah',
|
||||
type: 'text',
|
||||
blockName: 'header',
|
||||
},
|
||||
{
|
||||
name: 'look',
|
||||
label: 'Look',
|
||||
placeholder: 'all black, muted, chains',
|
||||
type: 'text',
|
||||
blockName: 'header',
|
||||
},
|
||||
{ name: 'family', label: 'Family', placeholder: 'strict', type: 'text', blockName: 'header' },
|
||||
{
|
||||
name: 'bond',
|
||||
label: 'Bond',
|
||||
placeholder: 'natural chemistry',
|
||||
type: 'text',
|
||||
blockName: 'header',
|
||||
},
|
||||
{
|
||||
name: 'vibes',
|
||||
label: 'Vibes',
|
||||
placeholder: 'space cadet',
|
||||
type: 'text',
|
||||
blockName: 'header',
|
||||
},
|
||||
{
|
||||
name: 'stickers',
|
||||
label: 'Stickers, etc.',
|
||||
placeholder: "'Skate and/or Die' beside a cat in a box",
|
||||
type: 'text',
|
||||
blockName: 'header',
|
||||
},
|
||||
],
|
||||
},
|
||||
attitude: {
|
||||
subtitle: { name: 'attitude_subtitle', placeholder: "Select a playbook or add your own!", type: 'textarea', blockName: 'attitude' },
|
||||
fields: [
|
||||
{ name: 'attitude_boost', label: 'Attitude Boost', type: 'hidden', blockName: 'attitude' },
|
||||
{ name: 'attitude_kick', label: 'Attitude Kick', type: 'hidden', blockName: 'attitude' },
|
||||
],
|
||||
},
|
||||
style: {
|
||||
hidden: [{ name: 'style', type: 'hidden', blockName: 'style' }],
|
||||
subtitle: { name: 'style_run_bonus', placeholder: "Select a playbook or add your own!", type: 'textarea', blockName: 'style' },
|
||||
track: Array.from(Array(10).keys(), (i) => ({
|
||||
name: 'style',
|
||||
label: `${i} style`,
|
||||
value: i,
|
||||
type: 'radio',
|
||||
blockName: 'style',
|
||||
})),
|
||||
},
|
||||
trouble: {
|
||||
hidden: [{ name: 'trouble', type: 'hidden', blockName: 'trouble' }],
|
||||
actions: [
|
||||
{ name: 'nope', label: 'Nope!', type: 'action', blockName: 'trouble' },
|
||||
{ name: 'disaster', label: 'Roll Disaster', type: 'action', blockName: 'trouble' },
|
||||
],
|
||||
track: Array.from(Array(9).keys(), (i) => ({
|
||||
name: 'trouble',
|
||||
label: `${i} trouble`,
|
||||
value: i,
|
||||
type: 'radio',
|
||||
blockName: 'trouble',
|
||||
})),
|
||||
},
|
||||
legacy: {
|
||||
broadcast: legacyBroadcast,
|
||||
repeating: [
|
||||
{
|
||||
name: 'legacy_name',
|
||||
label: 'Legacy',
|
||||
placeholder: 'viral video of 1080',
|
||||
type: 'text',
|
||||
blockName: 'legacy',
|
||||
},
|
||||
{
|
||||
name: 'legacy_description',
|
||||
label: 'Description',
|
||||
placeholder: 'Description',
|
||||
type: 'textarea',
|
||||
blockName: 'legacy',
|
||||
},
|
||||
],
|
||||
},
|
||||
doom: {
|
||||
broadcast: doomBroadcast,
|
||||
repeating: [
|
||||
{
|
||||
name: 'doom_name',
|
||||
label: 'Doom',
|
||||
placeholder: "broke mom's trust",
|
||||
type: 'text',
|
||||
blockName: 'doom',
|
||||
},
|
||||
{
|
||||
name: 'doom_description',
|
||||
label: 'Description',
|
||||
placeholder: 'Description',
|
||||
type: 'textarea',
|
||||
blockName: 'doom',
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,38 @@
|
||||
-
|
||||
data.character.dicetray = {
|
||||
hidden: [],
|
||||
actions: [
|
||||
{ name: 'roll-character', label: 'Roll!', type: 'action', blockName: 'dicetray' },
|
||||
{ name: 'roll-character-trick', label: 'Do a Trick!', type: 'action', blockName: 'dicetray' },
|
||||
],
|
||||
fields: [
|
||||
{
|
||||
name: 'dicetray_boosts',
|
||||
label: 'Boost',
|
||||
type: 'number',
|
||||
min: 0,
|
||||
span: 6,
|
||||
blockName: 'dicetray',
|
||||
},
|
||||
{
|
||||
name: 'dicetray_kicks',
|
||||
label: 'Kick',
|
||||
type: 'number',
|
||||
min: 0,
|
||||
span: 6,
|
||||
blockName: 'dicetray',
|
||||
},
|
||||
{
|
||||
name: 'dicetray_dare',
|
||||
label: 'Dare',
|
||||
options: [
|
||||
{ name: 'choose_dare', text: 'choose dare...', selected: true },
|
||||
{ name: 'plus_1d6', text: '+1d6' },
|
||||
{ name: 'plus_kick', text: '1 kick' },
|
||||
{ name: 'clear_trouble', text: 'clear 1 trouble' },
|
||||
],
|
||||
type: 'select',
|
||||
blockName: 'dicetray',
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -0,0 +1,92 @@
|
||||
-
|
||||
const downtimeBroadcast = [
|
||||
'&{template:slugcast}',
|
||||
'{{character=@{character_name}}}',
|
||||
'{{title=^{downtime}}}',
|
||||
'{{^{downtime_name}=@{downtime_name}}}',
|
||||
'{{^{downtime_cost}=@{downtime_cost}}}',
|
||||
'{{^{downtime_description}=@{downtime_description}}}',
|
||||
'{{^{downtime_result}=@{downtime_result}}}',
|
||||
].join(' ');
|
||||
|
||||
data.character.downtime = {
|
||||
sections: [
|
||||
{ name: 'trait-beats', title: 'Trait Beats' },
|
||||
{ name: 'personality-arc', title: 'Personality Arc' },
|
||||
{ name: 'family-arc', title: 'Family Arc' },
|
||||
{ name: 'angst-arc', title: 'Angst Arc' },
|
||||
{ name: 'crew-beats', title: 'Crew Beats' },
|
||||
{ name: 'other-beats', title: 'Other Beats' },
|
||||
],
|
||||
beats: {
|
||||
'trait-beats': [
|
||||
{ name: "just_vibin", label: "Just Vibin' (2 style)", type: 'checkbox', blockName: 'beats beats--chill' },
|
||||
{ name: "grinding", label: "Grinding' (2 style)", type: 'checkbox', blockName: 'beats beats--grit' },
|
||||
{ name: "swagger", label: "Swagger (2 style)", type: 'checkbox', blockName: 'beats beats--guts' },
|
||||
{ name: "devotion", label: "Devotion (2 style)", type: 'checkbox', blockName: 'beats beats--heart' },
|
||||
{ name: "research", label: "Research (2 style)", type: 'checkbox', blockName: 'beats beats--smarts' },
|
||||
{ name: "custom_trait_beat", label: "Custom Trait Beat", placeholder: "Custom Trait Beat", type: 'text', blockName: 'beats beats--custom' },
|
||||
{ name: "origin_story", label: "Origin Story (3 style)", title: "A flashback that shows a defining moment from your past. +1 trait.", type: 'checkbox', blockName: 'beats' },
|
||||
{ name: "sharpened", label: "Sharpened (4 style)", title: "A teammate inspires you or shows you something about yourself. +1 trait.", type: 'checkbox', blockName: 'beats' },
|
||||
],
|
||||
'personality-arc': [
|
||||
{ name: "caught_in_a_plot", label: "Caught in a Plot (2 style)", type: 'checkbox', blockName: 'beats beats--chill' },
|
||||
{ name: "serendipity", label: "Serendipity (1 style)", type: 'checkbox', blockName: 'beats beats--chill' },
|
||||
{ name: "in_too_deep", label: "In Too Deep (4 trouble)", type: 'checkbox', blockName: 'beats beats--chill' },
|
||||
{ name: "somehow_works_out", label: "Somehow Works Out (3 style)", type: 'checkbox', blockName: 'beats beats--chill' },
|
||||
{ name: "a_goal", label: "A Goal (1 style)", type: 'checkbox', blockName: 'beats beats--grit' },
|
||||
{ name: "setbacks", label: "Setbacks (2 style)", type: 'checkbox', blockName: 'beats beats--grit' },
|
||||
{ name: "quitting", label: "Quitting (4 trouble)", type: 'checkbox', blockName: 'beats beats--grit' },
|
||||
{ name: "perseverance", label: "Perseverance (3 style)", type: 'checkbox', blockName: 'beats beats--grit' },
|
||||
{ name: "spotlight", label: "Spotlight (3 style)", type: 'checkbox', blockName: 'beats beats--guts' },
|
||||
{ name: "star_power", label: "Star Power (2 style)", type: 'checkbox', blockName: 'beats beats--guts' },
|
||||
{ name: "going_solo", label: "Going Solo (4 trouble)", type: 'checkbox', blockName: 'beats beats--guts' },
|
||||
{ name: "the_i_in_team", label: "The I in Team (1 style)", type: 'checkbox', blockName: 'beats beats--guts' },
|
||||
{ name: "dalliance", label: "Dalliance (2 style)", type: 'checkbox', blockName: 'beats beats--heart' },
|
||||
{ name: "catching_feelings", label: "Catching Feelings (1 style)", type: 'checkbox', blockName: 'beats beats--heart' },
|
||||
{ name: "us_or_them", label: "Us or Them (4 trouble)", type: 'checkbox', blockName: 'beats beats--heart' },
|
||||
{ name: "love_conquers_all", label: "Love Conquers All (3 style)", type: 'checkbox', blockName: 'beats beats--heart' },
|
||||
{ name: "inspiration", label: "Inspiration (1 style)", type: 'checkbox', blockName: 'beats beats--smarts' },
|
||||
{ name: "results", label: "Results (2 style)", type: 'checkbox', blockName: 'beats beats--smarts' },
|
||||
{ name: "unintended_consequences", label: "Unintended Consequences (4 trouble)", type: 'checkbox', blockName: 'beats beats--smarts' },
|
||||
{ name: "full_realization", label: "Full Realization (3 style)", type: 'checkbox', blockName: 'beats beats--smarts' },
|
||||
{ name: "custom_personality_arc_1", placeholder: "Custom Personality Arc", type: 'text', blockName: 'beats beats--custom' },
|
||||
{ name: "custom_personality_arc_2", placeholder: "Custom Personality Arc", type: 'text', blockName: 'beats beats--custom' },
|
||||
{ name: "custom_personality_arc_3", placeholder: "Custom Personality Arc", type: 'text', blockName: 'beats beats--custom' },
|
||||
{ name: "custom_personality_arc_4", placeholder: "Custom Personality Arc", type: 'text', blockName: 'beats beats--custom' },
|
||||
],
|
||||
'family-arc': [
|
||||
{ name: "trouble_at_home", label: "Trouble at Home (2 trouble)", type: 'checkbox', blockName: 'beats' },
|
||||
{ name: "final_warning", label: "Final Warning (3 trouble)", type: 'checkbox', blockName: 'beats' },
|
||||
{ name: "last_straw", label: "Last Straw (4 trouble)", type: 'checkbox', blockName: 'beats' },
|
||||
{ name: "redemption", label: "Redemption (4 style)", type: 'checkbox', blockName: 'beats' },
|
||||
],
|
||||
'angst-arc': [
|
||||
{ name: "angst", label: "Angst (2 trouble)", type: 'checkbox', blockName: 'beats' },
|
||||
{ name: "struggling", label: "Struggling (3 trouble)", type: 'checkbox', blockName: 'beats' },
|
||||
{ name: "darkness", label: "Darkness (4 trouble)", type: 'checkbox', blockName: 'beats' },
|
||||
{ name: "catharsis", label: "Catharsis (4 style)", type: 'checkbox', blockName: 'beats' },
|
||||
],
|
||||
'crew-beats': [
|
||||
{ name: "opportunity", label: "Opportunity (2 style)", type: 'checkbox', blockName: 'beats' },
|
||||
{ name: "challenge", label: "Challenge (5 trouble)", type: 'checkbox', blockName: 'beats' },
|
||||
{ name: "fight", label: "Fight (5 trouble)", type: 'checkbox', blockName: 'beats' },
|
||||
{ name: "make_up", label: "Make Up (5 style)", type: 'checkbox', blockName: 'beats' },
|
||||
],
|
||||
'other-beats': [
|
||||
{ name: "being_good", label: "Being Good (1 style)", type: 'checkbox', blockName: 'beats' },
|
||||
{ name: "you_earned_it", label: "You Earned It (5 style)", type: 'checkbox', blockName: 'beats' },
|
||||
{ name: "take_an_l", label: "Take an L (5 trouble)", type: 'checkbox', blockName: 'beats' },
|
||||
{ name: "in_the_lab", label: "In the Lab (1 style)", type: 'checkbox', blockName: 'beats' },
|
||||
{ name: "portal_discovery", label: "Portal Discovery (2 style)", type: 'checkbox', blockName: 'beats' },
|
||||
],
|
||||
},
|
||||
broadcast: downtimeBroadcast,
|
||||
repeating: [
|
||||
{ name: 'downtime_check', label: 'Check', placeholder: 'Check', type: 'checkbox', span: 1, blockName: 'downtime' },
|
||||
{ name: 'downtime_name', label: 'Name', placeholder: 'Name', type: 'text', span: 11, blockName: 'downtime' },
|
||||
{ name: 'downtime_cost', label: 'Cost', placeholder: 'Cost', type: 'text', blockName: 'downtime' },
|
||||
{ name: 'downtime_description', label: 'Description', placeholder: 'Description', type: 'textarea', blockName: 'downtime', },
|
||||
{ name: 'downtime_result', label: 'Result', placeholder: 'Result', type: 'text', blockName: 'downtime', },
|
||||
],
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
-
|
||||
const gearBroadcast = [
|
||||
'&{template:slugcast}',
|
||||
'{{character=@{character_name}}}',
|
||||
'{{title=^{gear}}}',
|
||||
'{{^{gear_name}=@{gear_name}}}',
|
||||
'{{^{gear_cost}=@{gear_cost}}}',
|
||||
'{{^{gear_description}=@{gear_description}}}',
|
||||
].join(' ');
|
||||
|
||||
data.character.gear = {
|
||||
phone: {
|
||||
name: 'your_phone',
|
||||
label: 'Your Phone',
|
||||
placeholder: 'touch-screen, stylus, keypad, scrollwheel, etc.',
|
||||
type: 'text',
|
||||
blockName: 'gear',
|
||||
},
|
||||
board: {
|
||||
name: 'your_board',
|
||||
label: 'Your Board',
|
||||
placeholder: 'street deck with hologram griptape',
|
||||
type: 'text',
|
||||
blockName: 'gear',
|
||||
},
|
||||
raygun: {
|
||||
name: 'your_raygun',
|
||||
label: 'Your Raygun',
|
||||
placeholder: 'circuit-bent photon pistol',
|
||||
type: 'text',
|
||||
blockName: 'gear',
|
||||
},
|
||||
hidden: [{ name: 'gear_autogen', type: 'hidden', blockName: 'gear' }],
|
||||
broadcast: gearBroadcast,
|
||||
repeating: [
|
||||
{ name: 'gear_check', label: 'Select Gear', type: 'checkbox', span: 1, blockName: 'gear' },
|
||||
{
|
||||
name: 'gear_name',
|
||||
label: 'Gear',
|
||||
placeholder: 'grappling hook',
|
||||
type: 'text',
|
||||
span: 11,
|
||||
blockName: 'gear',
|
||||
},
|
||||
{ name: 'gear_cost', label: 'Cost', placeholder: '1 coil', type: 'text', blockName: 'gear' },
|
||||
{
|
||||
name: 'gear_description',
|
||||
label: 'Description',
|
||||
placeholder:
|
||||
'A pistol-sized launcher that fires an anti-negafriction dart which sticks firmly to most surfaces until switched off. The dart is attached to a hundred feet of lightweight carbon-fibre cable, which can be retracted via the launcher’s micro-winch.',
|
||||
type: 'textarea',
|
||||
blockName: 'gear',
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -0,0 +1,179 @@
|
||||
-
|
||||
const modsBroadcast = [
|
||||
'&{template:slugcast}',
|
||||
'{{character=@{character_name}}}',
|
||||
'{{title=^{mods}}}',
|
||||
'{{^{mod_name}=@{mod_name}}}',
|
||||
'{{^{mod_cost}=@{mod_cost}}}',
|
||||
'{{^{mod_description}=@{mod_description}}}',
|
||||
].join(' ');
|
||||
|
||||
data.signature = {
|
||||
signatures: [
|
||||
"gravity_blaster",
|
||||
"hardlight_board",
|
||||
"hyperoptic_visor",
|
||||
"kinetic_deck",
|
||||
"negafriction_sword",
|
||||
"photonic_jacket",
|
||||
"powered_armour",
|
||||
"reality_cannon",
|
||||
"riftninja_sneakers",
|
||||
"robotic_companion",
|
||||
"skipmode_runners",
|
||||
"voidwear_backpack",
|
||||
],
|
||||
hidden: ["signature"],
|
||||
signature: {
|
||||
name: "signature",
|
||||
dynamic: true,
|
||||
blockName: "signatures",
|
||||
},
|
||||
custom: {
|
||||
name: "signature_custom",
|
||||
label: "Custom signature",
|
||||
placeholder: "Custom signature",
|
||||
type: "text",
|
||||
blockName: "signatures",
|
||||
},
|
||||
fields: [
|
||||
{
|
||||
name: "signature",
|
||||
label: "signature",
|
||||
placeholder: "Signature",
|
||||
options: [
|
||||
{ name: "select_signature", text: "Pick Your Signature" },
|
||||
{ name: "gravity_blaster", text: "Gravity Blaster" },
|
||||
{ name: "hardlight_board", text: "Hardlight Board" },
|
||||
{ name: "hyperoptic_visor", text: "Hyperoptic Visor" },
|
||||
{ name: "kinetic_deck", text: "Kinetic Deck" },
|
||||
{ name: "negafriction_sword", text: "Negafriction Sword" },
|
||||
{ name: "photonic_jacket", text: "Photonic Jacket" },
|
||||
{ name: "powered_armour", text: "Powered Armour" },
|
||||
{ name: "reality_cannon", text: "Reality Cannon" },
|
||||
{ name: "riftninja_sneakers", text: "Riftninja Sneakers" },
|
||||
{ name: "robotic_companion", text: "Robotic Companion" },
|
||||
{ name: "skipmode_runners", text: "Skipmode Runners" },
|
||||
{ name: "voidwear_backpack", text: "Voidwear Backpack" },
|
||||
{ name: "custom", text: "Custom" },
|
||||
],
|
||||
type: "select",
|
||||
blockName: "header",
|
||||
},
|
||||
{
|
||||
name: "signature_description",
|
||||
label: "Description",
|
||||
placeholder:
|
||||
"Negafriction is just what it sounds like: complete nonsense.",
|
||||
type: "textarea",
|
||||
blockName: "signatures",
|
||||
},
|
||||
{
|
||||
name: "signature_function",
|
||||
label: "Function",
|
||||
placeholder:
|
||||
"Roll to slice, dice, chop, and stab things (or nonlethally smack them with the kinetically-charged sheath).",
|
||||
type: "textarea",
|
||||
blockName: "signatures",
|
||||
},
|
||||
{
|
||||
name: "signature_look",
|
||||
label: "Look",
|
||||
placeholder: "hardlight katana",
|
||||
type: "text",
|
||||
blockName: "signatures",
|
||||
},
|
||||
],
|
||||
turbo: {
|
||||
fields: [
|
||||
{
|
||||
name: "turbo_boost",
|
||||
label: "Turbo Boost",
|
||||
type: "hidden",
|
||||
blockName: "turbo",
|
||||
},
|
||||
{
|
||||
name: "turbo_kick",
|
||||
label: "Turbo Kick",
|
||||
type: "hidden",
|
||||
blockName: "turbo",
|
||||
},
|
||||
],
|
||||
},
|
||||
mods: {
|
||||
hidden: [{ name: "mod_autogen", type: "hidden", blockName: "mod" }],
|
||||
fields: [
|
||||
{
|
||||
name: "turbo_boost",
|
||||
label: "Add +1 boost",
|
||||
type: "checkbox",
|
||||
blockName: "mods",
|
||||
},
|
||||
{
|
||||
name: "turbo_kick",
|
||||
label: "Add +1 kick",
|
||||
type: "checkbox",
|
||||
blockName: "mods",
|
||||
},
|
||||
],
|
||||
broadcast: modsBroadcast,
|
||||
repeating: [
|
||||
{
|
||||
name: "mod_check",
|
||||
label: "Select mod",
|
||||
type: "checkbox",
|
||||
span: 1,
|
||||
blockName: "mods",
|
||||
},
|
||||
{
|
||||
name: "mod_name",
|
||||
label: "mod",
|
||||
placeholder: "Slip Rattle",
|
||||
type: "text",
|
||||
span: 11,
|
||||
blockName: "mods",
|
||||
},
|
||||
{
|
||||
name: "mod_cost",
|
||||
label: "Cost",
|
||||
placeholder: "1 coil, 1 disc",
|
||||
type: "text",
|
||||
blockName: "mods",
|
||||
},
|
||||
{
|
||||
name: "mod_description",
|
||||
label: "Description",
|
||||
placeholder:
|
||||
"Roll to teleport in-universe by slicing spacetime. If you can’t see your destination, potential problems are worse.",
|
||||
type: "textarea",
|
||||
blockName: "mods",
|
||||
},
|
||||
],
|
||||
},
|
||||
components: [
|
||||
{
|
||||
name: "lenses",
|
||||
label: "Lenses",
|
||||
type: "radio",
|
||||
blockName: "components",
|
||||
},
|
||||
{
|
||||
name: "coils",
|
||||
label: "Coils",
|
||||
type: "radio",
|
||||
blockName: "components",
|
||||
},
|
||||
{
|
||||
name: "discs",
|
||||
label: "Discs",
|
||||
type: "radio",
|
||||
blockName: "components",
|
||||
},
|
||||
{
|
||||
name: "gems",
|
||||
label: "Gems",
|
||||
type: "radio",
|
||||
blockName: "components"
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -0,0 +1,30 @@
|
||||
-
|
||||
const slamsBroadcast = [
|
||||
'&{template:slugcast}',
|
||||
'{{character=@{character_name}}}',
|
||||
'{{title=^{slams}}}',
|
||||
'{{^{slam_1}=@{slam_1}}}',
|
||||
'{{^{slam_2}=@{slam_2}}}',
|
||||
'{{^{slam_3}=@{slam_3}}}',
|
||||
].join(' ');
|
||||
|
||||
data.character.slams = {
|
||||
broadcast: slamsBroadcast,
|
||||
fields: [
|
||||
{
|
||||
name: 'slam_1',
|
||||
label: 'Super Slam',
|
||||
placeholder: 'super bruised ribs',
|
||||
type: 'text',
|
||||
blockName: 'slams',
|
||||
},
|
||||
{
|
||||
name: 'slam_2',
|
||||
label: 'Slam 1',
|
||||
placeholder: 'frustrated',
|
||||
type: 'text',
|
||||
blockName: 'slams',
|
||||
},
|
||||
{ name: 'slam_3', label: 'Slam 2', placeholder: 'slimed', type: 'text', blockName: 'slams' },
|
||||
],
|
||||
};
|
||||
@@ -0,0 +1,38 @@
|
||||
-
|
||||
const traitsBroadcast = [
|
||||
'&{template:slugcast}',
|
||||
'{{character=@{character_name}}}',
|
||||
'{{title=^{traits}}}',
|
||||
'{{^{trait_name}=@{trait_name}}}',
|
||||
'{{^{trait_description}=@{trait_description}}}',
|
||||
].join(' ');
|
||||
|
||||
data.character.traits = {
|
||||
hidden: [{ name: 'trait_autogen', type: 'hidden', blockName: 'traits' }],
|
||||
broadcast: traitsBroadcast,
|
||||
repeating: [
|
||||
{
|
||||
name: 'trait_check',
|
||||
label: 'Select trait',
|
||||
type: 'checkbox',
|
||||
span: 1,
|
||||
blockName: 'traits',
|
||||
},
|
||||
{
|
||||
name: 'trait_name',
|
||||
label: 'trait',
|
||||
placeholder: 'Patient',
|
||||
type: 'text',
|
||||
span: 11,
|
||||
blockName: 'traits',
|
||||
},
|
||||
{
|
||||
name: 'trait_description',
|
||||
label: 'Description',
|
||||
placeholder:
|
||||
'When you reveal how you’ve been waiting to act, get +1d6 or +1 kick on your action.',
|
||||
type: 'textarea',
|
||||
blockName: 'traits',
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -0,0 +1,28 @@
|
||||
-
|
||||
const noteBroadcast = [
|
||||
'&{template:slugcast}',
|
||||
'{{character=@{character_name}}}',
|
||||
'{{title=^{notes}}}',
|
||||
'{{^{note_name}=@{note_name}}}',
|
||||
'{{^{note_description}=@{note_description}}}',
|
||||
].join(' ');
|
||||
|
||||
data.common.notes = {
|
||||
broadcast: noteBroadcast,
|
||||
repeating: [
|
||||
{
|
||||
name: 'note_name',
|
||||
label: 'Note',
|
||||
placeholder: "broke mom's trust",
|
||||
type: 'text',
|
||||
blockName: 'notes',
|
||||
},
|
||||
{
|
||||
name: 'note_description',
|
||||
label: 'Description',
|
||||
placeholder: 'Description',
|
||||
type: 'textarea',
|
||||
blockName: 'notes',
|
||||
},
|
||||
],
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
-
|
||||
const trackBroadcast = [
|
||||
'&{template:slugcast}',
|
||||
'{{character=@{character_name}}}',
|
||||
'{{title=@{track_display}}}',
|
||||
'{{^{track_name}=@{track_name} (@{track_completed}/@{track_size})}}',
|
||||
//- '{{^{track_progress}=@{track_completed}/@{track_size}}}',
|
||||
'{{^{track_description}=@{track_description}}}',
|
||||
].join(' ');
|
||||
|
||||
data.common.tracks = {
|
||||
hidden: [
|
||||
{ name: 'track_completed', label: 'Completed', type: 'hidden', blockName: 'tracks' },
|
||||
{ name: 'track_size', label: 'Size', type: 'hidden', blockName: 'tracks' },
|
||||
{ name: 'track_display', label: 'Progress Track', type: 'hidden', blockName: 'tracks' },
|
||||
],
|
||||
broadcast: trackBroadcast,
|
||||
track: {
|
||||
letter: { name: 'track_letter', label: 'Track', type: 'hidden', blockName: 'tracks' },
|
||||
marker: { name: 'track_marker', label: 'Track', type: 'checkbox', blockName: 'tracks' },
|
||||
},
|
||||
repeating: [
|
||||
{
|
||||
name: 'track_name',
|
||||
label: 'Track',
|
||||
placeholder: "SKATE",
|
||||
type: 'text',
|
||||
blockName: 'tracks',
|
||||
},
|
||||
//- {
|
||||
//- name: 'track_size',
|
||||
//- label: 'Size',
|
||||
//- options: [
|
||||
//- { name: 'custom', text: 'Custom', selected: true },
|
||||
//- { name: 'four', value: '4', text: '4 (four)' },
|
||||
//- { name: 'six', value: '6', text: '6 (six)' },
|
||||
//- { name: 'eight', value: '8', text: '8 (eight)' },
|
||||
//- { name: 'ten', value: '10', text: '10 (ten)' },
|
||||
//- { name: 'twelve', value: '12', text: '12 (twelve)' },
|
||||
//- ],
|
||||
//- type: 'select',
|
||||
//- blockName: 'tracks',
|
||||
//- },
|
||||
{
|
||||
name: 'track_description',
|
||||
label: 'Description',
|
||||
placeholder: 'Description',
|
||||
type: 'textarea',
|
||||
blockName: 'tracks',
|
||||
},
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,113 @@
|
||||
-
|
||||
data.crew = {
|
||||
header: {
|
||||
fields: [
|
||||
{
|
||||
name: 'character_name',
|
||||
label: 'Name',
|
||||
placeholder: 'Farrah',
|
||||
type: 'text',
|
||||
blockName: 'header',
|
||||
},
|
||||
{
|
||||
name: 'brands',
|
||||
label: 'Brands',
|
||||
placeholder: 'good kids, weirdos',
|
||||
type: 'text',
|
||||
blockName: 'header',
|
||||
},
|
||||
{ name: 'hangouts', label: 'Hangouts', placeholder: 'the gas station', type: 'text', blockName: 'header' },
|
||||
]
|
||||
},
|
||||
style: {
|
||||
hidden: [{ name: 'crew_style', type: 'hidden', blockName: 'style' }],
|
||||
subtitle: { name: 'style_run_bonus', type: 'span', blockName: 'style' },
|
||||
track: Array.from(Array(11).keys(), (i) => ({
|
||||
name: 'crew_style',
|
||||
label: `${i} style`,
|
||||
value: i,
|
||||
type: 'radio',
|
||||
blockName: 'style',
|
||||
})),
|
||||
},
|
||||
hype: {
|
||||
fields: [
|
||||
{ name: 'hype_boost', label: 'Hype Boost', type: 'hidden', blockName: 'hype' },
|
||||
{ name: 'hype_kick', label: 'Hype Kick', type: 'hidden', blockName: 'hype' },
|
||||
],
|
||||
},
|
||||
fame: {
|
||||
ranks: {
|
||||
nobodies: {
|
||||
label: { name: 'nobodies', label: 'Nobodies', type: 'checkbox', blockName: 'fame' },
|
||||
perks: [
|
||||
{ name: 'masks', label: 'Masks (2 style)', type: 'checkbox', blockName: 'fame' },
|
||||
{ name: 'advanced_portal_tech', label: 'Advanced Portal Tech (2 style)', type: 'checkbox', blockName: 'fame' },
|
||||
],
|
||||
},
|
||||
up_and_comers: {
|
||||
label: { name: "up_and_comers", label: "Up & Comers", type: 'checkbox', blockName: 'fame' },
|
||||
style: { name: "up_and_comers_style", label: "5 style", type: 'checkbox', blockName: 'fame' },
|
||||
perks: [
|
||||
{ name: "hazwear", label: "Hazwear (2 style)", type: 'checkbox', blockName: 'fame' },
|
||||
{ name: "sticker_spotted", label: "Sticker Spotted (4 style)", type: 'checkbox', blockName: 'fame' },
|
||||
{ name: "protective_fans", label: "Protective Fans (5 style)", type: 'checkbox', blockName: 'fame' },
|
||||
{ name: "blurb", label: "Blurb (5 style)", type: 'checkbox', blockName: 'fame' },
|
||||
]
|
||||
},
|
||||
well_established: {
|
||||
label: { name: "well_established", label: "Well-Established", type: 'checkbox', blockName: 'fame' },
|
||||
style: { name: "well_established_style", label: "7 style", type: 'checkbox', blockName: 'fame' },
|
||||
perks: [
|
||||
{ name: "logic_binders", label: "Logic Binders (3 style)", type: 'checkbox', blockName: 'fame' },
|
||||
{ name: "small_press_merch", label: "Small-Press Merch (4 style)", type: 'checkbox', blockName: 'fame' },
|
||||
{ name: "improved_hangout", label: "Improved Hangout (4 style)", type: 'checkbox', blockName: 'fame' },
|
||||
{ name: "diehard_fans", label: "Diehard Fans (5 style)", type: 'checkbox', blockName: 'fame' },
|
||||
]
|
||||
},
|
||||
major_players: {
|
||||
label: { name: "major_players", label: "Major Players", type: 'checkbox', blockName: 'fame' },
|
||||
style: { name: "major_players_style", label: "9 style", type: 'checkbox', blockName: 'fame' },
|
||||
perks: [
|
||||
{ name: "name_on_a_shoe", label: "Name on a Shoe (5 style)", type: 'checkbox', blockName: 'fame' },
|
||||
{ name: "eponymous", label: "Eponymous (5 style)", type: 'checkbox', blockName: 'fame' },
|
||||
{ name: "article", label: "Article (5 style)", type: 'checkbox', blockName: 'fame' },
|
||||
{ name: "tastemaker_fans", label: "Tastemaker Fans (5 style)", type: 'checkbox', blockName: 'fame' },
|
||||
]
|
||||
},
|
||||
rising_stars: {
|
||||
label: { name: "rising_stars", label: "Rising Stars", type: 'checkbox', blockName: 'fame' },
|
||||
style: { name: "rising_stars_style", label: "9 style", type: 'checkbox', blockName: 'fame' },
|
||||
perks: [
|
||||
{ name: "quantum_hangout", label: "Quantum Hangout (5 style)", type: 'checkbox', blockName: 'fame' },
|
||||
{ name: "image_rights", label: "Image Rights (5 style)", type: 'checkbox', blockName: 'fame' },
|
||||
{ name: "screaming_fans", label: "Screaming Fans (5 style) ", type: 'checkbox', blockName: 'fame' },
|
||||
{ name: "cover_story", label: "Cover Story (5 style)", type: 'checkbox', blockName: 'fame' },
|
||||
]
|
||||
},
|
||||
legends: {
|
||||
label: { name: "legends", label: "Legends", type: 'checkbox', blockName: 'fame' },
|
||||
style: { name: "legends_style", label: "11 style", type: 'checkbox', blockName: 'fame' },
|
||||
perks: [
|
||||
{ name: "you_did_it", label: "You did it", type: 'checkbox', blockName: 'fame' },
|
||||
]
|
||||
},
|
||||
},
|
||||
hype: [
|
||||
{
|
||||
name: "hype_boost",
|
||||
label: "Extra Boost",
|
||||
type: "select",
|
||||
blockname: "fame",
|
||||
options: Array.from(Array(3).keys(), (i) => ({ name: i, text: `+${i}`}))
|
||||
},
|
||||
{
|
||||
name: "hype_kick",
|
||||
label: "Extra Kick",
|
||||
type: "select",
|
||||
blockname: "fame",
|
||||
options: Array.from(Array(3).keys(), (i) => ({ name: i, text: `+${i}`}))
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
-
|
||||
const factionBroadcast = [
|
||||
'&{template:slugcast}',
|
||||
'{{character=@{character_name}}}',
|
||||
'{{title=^{factions}}}',
|
||||
'{{^{faction_name}=@{faction_name}}}',
|
||||
'{{^{faction_relationship}=@{faction_relationship}}}',
|
||||
'{{^{faction_description}=@{faction_description}}}',
|
||||
].join(' ');
|
||||
|
||||
data.crew.factions = {
|
||||
sections: [
|
||||
{ name: 'crew-factions', title: 'Crews' },
|
||||
{ name: 'authority-factions', title: 'Authorities' },
|
||||
{ name: 'sponsor-factions', title: 'Sponsors' },
|
||||
{ name: 'crowd-factions', title: 'Crowds' },
|
||||
],
|
||||
broadcast: factionBroadcast,
|
||||
hidden: [
|
||||
{ name: 'faction_autogen', type: 'hidden', blockName: 'faction' },
|
||||
],
|
||||
repeating: [
|
||||
{ name: 'faction_name', label: 'Faction Name', placeholder: 'Faction', type: 'text', span: 8, blockName: 'faction' },
|
||||
{ name: 'faction_relationship', label: 'Relationship', placeholder: '0', options: [
|
||||
{ name: 'faction_relationship_ally', value: '+3', text: 'Ally (+3)' },
|
||||
{ name: 'faction_relationship_tight', value: '+2', text: 'Tight (+2)' },
|
||||
{ name: 'faction_relationship_friendly', value: '+1', text: 'Friendly (+1)' },
|
||||
{ name: 'faction_relationship_neutral', value: '±0', text: 'Neutral (±0)', selected: true },
|
||||
{ name: 'faction_relationship_unfriendly', value: '-1', text: 'Unfriendly (-1)' },
|
||||
{ name: 'faction_relationship_rivals', value: '-2', text: 'Rivals (-2)' },
|
||||
{ name: 'faction_relationship_enemy', value: '-3', text: 'Enemy (-3)' },
|
||||
{ name: 'faction_relationship_unstable', value: '!!', text: 'Unstable (!!)' },
|
||||
], type: 'select', span: 4, blockName: 'faction'
|
||||
},
|
||||
{
|
||||
name: 'faction_description',
|
||||
label: 'Description',
|
||||
placeholder: 'Description',
|
||||
type: 'textarea',
|
||||
blockName: 'faction',
|
||||
},
|
||||
],
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
-
|
||||
const fracturesBroadcast = [
|
||||
'&{template:slugcast}',
|
||||
'{{character=@{character_name}}}',
|
||||
'{{title=^{fractures}}}',
|
||||
'{{^{fracture_1}=@{fracture_1}}}',
|
||||
'{{^{fracture_2}=@{fracture_2}}}',
|
||||
].join(' ');
|
||||
|
||||
data.character.fractures = {
|
||||
broadcast: fracturesBroadcast,
|
||||
fields: [
|
||||
{
|
||||
name: 'fracture_1',
|
||||
label: 'Fracture 1',
|
||||
placeholder: 'going solo',
|
||||
type: 'text',
|
||||
blockName: 'fractures',
|
||||
},
|
||||
{
|
||||
name: 'fracture_2',
|
||||
label: 'Fracture 2',
|
||||
placeholder: 'catching feelings',
|
||||
type: 'text',
|
||||
blockName: 'fractures',
|
||||
},
|
||||
//- { name: 'fracture_3', label: 'fracture 2', placeholder: 'slimed', type: 'text', blockName: 'fractures' },
|
||||
],
|
||||
};
|
||||
@@ -0,0 +1,12 @@
|
||||
-
|
||||
data.global = {
|
||||
sheet_mode: { name: "sheet_mode", type: "hidden", value: 'character', blockName: "nav" },
|
||||
sheet_version: { name: "sheet_version", label: 'Version', value: "1.0.0", type: "hidden", blockName: "nav" },
|
||||
nav: {
|
||||
actions: [
|
||||
{ name: "character", label: "Character", type: "action", blockName: "nav" },
|
||||
{ name: "crew", label: "Crew", type: "action", blockName: "nav" },
|
||||
{ name: "options", label: "Options", type: "action", blockName: "nav" },
|
||||
],
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
-
|
||||
data.options = {
|
||||
attitude: {
|
||||
override: {
|
||||
name: "attitude_override",
|
||||
label: "Override Attitude",
|
||||
type: "checkbox",
|
||||
blockName: "options",
|
||||
},
|
||||
selects: [
|
||||
{
|
||||
name: "attitude_boost_set",
|
||||
label: "Override Boost",
|
||||
type: "select",
|
||||
blockName: "options",
|
||||
options: Array.from(Array(5).keys(), (i) => ({ name: i, text: `+${i}`}))
|
||||
},
|
||||
{
|
||||
name: "attitude_kick_set",
|
||||
label: "Override Kick",
|
||||
type: "select",
|
||||
blockName: "options",
|
||||
options: Array.from(Array(5).keys(), (i) => ({ name: i, text: `+${i}`}))
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
-
|
||||
data.translation.factions = {
|
||||
brb: 'BRB',
|
||||
brb_description: 'A crew of straight-laced, athletic, and super competitive laserbladers.',
|
||||
jet_collective: 'Jet Collective',
|
||||
jet_collective_description:
|
||||
'A large crew of inclusive activists with an addiction to petty drama.',
|
||||
null_range: 'Null Range',
|
||||
null_range_description: 'An obnoxious, anti-authoritarian crew of older kids from Hillview.',
|
||||
lazy_bunny: 'Lazy Bunny',
|
||||
lazy_bunny_description:
|
||||
'Super mainstream, super broish, super nice live-streamers having their moment.',
|
||||
the_wicks: 'The Wicks',
|
||||
the_wicks_description: 'A crew of young, rowdy, disenfranchised up-and-comers.',
|
||||
miper: 'Miper',
|
||||
miper_description: 'A sleek, idealistic big-tech company.',
|
||||
hardecker: 'Hardecker.',
|
||||
hardecker_description: 'A clueless blue-collar brand that’s just been made cool.',
|
||||
wilkies: 'Wilkie’s',
|
||||
wilkies_description: 'Candy, toys, energy drinks, x-treme sports.',
|
||||
scram_cat: 'Scram Cat',
|
||||
scram_cat_description:
|
||||
'The original indie slugblasting shop, in the process of becoming a Miper subsidiary.',
|
||||
fust: 'FUST',
|
||||
fust_description: 'Last real indie sponsor, owned/operated by total a-holes.',
|
||||
dara: 'DARA',
|
||||
dara_description:
|
||||
'Big, mysterious research facility. Its Rescue division act as Hillview’s portal cops.',
|
||||
the_arborists: 'The Arborists',
|
||||
the_arborists_description: 'An ancient sect of planeswalkers from Thennis Spar.',
|
||||
shimmer: 'Shimmer',
|
||||
shimmer_description: 'Transversal criminal syndicate.',
|
||||
doorways: 'Doorways',
|
||||
doorways_description: 'Concerned parent group from Hillview.',
|
||||
the_old_guard: 'The Old Guard',
|
||||
the_old_guard_description: 'Promoters, magazine editors, and retired slugblasters.',
|
||||
the_thrashers: 'The Thrashers',
|
||||
the_thrashers_description:
|
||||
'The partiers, hipsters, and artists. They value authenticity, aesthetic, and attitude.',
|
||||
the_heads: 'The Heads',
|
||||
the_heads_description: 'The nerds, athletes, and aficionados. They value skill and innovation.',
|
||||
the_mavens: 'The Mavens',
|
||||
the_mavens_description:
|
||||
'The activists, punks, and die-hards. They value community and standing for something.',
|
||||
the_freaks: 'The Freaks',
|
||||
the_freaks_description:
|
||||
'The ravers, crusties, and oddballs. They value originality and expression.',
|
||||
the_normies: 'The Normies',
|
||||
the_normies_description: 'The mainstreamers, pre-teens, and basics. They value fun.',
|
||||
};
|
||||
@@ -0,0 +1,97 @@
|
||||
-
|
||||
data.translation.gear = {
|
||||
//- your_phone: 'your phone',
|
||||
//- your_phone_cost: '',
|
||||
//- your_phone_description: '',
|
||||
};
|
||||
|
||||
//- grappling_hook: 'grappling hook',
|
||||
//- grappling_hook_cost: '',
|
||||
//- grappling_hook_description: '',
|
||||
//- spacetime_ampimeter: 'spacetime ampimeter',
|
||||
//- spacetime_ampimeter_cost: '',
|
||||
//- spacetime_ampimeter_description: '',
|
||||
//- hacking_tools: 'hacking tools',
|
||||
//- hacking_tools_cost: '',
|
||||
//- hacking_tools_description: '',
|
||||
//- multiversal_maps: 'multiversal maps',
|
||||
//- multiversal_maps_cost: '',
|
||||
//- multiversal_maps_description: '',
|
||||
//- repair_tools: 'repair tools',
|
||||
//- repair_tools_cost: '',
|
||||
//- repair_tools_description: '',
|
||||
//- small_drone: 'a small drone',
|
||||
//- small_drone_cost: '',
|
||||
//- small_drone_description: '',
|
||||
//- pro_camera_gear: 'pro camera gear',
|
||||
//- pro_camera_gear_cost: '',
|
||||
//- pro_camera_gear_description: '',
|
||||
//- peel_back_kit: 'peel back kit',
|
||||
//- peel_back_kit_cost: '',
|
||||
//- peel_back_kit_description: '',
|
||||
//- hazwear: 'Hazwear',
|
||||
//- hazwear_cost: '',
|
||||
//- hazwear_description: '',
|
||||
//- backup_portaling_device: 'Backup Portaling Device',
|
||||
//- backup_portaling_device_cost: '',
|
||||
//- backup_portaling_device_description: '',
|
||||
//- logic_binder: 'Logic Binder',
|
||||
//- logic_binder_cost: '',
|
||||
//- logic_binder_description: '',
|
||||
//- advanced_portal_tech: 'Advanced Portal Tech',
|
||||
//- advanced_portal_tech_cost: '',
|
||||
//- advanced_portal_tech_description: '',
|
||||
//- hardecker_sludge_flares: 'Hardecker sludge flares',
|
||||
//- hardecker_sludge_flares_cost: '',
|
||||
//- hardecker_sludge_flares_description: '',
|
||||
//- hardlight_marker: 'Hardlight Marker',
|
||||
//- hardlight_marker_cost: '',
|
||||
//- hardlight_marker_description: '',
|
||||
//- maser_grenades: 'Maser Grenades',
|
||||
//- maser_grenades_cost: '',
|
||||
//- maser_grenades_description: '',
|
||||
//- smartcord: 'smartcord',
|
||||
//- smartcord_cost: '',
|
||||
//- smartcord_description: '',
|
||||
//- the_fust_mix: 'the FUST mix',
|
||||
//- the_fust_mix_cost: '',
|
||||
//- the_fust_mix_description: '',
|
||||
//- beam_filter: 'beam filter',
|
||||
//- beam_filter_cost: '',
|
||||
//- beam_filter_description: '',
|
||||
//- wilkies_gravity_stickers: 'Wilkie’S gravity stickers',
|
||||
//- wilkies_gravity_stickers_cost: '',
|
||||
//- wilkies_gravity_stickers_description: '',
|
||||
//- panic_energy_fuel_line: 'PANIC energy fuel-line',
|
||||
//- panic_energy_fuel_line_cost: '',
|
||||
//- panic_energy_fuel_line_description: '',
|
||||
//- fust_stasis_stickers: 'FUST stasis stickers',
|
||||
//- fust_stasis_stickers_cost: '',
|
||||
//- fust_stasis_stickers_description: '',
|
||||
//- aug_band: 'aug band',
|
||||
//- aug_band_cost: '',
|
||||
//- aug_band_description: '',
|
||||
//- particle_bond_tights: 'particle bond tights',
|
||||
//- particle_bond_tights_cost: '',
|
||||
//- particle_bond_tights_description: '',
|
||||
//- '3d_printed_ablatine': '3D-printed ablatine',
|
||||
//- '3d_printed_ablatine_cost': '',
|
||||
//- '3d_printed_ablatine_description': '',
|
||||
//- knock_off_scram_cat_tee: 'knock-off Scram Cat tee',
|
||||
//- knock_off_scram_cat_tee_cost: '',
|
||||
//- knock_off_scram_cat_tee_description: '',
|
||||
//- miper_escape_bag: 'Miper escape bag',
|
||||
//- miper_escape_bag_cost: '',
|
||||
//- miper_escape_bag_description: '',
|
||||
//- awf_bracelet: 'awf bracelet',
|
||||
//- awf_bracelet_cost: '',
|
||||
//- awf_bracelet_description: '',
|
||||
//- duraweave_jacket: 'duraweave jacket',
|
||||
//- duraweave_jacket_cost: '',
|
||||
//- duraweave_jacket_description: '',
|
||||
//- link_patch_duo: 'link patch duo',
|
||||
//- link_patch_duo_cost: '',
|
||||
//- link_patch_duo_description: '',
|
||||
//- slam_patch: 'slam patch',
|
||||
//- slam_patch_cost: '',
|
||||
//- slam_patch_description: '',
|
||||
@@ -0,0 +1,162 @@
|
||||
-
|
||||
data.translation.personalities = {
|
||||
misc: {
|
||||
personal_growth: "Personal Growth",
|
||||
personal_growth_description:
|
||||
"A trait from another personality. How are you changing? Who are you learning from?",
|
||||
},
|
||||
grit: {
|
||||
// attitude
|
||||
grit_attitude:
|
||||
"Describe how your grit helps your action, then boost or kick as needed. Also, refill 1 attitude whenever you fail any action. When the going gets tough, ya know?",
|
||||
|
||||
// style
|
||||
grit_style: "Get +1 style after runs where you show toughness or focus.",
|
||||
|
||||
// extra gear
|
||||
something_everyone_else_forgot: "Something Everyone Else Forgot",
|
||||
backup_portaling_device: "Backup Portaling Device",
|
||||
|
||||
// traits
|
||||
patient: "Patient",
|
||||
patient_description:
|
||||
"When you reveal how you’ve been waiting to act, get +1d6 or +1 kick on your action.",
|
||||
sacrifice_your_body: "Sacrifice Your Body",
|
||||
sacrifice_your_body_description:
|
||||
"Take a slam (exhausted, strained, etc.) to get +2d6 to your action. This slam can’t be noped or avoided in any way. You gotta actually take it, kid.",
|
||||
diligent: "Diligent",
|
||||
diligent_description:
|
||||
"You can reroll In the Lab. Also clear +1 trouble when Being Good once per downtime.",
|
||||
walk_it_off: "Walk It Off",
|
||||
walk_it_off_description:
|
||||
"You gain 1 extra slam box. Mark 1 style every time you take a slam.",
|
||||
skill: "Skill",
|
||||
skill_description:
|
||||
"You’ve spent hours and hours practicing ____________. If this would help you with an action, you can mark 1 trouble to upgrade a 1–3 result into a 4/5 result.",
|
||||
|
||||
// vibes
|
||||
one_song_on_repeat: "one song on repeat",
|
||||
never_smile: "never smile",
|
||||
your_drink_matches_your_shoes: "your drink matches your shoes",
|
||||
sleep_when_youre_dead: "sleep when you’re dead",
|
||||
adult_in_residence: "adult-in-residence",
|
||||
overachiever: "overachiever",
|
||||
},
|
||||
guts: {
|
||||
// attitude
|
||||
guts_attitude:
|
||||
"Describe how your guts help your action, then boost or kick as needed. Also, refill 1 attitude whenever you attempt a trick, even if you fail. Feel the rush?",
|
||||
|
||||
// style
|
||||
guts_style:
|
||||
"Get +1 style after runs where you show boldness or risk-taking.",
|
||||
|
||||
something_youre_not_supposed_to_have: 'Something You’re Not Supposed to Have',
|
||||
a_portable_speaker: 'A Portable Speaker',
|
||||
|
||||
show_off: "Show Off",
|
||||
show_off_description:
|
||||
"You get +1d6 when you do a trick. You just can’t help it, the spotlight loves you.",
|
||||
snake: "Snake",
|
||||
snake_description:
|
||||
"If there is any question about who goes first, it’s you.",
|
||||
double_dare: "Double Dare",
|
||||
double_dare_description:
|
||||
"Instead of taking a dare, you can mark 2 trouble for +2d6 or +2 kick to an action roll.",
|
||||
walking_disaster: "Walking Disaster",
|
||||
walking_disaster_description:
|
||||
"You don’t just flirt with disaster, you’re dating it. You get +1d6 on disaster rolls, and can choose to take a disaster for a willing teammate. If you do, mark 2 style.",
|
||||
raw_talent: "Raw Talent",
|
||||
raw_talent_description:
|
||||
"You’ve always just been amazing at ____________. If this would help you with an action, you can mark 1 trouble to upgrade a 1–3 result into a 4/5 result.",
|
||||
},
|
||||
smarts: {
|
||||
// attitude
|
||||
smarts_attitude:
|
||||
"Describe how your smarts help your action, then boost or kick as needed. If you fail, refill any attitude you just spent. You learn from failure.",
|
||||
|
||||
// style
|
||||
smarts_style:
|
||||
"+1 style after runs where you show curiosity or creativity.",
|
||||
|
||||
a_work_in_progress: 'A Work-In-Progress',
|
||||
a_vital_screenshot_or_image_file: 'A Vital Screenshot or Image File',
|
||||
|
||||
lateral_thinking: "Lateral Thinking",
|
||||
lateral_thinking_description:
|
||||
"When you try a trick with a creative approach, mark 1 style even on failed roll.",
|
||||
technobabble: "Technobabble",
|
||||
technobabble_description:
|
||||
"Twice per run, ex- plain something technical with jargon or a fun metaphor for 1 style and +1d6 to a roll.",
|
||||
power_user: "Power User",
|
||||
power_user_description:
|
||||
"Gain a secondary signature of your choosing. It shares the turbo pool of your primary one and has space for one mod (sold seperately).",
|
||||
actually_reads_the_manual: "Actually Reads the Manual",
|
||||
actually_reads_the_manual_description:
|
||||
"You can break mods down into components and install new mods on the fly. It takes either an action roll or a few minutes.",
|
||||
know_how: "Know-How",
|
||||
know_how_description:
|
||||
"You know everything about ____________. If this would help you with an action, you can mark 1 trouble to upgrade a 1–3 re- sult into a 4/5 result.",
|
||||
},
|
||||
heart: {
|
||||
// attitude
|
||||
heart_attitude:
|
||||
"Describe how your heart helps your action, then boost or kick as needed. Also, anytime you (or a teammate you’re helping) succeed on any action, refill 1 attitude.",
|
||||
|
||||
// style
|
||||
heart_style: "+1 style after runs where you show passion or empathy.",
|
||||
|
||||
something_from_someone_special: 'Something From Someone Special',
|
||||
an_important_pamphlet: 'An Important Pamphlet',
|
||||
|
||||
team_player: "Team Player",
|
||||
team_player_description:
|
||||
"Mark 1 style whenever you take (or nope) a slam for some- one else. ",
|
||||
pep_talk: "Pep Talk",
|
||||
pep_talk_description:
|
||||
"Once per run, refill 3 hype or clear a slam for a teammate. What do they need to hear the most right now? ",
|
||||
middle_finger: "Middle Finger",
|
||||
middle_finger_description:
|
||||
"Once per run, auto- matically get a 6 on any action, no roll required. Add up to 2 kick, baby. Nothing can stand in your way. ",
|
||||
intuition: "Intuition",
|
||||
intuition_description:
|
||||
"You can always tell who likes/dislikes who, what someone really wants, and if someone’s vibes are off. ",
|
||||
passion: "Passion",
|
||||
passion_description:
|
||||
"You care a lot about ___________. If this would help you with an action, you can mark 1 trouble to upgrade a 1−3 result into a 4/5 result.",
|
||||
},
|
||||
chill: {
|
||||
// attitude
|
||||
chill_attitude:
|
||||
"Sit back, relax, and get +1d6 to all your actions. Things just tend to work out.",
|
||||
|
||||
// style
|
||||
chill_style: "Get +1 style after runs where you show ease or flow.",
|
||||
|
||||
something_you_found_on_your_way_here: 'Something You Found on Your Way Here',
|
||||
a_pet: 'A Pet',
|
||||
|
||||
steezey: "Steezey",
|
||||
steezey_description:
|
||||
"Mark 1 style anytime you roll doubles. You look cool without even knowing it.",
|
||||
umm_guys: "Umm… Guys",
|
||||
umm_guys_description:
|
||||
"You accidentally notice the stuff everyone else didn’t, like hidden panels, perfect skate spots, looming monsters, etc.",
|
||||
button_masher: "Button Masher",
|
||||
button_masher_description:
|
||||
"Mark 1 turbo to use a locked mod for the length of one action—or 2 turbo if the mod is from another device. Be careful, potential problems are worse.",
|
||||
lucky: "Lucky",
|
||||
lucky_description:
|
||||
"Once per run, dumb luck helps you. A tree falls on a monster, lasers miss as you tie your shoes, you unknowingly give someone a perfect gift, etc.",
|
||||
quirk: "Quirk",
|
||||
quirk_description:
|
||||
"For some weird reason, you are good at ___________. If this would help you with an action, you can mark 1 trouble to upgrade a 1−3 result into a 4/5 result.",
|
||||
},
|
||||
custom: {
|
||||
// attitude
|
||||
custom_attitude: "Add a custom attitude!",
|
||||
|
||||
// style
|
||||
custom_style: "What makes you unique?",
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,341 @@
|
||||
-
|
||||
data.translation.signatures = {
|
||||
general: {
|
||||
// mods
|
||||
power_cell: "Power Cell",
|
||||
power_cell_cost: "2 gems",
|
||||
power_cell_description: "Turbo gains 1 kick.",
|
||||
stabilizer: "Stabilizer",
|
||||
stabilizer_cost: "1 coil, 1 disc",
|
||||
stabilizer_description: "Turbo gains 1 boost.",
|
||||
kitbashed: "Kitbashed",
|
||||
kitbashed_cost: "",
|
||||
kitbashed_description: "Buy a mod from another device.",
|
||||
},
|
||||
negafriction_sword: {
|
||||
// function
|
||||
negafriction_sword_function:
|
||||
"Roll to slice, dice, chop, and stab things (or nonlethally smack them with the kinetically-charged sheath).",
|
||||
// look
|
||||
// description
|
||||
negafriction_sword_description:
|
||||
"Negafriction is just what it sounds like: complete nonsense. Normally, friction converts kinetic energy into heat, causing objects to slow down and get warmer. But negafriction swords speed up and get cooler. Just like you!",
|
||||
// mods
|
||||
slip_rattle: "Slip Rattle",
|
||||
slip_rattle_cost: "1 Coil, 1 Disc",
|
||||
slip_rattle_description:
|
||||
"Roll to teleport in universe by slicing spacetime. If you can’t see your destination, potential problems are worse.",
|
||||
field_projector: "Field Projector",
|
||||
field_projector_cost: "1 Lens, 1 Coil",
|
||||
field_projector_description:
|
||||
"Roll to temporarily remove the surface friction from a room-sized area near you.",
|
||||
ref_coating: "Ref Coating",
|
||||
ref_coating_cost: "1 Lens, 1 Gem",
|
||||
ref_coating_description:
|
||||
"Avoid slams from lasers and other electromagnetic energy by marking 1 turbo, redirecting the attack wherever you wish.",
|
||||
negafriction_wake: "Negafriction Wake",
|
||||
negafriction_wake_cost: "1 Disc, 1 Gem",
|
||||
negafriction_wake_description:
|
||||
"Roll to boost your speed as your sword accelerates through matter (even air) and pulls you along.",
|
||||
subdimensional_edge: "Subdimensional Edge",
|
||||
subdimensional_edge_cost: "2 Gems, 1 Lens, 1 Coil",
|
||||
subdimensional_edge_description:
|
||||
"You can roll to temporarily slice entire dimensions off of a target, turning a 3D object 2D, for example, or removing someone from the timestream. The target re-coheres after a minute or two. It’s not pleasant, but mostly harmless.",
|
||||
},
|
||||
gravity_blaster: {
|
||||
gravity_blaster_function:
|
||||
"Oh, gravity. Thinks it’s so tough, but even an entire planet’s worth can’t beat the static field generated by a balloon rubbed on your little sister’s head. But you gotta love an underdog, and with enough concentrators, excit- ers, and dilators you can still get this one to bark.",
|
||||
gravity_blaster_description:
|
||||
"Roll to damage things at a distance with a blast of crushing force (or pum- mel stuff with non-lethal grav torrents).",
|
||||
endurance_engine: "Endurance Engine",
|
||||
endurance_engine_cost: "1 Coil, 1 Gem",
|
||||
endurance_engine_description:
|
||||
"Roll to coarsely lift, push, and pull things at a distance, with the accuracy and power of a tractor.",
|
||||
agility_pin: "Agility Pin",
|
||||
agility_pin_cost: "1 Lens, 1 Disc",
|
||||
agility_pin_description:
|
||||
"Roll to manipulate things at a distance with the accuracy and power of two human hands.",
|
||||
impulse_rig: "Impulse Rig",
|
||||
impulse_rig_cost: "1 Lens, 1 Coil",
|
||||
impulse_rig_description:
|
||||
"Roll to launch your- self high in the air, use your beam like a grappling hook, or give yourself a burst of speed.",
|
||||
gravity_spasm: "Gravity Spasm",
|
||||
gravity_spasm_cost: "1 Lens, 1 Gem",
|
||||
gravity_spasm_description:
|
||||
"Mark 1 turbo to avoid a physical slam by creating a brief, invisible force field.",
|
||||
field_inverter: "Field Inverter",
|
||||
field_inverter_cost: "2 Coils, 1 Lens, 1 Gem",
|
||||
field_inverter_description:
|
||||
"Roll to tem- porarily modify the gravity of a room-sized or small- er area you target with your gravity beam. Choose whether the gravity there is increased, decreased, reversed, pointing sideways, etc. Roll each time you want to change it.",
|
||||
},
|
||||
hardlight_board: {
|
||||
hardlight_board_function:
|
||||
"Create a board made of solid, stable light with this wrist-mounted device. Out of the box, it’s basically just a standard hoverboard you can use as a nightlight, but a good programmer can unlock its true photonic potential. Hold onto your waveforms!",
|
||||
hardlight_board_description:
|
||||
"Go fast over solid terrain on a hoverboard made from crystallized light. Make your board non-exist and re-exist at will.",
|
||||
|
||||
photon_vent: "Photon Vent",
|
||||
photon_vent_cost: "1 Coil, 1 Gem",
|
||||
photon_vent_description:
|
||||
"Roll to create trails of semi-permanent, slightly brittle hardlight behind you, which float in space until they fade.",
|
||||
energy_lattice: "Energy Lattice",
|
||||
energy_lattice_cost: "1 Lens, 1 Coil",
|
||||
energy_lattice_description:
|
||||
"Roll to reform your board into custom shapes, including tools, hand weapons, and other useful objects of a similar size.",
|
||||
photon_exciter: "Photon Exciter",
|
||||
photon_exciter_cost: "1 Lens, 1 Coil",
|
||||
photon_exciter_description:
|
||||
"Roll to damage things you grind, slide, ollie over, or just smack with your board.",
|
||||
flicker_switch: "Flicker Switch",
|
||||
flicker_switch_cost: "1 Lens, 1 Gem",
|
||||
flicker_switch_description:
|
||||
"Avoid a physical slam by marking 1 turbo. You blink out of existence for a second. What’s it feel like?",
|
||||
matter_photonizer: "Matter Photonizer",
|
||||
matter_photonizer_cost: "2 Coils, 1 Lens, 1 Gem",
|
||||
matter_photonizer_description:
|
||||
"Mark 2 turbo to turn yourself (and your gear) into pure light. The rest of the world pauses. You can’t affect the paused world, but you can observe and move around in it. Time starts again after about an hour, or once you’ve moved 100 total feet.",
|
||||
},
|
||||
hyperoptic_visor: {
|
||||
hyperoptic_visor_function:
|
||||
"Why have your face glued to your phone when you can have your phone glued to your face? Visors, goggles, and other hands-free consoles are popular among nerds, videographers, and anyone who needs to text while eating a footlong sub.",
|
||||
hyperoptic_visor_description:
|
||||
"Use an advanced HUD to access information, capture pictures and video, send texts, play Ruby Rush, and do everything else you could with a phone.",
|
||||
|
||||
realmware_lens: "Realmware Lens",
|
||||
realmware_lens_cost: "1 Lens, 1 Disc",
|
||||
realmware_lens_description:
|
||||
"Roll to see ener- gy fields, invisible entities, and in-depth biometrics. Also acts as a spacetime ampimeter (page 64).",
|
||||
omniscience_aperture: "Omniscience Aperture",
|
||||
omniscience_aperture_cost: "1 Lens, 1 Coil",
|
||||
omniscience_aperture_description:
|
||||
"You can see through walls, into objects, and all around you. Also, mark 1 turbo to avoid dodgeable slams.",
|
||||
spacetime_periscope: "Spacetime Periscope",
|
||||
spacetime_periscope_cost: "1 Lens, 1 Coil",
|
||||
spacetime_periscope_description:
|
||||
"Roll to press up against the spacetime membrane and spy on a neighbouring universe.",
|
||||
powered_crunk_filter: "Powered Crunk Filter",
|
||||
powered_crunk_filter_cost: "1 Disc, 1 Gem",
|
||||
powered_crunk_filter_description:
|
||||
"Mark +1 style when you successfully use a trick to take a dope picture or video.",
|
||||
adv_neural_imaging: "Adv. Neural Imaging",
|
||||
adv_neural_imaging_cost: "2 Lenses, 1 Coil, 1 Disc",
|
||||
adv_neural_imaging_description:
|
||||
"You can roll to see and record a subject’s active surface thoughts. It’s obvious you’re doing it, but adding kick allows you to do it secretly and/or zoom into deeper thoughts and memories. Use caution.",
|
||||
},
|
||||
kinetic_deck: {
|
||||
kinetic_deck_function:
|
||||
"Inertial sweepers and momentum cells have been standard in hoverboards for years, allowing higher top speeds for classic kick-push decks. Only recently have slugblasters discovered that a little ballast-modification can break the laws of hoverboard physics completely.",
|
||||
kinetic_deck_description:
|
||||
"Go fast over solid terrain. Make your board super heavy at will, either as an effective attack or to protect it from theft.",
|
||||
|
||||
proximity_lock: "Proximity Lock",
|
||||
proximity_lock_cost: "2 Discs",
|
||||
proximity_lock_description:
|
||||
"Your deck returns to you, if possible. May require a roll if the path isn’t clear or it faces resistance.",
|
||||
stasis_anchor: "Stasis Anchor",
|
||||
stasis_anchor_cost: "1 Coil, 1 Gem",
|
||||
stasis_anchor_description:
|
||||
"Make your deck completely immovable, floating frozen in space, until you deactivate it.",
|
||||
density_pedal: "Density Pedal",
|
||||
density_pedal_cost: "1 Coil, 1 Gem",
|
||||
density_pedal_description:
|
||||
"Roll to increase or decrease your own mass dramatically. Make your body lighter than air, make your fist heavier than uranium, and don’t let anyone push you around.",
|
||||
inertial_vortex: "Inertial Vortex",
|
||||
inertial_vortex_cost: "1 Coil, 1 Disc",
|
||||
inertial_vortex_description:
|
||||
"Roll to subtract momentum from a room-sized area around you, slowing nearby enemies and objects. Alternatively, mark 1 turbo to avoid a slam from kinetic attacks.",
|
||||
dimensional_ballast: "Dimensional Ballast",
|
||||
dimensional_ballast_cost: "2 Coils, 1 Gem, 1 Disc",
|
||||
dimensional_ballast_description:
|
||||
"Roll to decrease your mass drastically by temporarily shedding some of your dimensions! Turn 2D and hide against a wall, or briefly exist outside time! Try adding a dimension even. Why not? You do you.",
|
||||
},
|
||||
photonic_jacket: {
|
||||
photonic_jacket_function:
|
||||
"Metamaterial clothing has been working hard to keep kids’ atoms intact since slugblasting started, but Miper’s Billy Blazer® and similar photonic jackets have taken the scene by storm. Blend into the scenery, stand out from the crowd, and stay alive more to thrive more.",
|
||||
photonic_jacket_description:
|
||||
"Display colours, images, and patterns on the fabric’s surface. Also, nope slams from lasers and other electromagnetic energy for only 1 trouble.",
|
||||
|
||||
flash_patterns: "Flash Patterns",
|
||||
flash_patterns_cost: "1 Lens, 1 Disc",
|
||||
flash_patterns_description:
|
||||
"Roll to blind, daze, confuse, entrance, or cause seizures in targets that can see your jacket.",
|
||||
ambiance_panel: "Ambiance Panel",
|
||||
ambiance_panel_cost: "1 Gem, 1 Coil",
|
||||
ambiance_panel_description:
|
||||
"Freely program non-realistic, translucent graphics within ten feet of you, or roll to create a more convincing illusion. Preparation and/or image data may be required.",
|
||||
photo_bypass: "Photo Bypass",
|
||||
photo_bypass_cost: "1 Coil, 1 Lens",
|
||||
photo_bypass_description:
|
||||
"Roll to fold normal light around you and blend in with your surround- ings. Remember to put your hood up!",
|
||||
hardlight_upscaling: "Hardlight Upscaling",
|
||||
hardlight_upscaling_cost: "1 Lens, 1 Disc",
|
||||
hardlight_upscaling_description:
|
||||
"Roll to tem- porarily augment your jacket with useful hardlight ornaments such as glowing tentacles, giant polygo- nal fists or briefly serviceable wings.",
|
||||
concept_prism: "Concept Prism",
|
||||
concept_prism_cost: "2 Lenses, 1 Gem, 1 Disc",
|
||||
concept_prism_description:
|
||||
"Mark 1 turbo. You temporarily split into 3d6 colourful in- stances of yourself. They are difficult to control, but tend to act like you would and stay nearby.",
|
||||
},
|
||||
powered_armour: {
|
||||
powered_armour_function:
|
||||
"3D-printed armour, repurposed exoskeletons, and Slip- market battle suits didn’t hit the scene until fairly recent- ly, but their modular frameworks make them perfect for creative slugblasters looking to do something bespoke and original.",
|
||||
powered_armour_description:
|
||||
"Nope slams from falls, crushing, hits, and other kinetic damage for only 1 trouble. Don and doff fast via an automated process.",
|
||||
|
||||
heavy_duty_servos: "Heavy-Duty Servos",
|
||||
heavy_duty_servos_cost: "1 Coil, 1 Gem",
|
||||
heavy_duty_servos_description:
|
||||
"Roll to lift or carry very heavy things, slowly crush things in your hands, or jump great distances.",
|
||||
weapons_system: "Weapons System",
|
||||
weapons_system_cost: "1 Lens, 1 Gem",
|
||||
weapons_system_description:
|
||||
"Roll to attack, at a distance or in melee, lethally or non-lethally, with either attack-speed blows or other weapons you design. What are they?",
|
||||
mobility_booster: "Mobility Booster",
|
||||
mobility_booster_cost: "(1 Coil, 1 Disc",
|
||||
mobility_booster_description:
|
||||
"Roll to go fast over solid terrain, via jet propulsion, mechanized leg engines, etc. Room for 1 passenger.",
|
||||
ablatine_plates: "Ablatine Plates",
|
||||
ablatine_plates_cost: "1 Lens, 1 Disc",
|
||||
ablatine_plates_description:
|
||||
"Avoid one slam from physical damage. Resets during your next In the Lab beat. (Can’t stack with 3D-Printed Ablatine.)",
|
||||
omega_engine: "Omega Engine",
|
||||
omega_engine_cost: "2 Coils, 2 Gems",
|
||||
omega_engine_description:
|
||||
"Mark 2 turbo. Your armour transforms for a few minutes, getting bigger, brighter, or cooler in some way. You get +1 kick on all related actions and can roll to create a powerful, room-sized force field which requires focused concentration.",
|
||||
},
|
||||
reality_cannon: {
|
||||
reality_cannon_function:
|
||||
"If you shine light through a kramshon crystal, you see a brand new colour. If you fire a high-powered beam of coherent photons through a kramshon crystal, you can scramble reality itself. And guess what! Most things, including monsters, are made of reality! Have fun!",
|
||||
reality_cannon_description:
|
||||
"Roll to scramble things with a powerful reality beam (either destruc- tive and permanent, or unpleasant and temporary).",
|
||||
|
||||
parameter_dial: "Parameter Dial",
|
||||
parameter_dial_cost: "2 Discs",
|
||||
parameter_dial_description:
|
||||
"Roll to temporarily shift or calibrate minor features of a target, like colour, texture, volume, odor, temperature, etc.",
|
||||
exponent_coil: "Exponent Coil",
|
||||
exponent_coil_cost: "1 Coil, 1 Gem",
|
||||
exponent_coil_description:
|
||||
"Roll to temporarily create 2d6 alternate versions of a subject or ob- ject. They appear nearby. One is usually evil.",
|
||||
subjectivity_diode: "Subjectivity Diode",
|
||||
subjectivity_diode_cost: "1 Lens, 1 Gem",
|
||||
subjectivity_diode_description:
|
||||
"Create a tem- porary illusionary reality for a specific target. The effect happens within their senses.",
|
||||
matter_lens: "Matter Lens",
|
||||
matter_lens_cost: "1 Lens, 1 Disc",
|
||||
matter_lens_description:
|
||||
"Roll to create large amounts of soft, amorphous matter, which coheres into random objects and terrain with time. Specific, complex, or immediate forms may require kick.",
|
||||
concept_inverter: "Concept Inverter",
|
||||
concept_inverter_cost: "2 Gems, 2 Discs",
|
||||
concept_inverter_description:
|
||||
"Roll to invert a target’s adjective—something “dry” might turn “wet,” for example. You choose. Adjectives are relative to yourself (i.e., an elephant is “big”). As always, substantial or dramatic results (“living” to “dead,” etc.) may require kick or multiple rolls.",
|
||||
},
|
||||
riftninja_sneakers: {
|
||||
riftninja_sneakers_function:
|
||||
"Riftninja sneakers are branded as performance-wear for pro-level capture-the-flag athletes, hoping to distance themselves from their core market of graffiti artists, van- dals, thieves, and kids trying to sneak out of the house.",
|
||||
riftninja_sneakers_description:
|
||||
"Use astral phasing to become slightly not here, ghostly and ethe- real, which can help you sneak around.",
|
||||
|
||||
hyperphaser: "Hyperphaser",
|
||||
hyperphaser_cost: "1 Lens, 1 Gem",
|
||||
hyperphaser_description:
|
||||
"You can roll to phase through walls and other matter.",
|
||||
anti_negafriction_outsoles: "Anti-Negafriction Outsoles",
|
||||
anti_negafriction_outsoles_cost: "1 Gem, 1 Disc",
|
||||
anti_negafriction_outsoles_description:
|
||||
"You can run up walls, hang from ceilings, etc. Complex or risky maneuvers may require a roll, as usual.",
|
||||
powered_midsoles: "Powered Midsoles",
|
||||
powered_midsoles_cost: "1 Coil, 1 Gem",
|
||||
powered_midsoles_description:
|
||||
"Run, jump, and slide super fast, easily keeping up with hoverboards.",
|
||||
reaction_switch: "Reaction Switch",
|
||||
reaction_switch_cost: "1 Coil, 1 Disc",
|
||||
reaction_switch_description:
|
||||
"Mark 1 turbo to avoid a physical slam by turning ghostly just before it hits.",
|
||||
plane_haunt: "Plane Haunt",
|
||||
plane_haunt_cost: "2 Lenses, 2 Gems",
|
||||
plane_haunt_description:
|
||||
"Spend 1 turbo to create a extra version of yourself. You share resources and can roll to swap minds. Ends after a few hours or whenever one of you takes a slam and disintegrates horribly (that slam lingers with the remaining “you” as concept shock). Also, mark 1 turbo to clear 2 trouble. There was a you covering at home this whole time.",
|
||||
},
|
||||
robotic_companion: {
|
||||
robotic_companion_function:
|
||||
"Loners, geniuses, and kids with too much love to give all inevitably create signature devices capable of feeling things. Is it a hovering companion drone, a lumbering utility mech, an inflatable personal healthcare assistant, or something else?",
|
||||
robotic_companion_description:
|
||||
"As smart and loyal as a dog. Can follow closely, lift and carry things you could, communicate vaguely, and you can roll to have it do simple tasks, like fetch.",
|
||||
|
||||
weapons: "Weapons",
|
||||
weapons_cost: "1 Coil, 1 Gem",
|
||||
weapons_description:
|
||||
"Roll to have your robot attack, at a distance or in melee, lethally or non- lethally, with weapons you’ve designed. What are they?",
|
||||
mobility_boosters: "Mobility Boosters",
|
||||
mobility_boosters_cost: "1 Lens, 1 Disc",
|
||||
mobility_boosters_description:
|
||||
"Roll to have your robot go really fast. Can carry a passenger or two. Ditch the hoverboard and hop on.",
|
||||
heavy_duty_servos: "Heavy-Duty Servos",
|
||||
heavy_duty_servos_cost: "1 Coil, 1 Gem",
|
||||
heavy_duty_servos_description:
|
||||
"Roll to have your robot lift or carry very heavy things, slowly crush things in its hands, or jump great distances.",
|
||||
guardian_mode: "Guardian Mode",
|
||||
guardian_mode_cost: "1 Lens, 1 Gem",
|
||||
guardian_mode_description:
|
||||
"Mark 1 turbo to have your robot protect you or a nearby teammate from a physical slam.",
|
||||
neural_network: "Neural Network",
|
||||
neural_network_cost: "4 discs",
|
||||
neural_network_description:
|
||||
"Your robot now has the intelligence, communication skills, and common sense of a human child, and grows smarter and more independent each day. Mark 1 legacy. They grow up so fast.",
|
||||
},
|
||||
skipmode_runners: {
|
||||
skipmode_runners_function:
|
||||
"Skip boring. Skip average. Skip to the good part with Skipmode runners. The commercial shows a kid fast-for- warding through his homework, but everyone knew it was just clever marketing for a fairly average modular shoe. Until sluggers got ahold of them...",
|
||||
skipmode_runners_description:
|
||||
"Use your powered midsoles to run, jump, and slide super fast, easily keeping up with hoverboards.",
|
||||
|
||||
anti_negafriction_outsoles: "Anti-Negafriction Outsoles",
|
||||
anti_negafriction_outsoles_cost: "1 Gem, 1 Disc",
|
||||
anti_negafriction_outsoles_description:
|
||||
"You can run up walls, hang from ceilings, etc. Complex or risky maneuvers may require a roll, as usual.",
|
||||
energy_tenser: "Energy Tenser",
|
||||
energy_tenser_cost: "1 Coil, 1 Disc",
|
||||
energy_tenser_description:
|
||||
"With a running start, roll to teleport in-universe. If you can’t see your destination, potential problems are worse.",
|
||||
temporal_scrubber: "Temporal Scrubber",
|
||||
temporal_scrubber_cost: "1 Lens, 1 Gem",
|
||||
temporal_scrubber_description:
|
||||
"Reveal you’ve been fast-forwarding through most of this snooze fest. Refill 1 hype. Mark 1 trouble and try not to think about all you’ve missed by not being present. Being constantly stoked is not the same as living.",
|
||||
chrono_clip: "Chrono Clip",
|
||||
chrono_clip_cost: "1 Disc, 1 Gem",
|
||||
chrono_clip_description:
|
||||
"Mark 1 turbo to avoid a physical slam by skipping a few seconds into the future. Others think you disappeared briefly.",
|
||||
causality_hoop: "Causality Hoop",
|
||||
causality_hoop_cost: "2 Gems, 1 Lens, 1 Coil",
|
||||
causality_hoop_description:
|
||||
"Mark 2 turbo to rewind time a few seconds and retry an ac- tion, warn someone of a slam, change tactics, etc. (Due to, uh, temporal rippling, game resources like boost, trouble, etc. still stay as they are, however.)",
|
||||
},
|
||||
voidwear_backpack: {
|
||||
voidwear_backpack_function:
|
||||
"The back-breaking sport of shoulder-hoarding was transformed by Miper’s iconic, ubiquitous Voidwear® backpack, which uses [stolen] proprietary shipping technology to allow you to carry the contents of your bedroom in a simple 1-pocket cinch.",
|
||||
voidwear_backpack_description:
|
||||
"Store any amount of objects smaller than a person in your bag’s pocket dimension. Roll to see if you happen to have a specific everyday item in there.",
|
||||
|
||||
astral_intake: "Astral Intake",
|
||||
astral_intake_cost: "1 Coil, 1 Disc",
|
||||
astral_intake_description:
|
||||
"Mark 1 turbo and roll to pull a unique, specialized, or implausible item from the multiverse, like antitoxin, an alien lifeform, or almost the exact keycard you need.",
|
||||
omni_siphon: "Omni-Siphon",
|
||||
omni_siphon_cost: "1 Coil, 1 Gem",
|
||||
omni_siphon_description:
|
||||
"Roll to vent a cocktail of energy from the multiverse. Use it as a makeshift weapon, jump pack, or charging station.",
|
||||
chaos_vent: "Chaos Vent",
|
||||
chaos_vent_cost: "1 Coil, 1 Disc",
|
||||
chaos_vent_description:
|
||||
"Mark 1 turbo. Turn your bag into a one-way portal to a randomly selected world. The bag goes with you.",
|
||||
collapsible_panels: "Collapsible Panels",
|
||||
collapsible_panels_cost: "1 Coil",
|
||||
collapsible_panels_description:
|
||||
"You can fold your bag into itself, leaving only a single zipper tab in your hand, which can be used to reopen the bag.",
|
||||
reversible_zipper: "Reversible Zipper",
|
||||
reversible_zipper_cost: "2 Coils, 1 Gem, 1 Disc",
|
||||
reversible_zipper_description:
|
||||
"Roll to turn your bag inside out. You and everyone and everything in a room-sized area are now floating inside your bag, surrounded by all your junk. Outside observers simply see a bag lying on the ground.",
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,29 @@
|
||||
.translations
|
||||
- const points = Array.from(Array(5).keys(), (i) => i + 1);
|
||||
each point in points
|
||||
span.translation(data-i18n=`style_${point}`)= `${point} style`
|
||||
span.translation(data-i18n=`style_${point}_short`)= `${point}s`
|
||||
span.translation(data-i18n=`trouble_${point}`)= `${point} trouble`
|
||||
span.translation(data-i18n=`trouble_${point}_short`)= `${point}t`
|
||||
|
||||
//- playbook personalities
|
||||
each personality in data.translation.personalities
|
||||
each translation in Object.entries(personality)
|
||||
- const [key, text] = translation;
|
||||
span.translation(data-i18n=key)= text
|
||||
|
||||
//- signatures
|
||||
each signature in data.translation.signatures
|
||||
each translation in Object.entries(signature)
|
||||
- const [key, text] = translation;
|
||||
span.translation(data-i18n=key)= text
|
||||
|
||||
//- gear
|
||||
each translation in Object.entries(data.translation.gear)
|
||||
- const [key, text] = translation;
|
||||
span.translation(data-i18n=key)= text
|
||||
|
||||
//- factions
|
||||
each translation in Object.entries(data.translation.factions)
|
||||
- const [key, text] = translation;
|
||||
span.translation(data-i18n=key)= text
|
||||
@@ -0,0 +1,7 @@
|
||||
//- include modals
|
||||
include blade
|
||||
include blocks
|
||||
include editor
|
||||
include fields
|
||||
include panels
|
||||
include repeating
|
||||
@@ -0,0 +1,7 @@
|
||||
mixin blade(blade)
|
||||
aside.blade(class=blade.name)&attributes(attributes)
|
||||
input.blade-toggle__controller(name=`attr_${blade.name}_blade`, type='hidden', value='0')
|
||||
button.blade-toggle(name=`act_${blade.name}-blade`, type='action')
|
||||
h2.blade__title(data-i18n=blade.name)= blade.title
|
||||
.blade__wrapper
|
||||
block
|
||||
@@ -0,0 +1,14 @@
|
||||
//- https://github.com/pugjs/pug/issues/1693#issuecomment-894801220
|
||||
//- https://codepen.io/Vectorjon/pen/GRmYWjN
|
||||
mixin block(key, marker=false)
|
||||
- global.my_blocks = global.my_blocks || {};
|
||||
if marker
|
||||
if global.my_blocks[key]
|
||||
- let temp = {};
|
||||
- temp[key] = global.my_blocks[key];
|
||||
- global.my_blocks[key] = null;
|
||||
- temp[key]();
|
||||
else
|
||||
block
|
||||
else
|
||||
- global.my_blocks[key] = this.block;
|
||||
@@ -0,0 +1,33 @@
|
||||
mixin edittoggle(name)
|
||||
button.edit-toggle(name=`act_${name}-editor`, type='action')
|
||||
input.edit-toggle__controller(name=`attr_${name}_editor`, type='hidden', value='on')
|
||||
.edit-toggle__edit
|
||||
span.visually-hidden(data-i18n='view') View
|
||||
span.pictos(aria-hidden='true') *
|
||||
.edit-toggle__view
|
||||
span.visually-hidden(data-i18n='edit') Edit
|
||||
span.pictos(aria-hidden='true') p
|
||||
|
||||
mixin minitoggle(name)
|
||||
button.minimizer-toggle(name=`act_${name}-minimizer`, type='action')
|
||||
input.minimizer-toggle__controller(name=`attr_${name}_minimizer`, type='hidden', value='0')
|
||||
.minimizer-toggle__edit
|
||||
span.visually-hidden(data-i18n='maximize') Maximize
|
||||
span.pictos(aria-hidden='true') &
|
||||
.minimizer-toggle__view
|
||||
span.visually-hidden(data-i18n='minimize') Minimize
|
||||
span.pictos(aria-hidden='true') _
|
||||
|
||||
mixin editorblock(toggleName, klassName)
|
||||
- const panelClass = klassName || toggleName;
|
||||
- const editClass = `${toggleName}__edit`;
|
||||
- const viewClass = `${toggleName}__view`;
|
||||
.editor
|
||||
//- input.editor__controller(name=`attr_${toggleName}_editor`, value='0',type='hidden')
|
||||
block
|
||||
//- .editor__wrapper(class=`${panelClass}__wrapper`)
|
||||
.editor__content
|
||||
.editor__edit(class=editClass)
|
||||
+block("edit", true)
|
||||
.editor__view(class=viewClass)
|
||||
+block("view", true)
|
||||
@@ -0,0 +1,176 @@
|
||||
mixin hidden(field, value)
|
||||
input(name=`attr_${field}`, type='hidden', value=value)&attributes(attributes)
|
||||
|
||||
mixin field(field)
|
||||
-
|
||||
let { name, type, readonly, value, placeholder, min, max, size, selected, blockName } = field;
|
||||
type = type || 'text';
|
||||
|
||||
if (value !== 0) value = value || null;
|
||||
|
||||
let id = name;
|
||||
let klass = `${blockName}__${name} ${blockName}__input--${type}`;
|
||||
|
||||
let sizeKlass = size ? `el-input--${size}` : null;
|
||||
let typeSizeKlass = size ? `el-input-${type}--${size}` : null;
|
||||
|
||||
case (type)
|
||||
when 'action'
|
||||
+action(field)
|
||||
|
||||
when 'hidden'
|
||||
input(name=`attr_${name}`, type='hidden', value=value)&attributes(attributes)
|
||||
|
||||
when 'calculated'
|
||||
- placeholder = placeholder || 0;
|
||||
.el-calculated(class=sizeKlass)
|
||||
.el-input(class=sizeKlass)
|
||||
.el-input__wrapper
|
||||
+span(field).el-input__inner
|
||||
|
||||
when 'select'
|
||||
select(class=klass, name=`attr_${name}`, readonly=readonly)&attributes(attributes)
|
||||
each option in field.options
|
||||
- const isSelected = option.value === value || option.selected;
|
||||
- const isHidden = option.hidden ? true : false;
|
||||
- value = option.value || option.name;
|
||||
option(data-i18n=option.name, hidden=isHidden, selected=isSelected, value=value)= option.text
|
||||
|
||||
when 'checkbox'
|
||||
when 'radio'
|
||||
- if (type === 'checkbox') value = value || 'on';
|
||||
input(checked=selected, id=id, name=`attr_${name}`, type=type, value=value)&attributes(attributes)
|
||||
|
||||
when 'number'
|
||||
- placeholder = placeholder || 0;
|
||||
input(
|
||||
inputmode='numeric',
|
||||
max=max,
|
||||
min=min,
|
||||
name=`attr_${name}`,
|
||||
pattern='[0-9]+',
|
||||
placeholder=placeholder,
|
||||
type=type,
|
||||
value=value
|
||||
)&attributes(attributes)
|
||||
|
||||
when 'textarea'
|
||||
textarea(
|
||||
class=klass,
|
||||
data-i18n-placeholder=`placeholder_${name}`,
|
||||
name=`attr_${name}`,
|
||||
placeholder=placeholder,
|
||||
readonly=readonly,
|
||||
value=value
|
||||
)&attributes(attributes)
|
||||
|
||||
when 'text'
|
||||
default
|
||||
input(
|
||||
class=klass,
|
||||
data-i18n-placeholder=`placeholder_${name}`,
|
||||
id=id,
|
||||
name=`attr_${name}`,
|
||||
placeholder=placeholder,
|
||||
readonly=readonly,
|
||||
type=type,
|
||||
value=value
|
||||
)&attributes(attributes)
|
||||
|
||||
mixin span(field)
|
||||
- const klass = '';
|
||||
- const dynamic_i18n = field.dynamic ? 'data-i18n-dynamic' : null;
|
||||
span(class!=klass, data-i18n-dynamic=dynamic_i18n, name=`attr_${field.name}`)&attributes(attributes)
|
||||
|
||||
mixin action(btn)
|
||||
- let { name, label, type, blockName } = btn;
|
||||
- let klass = `${blockName}__action ${blockName}--${name}`;
|
||||
button(class=klass, name=`act_${name}`, type='action')&attributes(attributes)
|
||||
+block('content', true)
|
||||
span(class=`${blockName}__action--label`, data-i18n=name)= label
|
||||
|
||||
mixin actiongroup(name, actions)
|
||||
.action__group(class=`action__group--${name}`)
|
||||
each btn in actions
|
||||
+action(btn)
|
||||
|
||||
mixin numcontrol(field)
|
||||
- let { name } = field;
|
||||
.numcontroller
|
||||
button.numcontroller__decrease(name=`act_${name}-down`, type='action')
|
||||
span.visually-hidden(data-i18n='step_down') Step Down
|
||||
span.pictos _
|
||||
+span(field).numcontroller__span
|
||||
button.numcontroller__increase(name=`act_${name}-up`, type='action')
|
||||
span.visually-hidden(data-i18n='step_up') Step Up
|
||||
span.pictos &
|
||||
|
||||
mixin el-inputs
|
||||
//- case (type)
|
||||
when 'el-select'
|
||||
.el-select
|
||||
.el-input(class=sizeKlass)
|
||||
.el-input__wrapper
|
||||
select.el-input__inner(name=`attr_${name}`, readonly=readonly, class=klass)&attributes(attributes)
|
||||
each option in field.options
|
||||
- const isSelected = option.value === value || option.selected;
|
||||
- const isHidden = option.hidden ? true : false;
|
||||
- value = option.value || option.name;
|
||||
option(
|
||||
data-i18n=`opt_${option.name}`,
|
||||
value=value,
|
||||
selected=isSelected,
|
||||
hidden=isHidden
|
||||
)= option.text
|
||||
|
||||
when 'el-textarea'
|
||||
.el-textarea
|
||||
textarea.el-textarea__inner(
|
||||
name=`attr_${name}`,
|
||||
value=value,
|
||||
readonly=readonly,
|
||||
data-i18n-placeholder=`placeholder_${name}`,
|
||||
placeholder=placeholder,
|
||||
class=klass
|
||||
)&attributes(attributes)
|
||||
|
||||
when 'el-number'
|
||||
- placeholder = placeholder || 0;
|
||||
.el-input-number(class=typeSizeKlass)
|
||||
unless size == 'simple'
|
||||
button.el-input-number__decrease(name=`act_${name}-down`, type='action')
|
||||
span.visually-hidden(data-i18n='step_down') Step Down
|
||||
span.pictos _
|
||||
button.el-input-number__increase(name=`act_${name}-up`, type='action')
|
||||
span.visually-hidden(data-i18n='step_up') Step Up
|
||||
span.pictos &
|
||||
.el-input(class=sizeKlass)
|
||||
.el-input__wrapper
|
||||
input.el-input__inner(
|
||||
name=`attr_${name}`,
|
||||
type=type,
|
||||
placeholder=placeholder,
|
||||
readonly=readonly,
|
||||
min=min,
|
||||
max=max,
|
||||
class=klass
|
||||
)
|
||||
|
||||
when 'el-switch'
|
||||
label.el-switch
|
||||
input.el-switch__checkbox(name=`attr_${name}`, type='checkbox', readonly=readonly, class=klass)
|
||||
.el-switch__inner
|
||||
|
||||
when 'el-text'
|
||||
.el-input(class=sizeKlass)
|
||||
.el-input__wrapper
|
||||
input.el-input__inner(
|
||||
name=`attr_${name}`,
|
||||
id=id,
|
||||
type=type,
|
||||
value=value,
|
||||
data-i18n-placeholder=`placeholder_${name}`,
|
||||
placeholder=placeholder,
|
||||
readonly=readonly,
|
||||
class=klass
|
||||
)&attributes(attributes)
|
||||
@@ -0,0 +1,64 @@
|
||||
//- panels have editor toggles
|
||||
mixin panel(panel)
|
||||
- const semantic = panel.semantic || 'section';
|
||||
- const editor = panel.editor || panel.name;
|
||||
#{semantic}.panel(class=panel.name)&attributes(attributes)
|
||||
input.editor__controller(name=`attr_${panel.name}_editor`, type='hidden', value='on')
|
||||
input.minimizer__controller(name=`attr_${panel.name}_minimizer`, type='hidden', value='0')
|
||||
.panel__wrapper
|
||||
block
|
||||
.panel__header(class=`${panel.name}__header`)
|
||||
+block('header', true)
|
||||
if (panel.title)
|
||||
h2.panel__title(class=`${panel.name}__title`, data-i18n=panel.name)= panel.title
|
||||
.panel__controls
|
||||
unless panel.static
|
||||
+minitoggle(panel.name)
|
||||
+edittoggle(panel.name)
|
||||
.panel__content(class=`${panel.name}__content`)
|
||||
+block('content', true)
|
||||
|
||||
mixin blob(blob)
|
||||
- const semantic = blob.semantic || 'section';
|
||||
- const editorClass = blob.editor ? 'blob--editor' : null;
|
||||
#{semantic}.blob(class=blob.name)&attributes(attributes)
|
||||
input.editor__controller(name=`attr_${blob.name}_editor`, type='hidden', value='on')
|
||||
input.minimizer__controller(name=`attr_${blob.name}_minimizer`, type='hidden', value='0')
|
||||
.blob__wrapper(class=editorClass)
|
||||
block
|
||||
if (blob.title)
|
||||
.blob__header(class=`${blob.name}__header`)
|
||||
h2.blob__title(class=`${blob.name}__title`, data-i18n=blob.name)= blob.title
|
||||
.blob__controls
|
||||
if blob.broadcast
|
||||
- const { name, broadcast } = blob;
|
||||
+broadcast({ name, broadcast})
|
||||
if blob.editor
|
||||
+edittoggle(blob.name)
|
||||
if blob.minimizer
|
||||
+minitoggle(blob.name)
|
||||
.blob__content(class=`${blob.name}__content`)
|
||||
+block('content', true)
|
||||
|
||||
mixin bubble(bubble)
|
||||
article.bubble(class=`bubble__${bubble.name}`)
|
||||
block
|
||||
input.bubble__controller(name=`attr_${bubble.name}_collapse`, type='hidden', value='0')
|
||||
.bubble__header
|
||||
+block('header', true)
|
||||
.bubble__controls
|
||||
if (bubble.broadcast)
|
||||
+broadcast(bubble).bubble__broadcast
|
||||
label.bubble__expand(for=`attr_${bubble.name}_collapse`)
|
||||
input(name=`attr_${bubble.name}_collapse`, type='checkbox')
|
||||
span.bubble__expand--collapse.visually-hidden(data-i18n='collapse_content') Collapse Content
|
||||
span.bubble__expand--expand.visually-hidden(data-i18n='expand_content') Expand Content
|
||||
.bubble__content
|
||||
.bubble__collapse
|
||||
+block('content', true)
|
||||
|
||||
mixin broadcast(broadcast)
|
||||
- const broadcastClass = attributes.class || 'broadcast';
|
||||
button.broadcast(class=broadcastClass, name=`roll_${broadcast.name}-broadcast`, type='roll', value=broadcast.broadcast)
|
||||
span.pictos w
|
||||
span.visually-hidden(data-i18n='broadcast_to_chat') Broadcast to Chat
|
||||
@@ -0,0 +1,22 @@
|
||||
mixin repeating(fieldset, toggleName)
|
||||
block
|
||||
.repeating
|
||||
input.repeating__is-empty(name=`attr_${fieldset}_empty`, type='hidden', value='0')
|
||||
input.repeating__controller(name=`attr_${fieldset}_editor`, type='hidden', value='on')
|
||||
.repeating__empty
|
||||
- const emptyKey = `none_${fieldset}_repeating`;
|
||||
- const emptyHeader = `None ${fieldset.replace(/[-_]+/g, ' ')} with left beef`;
|
||||
.repeating__header
|
||||
span(data-i18n=emptyKey)= emptyHeader
|
||||
.repeating__subtitle
|
||||
|
||||
fieldset(class=`repeating_${fieldset}`)
|
||||
.repeating__wrapper
|
||||
.repeating__edit
|
||||
+block('edit', true)
|
||||
|
||||
.repeating__view
|
||||
+block('view', true)
|
||||
|
||||
.repeating__delete
|
||||
+block('delete', true)
|
||||
@@ -0,0 +1,33 @@
|
||||
- const character = data.character;
|
||||
|
||||
main.character
|
||||
section.character__main
|
||||
section.character__col
|
||||
include ../pages/character/dicetray
|
||||
include ../pages/character/header
|
||||
include ../pages/character/slams
|
||||
include ../pages/character/gear
|
||||
|
||||
section.character__col
|
||||
include ../pages/character/style
|
||||
include ../pages/character/attitude
|
||||
include ../pages/character/traits
|
||||
|
||||
section.character__col
|
||||
include ../pages/character/trouble
|
||||
include ../pages/character/turbo
|
||||
include ../pages/character/signature
|
||||
include ../pages/character/mods
|
||||
include ../pages/character/components
|
||||
|
||||
aside.character__blades
|
||||
+blade({ name: 'diary', title: 'Diary' })
|
||||
include ../pages/common/notes
|
||||
include ../pages/common/tracks
|
||||
|
||||
+blade({ name: 'downtimes', title: 'Downtime'})
|
||||
include ../pages/character/downtime
|
||||
|
||||
+blade({ name: 'epilogue', title: 'Epilogue'})
|
||||
include ../pages/character/legacy
|
||||
include ../pages/character/doom
|
||||
@@ -0,0 +1,22 @@
|
||||
- const crew = data.crew;
|
||||
|
||||
main.crew
|
||||
section.crew__main
|
||||
section.crew__col
|
||||
include ../pages/crew/header
|
||||
include ../pages/crew/fractures
|
||||
section.crew__col
|
||||
include ../pages/crew/hype
|
||||
include ../pages/crew/style
|
||||
include ../pages/crew/fame
|
||||
|
||||
aside.crew__blades
|
||||
+blade({ name: 'diary', title: 'Diary' })
|
||||
include ../pages/common/notes
|
||||
include ../pages/common/tracks
|
||||
+blade({ name: 'factions', title: 'Factions' })
|
||||
input(name='attr_load_factions', type='hidden', value='0')
|
||||
button.crew__action.crew--factions(name='act_load-factions', type='action')
|
||||
span(data-i18n='load_factions') Load Factions
|
||||
include ../pages/crew/factions
|
||||
//- +blade({ name: 'multiverse', title: 'The Multiverse' })
|
||||
@@ -0,0 +1,8 @@
|
||||
+blob({ name: 'tophat'})
|
||||
+block('content')
|
||||
- const globalHeader = data.global.nav;
|
||||
//- h2.tophat__title(data-i18n='slugblaster') Slugblaster
|
||||
ul.nav
|
||||
each mode in globalHeader.actions
|
||||
li
|
||||
+action(mode).button--glitch
|
||||
@@ -0,0 +1,34 @@
|
||||
- const options = data.options;
|
||||
|
||||
main.options
|
||||
section.options__main
|
||||
section.options__col
|
||||
.option.options__override-attitude
|
||||
- const { override, selects } = options.attitude;
|
||||
label(for=override.name)
|
||||
+field(override)
|
||||
span(data-i18n=override.name)= override.label
|
||||
.option__dropdowns--horizontal
|
||||
+hidden(override.name, 0).options-hide
|
||||
each field in selects
|
||||
.option__dropdown
|
||||
+field(field)
|
||||
label(data-i18n=field.name, for=field.name)= field.label
|
||||
|
||||
aside
|
||||
.a-heartfelt-word
|
||||
span(data-i18n='you_are_small') You are small.
|
||||
<br><br>
|
||||
span(data-i18n='you_are_just_a_handful_of_parameters') You are just a handful of parameters in the infinite universe generator. A few numbers a quintillion decimal places down the encyclopedia wand. A blip on the timeline, a speck of cosmic dust.
|
||||
<br><br>
|
||||
span(data-i18n='you_are_also_big') You are also big.
|
||||
<br><br>
|
||||
span(data-i18n='your_intestines_are') Your intestines are the coil-structured megacity for trillions of bacteria. Whole dimensions are born and collapse in the quantum foam inside you every second. Your dad brings you up in every conversation.
|
||||
<br><br>
|
||||
span(data-i18n='you_are_someones_world') You are someone’s world.
|
||||
|
||||
.sheet-version
|
||||
- const version = data.global.sheet_version;
|
||||
+field(version)
|
||||
span.visually-hidden(data-i18n=version.name)= version.label
|
||||
+span(version)
|
||||
@@ -0,0 +1,26 @@
|
||||
- const { attitude } = data.character;
|
||||
+blob({ name: 'attitude', title: 'Attitude' })
|
||||
+block('content')
|
||||
- const [boosts, kicks] = attitude.fields;
|
||||
- const four = Array.from(Array(4).keys(), (i) => i + 1);
|
||||
|
||||
+field(attitude.subtitle)
|
||||
|
||||
+field(boosts)
|
||||
+field(kicks)
|
||||
.attitude__clickies
|
||||
each index in four
|
||||
- const field = { ...boosts };
|
||||
- field.type = 'checkbox';
|
||||
- field.name = `${field.name}_${index}`;
|
||||
label.attitude__boost(class=`attitude__boost--${index}`)
|
||||
+field(field)
|
||||
span.visually-hidden(data-i18n=field.name)= field.label + ' ' + index
|
||||
|
||||
each index in four
|
||||
- const field = { ...kicks };
|
||||
- field.type = 'checkbox';
|
||||
- field.name = `${field.name}_${index}`;
|
||||
label.attitude__kick(class=`attitude__kick--${index}`)
|
||||
+field(field)
|
||||
span.visually-hidden(data-i18n=field.name)= field.label + ' ' + index
|
||||
@@ -0,0 +1,15 @@
|
||||
- const { components } = data.signature;
|
||||
+blob({ name: 'components', title: 'Components' })
|
||||
+block('content')
|
||||
- const three = Array.from(Array(4).keys(), (i) => i);
|
||||
|
||||
each component in components
|
||||
.components__component(class=`components__component--${component.name}`)
|
||||
label.components__component--header(data-i18n=component.name)= component.label
|
||||
.components__component--track
|
||||
+hidden(component.name).component__value
|
||||
each index in three
|
||||
- const field = { ...component, value: index };
|
||||
label.component__checkbox(class=`component__checkbox--${index}`)
|
||||
+field(field)
|
||||
span.visually-hidden(data-i18n=`${component.name}_${index}`)= `${index} ${component.label}`
|
||||
@@ -0,0 +1,33 @@
|
||||
- const { dicetray } = data.character;
|
||||
+panel({ name: 'dicetray', title: 'Dice Tray', static: true })
|
||||
+block('content')
|
||||
- const { hidden, actions, fields } = dicetray;
|
||||
.dicetray__actions
|
||||
each action in actions
|
||||
+action(action)
|
||||
|
||||
+editorblock('dicetray')
|
||||
+block('edit')
|
||||
.row.dicetray__edit
|
||||
each field in hidden
|
||||
+field(field)
|
||||
each field in fields
|
||||
- const hideLabel = ['dicetray_check', 'dicetray_name'].includes(field.name);
|
||||
- const divClass = field.span ? `col-${field.span}` : '';
|
||||
- const labelClass = hideLabel ? 'visually-hidden' : null;
|
||||
.dicetray__field(class=`${field.name} ${divClass}`)
|
||||
if field.type === "checkbox"
|
||||
label(class=labelClass, for=field.name)
|
||||
+field(field)
|
||||
span(data-i18n=field.name)= field.label
|
||||
|
||||
else
|
||||
+field(field).checkbox--scribble
|
||||
label(class=labelClass, data-i18n=field.name, for=field.name)= field.label
|
||||
|
||||
//- +block('view')
|
||||
.dicetray__view
|
||||
label.dicetray__check
|
||||
+field(check).checkbox--scribble
|
||||
+span(name).dicetray__name
|
||||
+span(desc)
|
||||
@@ -0,0 +1,26 @@
|
||||
- const { doom } = data.character;
|
||||
+panel({ name: 'doom', title: 'doom' })
|
||||
+block('content')
|
||||
+repeating('doom')
|
||||
- const { broadcast, repeating } = doom;
|
||||
- const [name, desc] = repeating;
|
||||
+block('edit')
|
||||
.row.doom__edit
|
||||
each field in repeating
|
||||
- const hideLabel = ['trait_check', 'trait_name'].includes(field.name);
|
||||
- const divClass = field.span ? `col-${field.span}` : '';
|
||||
- const labelClass = hideLabel ? 'visually-hidden' : null;
|
||||
.doom__field(class=`${field.name} ${divClass}`)
|
||||
+field(field)
|
||||
label(class=labelClass, data-i18n=field.name, for=field.name)= field.label
|
||||
|
||||
+block('view')
|
||||
.doom__view
|
||||
+bubble({ name: 'doom', broadcast })
|
||||
+block('header')
|
||||
+span(name).doom__name
|
||||
+block('content')
|
||||
+span(desc)
|
||||
|
||||
+block('delete')
|
||||
+span(name).doom__name
|
||||
@@ -0,0 +1,76 @@
|
||||
mixin makeDowntimeFieldset(fieldset)
|
||||
- const { downtime } = data.character;
|
||||
- const beats = downtime.beats[fieldset.name];
|
||||
+panel({ name: fieldset.name, title: fieldset.title }).downtime
|
||||
+block('content')
|
||||
+editorblock(fieldset.name)
|
||||
+block('edit')
|
||||
+hidden("personality")
|
||||
each field in beats
|
||||
if field.type === "checkbox"
|
||||
label(class=field.blockName, for=field.name)
|
||||
+field(field)
|
||||
span(data-i18n=field.name)= field.label
|
||||
else
|
||||
-
|
||||
const checkbox = structuredClone(field)
|
||||
checkbox.type = 'checkbox'
|
||||
checkbox.name = `${checkbox.name}_checkbox`
|
||||
.beats__custom(class=field.blockName)
|
||||
label(for=checkbox.name)
|
||||
+field(checkbox)
|
||||
+field(field)
|
||||
|
||||
+block('view')
|
||||
each field in beats
|
||||
if field.type === "checkbox"
|
||||
+hidden(field.name)
|
||||
span(data-i18n=field.name)= field.label
|
||||
else
|
||||
+hidden(`${field.name}_checkbox`)
|
||||
+span(field)
|
||||
|
||||
//- if fieldset.name === "personality-arc"
|
||||
+blob({ name: fieldset.name})
|
||||
+block('content')
|
||||
+repeating(fieldset.name)
|
||||
- const { broadcast, repeating } = downtime;
|
||||
- const [check, name, cost, desc, result] = repeating;
|
||||
+block('edit')
|
||||
.row.downtime__edit
|
||||
//- each field in hidden
|
||||
+field(field)
|
||||
each field in repeating
|
||||
- const hideLabel = ['downtime_check', 'downtime_name'].includes(field.name);
|
||||
- const divClass = field.span ? `col-${field.span}` : '';
|
||||
- const labelClass = hideLabel ? 'visually-hidden' : null;
|
||||
|
||||
.downtime__field(class=`${field.name} ${divClass}`)
|
||||
unless field.type === "checkbox"
|
||||
+field(field)
|
||||
label(class=labelClass, data-i18n=field.name, for=field.name)= field.label
|
||||
else
|
||||
label(for=field.name)
|
||||
+field(field)
|
||||
span(class=labelClass, data-i18n=field.name)= field.label
|
||||
|
||||
+block('view')
|
||||
+bubble({ name: 'downtime', broadcast })
|
||||
+block('header')
|
||||
.downtime__view
|
||||
label.downtime__check
|
||||
+field(check).checkbox--scribble
|
||||
+span(name).downtime__name
|
||||
+span(cost).downtime__cost
|
||||
|
||||
+block('content')
|
||||
+span(result)
|
||||
label(data-i18n=result.name)= result.label
|
||||
+span(desc)
|
||||
label(data-i18n=desc.name)= desc.label
|
||||
|
||||
+block('delete')
|
||||
+span(name).downtime__name
|
||||
|
||||
each section in data.character.downtime.sections
|
||||
+makeDowntimeFieldset(section)
|
||||
@@ -0,0 +1,73 @@
|
||||
- const { gear } = data.character;
|
||||
+panel({ name: 'gear', title: 'Gear' })
|
||||
+block('content')
|
||||
+editorblock('gear')
|
||||
- const { phone, board, raygun } = gear;
|
||||
+block('edit')
|
||||
.gear__item
|
||||
label.gear__label(data-i18n=phone.name)= phone.label
|
||||
+field(phone)
|
||||
.gear__item
|
||||
label.gear__label(data-i18n=raygun.name)= raygun.label
|
||||
+field(raygun)
|
||||
.gear__item
|
||||
label.gear__label(data-i18n=board.name)= board.label
|
||||
+field(board)
|
||||
+block('view')
|
||||
.gear__item
|
||||
+span(phone)
|
||||
label.gear__label(data-i18n=phone.name)= phone.label
|
||||
.gear__item
|
||||
+span(raygun)
|
||||
label.gear__label(data-i18n=raygun.name)= raygun.label
|
||||
.gear__item
|
||||
+span(board)
|
||||
label.gear__label(data-i18n=board.name)= board.label
|
||||
|
||||
+blob({ name: 'gear'})
|
||||
+block('content')
|
||||
+repeating('gear')
|
||||
- const { hidden, broadcast, repeating } = gear;
|
||||
- const [check, name, cost, desc] = repeating;
|
||||
+block('edit')
|
||||
.row.gear__edit
|
||||
each field in hidden
|
||||
+field(field)
|
||||
each field in repeating
|
||||
- const hideLabel = ['gear_check', 'gear_name'].includes(field.name);
|
||||
- const divClass = field.span ? `col-${field.span}` : '';
|
||||
- const labelClass = hideLabel ? 'visually-hidden' : null;
|
||||
|
||||
.gear__field(class=`${field.name} ${divClass}`)
|
||||
unless field.type === "checkbox"
|
||||
+field(field)
|
||||
label(class=labelClass, data-i18n=field.name, for=field.name)= field.label
|
||||
else
|
||||
label(for=field.name)
|
||||
+field(field)
|
||||
span(class=labelClass, data-i18n=field.name)= field.label
|
||||
|
||||
+block('view')
|
||||
.gear__view
|
||||
+bubble({ name: 'gear', broadcast })
|
||||
+block('header')
|
||||
label.gear__check
|
||||
+field(check)
|
||||
+span(name).gear__name
|
||||
+block('content')
|
||||
+span(cost)
|
||||
label(data-i18n=cost.name)= cost.label
|
||||
+span(desc)
|
||||
label(data-i18n=desc.name)= desc.label
|
||||
|
||||
+block('delete')
|
||||
+span(name)
|
||||
|
||||
//- .gear__extra
|
||||
//- each extra in extragear
|
||||
//- label.gear__extra--item
|
||||
//- +field({...extra, type: 'checkbox'})
|
||||
//- if extra.type === 'checkbox'
|
||||
//- span(data-i18n=extra.name)= extra.label
|
||||
//- else
|
||||
//- +span({...extra, name: `${extra.name}_name`})
|
||||
@@ -0,0 +1,27 @@
|
||||
+panel({ name: 'header' })
|
||||
- const { hidden, personality, custom, fields } = character.header;
|
||||
+block('header')
|
||||
each field in hidden
|
||||
+hidden(field)
|
||||
+span(personality).header__title
|
||||
+span(custom).header__title--custom
|
||||
+block('content')
|
||||
+editorblock('header')
|
||||
+block('edit')
|
||||
each field in hidden
|
||||
+hidden(field)
|
||||
each field in fields
|
||||
div(class=`header__${field.name}`)
|
||||
label(data-i18n=field.name, for=field.name)= field.label
|
||||
+field(field)
|
||||
|
||||
if field.name === "personality"
|
||||
.header__personality--custom
|
||||
label(data-i18n=custom.name, for=custom.name)= custom.label
|
||||
+field(custom)
|
||||
+block('view')
|
||||
each field in fields.slice(1)
|
||||
- const divClass = field.span ? `col-${field.span}` : '';
|
||||
div(class=divClass)
|
||||
+span(field)
|
||||
label(data-i18n=field.name)= field.label
|
||||
@@ -0,0 +1,26 @@
|
||||
- const { legacy } = data.character;
|
||||
+panel({ name: 'legacy', title: 'legacy' })
|
||||
+block('content')
|
||||
+repeating('legacy')
|
||||
- const { broadcast, repeating } = legacy;
|
||||
- const [name, desc] = repeating;
|
||||
+block('edit')
|
||||
.row.legacy__edit
|
||||
each field in repeating
|
||||
- const hideLabel = ['trait_check', 'trait_name'].includes(field.name);
|
||||
- const divClass = field.span ? `col-${field.span}` : '';
|
||||
- const labelClass = hideLabel ? 'visually-hidden' : null;
|
||||
.legacy__field(class=`${field.name} ${divClass}`)
|
||||
+field(field)
|
||||
label(class=labelClass, data-i18n=field.name, for=field.name)= field.label
|
||||
|
||||
+block('view')
|
||||
.legacy__view
|
||||
+bubble({ name: 'legacy', broadcast })
|
||||
+block('header')
|
||||
+span(name).legacy__name
|
||||
+block('content')
|
||||
+span(desc)
|
||||
|
||||
+block('delete')
|
||||
+span(name).legacy__name
|
||||
@@ -0,0 +1,54 @@
|
||||
- const { mods } = data.signature;
|
||||
+panel({ name: 'mods', title: 'Mods' })
|
||||
+block('content')
|
||||
+editorblock('mods')
|
||||
- const { fields } = mods;
|
||||
+block('edit')
|
||||
.mods__turbo
|
||||
each field in fields
|
||||
label.mods__check
|
||||
+field(field).checkbox--scribble
|
||||
span(data-i18n='mod_' + field.name)= field.label
|
||||
//- +block('view')
|
||||
.mods__turbo
|
||||
each field in fields
|
||||
+hidden(field.name)
|
||||
div(data-i18n='mod_' + field.name)= field.label
|
||||
|
||||
+blob({ name: 'mods' })
|
||||
+block('content')
|
||||
+repeating('mods')
|
||||
- const { hidden, broadcast, repeating } = mods;
|
||||
- const [check, name, cost, desc] = repeating;
|
||||
+block('edit')
|
||||
.row.mods__edit
|
||||
each field in hidden
|
||||
+field(field)
|
||||
each field in repeating
|
||||
- const hideLabel = ['mod_check', 'mod_name'].includes(field.name);
|
||||
- const divClass = field.span ? `col-${field.span}` : '';
|
||||
- const labelClass = hideLabel ? 'visually-hidden' : null;
|
||||
.mods__field(class=`${field.name} ${divClass}`)
|
||||
unless field.type === "checkbox"
|
||||
+field(field)
|
||||
label(class=labelClass, data-i18n=field.name, for=field.name)= field.label
|
||||
else
|
||||
label(for=field.name)
|
||||
+field(field)
|
||||
span(class=labelClass, data-i18n=field.name)= field.label
|
||||
|
||||
+block('view')
|
||||
+bubble({ name: 'mod', broadcast })
|
||||
+block('header')
|
||||
.mods__view
|
||||
label.mods__check
|
||||
+field(check)
|
||||
+span(name).mod__name
|
||||
+block('content')
|
||||
+span(cost)
|
||||
label(data-i18n=cost.name)= cost.label
|
||||
+span(desc)
|
||||
label(data-i18n=desc.name)= desc.label
|
||||
|
||||
+block('delete')
|
||||
+span(name).mod__name
|
||||
@@ -0,0 +1,27 @@
|
||||
+panel({ name: 'signature' })
|
||||
- const { hidden, signature, custom, fields } = data.signature;
|
||||
+block('header')
|
||||
each field in hidden
|
||||
+hidden(field)
|
||||
+span(signature).signature__title
|
||||
+span(custom).signature__title--custom
|
||||
+block('content')
|
||||
+editorblock('signature')
|
||||
+block('edit')
|
||||
each field in hidden
|
||||
+hidden(field)
|
||||
each field in fields
|
||||
div(class=`signature__${field.name}`)
|
||||
label(data-i18n=field.name, for=field.name)= field.label
|
||||
+field(field)
|
||||
|
||||
if field.name === "signature"
|
||||
.signature__signature--custom
|
||||
label(data-i18n=custom.name, for=custom.name)= custom.label
|
||||
+field(custom)
|
||||
+block('view')
|
||||
each field in fields.slice(1)
|
||||
- const divClass = field.span ? `col-${field.span}` : '';
|
||||
div(class=divClass)
|
||||
+span(field)
|
||||
label(data-i18n=field.name)= field.label
|
||||
@@ -0,0 +1,11 @@
|
||||
- const { slams } = data.character;
|
||||
+blob({ name: 'slams', title: 'Slams', broadcast: slams.broadcast })
|
||||
+block('content')
|
||||
- const { fields } = slams;
|
||||
- const [one, two, three] = slams.fields;
|
||||
|
||||
.slams__boxes
|
||||
each field, index in fields
|
||||
.slams__box(class=`slams__box--${field.name}`)
|
||||
+field(field)
|
||||
label.visually-hidden(data-i18n=field.name, for=field.name)= field.label
|
||||
@@ -0,0 +1,13 @@
|
||||
- const { style } = data.character;
|
||||
+blob({ name: 'style', title: 'Style' })
|
||||
+block('content')
|
||||
- const { subtitle, hidden, track } = style;
|
||||
.style__track
|
||||
each field in hidden
|
||||
+hidden(field.name)
|
||||
each radio in track
|
||||
label.style__checkbox(class=`style__checkbox--${radio.value}`)
|
||||
+field(radio).checkbox--circle
|
||||
span.visually-hidden(data-i18n=`style_${radio.value}`)= radio.label
|
||||
|
||||
+field(subtitle)
|
||||
@@ -0,0 +1,36 @@
|
||||
- const { traits } = data.character;
|
||||
+panel({ name: 'traits', title: 'Traits' })
|
||||
+block('content')
|
||||
+repeating('traits')
|
||||
- const { hidden, broadcast, repeating } = traits;
|
||||
- const [check, name, desc] = repeating;
|
||||
+block('edit')
|
||||
.row.traits__edit
|
||||
each field in hidden
|
||||
+field(field)
|
||||
each field in repeating
|
||||
- const hideLabel = ['trait_check', 'trait_name'].includes(field.name);
|
||||
- const divClass = field.span ? `col-${field.span}` : '';
|
||||
- const labelClass = hideLabel ? 'visually-hidden' : null;
|
||||
.traits__field(class=`${field.name} ${divClass}`)
|
||||
unless field.type === "checkbox"
|
||||
+field(field)
|
||||
label(class=labelClass, data-i18n=field.name, for=field.name)= field.label
|
||||
else
|
||||
label(for=field.name)
|
||||
+field(field)
|
||||
span(class=labelClass, data-i18n=field.name)= field.label
|
||||
|
||||
+block('view')
|
||||
.traits__view
|
||||
+bubble({ name: 'trait', broadcast })
|
||||
+block('header')
|
||||
label.traits__check
|
||||
+field(check)
|
||||
+span(name).trait__name
|
||||
+block('content')
|
||||
+span(desc)
|
||||
|
||||
+block('delete')
|
||||
.traits__view
|
||||
+span(name).trait__name
|
||||
@@ -0,0 +1,14 @@
|
||||
- const { trouble } = data.character;
|
||||
+blob({ name: 'trouble', title: 'Trouble' })
|
||||
+block('content')
|
||||
- const { hidden, track, actions } = trouble;
|
||||
.trouble__track
|
||||
each field in hidden
|
||||
+hidden(field.name)
|
||||
each radio in track
|
||||
label.trouble__checkbox(class=`trouble__checkbox--${radio.value}`)
|
||||
+field(radio).checkbox--circle
|
||||
span.visually-hidden(data-i18n=`trouble_${radio.value}`)= radio.label
|
||||
.trouble__actions
|
||||
each action in actions
|
||||
+action(action)
|
||||
@@ -0,0 +1,27 @@
|
||||
- const { turbo } = data.signature;
|
||||
|
||||
+blob({ name: 'turbo', title: 'Turbo' })
|
||||
+block('content')
|
||||
- const [boosts, kicks] = turbo.fields;
|
||||
- const three = Array.from(Array(3).keys(), (i) => i + 1);
|
||||
|
||||
span(data-i18n='turbo_description') Describe how your device helps you with an action, then boost or kick as needed.
|
||||
|
||||
+field(boosts)
|
||||
+field(kicks)
|
||||
.turbo__clickies
|
||||
each index in three
|
||||
- const field = { ...boosts };
|
||||
- field.type = 'checkbox';
|
||||
- field.name = `${field.name}_${index}`;
|
||||
label.turbo__boost(class=`turbo__boost--${index}`)
|
||||
+field(field)
|
||||
span.visually-hidden(data-i18n=field.name)= field.label + ' ' + index
|
||||
|
||||
each index in three
|
||||
- const field = { ...kicks };
|
||||
- field.type = 'checkbox';
|
||||
- field.name = `${field.name}_${index}`;
|
||||
label.turbo__kick(class=`turbo__kick--${index}`)
|
||||
+field(field)
|
||||
span.visually-hidden(data-i18n=field.name)= field.label + ' ' + index
|
||||
@@ -0,0 +1,34 @@
|
||||
- const { notes } = data.common;
|
||||
+panel({ name: 'notes', title: 'notes' })
|
||||
+block('content')
|
||||
+repeating('notes')
|
||||
- const { hidden, broadcast, repeating } = notes;
|
||||
- const [name, desc] = repeating;
|
||||
+block('edit')
|
||||
.row.notes__edit
|
||||
//- each field in hidden
|
||||
+field(field)
|
||||
each field in repeating
|
||||
- const hideLabel = ['note_check', 'note_name'].includes(field.name);
|
||||
- const divClass = field.span ? `col-${field.span}` : '';
|
||||
- const labelClass = hideLabel ? 'visually-hidden' : null;
|
||||
.notes__field(class=`${field.name} ${divClass}`)
|
||||
unless field.type === "checkbox"
|
||||
+field(field)
|
||||
label(class=labelClass, data-i18n=field.name, for=field.name)= field.label
|
||||
else
|
||||
label(for=field.name)
|
||||
+field(field)
|
||||
span(class=labelClass, data-i18n=field.name)= field.label
|
||||
|
||||
+block('view')
|
||||
+bubble({ name: 'note', broadcast })
|
||||
+block('header')
|
||||
.notes__view
|
||||
+span(name).note__name
|
||||
+block('content')
|
||||
+span(desc)
|
||||
label(data-i18n=desc.name)= desc.label
|
||||
|
||||
+block('delete')
|
||||
+span(name).note__name
|
||||
@@ -0,0 +1,47 @@
|
||||
- const { tracks } = data.common;
|
||||
+panel({ name: 'tracks', title: 'Tracks' })
|
||||
+block('content')
|
||||
+repeating('tracks')
|
||||
- const { hidden, track, broadcast, repeating } = tracks;
|
||||
- const [name, desc] = repeating;
|
||||
+block('edit')
|
||||
.row.tracks__edit
|
||||
each field in hidden
|
||||
+field(field)
|
||||
each field in repeating
|
||||
- const hideLabel = ['track_name'].includes(field.name);
|
||||
- const divClass = field.span ? `col-${field.span}` : '';
|
||||
- const labelClass = hideLabel ? 'visually-hidden' : null;
|
||||
.tracks__field(class=`${field.name} ${divClass}`)
|
||||
unless field.type === "checkbox"
|
||||
+field(field)
|
||||
label(class=labelClass, data-i18n=field.name, for=field.name)= field.label
|
||||
else
|
||||
label(for=field.name)
|
||||
+field(field)
|
||||
span(class=labelClass, data-i18n=field.name)= field.label
|
||||
|
||||
+block('view')
|
||||
+bubble({ name: 'track', broadcast })
|
||||
+block('header')
|
||||
.tracks__view
|
||||
.tracks__progress-track
|
||||
- const twelve = Array.from(Array(12).keys(), (i) => i + 1);
|
||||
each index in twelve
|
||||
- const letter = { ...track.letter };
|
||||
- const marker = { ...track.marker };
|
||||
- letter.name = `${letter.name}_${index}`;
|
||||
- marker.name = `${marker.name}_${index}`;
|
||||
+field(letter).track__letter-exists
|
||||
label.track__progress(class=`track__progress--${index}`)
|
||||
+field(marker).track__marker
|
||||
+span(letter).track__letter
|
||||
span.track__marked X
|
||||
span.visually-hidden(data-i18n=marker.name)= marker.label + ' ' + index
|
||||
+block('content')
|
||||
+span(name).track__name
|
||||
+span(desc)
|
||||
label(data-i18n=desc.name)= desc.label
|
||||
|
||||
+block('delete')
|
||||
+span(name).track__name
|
||||
@@ -0,0 +1,43 @@
|
||||
mixin makeFactionFieldset(fieldset)
|
||||
- const { factions } = data.crew;
|
||||
+panel({ name: fieldset.name, title: fieldset.title }).faction
|
||||
+block('content')
|
||||
+repeating(fieldset.name)
|
||||
- const { broadcast, hidden, repeating } = factions;
|
||||
- const [name, relationship, desc] = repeating;
|
||||
+block('edit')
|
||||
.row.faction__edit
|
||||
each field in hidden
|
||||
+field(field)
|
||||
each field in repeating
|
||||
- const hideLabel = ['faction_check'].includes(field.name);
|
||||
- const divClass = field.span ? `col-${field.span}` : '';
|
||||
- const labelClass = hideLabel ? 'visually-hidden' : null;
|
||||
|
||||
.faction__field(class=`${field.name} ${divClass}`)
|
||||
unless field.type === "checkbox"
|
||||
+field(field)
|
||||
label(class=labelClass, data-i18n=field.name, for=field.name)= field.label
|
||||
else
|
||||
label(for=field.name)
|
||||
+field(field)
|
||||
span(class=labelClass, data-i18n=field.name)= field.label
|
||||
|
||||
+block('view')
|
||||
+bubble({ name: 'faction', broadcast })
|
||||
+block('header')
|
||||
.faction__view
|
||||
+span(relationship).faction__relationship
|
||||
+span(name).faction__name
|
||||
|
||||
+block('content')
|
||||
//- +span(result)
|
||||
//- label(data-i18n=result.name)= result.label
|
||||
+span(desc)
|
||||
label(data-i18n=desc.name)= desc.label
|
||||
|
||||
+block('delete')
|
||||
+span(name).faction__name
|
||||
|
||||
each section in data.crew.factions.sections
|
||||
+makeFactionFieldset(section)
|
||||
@@ -0,0 +1,37 @@
|
||||
+panel({ name: 'fame', title: 'Fame' })
|
||||
- const { fame } = data.crew;
|
||||
+block('content')
|
||||
+editorblock('fame')
|
||||
+block('edit')
|
||||
.fame__hypes
|
||||
each field in fame.hype
|
||||
.fame__hype
|
||||
+field(field)
|
||||
label(data-i18n=field.name, for=field.name)= field.label
|
||||
.fame__ranks
|
||||
each rank in fame.ranks
|
||||
- const { label, style, perks, descriptions } = rank;
|
||||
.fame__rank
|
||||
label.rank(for=label.name)
|
||||
+field(label)
|
||||
span.rank__name(data-i18n=label.name)= label.label
|
||||
if style
|
||||
span.rank__cost(data-i18n=style.name)= style.label
|
||||
each field in perks
|
||||
.fame__perk
|
||||
label.fame__perk--name(for=field.name)
|
||||
+field(field)
|
||||
span(data-i18n=field.name)= field.label
|
||||
//- span.fame__perk--description(data-i18n=`${field.name}_description`)= descriptions[field.name]
|
||||
|
||||
+block('view')
|
||||
.fame__ranks
|
||||
each rank in fame.ranks
|
||||
- const { label, perks, descriptions } = rank;
|
||||
.fame__rank
|
||||
+hidden(label.name)
|
||||
span.rank__name(data-i18n=label.name)= label.label
|
||||
each field in perks
|
||||
.fame__perk
|
||||
+hidden(field.name)
|
||||
span.fame__perk--name(data-i18n=field.name)= field.label
|
||||