GH-51 Dice Macro

- Closes #51
- Adds Dice Rolling buttons to Character Sheet
- Adds Dice Rolling button to Tools panel
- Refactors file names
This commit is contained in:
megastruktur 2020-05-25 19:00:53 +03:00
parent 0e4cdcb68b
commit 11b5b3b5b0
No known key found for this signature in database
GPG key ID: 26EB6D6AE7FDC8C1
18 changed files with 456 additions and 282 deletions

View file

@ -46,7 +46,7 @@ Crew Types:
- Clocks
- Friends/rivals section
- Stress/Harm dynamic values (can be modified by abilities but for now are hardcoded)
- Dice Rolling
- Enhance Dice Rolling (ability modifiers)
## Troubleshooting
- If you can't find the drag-n-dropped item, refer to "All Items" tab on each sheet.

165
module/blades-actor.js Normal file
View file

@ -0,0 +1,165 @@
import { bladesRoll } from "./blades-roll.js";
/**
* Extend the basic Actor
* @extends {Actor}
*/
export class BladesActor extends Actor {
/** @override */
getRollData() {
const data = super.getRollData();
data.dice_amount = this.getAttributeDiceToThrow();
return data;
}
/* -------------------------------------------- */
/**
* Calculate Attribute Dice to throw.
*/
getAttributeDiceToThrow() {
// Calculate Dice to throw.
let dice_amount = {};
for (var attibute_name in this.data.data.attributes) {
dice_amount[attibute_name] = 0;
for (var skill_name in this.data.data.attributes[attibute_name].skills) {
dice_amount[skill_name] = parseInt(this.data.data.attributes[attibute_name].skills[skill_name][0])
// We add a +1d for every skill higher than 0.
if (dice_amount[skill_name] > 0) {
dice_amount[attibute_name]++;
}
}
}
return dice_amount;
}
/* -------------------------------------------- */
rollAttributePopup(attribute_name) {
// const roll = new Roll("1d20 + @abilities.wis.mod", actor.getRollData());
new Dialog({
title: `Roll ${attribute_name}`,
content: `
<h2>Roll ${attribute_name}</h2>
<form>
<div class="form-group">
<label>Modifier:</label>
<select id="mod" name="mod">
${this.createListOfDiceMods(-3,+3,0)}
</select>
</div>
</form>
`,
buttons: {
yes: {
icon: "<i class='fas fa-check'></i>",
label: `Roll`,
callback: (html) => {
let modifier = parseInt(html.find('[name="mod"]')[0].value);
this.rollAttribute(attribute_name, modifier);
}
},
no: {
icon: "<i class='fas fa-times'></i>",
label: `Close`,
},
},
default: "yes",
}).render(true);
}
/* -------------------------------------------- */
rollAttribute(attribute_name = "", additional_dice_amount = 0) {
let dice_amount = 0;
if (attribute_name !== "") {
let roll_data = this.getRollData();
dice_amount += roll_data.dice_amount[attribute_name];
}
else {
dice_amount = 1;
}
dice_amount += additional_dice_amount;
bladesRoll(dice_amount, attribute_name);
}
/* -------------------------------------------- */
/**
* Create <options> for available actions
* which can be performed.
*/
createListOfActions() {
let text, attribute, skill;
let attributes = this.data.data.attributes;
for ( attribute in attributes ) {
var skills = attributes[attribute].skills;
text += `<optgroup label="${attribute} Actions">`;
text += `<option value="${attribute}">${attribute} (Resist)</option>`;
for ( skill in skills ) {
text += `<option value="${skill}">${skill}</option>`;
}
text += `</optgroup>`;
}
return text;
}
/* -------------------------------------------- */
/**
* Creates <options> modifiers for dice roll.
*
* @param {int} rs
* Min die modifier
* @param {int} re
* Max die modifier
* @param {int} s
* Selected die
*/
createListOfDiceMods(rs, re, s) {
var text = ``;
var i = 0;
if ( s == "" ) {
s = 0;
}
for ( i = rs; i <= re; i++ ) {
var plus = "";
if ( i >= 0 ) { plus = "+" };
text += `<option value="${i}"`;
if ( i == s ) {
text += ` selected`;
}
text += `>${plus}${i}d</option>`;
}
return text;
}
/* -------------------------------------------- */
}

View file

@ -195,6 +195,7 @@ export class BladesHelpers {
return list_of_items;
}
/* -------------------------------------------- */
}

123
module/blades-roll.js Normal file
View file

@ -0,0 +1,123 @@
/**
* Roll Dice.
* @param {int} dice_amount
* @param {string} attribute_name
*/
export async function bladesRoll(dice_amount, attribute_name = "") {
let speaker = ChatMessage.getSpeaker();
// ChatMessage.getSpeaker(controlledToken)
let zeromode = false;
if ( dice_amount < 0 ) { dice_amount = 0; }
if ( dice_amount == 0 ) { zeromode = true; dice_amount = 2; }
let r = new Roll( `${dice_amount}d6`, {} );
r.roll();
// r.toMessage();
// Might be better as a DicePool with keep high/keep low intelligence,
// but I want to get my hands into this directly, and I think players
// will want to see all the dice happening.
let rolls = (r.parts)[0].rolls;
// Sort roll values from lowest to highest.
let sorted_rolls = rolls.map(i => i.roll).sort();
let roll_status = "failure"
if (sorted_rolls[0] === 6 && zeromode) {
roll_status = "critical-success";
}
else {
let use_die;
let prev_use_die = false;
if (zeromode) {
use_die = sorted_rolls[0];
}
else {
use_die = sorted_rolls[sorted_rolls.length - 1];
if (sorted_rolls.length - 2 >= 0) {
prev_use_die = sorted_rolls[sorted_rolls.length - 2]
}
}
// 1,2,3 = failure
if (use_die <= 3) {
roll_status = "failure";
}
// if 6 - check the prev highest one.
else if (use_die === 6) {
// 6,6 - critical success
if (prev_use_die && prev_use_die === 6) {
roll_status = "critical-success";
}
// 6 - success
else {
roll_status = "success";
}
}
// else (4,5) = partial success
else {
roll_status = "partial-success";
}
}
let result = await renderTemplate("systems/blades-in-the-dark/templates/blades-roll.html", {rolls: rolls, roll_status: roll_status, attribute_name: attribute_name});
let messageData = {
speaker: speaker,
content: result,
type: CONST.CHAT_MESSAGE_TYPES.OOC,
roll: r
}
CONFIG.ChatMessage.entityClass.create(messageData, {})
return result;
}
/**
* Call a Roll popup.
*/
export async function simpleRollPopup() {
new Dialog({
title: `Simple Roll`,
content: `
<h2>Roll some dice!</h2>
<p>If you want to pull the numbers from a character, select their Token first.</p>
<form>
<div class="form-group">
<label>Number of Dice:</label>
<select id="qty" name="qty">
${Array(11).fill().map((item, i) => `<option value="${i}">${i}d</option>`).join('')}
</select>
</div>
</form>
`,
buttons: {
yes: {
icon: "<i class='fas fa-check'></i>",
label: `Roll`,
callback: (html) => {
let diceQty = html.find('[name="qty"]')[0].value;
console.log("Roll "+diceQty);
bladesRoll(diceQty);
},
},
no: {
icon: "<i class='fas fa-times'></i>",
label: `Cancel`,
},
},
default: "yes"
}).render(true);
}

View file

@ -16,6 +16,8 @@ export class BladesSheet extends ActorSheet {
if ( this.options.submitOnChange ) {
html.on("change", "textarea", this._onChangeInput.bind(this)); // Use delegated listener on the form
}
html.find(".roll-die-attribute").click(this._onRollAttributeDieClick.bind(this));
}
/* -------------------------------------------- */
@ -92,4 +94,16 @@ export class BladesSheet extends ActorSheet {
}
/* -------------------------------------------- */
/**
* Roll an Attribute die.
* @param {*} event
*/
async _onRollAttributeDieClick(event) {
const attribute_name = $(event.currentTarget).data("rollAttribute");
this.actor.rollAttributePopup(attribute_name);
}
/* -------------------------------------------- */
}

View file

@ -5,12 +5,14 @@
*/
// Import Modules
import { preloadHandlebarsTemplates } from "./templates.js";
import { preloadHandlebarsTemplates } from "./blades-templates.js";
import { bladesRoll, simpleRollPopup } from "./blades-roll.js";
import { BladesHelpers } from "./blades-helpers.js";
import { BladesItem } from "./item.js";
import { BladesItemSheet } from "./item-sheet.js";
import { BladesActorSheet } from "./actor-sheet.js";
import { BladesCrewSheet } from "./crew-sheet.js";
import { BladesActor } from "./blades-actor.js";
import { BladesItem } from "./blades-item.js";
import { BladesItemSheet } from "./blades-item-sheet.js";
import { BladesActorSheet } from "./blades-actor-sheet.js";
import { BladesCrewSheet } from "./blades-crew-sheet.js";
window.BladesHelpers = BladesHelpers;
@ -20,11 +22,16 @@ window.BladesHelpers = BladesHelpers;
Hooks.once("init", async function() {
console.log(`Initializing Blades In the Dark System`);
/**
* Set an initiative formula for the system
* @type {String}
*/
game.blades = {
dice: bladesRoll
}
// Define Roll template.
// CONFIG.Dice.template = "systems/blades-in-the-dark/templates/blades-roll.html"
// CONFIG.Dice.tooltip = "systems/blades-in-the-dark/templates/blades-roll-tooltip.html"
CONFIG.Item.entityClass = BladesItem;
CONFIG.Actor.entityClass = BladesActor;
// Register sheet application classes
Actors.unregisterSheet("core", ActorSheet);
@ -139,3 +146,11 @@ Hooks.on("deleteOwnedItem", (parent_entity, child_data, options, userId) => {
BladesHelpers.undoItemLogic(child_data, parent_entity);
return true;
});
// getSceneControlButtons
Hooks.on("renderSceneControls", async (app, html) => {
let dice_roller = $('<li class="scene-control" title="Dice Roll"><i class="fas fa-dice"></i></li>');
dice_roller.click(function() {
simpleRollPopup();
});
html.append(dice_roller);
});

View file

@ -100,7 +100,7 @@
display: flex;
$default_color: $almost_white;
$accent_color: gold;
$accent_color: $gold;
$circle_border_color: $almost_black;
label {

View file

@ -4,6 +4,8 @@ $gray: #999;
$red: red;
$almost_black: #191813;
$almost_white: #EEEFFF;
$gold: #DAA520;
$green: #008000;
// Imports
@import 'mixin.scss';
@ -262,6 +264,10 @@ $almost_white: #EEEFFF;
padding-left: 5px;
}
.attribute-label,
.attribute-skill-label {
text-transform: capitalize;
}
.attributes-exp {
position: relative;
@ -277,7 +283,7 @@ $almost_white: #EEEFFF;
.attributes-container {
display: flex;
margin: 5px 0px;
margin: 3px 0px;
@include custom_radio(15px, 15px);
* {
@ -573,5 +579,30 @@ $almost_white: #EEEFFF;
visibility: visible;
}
}
.blades-die-tooltip {
.die {
font-weight: bold;
text-transform: capitalize;
&.critical-success {
color: $gold;
}
&.success {
color: $green;
}
&.partial-success {
color: $almost_black;
}
&.failure {
color: $red;
}
}
}
}

View file

@ -357,6 +357,10 @@
font-size: 17px;
padding-left: 5px;
}
* #attributes .attribute-label,
* #attributes .attribute-skill-label {
text-transform: capitalize;
}
* #attributes .attributes-exp {
position: relative;
margin-bottom: 10px;
@ -397,7 +401,7 @@
}
* #attributes .attributes-container {
display: flex;
margin: 5px 0px;
margin: 3px 0px;
display: flex;
/* Hide the browser's default checkbox */
}
@ -471,7 +475,7 @@
* .coins label {
height: 15px;
width: 15px;
background-color: gold;
background-color: #DAA520;
vertical-align: middle;
border: 1px solid #191813;
}
@ -485,7 +489,7 @@
background-color: #EEEFFF;
}
* .coins input:checked + label {
background-color: gold;
background-color: #DAA520;
}
* .coins label {
margin-right: 3px;
@ -509,7 +513,7 @@
* .crew-coins label {
height: 15px;
width: 15px;
background-color: gold;
background-color: #DAA520;
vertical-align: middle;
border: 1px solid #191813;
}
@ -523,7 +527,7 @@
background-color: #EEEFFF;
}
* .crew-coins input:checked + label {
background-color: gold;
background-color: #DAA520;
}
* .crew-coins label {
margin-right: 3px;
@ -859,5 +863,21 @@
* .tooltip:hover .tooltiptext {
visibility: visible;
}
* .blades-die-tooltip .die {
font-weight: bold;
text-transform: capitalize;
}
* .blades-die-tooltip .die.critical-success {
color: #DAA520;
}
* .blades-die-tooltip .die.success {
color: #008000;
}
* .blades-die-tooltip .die.partial-success {
color: #191813;
}
* .blades-die-tooltip .die.failure {
color: red;
}
/*# sourceMappingURL=blades.css.map */

View file

@ -1 +1 @@
{"version":3,"sourceRoot":"","sources":["../scss/mixin.scss","../scss/style.scss"],"names":[],"mappings":"AAAA;AAAA;AAAA;AA+CA;AAAA;AAAA;AAgDA;AAAA;AAAA;AA0CA;AAAA;AAAA;AAkCA;AAAA;AAAA;AA0DA;AAAA;AAAA;AA4FA;AAAA;AAAA;AAoCA;AAAA;AAAA;AC3VA;AAAA;AAAA;AAGA;EACE;;AAEA;EACE;;AAGF;EACE;;AAIA;EACE;;AAIJ;EACE;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAEA;EACE;;AAIJ;EACE;;AAGF;EACE;;AAGF;EACE;EACA;;AAIJ;EACE;;AAGF;AAAA;EAEE;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE,kBApFW;EAqFX,OApFW;EAqFX;EACA;EACA;EACA;EACA;;AAGF;EACE,kBAhGG;EAiGH,OA/FW;EAgGX;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA,kBAzGW;EA0GX,OAzGW;EA0GX;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA,kBAvHG;EAwHH;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;;AAKF;EAEE;EACA;EACA;EACA;AAmBA;;AAjBA;EACE;;AAEA;EACE;;AAIJ;EACE;;AAIF;EDvJF;AAyBA;;AArBE;EACE,QCmJ0B;EDlJ1B,OCkJoB;EDjJpB;EACA;EACA;EACA;;AAEA;EACE;;AAEF;EACE;EACA;EACA;EACA;EACA;;AAMN;EAEE;;AAIE;EACE;;AAEF;EACE;;AC0HF;ED9JJ;AAyBA;ECuIM;;AD5JJ;EACE,QC0J4B;EDzJ5B,OCyJsB;EDxJtB;EACA;EACA;EACA;;AAEA;EACE;;AAEF;EACE;EACA;EACA;EACA;EACA;;AAMN;EAEE;;AAIE;EACE;;AAEF;EACE;;AC8HA;EACE;EACA;;AAKN;EDhCF;EACA;ECiCI;EACA;;ADjCJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;;AACA;EAEE;;AAEA;EACE,OC5JF;;ADgKF;EACE;EACA;;ACoBF;EACE;;AAEF;EACE;;AAEF;EACE;;AAIA;EACE;;AAON;EDvMA;AAyBA;ECgLE;EACA;EACA;;ADvMA;EACE,QCmMwB;EDlMxB,OCkMkB;EDjMlB;EACA;EACA;EACA;;AAEA;EACE;;AAEF;EACE;EACA;EACA;EACA;EACA;;AAMN;EAEE;;AAIE;EACE;;AAEF;EACE;;AC0KN;EAEE;;AAGA;EAEE;;AAEA;EACE;;AAEA;EACE,kBA5NK;EA6NL,OA5NK;;AA+NP;EACE;;AAMN;EDvDF;EACA;EACA;EACA;EACA;EACA;EACA;EACA;ECkDI;;ADhDJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA,kBClME;;ADqMJ;EACE;EACA;;AAGE;EACE,kBCzMO;;AD2MT;EACE,kBC9MF;;ADoNJ;EACE;;AAMA;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;ACmBA;EACE;EACA;EACA;;AAMN;EAEE;EACA;EACA;;AAEA;EACE,kBA9PS;EA+PT,OA9PS;EA+PT;EACA;;AAGF;EAEE;EACA;;AAEA;EDxQJ;AAyBA;ECiPM;EACA;EACA;;ADxQJ;EACE,QCoQ4B;EDnQ5B,OCmQsB;EDlQtB;EACA;EACA;EACA;;AAEA;EACE;;AAEF;EACE;EACA;EACA;EACA;EACA;;AAMN;EAEE;;AAIE;EACE;;AAEF;EACE;;AC4OJ;EACE;EACA;EDnOJ;AA2BA;;AApBE;EACE,QC4N4B;ED3N5B,OC2NsB;ED1NtB,kBC1DS;ED4DT;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;;AAMN;EACE;;AAIE;EACE,kBCjFO;;ADmFT;EACE,kBCrFO;;AAsRT;EACE;;AAMN;EAEE;;AAEA;EAEE;;AACA;EACE;;AAGF;EACE;EACA;;AAIJ;EACE;;AAEF;EACE;;AAEF;AAAA;EAEE;;AAIJ;EACE;;AAGF;AAAA;AAAA;EAGE;;AAGF;EACE;;AAMF;ED3OA;AAqBA;ECwNE;;ADtOA;EACE,QCgOQ;ED/NR,OC+NQ;ED9NR,kBARW;EAUX;EACA;;AAEA;EACE;;AAMN;EACE;;AAIE;EACE,kBC3HO;;AD6HT;EACE,kBA7BS;;AC6Ob;EACE,cAPU;EAQV,eARU;;AAUV;EACE;;AAIJ;EACE;;AAGF;EACE;;AAMJ;EDnQA;AAqBA;ECgPE;EACA;;AD/PA;EACE,QCgOQ;ED/NR,OC+NQ;ED9NR,kBARW;EAUX;EACA;;AAEA;EACE;;AAMN;EACE;;AAIE;EACE,kBC3HO;;AD6HT;EACE,kBA7BS;;ACsQb;EACE,cAhCU;EAiCV,eAjCU;;AAuCd;EACE;EDhXF;AAyBA;;AArBE;EACE,QC4WwB;ED3WxB,OC2WkB;ED1WlB;EACA;EACA;EACA;;AAEA;EACE;;AAEF;EACE;EACA;EACA;EACA;EACA;;AAMN;EAEE;;AAIE;EACE;;AAEF;EACE;;AC+UJ;EACE;;AAMJ;EAEE;EACA;;AAEA;EACE;EACA;EACA;;AAEA;EACE;;AAEF;EACE;;AAKF;EDpKJ,OCqK0B;EDpK1B,QCoKiC;EDnKjC,kBC/OU;EDgPV;EACA,QARc;EASd;;AAGE;EACE,kBCrPC;EDsPD;;AAIJ;EAEE;EACA;EACA,kBC/PQ;;ADiQR;EAEE;EACA;EACA;;AAEF;EACE;;AAEF;EACE,MCuIsB;;ADpIxB;EAEE;EACA;EACA;;AAEF;EACE;;AAEF;EACE,KC0H6B;;ADrHjC;EACE,kBC7RG;;ADgSL;EACE;EACA;EACA;EACA,OC6GwB;ED5GxB;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;;AAIA;EACE;EACA;EACA;;AC6FA;ED1KJ,OC2K0B;ED1K1B,QC0KiC;EDzKjC,kBC/OU;EDgPV;EACA,QARc;EASd;;AAGE;EACE,kBCrPC;EDsPD;;AAIJ;EAEE;EACA;EACA,kBC/PQ;;ADiQR;EAEE;EACA;EACA;;AAEF;EACE;;AAEF;EACE,MC6IsB;;AD1IxB;EAEE;EACA;EACA;;AAEF;EACE;;AAEF;EACE,KCgI6B;;AD3HjC;EACE,kBC7RG;;ADgSL;EACE;EACA;EACA;EACA,OCmHwB;EDlHxB;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;;AAIA;EACE;EACA;EACA;;ACmGJ;EACE;EDzFF;AAkBA;ECyEE;;ADvFA;EACE,QCqF+B;EDpF/B,OCoFyB;EDnFzB;EACA;EACA;EACA;;AAEA;EACE;;AAMN;EAEE;;AAGE;EACE;;ACqEN;EAEE,kBApaG;EAqaH;EACA;EACA;EACA;EACA;EDjEF;AAeA;;AAXE;EACE,QC8D0B;ED7D1B,OC6D0B;ED5D1B,kBC7WS;ED+WT;EACA;EACA;;AAKJ;EACE;;AAIE;EACE,cC6C8B;ED5C9B,kBC5XO;;AD8XT;EACE,kBChYO;EDiYP,cCjYO;;AA2aX;EACE;;AAKJ;EACE;;AAGF;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA,OAldS;;AAydX;EACE;;AAIE;EACE,OAheJ;;AA0eF;EACE;;AAIJ;EACE;;AAEA;EACE;;AAEF;EACE;;AAIA;EACE;;AAIJ;EAEE;;AAEA;EACE;;AAEA;EACE,OArgBK;EAsgBL;EACA,kBAxgBK;;AA4gBT;EACE;EACA;EACA;;AAMN;EAEE;EACA;EACA;EACA;;AAEA;AAAA;EAEE;;AAEA;AAAA;EACE;;AAQJ;EACE;EACA;EACA,kBA5iBS;EA6iBT,OA5iBS;EA6iBT;EACA;EACA;EAGA;EACA;;AAGF;EACE","file":"blades.css"}
{"version":3,"sourceRoot":"","sources":["../scss/mixin.scss","../scss/style.scss"],"names":[],"mappings":"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","file":"blades.css"}

View file

@ -2,17 +2,17 @@
"name": "blades-in-the-dark",
"title": "Blades in the Dark",
"description": "Blades in the dark game system.",
"version": "0.5.2",
"version": "0.6.0",
"minimumCoreVersion": "0.5.3",
"compatibleCoreVersion": "0.5.7",
"compatibleCoreVersion": "0.6.0",
"templateVersion": 1,
"author": "megastruktur",
"esmodules": ["module/blades.js"],
"styles": ["styles/blades.css"],
"languages": ["en"],
"url": "https://github.com/megastruktur/foundryvtt-blades-in-the-dark/",
"manifest": "https://raw.githubusercontent.com/megastruktur/foundryvtt-blades-in-the-dark/0.5.2/system.json",
"download": "https://github.com/megastruktur/foundryvtt-blades-in-the-dark/archive/0.5.2.zip",
"manifest": "https://raw.githubusercontent.com/megastruktur/foundryvtt-blades-in-the-dark/0.6.0/system.json",
"download": "https://github.com/megastruktur/foundryvtt-blades-in-the-dark/archive/0.6.0.zip",
"packs": [
{
"name": "class",

View file

@ -0,0 +1,25 @@
<div class="dice-tooltip blades-die-tooltip">
<div class="die {{roll_status}}">
{{#if attribute_name}}Roll {{attribute_name}}: {{/if}}
{{#if (eq roll_status "critical-success")}}
Critical Success!
{{/if}}
{{#if (eq roll_status "success")}}
Success!
{{/if}}
{{#if (eq roll_status "partial-success")}}
Partial Success
{{/if}}
{{#if (eq roll_status "failure")}}
Failure
{{/if}}
<ol class="dice-rolls">
{{#each this.rolls}}
<li class="roll die d6">{{{this.roll}}}</li>
{{/each}}
</ol>
</div>

View file

@ -1,278 +1,58 @@
<div id="attributes">
<div id="attributes-insight" class="attribute">
<div id="attributes-insight-title" class="attributes-exp">
{{#each data.attributes as |attribute attribute_name|}}
<div id="attributes-{{attribute_name}}" class="attribute">
<div id="attributes-{{attribute_name}}-title" class="attributes-exp">
<div class="stripe">
<label for="insight-exp-0">Insight</label>
<label class="attribute-label" for="{{attribute_name}}-exp-0">{{attribute_name}}</label>
<a class="roll-die-attribute" data-roll-attribute="{{attribute_name}}" title="Roll"><i class="fas fa-dice"></i></a>
</div>
<div class="stripe-tooth-body">
{{#multiboxes data.attributes.insight.exp}}
<input type="radio" id="insight-exp-0" name="data.attributes.insight.exp" value="0" checked="checked">
<input type="radio" id="insight-exp-1" name="data.attributes.insight.exp" value="1">
<label for="insight-exp-1"></label>
<input type="radio" id="insight-exp-2" name="data.attributes.insight.exp" value="2">
<label for="insight-exp-2"></label>
<input type="radio" id="insight-exp-3" name="data.attributes.insight.exp" value="3">
<label for="insight-exp-3"></label>
<input type="radio" id="insight-exp-4" name="data.attributes.insight.exp" value="4">
<label for="insight-exp-4"></label>
<input type="radio" id="insight-exp-5" name="data.attributes.insight.exp" value="5">
<label for="insight-exp-5"></label>
<input type="radio" id="insight-exp-6" name="data.attributes.insight.exp" value="6">
<label for="insight-exp-6"></label>
{{#multiboxes attribute.exp}}
<input type="radio" id="{{attribute_name}}-exp-0" name="data.attributes.{{attribute_name}}.exp" value="0" checked="checked">
<input type="radio" id="{{attribute_name}}-exp-1" name="data.attributes.{{attribute_name}}.exp" value="1">
<label for="{{attribute_name}}-exp-1"></label>
<input type="radio" id="{{attribute_name}}-exp-2" name="data.attributes.{{attribute_name}}.exp" value="2">
<label for="{{attribute_name}}-exp-2"></label>
<input type="radio" id="{{attribute_name}}-exp-3" name="data.attributes.{{attribute_name}}.exp" value="3">
<label for="{{attribute_name}}-exp-3"></label>
<input type="radio" id="{{attribute_name}}-exp-4" name="data.attributes.{{attribute_name}}.exp" value="4">
<label for="{{attribute_name}}-exp-4"></label>
<input type="radio" id="{{attribute_name}}-exp-5" name="data.attributes.{{attribute_name}}.exp" value="5">
<label for="{{attribute_name}}-exp-5"></label>
<input type="radio" id="{{attribute_name}}-exp-6" name="data.attributes.{{attribute_name}}.exp" value="6">
<label for="{{attribute_name}}-exp-6"></label>
{{/multiboxes}}
</div>
</div>
{{!-- Skills --}}
<div class="attributes-container">
{{#multiboxes data.attributes.insight.skills.hunt}}
<input type="radio" id="attributes-hunt-0" name="data.attributes.insight.skills.hunt" value="0">
<label for="attributes-hunt-0"></label>
<input type="radio" id="attributes-hunt-1" name="data.attributes.insight.skills.hunt" value="1">
<label for="attributes-hunt-1"></label>
<span>|</span>
<input type="radio" id="attributes-hunt-2" name="data.attributes.insight.skills.hunt" value="2">
<label for="attributes-hunt-2"></label>
<input type="radio" id="attributes-hunt-3" name="data.attributes.insight.skills.hunt" value="3">
<label for="attributes-hunt-3"></label>
<input type="radio" id="attributes-hunt-4" name="data.attributes.insight.skills.hunt" value="4">
<label for="attributes-hunt-4"></label>
<div class="attribute-skill-label">Hunt</div>
{{/multiboxes}}
</div>
<div class="attributes-container">
{{#multiboxes data.attributes.insight.skills.study}}
<input type="radio" id="attributes-study-0" name="data.attributes.insight.skills.study" value="0">
<label for="attributes-study-0"></label>
<input type="radio" id="attributes-study-1" name="data.attributes.insight.skills.study" value="1">
<label for="attributes-study-1"></label>
<span>|</span>
<input type="radio" id="attributes-study-2" name="data.attributes.insight.skills.study" value="2">
<label for="attributes-study-2"></label>
<input type="radio" id="attributes-study-3" name="data.attributes.insight.skills.study" value="3">
<label for="attributes-study-3"></label>
<input type="radio" id="attributes-study-4" name="data.attributes.insight.skills.study" value="4">
<label for="attributes-study-4"></label>
<div class="attribute-skill-label">Study</div>
{{/multiboxes}}
</div>
<div class="attributes-container">
{{#multiboxes data.attributes.insight.skills.survey}}
<input type="radio" id="attributes-survey-0" name="data.attributes.insight.skills.survey" value="0">
<label for="attributes-survey-0"></label>
<input type="radio" id="attributes-survey-1" name="data.attributes.insight.skills.survey" value="1">
<label for="attributes-survey-1"></label>
<span>|</span>
<input type="radio" id="attributes-survey-2" name="data.attributes.insight.skills.survey" value="2">
<label for="attributes-survey-2"></label>
<input type="radio" id="attributes-survey-3" name="data.attributes.insight.skills.survey" value="3">
<label for="attributes-survey-3"></label>
<input type="radio" id="attributes-survey-4" name="data.attributes.insight.skills.survey" value="4">
<label for="attributes-survey-4"></label>
<div class="attribute-skill-label">Survey</div>
{{/multiboxes}}
</div>
<div class="attributes-container">
{{#multiboxes data.attributes.insight.skills.tinker}}
<input type="radio" id="attributes-tinker-0" name="data.attributes.insight.skills.tinker" value="0">
<label for="attributes-tinker-0"></label>
<input type="radio" id="attributes-tinker-1" name="data.attributes.insight.skills.tinker" value="1">
<label for="attributes-tinker-1"></label>
<span>|</span>
<input type="radio" id="attributes-tinker-2" name="data.attributes.insight.skills.tinker" value="2">
<label for="attributes-tinker-2"></label>
<input type="radio" id="attributes-tinker-3" name="data.attributes.insight.skills.tinker" value="3">
<label for="attributes-tinker-3"></label>
<input type="radio" id="attributes-tinker-4" name="data.attributes.insight.skills.tinker" value="4">
<label for="attributes-tinker-4"></label>
<div class="attribute-skill-label">Tinker</div>
{{/multiboxes}}
</div>
</div>
<div id="attributes-prowess" class="attribute">
<div id="attributes-prowess-title" class="attributes-exp">
<div class="stripe">
<label for="prowess-exp-0">Prowess</label>
</div>
<div class="stripe-tooth-body">
{{#multiboxes data.attributes.prowess.exp}}
<input type="radio" id="prowess-exp-0" name="data.attributes.prowess.exp" value="0" checked="checked">
<input type="radio" id="prowess-exp-1" name="data.attributes.prowess.exp" value="1">
<label for="prowess-exp-1"></label>
<input type="radio" id="prowess-exp-2" name="data.attributes.prowess.exp" value="2">
<label for="prowess-exp-2"></label>
<input type="radio" id="prowess-exp-3" name="data.attributes.prowess.exp" value="3">
<label for="prowess-exp-3"></label>
<input type="radio" id="prowess-exp-4" name="data.attributes.prowess.exp" value="4">
<label for="prowess-exp-4"></label>
<input type="radio" id="prowess-exp-5" name="data.attributes.prowess.exp" value="5">
<label for="prowess-exp-5"></label>
<input type="radio" id="prowess-exp-6" name="data.attributes.prowess.exp" value="6">
<label for="prowess-exp-6"></label>
{{#each attribute.skills as |skill skill_name|}}
<div class="flex-horizontal">
<div class="attributes-container">
{{#multiboxes skill}}
<input type="radio" id="attributes-{{skill_name}}-0" name="data.attributes.{{attribute_name}}.skills.{{skill_name}}" value="0">
<label for="attributes-{{skill_name}}-0"></label>
<input type="radio" id="attributes-{{skill_name}}-1" name="data.attributes.{{attribute_name}}.skills.{{skill_name}}" value="1">
<label for="attributes-{{skill_name}}-1"></label>
<span>|</span>
<input type="radio" id="attributes-{{skill_name}}-2" name="data.attributes.{{attribute_name}}.skills.{{skill_name}}" value="2">
<label for="attributes-{{skill_name}}-2"></label>
<input type="radio" id="attributes-{{skill_name}}-3" name="data.attributes.{{attribute_name}}.skills.{{skill_name}}" value="3">
<label for="attributes-{{skill_name}}-3"></label>
<input type="radio" id="attributes-{{skill_name}}-4" name="data.attributes.{{attribute_name}}.skills.{{skill_name}}" value="4">
<label for="attributes-{{skill_name}}-4"></label>
<div class="attribute-skill-label">{{skill_name}}</div>
{{/multiboxes}}
</div>
<a class="roll-die-attribute" data-roll-attribute="{{skill_name}}" title="Roll"><i class="fas fa-dice"></i></a>
</div>
{{!-- Skills --}}
<div class="attributes-container">
{{#multiboxes data.attributes.prowess.skills.finesse}}
<input type="radio" id="attributes-finesse-0" name="data.attributes.prowess.skills.finesse" value="0">
<label for="attributes-finesse-0"></label>
<input type="radio" id="attributes-finesse-1" name="data.attributes.prowess.skills.finesse" value="1">
<label for="attributes-finesse-1"></label>
<span>|</span>
<input type="radio" id="attributes-finesse-2" name="data.attributes.prowess.skills.finesse" value="2">
<label for="attributes-finesse-2"></label>
<input type="radio" id="attributes-finesse-3" name="data.attributes.prowess.skills.finesse" value="3">
<label for="attributes-finesse-3"></label>
<input type="radio" id="attributes-finesse-4" name="data.attributes.prowess.skills.finesse" value="4">
<label for="attributes-finesse-4"></label>
<div class="attribute-skill-label">Finesse</div>
{{/multiboxes}}
</div>
<div class="attributes-container">
{{#multiboxes data.attributes.prowess.skills.prowl}}
<input type="radio" id="attributes-prowl-0" name="data.attributes.prowess.skills.prowl" value="0">
<label for="attributes-prowl-0"></label>
<input type="radio" id="attributes-prowl-1" name="data.attributes.prowess.skills.prowl" value="1">
<label for="attributes-prowl-1"></label>
<span>|</span>
<input type="radio" id="attributes-prowl-2" name="data.attributes.prowess.skills.prowl" value="2">
<label for="attributes-prowl-2"></label>
<input type="radio" id="attributes-prowl-3" name="data.attributes.prowess.skills.prowl" value="3">
<label for="attributes-prowl-3"></label>
<input type="radio" id="attributes-prowl-4" name="data.attributes.prowess.skills.prowl" value="4">
<label for="attributes-prowl-4"></label>
<div class="attribute-skill-label">Prowl</div>
{{/multiboxes}}
</div>
<div class="attributes-container">
{{#multiboxes data.attributes.prowess.skills.skirmish}}
<input type="radio" id="attributes-skirmish-0" name="data.attributes.prowess.skills.skirmish" value="0">
<label for="attributes-skirmish-0"></label>
<input type="radio" id="attributes-skirmish-1" name="data.attributes.prowess.skills.skirmish" value="1">
<label for="attributes-skirmish-1"></label>
<span>|</span>
<input type="radio" id="attributes-skirmish-2" name="data.attributes.prowess.skills.skirmish" value="2">
<label for="attributes-skirmish-2"></label>
<input type="radio" id="attributes-skirmish-3" name="data.attributes.prowess.skills.skirmish" value="3">
<label for="attributes-skirmish-3"></label>
<input type="radio" id="attributes-skirmish-4" name="data.attributes.prowess.skills.skirmish" value="4">
<label for="attributes-skirmish-4"></label>
<div class="attribute-skill-label">Skirmish</div>
{{/multiboxes}}
</div>
<div class="attributes-container">
{{#multiboxes data.attributes.prowess.skills.wreck}}
<input type="radio" id="attributes-wreck-0" name="data.attributes.prowess.skills.wreck" value="0">
<label for="attributes-wreck-0"></label>
<input type="radio" id="attributes-wreck-1" name="data.attributes.prowess.skills.wreck" value="1">
<label for="attributes-wreck-1"></label>
<span>|</span>
<input type="radio" id="attributes-wreck-2" name="data.attributes.prowess.skills.wreck" value="2">
<label for="attributes-wreck-2"></label>
<input type="radio" id="attributes-wreck-3" name="data.attributes.prowess.skills.wreck" value="3">
<label for="attributes-wreck-3"></label>
<input type="radio" id="attributes-wreck-4" name="data.attributes.prowess.skills.wreck" value="4">
<label for="attributes-wreck-4"></label>
<div class="attribute-skill-label">Wreck</div>
{{/multiboxes}}
</div>
{{/each}}
</div>
{{/each}}
<div id="attributes-resolve" class="attribute">
<div id="attributes-resolve-title" class="attributes-exp">
<div class="stripe">
<label for="resolve-exp-0">Resolve</label>
</div>
<div class="stripe-tooth-body">
{{#multiboxes data.attributes.resolve.exp}}
<input type="radio" id="resolve-exp-0" name="data.attributes.resolve.exp" value="0" checked="checked">
<input type="radio" id="resolve-exp-1" name="data.attributes.resolve.exp" value="1">
<label for="resolve-exp-1"></label>
<input type="radio" id="resolve-exp-2" name="data.attributes.resolve.exp" value="2">
<label for="resolve-exp-2"></label>
<input type="radio" id="resolve-exp-3" name="data.attributes.resolve.exp" value="3">
<label for="resolve-exp-3"></label>
<input type="radio" id="resolve-exp-4" name="data.attributes.resolve.exp" value="4">
<label for="resolve-exp-4"></label>
<input type="radio" id="resolve-exp-5" name="data.attributes.resolve.exp" value="5">
<label for="resolve-exp-5"></label>
<input type="radio" id="resolve-exp-6" name="data.attributes.resolve.exp" value="6">
<label for="resolve-exp-6"></label>
{{/multiboxes}}
</div>
</div>
{{!-- Skills --}}
<div class="attributes-container">
{{#multiboxes data.attributes.resolve.skills.attune}}
<input type="radio" id="attributes-attune-0" name="data.attributes.resolve.skills.attune" value="0">
<label for="attributes-attune-0"></label>
<input type="radio" id="attributes-attune-1" name="data.attributes.resolve.skills.attune" value="1">
<label for="attributes-attune-1"></label>
<span>|</span>
<input type="radio" id="attributes-attune-2" name="data.attributes.resolve.skills.attune" value="2">
<label for="attributes-attune-2"></label>
<input type="radio" id="attributes-attune-3" name="data.attributes.resolve.skills.attune" value="3">
<label for="attributes-attune-3"></label>
<input type="radio" id="attributes-attune-4" name="data.attributes.resolve.skills.attune" value="4">
<label for="attributes-attune-4"></label>
<div class="attribute-skill-label">Attune</div>
{{/multiboxes}}
</div>
<div class="attributes-container">
{{#multiboxes data.attributes.resolve.skills.command}}
<input type="radio" id="attributes-command-0" name="data.attributes.resolve.skills.command" value="0">
<label for="attributes-command-0"></label>
<input type="radio" id="attributes-command-1" name="data.attributes.resolve.skills.command" value="1">
<label for="attributes-command-1"></label>
<span>|</span>
<input type="radio" id="attributes-command-2" name="data.attributes.resolve.skills.command" value="2">
<label for="attributes-command-2"></label>
<input type="radio" id="attributes-command-3" name="data.attributes.resolve.skills.command" value="3">
<label for="attributes-command-3"></label>
<input type="radio" id="attributes-command-4" name="data.attributes.resolve.skills.command" value="4">
<label for="attributes-command-4"></label>
<div class="attribute-skill-label">Command</div>
{{/multiboxes}}
</div>
<div class="attributes-container">
{{#multiboxes data.attributes.resolve.skills.consort}}
<input type="radio" id="attributes-consort-0" name="data.attributes.resolve.skills.consort" value="0">
<label for="attributes-consort-0"></label>
<input type="radio" id="attributes-consort-1" name="data.attributes.resolve.skills.consort" value="1">
<label for="attributes-consort-1"></label>
<span>|</span>
<input type="radio" id="attributes-consort-2" name="data.attributes.resolve.skills.consort" value="2">
<label for="attributes-consort-2"></label>
<input type="radio" id="attributes-consort-3" name="data.attributes.resolve.skills.consort" value="3">
<label for="attributes-consort-3"></label>
<input type="radio" id="attributes-consort-4" name="data.attributes.resolve.skills.consort" value="4">
<label for="attributes-consort-4"></label>
<div class="attribute-skill-label">Consort</div>
{{/multiboxes}}
</div>
<div class="attributes-container">
{{#multiboxes data.attributes.resolve.skills.sway}}
<input type="radio" id="attributes-sway-0" name="data.attributes.resolve.skills.sway" value="0">
<label for="attributes-sway-0"></label>
<input type="radio" id="attributes-sway-1" name="data.attributes.resolve.skills.sway" value="1">
<label for="attributes-sway-1"></label>
<span>|</span>
<input type="radio" id="attributes-sway-2" name="data.attributes.resolve.skills.sway" value="2">
<label for="attributes-sway-2"></label>
<input type="radio" id="attributes-sway-3" name="data.attributes.resolve.skills.sway" value="3">
<label for="attributes-sway-3"></label>
<input type="radio" id="attributes-sway-4" name="data.attributes.resolve.skills.sway" value="4">
<label for="attributes-sway-4"></label>
<div class="attribute-skill-label">Sway</div>
{{/multiboxes}}
</div>
</div>
</div>