Amélioration fiche d'item

This commit is contained in:
ZigmundKreud 2021-11-08 14:40:29 +01:00
parent b6ad8a846e
commit 0c24f49470
44 changed files with 1007 additions and 571 deletions

View File

@ -245,6 +245,9 @@
.bol input::placeholder { .bol input::placeholder {
color: lightgray; color: lightgray;
} }
.bol .property {
margin-top: 2px;
}
/* ----------------------------------------- */ /* ----------------------------------------- */
/* LOCAL FONTS */ /* LOCAL FONTS */
/* ----------------------------------------- */ /* ----------------------------------------- */
@ -282,7 +285,14 @@
overflow-y: auto; overflow-y: auto;
} }
.items-list .item-header { .items-list .item-header {
font-family: "CCMeanwhile", cursive; font-family: 'Signika', sans-serif;
font-size: 1em;
color: #4b4a44;
background-color: lightgray;
}
.items-list .item-header .item-name {
font-family: "Wolfsbane2Expanded", cursive;
font-size: 1.5em;
} }
.items-list .item { .items-list .item {
min-height: 30px; min-height: 30px;
@ -293,13 +303,41 @@
} }
.items-list .item .item-image { .items-list .item .item-image {
flex: 0 0 30px; flex: 0 0 30px;
margin-right: 5px; padding: 0;
margin: 0 5px 0 0;
height: 30px;
width: 30px;
min-height: 30px;
min-width: 30px;
} }
.items-list .item .item-image img { .items-list .item .item-image img {
padding: 0;
margin: 0; margin: 0;
border: none; border: none;
height: 30px;
width: 30px;
min-height: 30px;
min-width: 30px;
} }
.items-list .item .item-name { .items-list .item .item-image.roll-weapon,
.items-list .item .item-image.roll-career {
background-color: transparent;
background-image: url("../../../icons/svg/dice-target.svg") !important;
background-size: 30px 30px;
background-repeat: no-repeat;
background-position: center;
cursor: pointer;
}
.items-list .item .item-image.roll-weapon:hover,
.items-list .item .item-image.roll-career:hover {
background-color: gray;
}
.items-list .item .item-image.roll-weapon:hover img,
.items-list .item .item-image.roll-career:hover img {
visibility: hidden;
}
.items-list .item .item-name,
.items-list .item .item-field {
margin: 0; margin: 0;
} }
.items-list .item .item-controls-1 { .items-list .item .item-controls-1 {
@ -315,8 +353,86 @@
.items-list .item .item-control { .items-list .item .item-control {
color: #4b4a44; color: #4b4a44;
} }
/* ----------------------------------------- */
/* Premade colors */
/* ----------------------------------------- */
.light {
color: lightgray;
}
.bg-light {
background: lightgray;
}
.darkgray {
color: #23221d;
}
.bg-darkgray {
background: #23221d;
color: #fff;
}
.darkbrown {
color: #464331c4;
}
.bg-darkbrown {
background: #464331c4;
color: #fff;
}
.darkslate {
color: darkslategray;
}
.bg-darkslate {
background: darkslategray;
color: #fff;
}
.darkgreen {
color: #003c1e;
}
.bg-darkgreen {
background: #003c1e;
color: #fff;
}
.darkblue {
color: midnightblue;
}
.bg-darkblue {
background: midnightblue;
color: #fff;
}
.blue {
color: #009ee0;
}
.bg-blue {
background: #009ee0;
color: #fff;
}
.green {
color: #44a12b;
}
.bg-green {
background: #44a12b;
color: #fff;
}
.black {
color: #000;
}
.bg-black {
background: #000;
color: #fff;
}
.red {
color: #cd071e;
}
.bg-red {
background: #cd071e;
color: #fff;
}
.purple {
color: purple;
}
.bg-purple {
background: purple;
color: #fff;
}
.bol.sheet .window-content { .bol.sheet .window-content {
background: white;
height: 100%; height: 100%;
padding: 5px; padding: 5px;
overflow-y: hidden; overflow-y: hidden;
@ -395,10 +511,11 @@
min-height: 700px; min-height: 700px;
height: 700px; height: 700px;
} }
.bol.sheet.actor .window-content { .bol.sheet.actor .window-content form {
background-image: url("/systems/bol/ui/logo.webp"); background-image: url("/systems/bol/ui/logo.webp");
background-repeat: no-repeat; background-repeat: no-repeat;
background-size: 190px 115px; background-size: 190px 115px;
background-color: white;
} }
.bol.sheet.actor .window-content form .sidebar { .bol.sheet.actor .window-content form .sidebar {
padding-top: 115px; padding-top: 115px;
@ -496,7 +613,7 @@
.bol.sheet.actor .header-field-label, .bol.sheet.actor .header-field-label,
.bol.sheet.actor .stat-label { .bol.sheet.actor .stat-label {
font-weight: bold; font-weight: bold;
font-family: "Wolfsbane2Expanded", serif; font-family: "Wolfsbane2Expanded", cursive;
font-size: 2rem; font-size: 2rem;
font-variant: small-caps; font-variant: small-caps;
} }
@ -526,6 +643,38 @@
min-width: 460px; min-width: 460px;
min-height: 400px; min-height: 400px;
} }
.bol.sheet.item h1 input.itemname {
font-family: "Wolfsbane2Expanded", cursive;
}
.bol.sheet.item .item-properties {
flex: 0 0 150px;
margin: 5px 5px 5px 0;
padding-right: 5px;
border-right: 1px groove #eeede0;
}
.bol.sheet.item .item-properties .form-group {
margin: 0;
}
.bol.sheet.item .item-properties .form-group label {
line-height: 20px;
}
.bol.sheet.item .item-properties .form-group input {
text-align: right;
}
.bol.sheet.item .item-properties .properties-list {
list-style: none;
margin: 0;
padding: 0;
}
.bol.sheet.item .item-properties .properties-list li {
margin: 3px 0;
padding: 0 2px;
background: rgba(0, 0, 0, 0.05);
border: 1px groove #eeede0;
text-align: center;
font-size: 12px;
line-height: 18px;
}
.editor, .editor,
.editor-content { .editor-content {
height: 100%; height: 100%;
@ -541,9 +690,8 @@
color: darkgreen; color: darkgreen;
} }
.chat-message .chat-icon { .chat-message .chat-icon {
border: 0; flex: 0 0 64px;
padding: 2px 6px 2px 2px; border: 1px outset lightgray;
float: left;
width: 64px; width: 64px;
height: 64px; height: 64px;
} }

View File

@ -19,6 +19,7 @@
"BOL.resources.faith": "Foi", "BOL.resources.faith": "Foi",
"BOL.resources.creation": "Création", "BOL.resources.creation": "Création",
"BOL.resources.power": "Pouvoir", "BOL.resources.power": "Pouvoir",
"BOL.resources.villainy": "Vilénie",
"BOL.traits.xp": "Expérience", "BOL.traits.xp": "Expérience",
"BOL.ui.tab.stats": "Attributs", "BOL.ui.tab.stats": "Attributs",
@ -43,26 +44,45 @@
"BOL.ui.unequip": "Déséquiper", "BOL.ui.unequip": "Déséquiper",
"BOL.ui.equip": "Equiper", "BOL.ui.equip": "Equiper",
"BOL.ui.delete": "Supprimer", "BOL.ui.delete": "Supprimer",
"BOL.ui.roll" : "Utiliser",
"BOL.ui.protection" : "Protection",
"BOL.ui.blocking" : "Blocage",
"BOL.ui.range" : "Portée",
"BOL.ui.quantity" : "Quantité",
"BOL.ui.weight" : "Poids",
"BOL.ui.price": "Prix",
"BOL.featureCategory.origins": "Origines", "BOL.featureCategory.origins": "Origines",
"BOL.featureCategory.races": "Races", "BOL.featureCategory.races": "Races",
"BOL.featureCategory.careers": "Carrieres", "BOL.featureCategory.careers": "Carrières",
"BOL.featureCategory.boons": "Avantages", "BOL.featureCategory.boons": "Avantages",
"BOL.featureCategory.flaws": "Desavantages", "BOL.featureCategory.flaws": "Désavantages",
"BOL.featureCategory.languages": "Langages", "BOL.featureCategory.languages": "Langages",
"BOL.itemCategory.equipment": "Equipement", "BOL.featureSubtypes.origin": "Origine",
"BOL.featureSubtypes.race": "Race",
"BOL.featureSubtypes.career": "Carrière",
"BOL.featureSubtypes.boon": "Avantage",
"BOL.featureSubtypes.flaw": "Désavantage",
"BOL.featureSubtypes.language": "Langage",
"BOL.itemCategory.equipment": "Équipement",
"BOL.itemCategory.consumable": "Consommable", "BOL.itemCategory.consumable": "Consommable",
"BOL.itemCategory.spell": "Sort", "BOL.itemCategory.spell": "Sort",
"BOL.itemCategory.mount": "Monture", "BOL.itemCategory.mount": "Monture",
"BOL.itemCategory.vehicle": "Véhicule", "BOL.itemCategory.vehicle": "Véhicule",
"BOL.itemCategory.other": "Autre", "BOL.itemCategory.other": "Autre",
"BOL.combatCategory.protections": "Protections",
"BOL.combatCategory.shields": "Boucliers",
"BOL.combatCategory.melee": "Armes de contact",
"BOL.combatCategory.ranged": "Armes à distance",
"BOL.equipmentCategory.weapon": "Arme", "BOL.equipmentCategory.weapon": "Arme",
"BOL.equipmentCategory.protection": "Protection", "BOL.equipmentCategory.protection": "Protection",
"BOL.equipmentCategory.jewel": "Bijou", "BOL.equipmentCategory.jewel": "Bijou",
"BOL.equipmentCategory.scroll": "Parchemin", "BOL.equipmentCategory.scroll": "Parchemin",
"BOL.equipmentCategory.ammunition": "munition", "BOL.equipmentCategory.ammunition": "Munition",
"BOL.equipmentCategory.container": "Conteneur", "BOL.equipmentCategory.container": "Conteneur",
"BOL.equipmentCategory.currency": "Monnaie", "BOL.equipmentCategory.currency": "Monnaie",
"BOL.equipmentCategory.other": "Autre", "BOL.equipmentCategory.other": "Autre",
@ -116,6 +136,14 @@
"BOL.itemSoak.formula": "Formule", "BOL.itemSoak.formula": "Formule",
"BOL.itemSoak.value": "Valeur", "BOL.itemSoak.value": "Valeur",
"BOL.range.PointBlank": "Bout portant",
"BOL.range.Short": "Courte",
"BOL.range.Medium": "Moyenne",
"BOL.range.Long": "Long",
"BOL.range.VeryLong": "Très longue",
"BOL.range.Extreme": "Extrême",
"BOL.range.Maximum": "Maximale",
"Careers": "Carrieres", "Careers": "Carrieres",
"Name": "Nom", "Name": "Nom",

View File

@ -19,6 +19,7 @@
"BOL.resources.faith": "Foi", "BOL.resources.faith": "Foi",
"BOL.resources.creation": "Création", "BOL.resources.creation": "Création",
"BOL.resources.power": "Pouvoir", "BOL.resources.power": "Pouvoir",
"BOL.resources.villainy": "Vilénie",
"BOL.traits.xp": "Expérience", "BOL.traits.xp": "Expérience",
"BOL.ui.tab.stats": "Attributs", "BOL.ui.tab.stats": "Attributs",
@ -43,26 +44,50 @@
"BOL.ui.unequip": "Déséquiper", "BOL.ui.unequip": "Déséquiper",
"BOL.ui.equip": "Equiper", "BOL.ui.equip": "Equiper",
"BOL.ui.delete": "Supprimer", "BOL.ui.delete": "Supprimer",
"BOL.ui.roll" : "Utiliser",
"BOL.ui.equipment" : "Équipement",
"BOL.ui.weapon" : "Arme",
"BOL.ui.melee" : "Arme de contact",
"BOL.ui.ranged" : "Arme à distance",
"BOL.ui.protection" : "Protection",
"BOL.ui.shield" : "Bouclier",
"BOL.ui.blocking" : "Blocage",
"BOL.ui.range" : "Portée",
"BOL.ui.quantity" : "Quantité",
"BOL.ui.weight" : "Poids",
"BOL.ui.price": "Prix",
"BOL.featureCategory.origins": "Origines", "BOL.featureCategory.origins": "Origines",
"BOL.featureCategory.races": "Races", "BOL.featureCategory.races": "Races",
"BOL.featureCategory.careers": "Carrieres", "BOL.featureCategory.careers": "Carrières",
"BOL.featureCategory.boons": "Avantages", "BOL.featureCategory.boons": "Avantages",
"BOL.featureCategory.flaws": "Desavantages", "BOL.featureCategory.flaws": "Désavantages",
"BOL.featureCategory.languages": "Langages", "BOL.featureCategory.languages": "Langages",
"BOL.itemCategory.equipment": "Equipement", "BOL.featureSubtypes.origin": "Origine",
"BOL.featureSubtypes.race": "Race",
"BOL.featureSubtypes.career": "Carrière",
"BOL.featureSubtypes.boon": "Avantage",
"BOL.featureSubtypes.flaw": "Désavantage",
"BOL.featureSubtypes.language": "Langage",
"BOL.itemCategory.equipment": "Équipement",
"BOL.itemCategory.consumable": "Consommable", "BOL.itemCategory.consumable": "Consommable",
"BOL.itemCategory.spell": "Sort", "BOL.itemCategory.spell": "Sort",
"BOL.itemCategory.mount": "Monture", "BOL.itemCategory.mount": "Monture",
"BOL.itemCategory.vehicle": "Véhicule", "BOL.itemCategory.vehicle": "Véhicule",
"BOL.itemCategory.other": "Autre", "BOL.itemCategory.other": "Autre",
"BOL.combatCategory.protections": "Protections",
"BOL.combatCategory.shields": "Boucliers",
"BOL.combatCategory.melee": "Armes de contact",
"BOL.combatCategory.ranged": "Armes à distance",
"BOL.equipmentCategory.weapon": "Arme", "BOL.equipmentCategory.weapon": "Arme",
"BOL.equipmentCategory.protection": "Protection", "BOL.equipmentCategory.protection": "Protection",
"BOL.equipmentCategory.jewel": "Bijou", "BOL.equipmentCategory.jewel": "Bijou",
"BOL.equipmentCategory.scroll": "Parchemin", "BOL.equipmentCategory.scroll": "Parchemin",
"BOL.equipmentCategory.ammunition": "munition", "BOL.equipmentCategory.ammunition": "Munition",
"BOL.equipmentCategory.container": "Conteneur", "BOL.equipmentCategory.container": "Conteneur",
"BOL.equipmentCategory.currency": "Monnaie", "BOL.equipmentCategory.currency": "Monnaie",
"BOL.equipmentCategory.other": "Autre", "BOL.equipmentCategory.other": "Autre",
@ -116,6 +141,14 @@
"BOL.itemSoak.formula": "Formule", "BOL.itemSoak.formula": "Formule",
"BOL.itemSoak.value": "Valeur", "BOL.itemSoak.value": "Valeur",
"BOL.range.PointBlank": "Bout portant",
"BOL.range.Short": "Courte",
"BOL.range.Medium": "Moyenne",
"BOL.range.Long": "Long",
"BOL.range.VeryLong": "Très longue",
"BOL.range.Extreme": "Extrême",
"BOL.range.Maximum": "Maximale",
"Careers": "Carrieres", "Careers": "Carrieres",
"Name": "Nom", "Name": "Nom",

View File

@ -31,7 +31,6 @@ export class BoLActorSheet extends ActorSheet {
html.find('.item-edit').click(ev => { html.find('.item-edit').click(ev => {
const li = $(ev.currentTarget).parents(".item"); const li = $(ev.currentTarget).parents(".item");
const item = this.actor.items.get(li.data("itemId")); const item = this.actor.items.get(li.data("itemId"));
console.log(item);
item.sheet.render(true); item.sheet.render(true);
}); });
html.find('.roll-attribute').click(ev => { html.find('.roll-attribute').click(ev => {
@ -64,51 +63,17 @@ export class BoLActorSheet extends ActorSheet {
/** @override */ /** @override */
getData(options) { getData(options) {
console.debug("getData"); const actorData = super.getData(options);
const actor = super.getData(options); actorData.data = {
console.log(actor.data); details : this.actor.details,
actor.data.details = actor.data.data.details; attributes : this.actor.attributes,
actor.data.attributes = Object.values(actor.data.data.attributes); aptitudes : this.actor.aptitudes,
actor.data.aptitudes = Object.values(actor.data.data.aptitudes); resources : this.actor.resources,
actor.data.resources = Object.values(actor.data.data.resources); equipment : this.actor.equipment,
actor.data.equipment = actor.data.items.filter(i => i.type === "item" || i.type == 'weapon' || i.type == 'armor'); combat : this.actor.buildCombat(),
actor.data.weapons = duplicate(actor.data.items.filter(i => i.type == 'weapon' )); features : this.actor.buildFeatures()
actor.data.armors = duplicate(actor.data.items.filter(i => i.type == 'armor' ));
actor.data.features = {
"careers" : {
"label" : "BOL.featureCategory.careers",
"ranked" : true,
"items" : actor.data.items.filter(i => i.type === "feature" && i.data.subtype === "career")
},
"origins" : {
"label" : "BOL.featureCategory.origins",
"ranked" : false,
"items" : actor.data.items.filter(i => i.type === "feature" && i.data.subtype === "origin")
},
"races" : {
"label" : "BOL.featureCategory.races",
"ranked" : false,
"items" : actor.data.items.filter(i => i.type === "feature" && i.data.subtype === "race")
},
"boons" : {
"label" : "BOL.featureCategory.boons",
"ranked" : false,
"items" : actor.data.items.filter(i => i.type === "feature" && i.data.subtype === "boon")
},
"flaws" : {
"label" : "BOL.featureCategory.flaws",
"ranked" : false,
"items" : actor.data.items.filter(i => i.type === "feature" && i.data.subtype === "flaw")
},
"languages" : {
"label" : "BOL.featureCategory.languages",
"ranked" : false,
"items" : actor.data.items.filter(i => i.type === "feature" && i.data.subtype === "language")
}
}; };
return actorData;
return actor;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */

View File

@ -10,9 +10,6 @@ export class BoLActor extends Actor {
/** @override */ /** @override */
prepareData() { prepareData() {
super.prepareData(); super.prepareData();
console.debug("prepareData");
const actorData = this.data; const actorData = this.data;
// console.log(actorData); // console.log(actorData);
// const data = actorData.data; // const data = actorData.data;
@ -25,10 +22,9 @@ export class BoLActor extends Actor {
} }
} }
// /** /**
// * Prepare Character type specific data * Prepare Character type specific data
// */ */
/* -------------------------------------------- */
_prepareCharacterData(actorData) { _prepareCharacterData(actorData) {
let newVitality = 10 + this.data.data.attributes.vigor.value; let newVitality = 10 + this.data.data.attributes.vigor.value;
if ( newVitality != this.data.data.resources.hp.max) { if ( newVitality != this.data.data.resources.hp.max) {
@ -38,18 +34,153 @@ export class BoLActor extends Actor {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
getBoons() { get itemData(){
return this.data.items.filter(i => i.type === "feature" && i.data.subtype === "boon"); return Array.from(this.data.items.values()).map(i => i.data);
}
get details() {
return this.data.data.details;
}
get attributes() {
return Object.values(this.data.data.attributes);
}
get aptitudes() {
return Object.values(this.data.data.aptitudes);
}
get resources() {
return Object.values(this.data.data.resources);
}
get boons() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "boon");
}
get flaws() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "flaw");
}
get careers() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "career");
}
get origins() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "origin");
}
get races() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "race");
}
get languages() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "language");
}
get features() {
return this.itemData.filter(i => i.type === "feature");
}
get equipment() {
return this.itemData.filter(i => i.type === "item");
}
get weapons() {
return this.itemData.filter(i => i.type === "item" && i.data.subtype === "weapon");
}
get armors() {
return this.itemData.filter(i => i.type === "item" && i.data.subtype === "armor" && i.data.worn === true);
}
get helms() {
return this.itemData.filter(i => i.type === "item" && i.data.subtype === "helm" && i.data.worn === true);
}
get shields() {
return this.itemData.filter(i => i.type === "item" && i.data.subtype === "shield" && i.data.worn === true);
}
get protections() {
return this.armors.concat(this.helms)
}
get melee() {
return this.weapons.filter(i => i.data.properties.melee === true && i.data.worn === true);
}
get ranged() {
return this.weapons.filter(i => i.data.properties.ranged === true && i.data.worn === true);
}
buildFeatures(){
return {
"careers": {
"label": "BOL.featureCategory.careers",
"ranked": true,
"items": this.careers
},
"origins": {
"label": "BOL.featureCategory.origins",
"ranked": false,
"items": this.origins
},
"races": {
"label": "BOL.featureCategory.races",
"ranked": false,
"items": this.races
},
"boons": {
"label": "BOL.featureCategory.boons",
"ranked": false,
"items": this.boons
},
"flaws": {
"label": "BOL.featureCategory.flaws",
"ranked": false,
"items": this.flaws
},
"languages": {
"label": "BOL.featureCategory.languages",
"ranked": false,
"items": this.languages
}
};
}
buildCombat(){
return {
"melee" : {
"label" : "BOL.combatCategory.melee",
"weapon" : true,
"protection" : false,
"blocking" : false,
"ranged" : false,
"items" : this.melee
},
"ranged" : {
"label" : "BOL.combatCategory.ranged",
"weapon" : true,
"protection" : false,
"blocking" : false,
"ranged" : true,
"items" : this.ranged
},
"protections" : {
"label" : "BOL.combatCategory.protections",
"weapon" : false,
"protection" : true,
"blocking" : false,
"ranged" : false,
"items" : this.protections
},
"shields" : {
"label" : "BOL.combatCategory.shields",
"weapon" : false,
"protection" : false,
"blocking" : true,
"ranged" : false,
"items" : this.shields
}
};
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
getFlaws() { buildRollData(mode, title) {
return this.data.items.filter(i => i.type === "feature" && i.data.subtype === "flaw"); return {
mode : mode,
title : title,
actorId: this.id,
actorImg: this.img,
boons : this.boons,
flaws : this.flaws,
d6Bonus: 0,
d6Malus: 0,
rollMode: game.settings.get("core", "rollMode"),
optionsBonusMalus: BoLUtility.buildListOptions(-8, +2),
bonusMalus: 0
} }
/* -------------------------------------------- */
getCareers() {
return this.data.items.filter(i => i.type === "feature" && i.data.subtype === "career");
} }
/* -------------------------------------------- */
saveRollData( rollData) { saveRollData( rollData) {
this.currentRollData = rollData; this.currentRollData = rollData;
} }
@ -61,20 +192,8 @@ export class BoLActor extends Actor {
attr = this.data.data.aptitudes[attrKey]; attr = this.data.data.aptitudes[attrKey];
} }
if (attr) { if (attr) {
let rollData = { let rollData = this.buildRollData("attribute", game.i18n.localize(attr.label));
mode : "attribute", rollData.attribute = duplicate(attr);
actorId: this.id,
actorImg: this.img,
attribute: duplicate(attr),
boons : this.getBoons(),
flaws : this.getFlaws(),
d6Bonus: 0,
d6Malus: 0,
rollMode: game.settings.get("core", "rollMode"),
title: game.i18n.localize(attr.label),
optionsBonusMalus: BoLUtility.buildListOptions(-8, +2),
bonusMalus: 0
}
let rollDialog = await BoLRollDialog.create( this, rollData); let rollDialog = await BoLRollDialog.create( this, rollData);
rollDialog.render( true ); rollDialog.render( true );
} else { } else {
@ -86,22 +205,10 @@ export class BoLActor extends Actor {
async rollCareer( careerId ) { async rollCareer( careerId ) {
let career = BoLUtility.data(this.data.items.find( item => item.type == 'feature' && item.id == careerId)); let career = BoLUtility.data(this.data.items.find( item => item.type == 'feature' && item.id == careerId));
if (career) { if (career) {
let rollData = { let rollData = this.buildRollData("career", `${career.name} : ${career.data.rank}`);
mode : "career", rollData.career = career;
actorId: this.id, rollData.rollAttribute = 'mind';
actorImg: this.img, rollData.attributes = duplicate(this.data.data.attributes);
career : career,
rollAttribute: 'mind',
attributes : duplicate(this.data.data.attributes),
boons : this.getBoons(),
flaws : this.getFlaws(),
d6Bonus: 0,
d6Malus: 0,
rollMode: game.settings.get("core", "rollMode"),
title: `${career.name} : ${career.data.rank}`,
optionsBonusMalus: BoLUtility.buildListOptions(-8, +2),
bonusMalus: 0
}
let rollDialog = await BoLRollDialog.create( this, rollData); let rollDialog = await BoLRollDialog.create( this, rollData);
rollDialog.render( true ); rollDialog.render( true );
} else { } else {
@ -111,35 +218,24 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
async rollWeapon( weaponId ) { async rollWeapon( weaponId ) {
let weapon = BoLUtility.data(this.data.items.find( item => item.type == 'weapon' && item.id == weaponId)); let weapon = BoLUtility.data(this.data.items.find( item => item.type == 'item' && item.id == weaponId));
if (weapon) { if (weapon) {
let target = BoLUtility.getTarget(); let target = BoLUtility.getTarget();
if ( !target) { // if ( !target) {
ui.notifications.warn("You must have a target to attack with a Weapon"); // ui.notifications.warn("You must have a target to attack with a Weapon");
return; // return;
} // }
let objectDefender = BoLUtility.data(game.actors.get(target.data.actorId)); let objectDefender = (target) ? BoLUtility.data(game.actors.get(target.data.actorId)) : null;
objectDefender = mergeObject(objectDefender, target.data.actorData); objectDefender = (objectDefender) ? mergeObject(objectDefender, target.data.actorData) : null;
let rollData = { let rollData = this.buildRollData("weapon", weapon.name);
mode : "weapon", rollData.weapon = weapon;
actorId: this.id, rollData.target = target;
actorImg: this.img, rollData.isRanged = BoLUtility.isRangedWeapon( weapon );
weapon : weapon, rollData.defender = objectDefender;
target: target, rollData.rollAttribute = 'agility';
isRanged: BoLUtility.isRangedWeapon( weapon ), rollData.attributes = duplicate(this.data.data.attributes); // For damage bonus
defender: objectDefender, rollData.rangeModifier = 0;
boons : this.getBoons(),
flaws : this.getFlaws(),
rollAttribute: 'agility',
attributes: duplicate(this.data.data.attributes), // For damage bonus
d6Bonus: 0,
d6Malus: 0,
rollMode: game.settings.get("core", "rollMode"),
title: weapon.name,
rangeModifier: 0,
optionsBonusMalus: BoLUtility.buildListOptions(-8, +2),
bonusMalus: 0
}
if ( weapon.data.type == 'melee') { if ( weapon.data.type == 'melee') {
rollData.aptitude = duplicate(this.data.data.aptitudes.melee); rollData.aptitude = duplicate(this.data.data.aptitudes.melee);
} else { } else {

View File

@ -14,7 +14,8 @@ Hooks.once('init', async function () {
game.bol = { game.bol = {
BoLActor, BoLActor,
BoLItem BoLItem,
config:BOL
}; };
/** /**

View File

@ -31,12 +31,14 @@ export class BoLItemSheet extends ItemSheet {
/** @override */ /** @override */
getData() { getData() {
const objectData = BoLUtility.data(this.object); const objectData = BoLUtility.data(this.item);
// const objectData = BoLUtility.data(this.object);
let itemData = foundry.utils.deepClone(BoLUtility.templateData(this.object)); let itemData = foundry.utils.deepClone(BoLUtility.templateData(this.item));
let formData = { let formData = {
title: this.title, title: this.title,
id: this.id, id: this.id,
config: game.bol.config,
type: objectData.type, type: objectData.type,
img: objectData.img, img: objectData.img,
name: objectData.name, name: objectData.name,
@ -46,7 +48,9 @@ export class BoLItemSheet extends ItemSheet {
limited: this.object.limited, limited: this.object.limited,
options: this.options, options: this.options,
owner: this.document.isOwner, owner: this.document.isOwner,
isGM: game.user.isGM isGM: game.user.isGM,
itemProperties : this.item.itemProperties
} }
console.log("ITEMDATA", formData); console.log("ITEMDATA", formData);
this.options.editable = !(this.object.data.origin == "embeddedItem"); this.options.editable = !(this.object.data.origin == "embeddedItem");
@ -73,4 +77,5 @@ export class BoLItemSheet extends ItemSheet {
if (!this.options.editable) return; if (!this.options.editable) return;
// Roll handlers, click handlers, etc. would go here. // Roll handlers, click handlers, etc. would go here.
} }
} }

View File

@ -8,11 +8,33 @@ export class BoLItem extends Item {
*/ */
prepareData() { prepareData() {
super.prepareData(); super.prepareData();
console.debug("Item prepareData"); // console.debug("Item prepareData");
// Get the Item's data // Get the Item's data
const itemData = this.data; const itemData = this.data;
console.log(itemData); // console.log(itemData);
const actorData = this.actor ? this.actor.data : {}; const actorData = this.actor ? this.actor.data : {};
const data = itemData.data; const data = itemData.data;
} }
get properties() {
return this.data.properties;
}
/* -------------------------------------------- */
/**
* Get the Array of item properties which are used in the small sidebar of the description tab
* @return {Array}
* @private
*/
get itemProperties() {
const props = [];
if ( this.data.type === "item" ) {
const entries = Object.entries(this.data.data.properties);
props.push(...entries.filter(e => e[1] === true).map(e => { return game.bol.config.itemProperties[e[0]] }));
}
return props.filter(p => !!p);
}
} }

View File

@ -33,12 +33,13 @@ export class BoLUtility {
/* -------------------------------------------- */ /* -------------------------------------------- */
static buildListOptions(min, max) { static buildListOptions(min, max) {
let options = "" let options = [];
for (let i = min; i <= max; i++) { for (let i = min; i <= max; i++) {
options += `<option value="${i}">${i}</option>` options.push(`<option value="${i}">${i}</option>`);
} }
return options; return options.join("");
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static async showDiceSoNice(roll, rollMode) { static async showDiceSoNice(roll, rollMode) {
if (game.modules.get("dice-so-nice")?.active) { if (game.modules.get("dice-so-nice")?.active) {

View File

@ -19,7 +19,7 @@ BOL.itemCategories = {
"other" : "BOL.itemCategory.other" "other" : "BOL.itemCategory.other"
} }
BOL.equipmentCategory = { BOL.equipmentCategories = {
"weapon" : "BOL.equipmentCategory.weapon", "weapon" : "BOL.equipmentCategory.weapon",
"protection" : "BOL.equipmentCategory.protection", "protection" : "BOL.equipmentCategory.protection",
"jewel" : "BOL.equipmentCategory.jewel", "jewel" : "BOL.equipmentCategory.jewel",
@ -30,20 +30,20 @@ BOL.equipmentCategory = {
"other" : "BOL.equipmentCategory.other" "other" : "BOL.equipmentCategory.other"
} }
BOL.protectionCategory = { BOL.protectionCategories = {
"armor" : "BOL.protectionCategory.armor", "armor" : "BOL.protectionCategory.armor",
"shield" : "BOL.protectionCategory.shield", "shield" : "BOL.protectionCategory.shield",
"helm" : "BOL.protectionCategory.helm", "helm" : "BOL.protectionCategory.helm",
"other" : "BOL.protectionCategory.other" "other" : "BOL.protectionCategory.other"
} }
BOL.weaponCategory = { BOL.weaponCategories = {
"melee" : "BOL.weaponCategory.melee", "melee" : "BOL.weaponCategory.melee",
"ranged" : "BOL.weaponCategory.ranged", "ranged" : "BOL.weaponCategory.ranged",
"other" : "BOL.weaponCategory.other" "other" : "BOL.weaponCategory.other"
} }
BOL.itemProperty = { BOL.itemProperties = {
"equipable" : "BOL.itemProperty.equipable", "equipable" : "BOL.itemProperty.equipable",
"protection" : "BOL.itemProperty.protection", "protection" : "BOL.itemProperty.protection",
"blocking" : "BOL.itemProperty.blocking", "blocking" : "BOL.itemProperty.blocking",
@ -61,10 +61,10 @@ BOL.itemProperty = {
"ranged" : "BOL.itemProperty.ranged", "ranged" : "BOL.itemProperty.ranged",
"weapon" : "BOL.itemProperty.weapon", "weapon" : "BOL.itemProperty.weapon",
"reloadable" : "BOL.itemProperty.reloadable", "reloadable" : "BOL.itemProperty.reloadable",
"worn" : "BOL.itemProperty.worn" "worn" : "BOL.itemProperty.worn",
} }
BOL.itemStat = { BOL.itemStats = {
"quantity" : "BOL.itemStat.quantity", "quantity" : "BOL.itemStat.quantity",
"weight" : "BOL.itemStat.weight", "weight" : "BOL.itemStat.weight",
"price" : "BOL.itemStat.price", "price" : "BOL.itemStat.price",
@ -93,6 +93,15 @@ BOL.itemSoak = {
"value" : "BOL.itemSoak.value" "value" : "BOL.itemSoak.value"
} }
BOL.featureSubtypes = {
"origin" : "BOL.featureSubtypes.origin",
"race" : "BOL.featureSubtypes.race",
"career" : "BOL.featureSubtypes.career",
"boon" : "BOL.featureSubtypes.boon",
"flaw" : "BOL.featureSubtypes.flaw",
"language" : "BOL.featureSubtypes.language"
}
BOL.itemIcons = { BOL.itemIcons = {
"item": "icons/containers/chest/chest-worn-oak-tan.webp", "item": "icons/containers/chest/chest-worn-oak-tan.webp",
"capacity": "icons/sundries/scrolls/scroll-plain-tan-red.webp", "capacity": "icons/sundries/scrolls/scroll-plain-tan-red.webp",

View File

@ -5,8 +5,9 @@ export class BoLRollDialog extends Dialog {
/* -------------------------------------------- */ /* -------------------------------------------- */
static async create(actor, rollData ) { static async create(actor, rollData ) {
let options = { classes: ["BoL"], width: 600, height: 320, 'z-index': 99999 }; let options = { classes: ["bol", "dialog"], width: 600, height: 320, 'z-index': 99999 };
let html = await renderTemplate(`systems/bol/templates/roll/roll-dialog-${rollData.mode}.hbs`, rollData); // let html = await renderTemplate(`systems/bol/templates/roll/roll-dialog-${rollData.mode}.hbs`, rollData);
let html = await renderTemplate(`systems/bol/templates/roll/roll-dialog.hbs`, rollData);
return new BoLRollDialog(actor, rollData, html, options ); return new BoLRollDialog(actor, rollData, html, options );
} }

View File

@ -17,10 +17,16 @@ export const preloadHandlebarsTemplates = async function () {
"systems/bol/templates/item/parts/item-header.hbs", "systems/bol/templates/item/parts/item-header.hbs",
"systems/bol/templates/item/parts/properties/feature-properties.hbs", "systems/bol/templates/item/parts/properties/feature-properties.hbs",
"systems/bol/templates/item/parts/properties/equipment-properties.hbs", "systems/bol/templates/item/parts/properties/equipment-properties.hbs",
"systems/bol/templates/item/parts/properties/protection-properties.hbs",
"systems/bol/templates/item/parts/properties/shield-properties.hbs",
"systems/bol/templates/item/parts/properties/weapon-properties.hbs",
"systems/bol/templates/item/parts/properties/armor-properties.hbs", "systems/bol/templates/item/parts/properties/armor-properties.hbs",
"systems/bol/templates/item/parts/properties/melee-properties.hbs", "systems/bol/templates/item/parts/properties/melee-properties.hbs",
"systems/bol/templates/item/parts/properties/ranged-properties.hbs", "systems/bol/templates/item/parts/properties/ranged-properties.hbs",
"systems/bol/templates/item/parts/properties/item-properties.hbs" "systems/bol/templates/item/parts/properties/item-properties.hbs",
// DIALOGS
"systems/bol/templates/roll/parts/roll-dialog-modifiers.hbs",
"systems/bol/templates/roll/parts/roll-dialog-attribute.hbs"
]; ];
// Load the template parts // Load the template parts

View File

@ -15,7 +15,7 @@
{"_id":"cS2LGlXLZegvRGOo","name":"Arbalète lourde","type":"item","img":"icons/weapons/crossbows/crossbow-golden-bolt.webp","data":{"subtype":"weapon","description":"<h1>Arbalète lourde</h1><p>plus lourde et plus puissante quune arbalète normale, larbalète lourde est peu usitée en Lémurie, sauf comme arme de siège portative. Il faut 2 rounds complets pour charger une arbalète lourde.</p>","properties":{"ranged":true,"melee":false,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"stackable":false,"activable":false,"consumable":false,"magical":false,"concealable":false,"ignoreshield":false,"2H":false,"reloadable":true,"bow":false,"crossbow":false,"powder":false,"throwing":false,"bashing":false,"2h":true,"damage":"d6B","range":45,"reload":2},"quantity":null,"weight":null},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}} {"_id":"cS2LGlXLZegvRGOo","name":"Arbalète lourde","type":"item","img":"icons/weapons/crossbows/crossbow-golden-bolt.webp","data":{"subtype":"weapon","description":"<h1>Arbalète lourde</h1><p>plus lourde et plus puissante quune arbalète normale, larbalète lourde est peu usitée en Lémurie, sauf comme arme de siège portative. Il faut 2 rounds complets pour charger une arbalète lourde.</p>","properties":{"ranged":true,"melee":false,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"stackable":false,"activable":false,"consumable":false,"magical":false,"concealable":false,"ignoreshield":false,"2H":false,"reloadable":true,"bow":false,"crossbow":false,"powder":false,"throwing":false,"bashing":false,"2h":true,"damage":"d6B","range":45,"reload":2},"quantity":null,"weight":null},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
{"_id":"d7UV55xQXXfMiGQI","name":"Fronde","type":"item","img":"icons/weapons/slings/slingshot-wood.webp","data":{"subtype":"weapon","description":"<h1>Fronde</h1><p>simple pièce de cuir équipée de lanières, une fronde permet de projeter de petites pierres ou des billes de plomb avec une certaine force. Cest une arme peu coûteuse et facile à fabriquer. Il existe une version plus puissante, montée au bout dun bâton (ce qui en fait une arme à deux mains), qui permet des tirs à plus longue portée.</p>","properties":{"ranged":true,"melee":false,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"stackable":false,"activable":false,"consumable":false,"magical":false,"concealable":false,"ignoreshield":false,"2H":false,"reloadable":true,"bow":false,"crossbow":false,"powder":false,"throwing":false,"bashing":false,"damage":"d6M","range":9,"reload":0},"quantity":null,"weight":null},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}} {"_id":"d7UV55xQXXfMiGQI","name":"Fronde","type":"item","img":"icons/weapons/slings/slingshot-wood.webp","data":{"subtype":"weapon","description":"<h1>Fronde</h1><p>simple pièce de cuir équipée de lanières, une fronde permet de projeter de petites pierres ou des billes de plomb avec une certaine force. Cest une arme peu coûteuse et facile à fabriquer. Il existe une version plus puissante, montée au bout dun bâton (ce qui en fait une arme à deux mains), qui permet des tirs à plus longue portée.</p>","properties":{"ranged":true,"melee":false,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"stackable":false,"activable":false,"consumable":false,"magical":false,"concealable":false,"ignoreshield":false,"2H":false,"reloadable":true,"bow":false,"crossbow":false,"powder":false,"throwing":false,"bashing":false,"damage":"d6M","range":9,"reload":0},"quantity":null,"weight":null},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
{"_id":"jjdzMgx8zru2A28V","name":"Armure moyenne","type":"item","img":"icons/equipment/chest/breastplate-layered-leather-studded-black.webp","data":{"subtype":"armor","description":"<h1>Armure moyenne</h1><p>Ce type darmure, compromis entre la maniabilité de larmure légère et la protection de larmure lourde, est le choix favori des aventuriers qui sattendent à affronter des combats de manière régulière. Il peut sagir dune armure de cuir couvrant la majeure partie du corps, avec des parties en cuir bouilli pour protéger les points vitaux, ou dune armure mêlant le cuir et la cotte de mailles, ou encore dune cuirasse en acier, simple mais efficace.</p><p>Un personnage portant une armure moyenne peut généralement en ôter certaines parties pour la transformer en armure légère sil le souhaite.</p><h2>Effets des armures moyennes</h2><ul><li>protection d6-2 (0-4 points de réduction des dégâts) ;</li><li>si vous préférez un chiffre fixe, une armure moyenne offre 2 points de protection ;</li><li>le port dune armure moyenne saccompagne dun malus de -1 en agilité du fait de lencombrement ;</li><li>le port dune armure moyenne handicape un sorcier et augmente de 2 points de pouvoir le coût de ses sorts.</li></ul>","properties":{"ranged":false,"melee":false,"spell":false,"protection":true,"weapon":false,"armor":true,"helm":false,"shield":false,"equipable":true,"stackable":false,"activable":false,"consumable":false,"magical":false,"concealable":false,"ignoreshield":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"powder":false,"throwing":false,"bashing":false,"modifiers":{"social":true,"agility":-1,"powercost":2},"soak":{"formula":"d6-2","value":2}},"quantity":null,"weight":null},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}} {"_id":"jjdzMgx8zru2A28V","name":"Armure moyenne","type":"item","img":"icons/equipment/chest/breastplate-layered-leather-studded-black.webp","data":{"subtype":"armor","description":"<h1>Armure moyenne</h1><p>Ce type darmure, compromis entre la maniabilité de larmure légère et la protection de larmure lourde, est le choix favori des aventuriers qui sattendent à affronter des combats de manière régulière. Il peut sagir dune armure de cuir couvrant la majeure partie du corps, avec des parties en cuir bouilli pour protéger les points vitaux, ou dune armure mêlant le cuir et la cotte de mailles, ou encore dune cuirasse en acier, simple mais efficace.</p><p>Un personnage portant une armure moyenne peut généralement en ôter certaines parties pour la transformer en armure légère sil le souhaite.</p><h2>Effets des armures moyennes</h2><ul><li>protection d6-2 (0-4 points de réduction des dégâts) ;</li><li>si vous préférez un chiffre fixe, une armure moyenne offre 2 points de protection ;</li><li>le port dune armure moyenne saccompagne dun malus de -1 en agilité du fait de lencombrement ;</li><li>le port dune armure moyenne handicape un sorcier et augmente de 2 points de pouvoir le coût de ses sorts.</li></ul>","properties":{"ranged":false,"melee":false,"spell":false,"protection":true,"weapon":false,"armor":true,"helm":false,"shield":false,"equipable":true,"stackable":false,"activable":false,"consumable":false,"magical":false,"concealable":false,"ignoreshield":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"powder":false,"throwing":false,"bashing":false,"modifiers":{"social":true,"agility":-1,"powercost":2},"soak":{"formula":"d6-2","value":2}},"quantity":null,"weight":null},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
{"_id":"me4GVat8gcs94hri","name":"Amure légère","type":"item","img":"icons/equipment/chest/shirt-simple-grey.webp","data":{"subtype":"armor","description":"<h1>Amure légère</h1><p>Si votre personnage préfère éviter les combats mais sait quil risque de ne pas y couper, vous souhaiterez peut-être quil bénéficie au moins dune petite protection. La catégorie des armures légères comprend les différentes sortes darmures de cuir et les chemises de mailles. Votre personnage pourrait ainsi porter un robuste gilet et des brassards en cuir, ou un pourpoint doublé, accompagné de bottes et de gants en cuir souple. À moins que vous ne décidiez quil soit vêtu dune légère chemise de mailles et de rien dautre.</p><p>Une armure légère est généralement dissimulable (à moins dêtre inspecté de près ou davoir affaire à lœil exercé dun soldat vétéran) et ne vous désigne pas au premier regard comme un guerrier.</p><h2>Effets des armures légères</h2><ul><li>protection d6-3 (0-3 points de réduction des dégâts) ;</li><li>si vous préférez un chiffre fixe, une armure légère offre 1 point de protection ;</li><li>le port dune armure légère handicape un sorcier et augmente de 1 point de pouvoir le coût de ses sorts.</li></ul>","properties":{"ranged":false,"melee":false,"spell":false,"protection":true,"weapon":false,"armor":true,"helm":false,"shield":false,"equipable":true,"stackable":false,"activable":false,"consumable":false,"magical":false,"concealable":true,"ignoreshield":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"powder":false,"throwing":false,"bashing":false,"modifiers":{"social":true,"agility":-1,"powercost":1},"soak":{"formula":"d6-3","value":1}},"quantity":null,"weight":null},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}} {"_id":"me4GVat8gcs94hri","name":"Armure légère","type":"item","img":"icons/equipment/chest/shirt-simple-grey.webp","data":{"subtype":"armor","description":"<h1>Amure légère</h1><p>Si votre personnage préfère éviter les combats mais sait quil risque de ne pas y couper, vous souhaiterez peut-être quil bénéficie au moins dune petite protection. La catégorie des armures légères comprend les différentes sortes darmures de cuir et les chemises de mailles. Votre personnage pourrait ainsi porter un robuste gilet et des brassards en cuir, ou un pourpoint doublé, accompagné de bottes et de gants en cuir souple. À moins que vous ne décidiez quil soit vêtu dune légère chemise de mailles et de rien dautre.</p><p>Une armure légère est généralement dissimulable (à moins dêtre inspecté de près ou davoir affaire à lœil exercé dun soldat vétéran) et ne vous désigne pas au premier regard comme un guerrier.</p><h2>Effets des armures légères</h2><ul><li>protection d6-3 (0-3 points de réduction des dégâts) ;</li><li>si vous préférez un chiffre fixe, une armure légère offre 1 point de protection ;</li><li>le port dune armure légère handicape un sorcier et augmente de 1 point de pouvoir le coût de ses sorts.</li></ul>","properties":{"d6B":false,"d6M":false,"ranged":false,"melee":false,"spell":false,"protection":true,"weapon":false,"armor":true,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":true,"ignoreshield":false,"powder":false,"bashing":false,"modifiers":{"social":true,"agility":-1,"powercost":1},"soak":{"formula":"d6-3","value":1}},"quantity":null,"weight":null},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
{"_id":"obNHhN1wvcWFaVrS","name":"Petit bouclier","type":"item","img":"icons/equipment/shield/buckler-wooden-boss-brown.webp","data":{"subtype":"shield","description":"<h1>Petit bouclier</h1><p>Un personnage ne peut bénéficier de son bouclier que sil est conscient de lattaque qui le vise, et donc sil est prêt à la parer.</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":true,"weapon":false,"armor":false,"helm":false,"shield":true,"equipable":true,"stackable":false,"activable":false,"consumable":false,"magical":false,"concealable":false,"ignoreshield":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"powder":false,"throwing":false,"bashing":false,"blocking":{"malus":-1,"nbAttacksPerRound":"1"}},"quantity":null,"weight":null},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}} {"_id":"obNHhN1wvcWFaVrS","name":"Petit bouclier","type":"item","img":"icons/equipment/shield/buckler-wooden-boss-brown.webp","data":{"subtype":"shield","description":"<h1>Petit bouclier</h1><p>Un personnage ne peut bénéficier de son bouclier que sil est conscient de lattaque qui le vise, et donc sil est prêt à la parer.</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":true,"weapon":false,"armor":false,"helm":false,"shield":true,"equipable":true,"stackable":false,"activable":false,"consumable":false,"magical":false,"concealable":false,"ignoreshield":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"powder":false,"throwing":false,"bashing":false,"blocking":{"malus":-1,"nbAttacksPerRound":"1"}},"quantity":null,"weight":null},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
{"_id":"pncWIrD5z7mk6dbc","name":"Massue","type":"item","img":"icons/weapons/clubs/club-simple-stone-purple.webp","data":{"subtype":"weapon","description":"<h1>Massue</h1><p>la version lourde du gourdin. Une massue consiste en un solide manche en bois dont lextrémité, plus volumineuse, sert à fracasser le crâne de ses adversaires, doù son autre nom de casse-tête.</p>","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"stackable":false,"activable":false,"consumable":false,"magical":false,"concealable":false,"ignoreshield":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"powder":false,"throwing":false,"bashing":false,"throwable":true,"range":3,"damage":"d6"},"quantity":null,"weight":null},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}} {"_id":"pncWIrD5z7mk6dbc","name":"Massue","type":"item","img":"icons/weapons/clubs/club-simple-stone-purple.webp","data":{"subtype":"weapon","description":"<h1>Massue</h1><p>la version lourde du gourdin. Une massue consiste en un solide manche en bois dont lextrémité, plus volumineuse, sert à fracasser le crâne de ses adversaires, doù son autre nom de casse-tête.</p>","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"stackable":false,"activable":false,"consumable":false,"magical":false,"concealable":false,"ignoreshield":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"powder":false,"throwing":false,"bashing":false,"throwable":true,"range":3,"damage":"d6"},"quantity":null,"weight":null},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
{"_id":"qG5Jlhjjh7vDtBB1","name":"Fléau","type":"item","img":"icons/weapons/maces/flail-triple-grey.webp","data":{"subtype":"weapon","description":"<h1>Fléau</h1><p>un fléau consiste en un manche de bois prolongé dune chaîne, à lextrémité de laquelle est fixée une boule hérissée de pointes métalliques. Les fléaux ne sont pas des armes employées couramment en Lémurie, mais les gladiateurs en utilisent parfois dans les arènes. Les attaques au fléau ignorent le bonus en défense accordé par lemploi dun bouclier.</p>","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"stackable":false,"activable":false,"consumable":false,"magical":false,"concealable":false,"ignoreshield":true,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"powder":false,"throwing":false,"bashing":false,"damage":"d6"},"quantity":null,"weight":null},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}} {"_id":"qG5Jlhjjh7vDtBB1","name":"Fléau","type":"item","img":"icons/weapons/maces/flail-triple-grey.webp","data":{"subtype":"weapon","description":"<h1>Fléau</h1><p>un fléau consiste en un manche de bois prolongé dune chaîne, à lextrémité de laquelle est fixée une boule hérissée de pointes métalliques. Les fléaux ne sont pas des armes employées couramment en Lémurie, mais les gladiateurs en utilisent parfois dans les arènes. Les attaques au fléau ignorent le bonus en défense accordé par lemploi dun bouclier.</p>","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"stackable":false,"activable":false,"consumable":false,"magical":false,"concealable":false,"ignoreshield":true,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"powder":false,"throwing":false,"bashing":false,"damage":"d6"},"quantity":null,"weight":null},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}

View File

@ -2,6 +2,7 @@
@import "global/forms"; @import "global/forms";
@import "global/typography"; @import "global/typography";
@import "global/item-list"; @import "global/item-list";
@import "global/colors";
@logo-width: 190px; @logo-width: 190px;
@logo-height: 115px; @logo-height: 115px;
@ -11,7 +12,6 @@
@attributes-height: 64px; @attributes-height: 64px;
@footer-height: 30px; @footer-height: 30px;
@sidebar-width: 250px; @sidebar-width: 250px;
@colorOlive: #4b4a44;
.bol { .bol {
&.sheet { &.sheet {
@ -29,6 +29,8 @@
min-height: 400px; min-height: 400px;
} }
} }
&.dialog {
}
} }
.editor, .editor-content { .editor, .editor-content {
@ -49,9 +51,10 @@
} }
.chat-message .chat-icon { .chat-message .chat-icon {
border: 0; flex : 0 0 64px;
padding: 2px 6px 2px 2px; border: 1px outset lightgray;
float: left; //padding: 2px 6px 2px 2px;
//float: left;
width: 64px; width: 64px;
height: 64px; height: 64px;
} }

View File

@ -1,9 +1,11 @@
.window-content { .window-content {
form {
background-image: url("/systems/bol/ui/logo.webp"); background-image: url("/systems/bol/ui/logo.webp");
background-repeat: no-repeat; background-repeat: no-repeat;
background-size: @logo-width @logo-height; background-size: @logo-width @logo-height;
background-color: white;
form {
.sidebar { .sidebar {
//background-color: green; //background-color: green;
//background-color: red; //background-color: red;

View File

@ -1,5 +1,5 @@
.window-content { .window-content {
background: white; //background: white;
height: 100%; height: 100%;
padding: 5px; padding: 5px;
overflow-y: hidden; overflow-y: hidden;

View File

@ -0,0 +1,40 @@
h1 {
input.itemname {
font-family: @font-charname;
}
}
.item-properties {
flex: 0 0 150px;
margin: 5px 5px 5px 0;
padding-right: 5px;
border-right: @borderGroove;
.form-group {
margin: 0;
label {
line-height: 20px;
}
input {
text-align: right;
}
}
.properties-list {
list-style: none;
margin: 0;
padding: 0;
li {
margin: 3px 0;
padding: 0 2px;
background: rgba(0, 0, 0, 0.05);
border: @borderGroove;
text-align: center;
font-size: 12px;
line-height: 18px;
}
}
}

137
styles/global/colors.less Normal file
View File

@ -0,0 +1,137 @@
@c-white: #fff;
@c-black: #000;
//@c-bright: whitesmoke;
@c-bright: #E2F1F1;
@c-lightg: lightgray;
@c-darkg: #23221d;
@c-dark: #3c3c3c;
@c-darkslate: darkslategray;
@c-darkgreen: #003c1e;
@c-lightgreen: mintcream;
@c-darkblue: midnightblue;
@c-blue: #009ee0;
@c-green: #44a12b;
@c-red: #cd071e;
@c-purple: purple;
@c-darkred: darkred;
@c-border:#736953a6;
//@c-darkbrown: rgba(70, 67, 49, 0.93);
@c-darkbrown: #464331c4;
@c-shadow:#00000052;
@c-linkshadow : gray;
@colorDark: #191813;
@colorFaint: #c9c7b8;
@colorBeige: #b5b3a4;
@colorTan: #7a7971;
@colorOlive: #4b4a44;
@colorCrimson: #44191A;
@lightGreen: #609b60;
@borderGroove: 1px groove #eeede0;
@borderGrooveGreen: 2px groove #003700;
//@borderGrooveOriginal: 2px groove #eeede0;
@colorSuccess : darkgreen;
@colorCritical : green;
@colorFailure : darkred;
@colorFumble : red;
@colorDamage : orangered;
@colorRoll : darkslategrey;
@colorGold : #caad27;
/* ----------------------------------------- */
/* Premade colors */
/* ----------------------------------------- */
.light {
//color:whitesmoke;
//color:antiquewhite;
color: @c-lightg;
}
.bg-light {
background: @c-lightg;
}
.darkgray {
color: @c-darkg;
}
.bg-darkgray {
background: @c-darkg;
color: @c-white;
}
.darkbrown {
color: @c-darkbrown;
}
.bg-darkbrown {
background: @c-darkbrown;
color: @c-white;
}
.darkslate {
color: @c-darkslate;
}
.bg-darkslate {
background: @c-darkslate;
color: @c-white;
}
.darkgreen {
color: @c-darkgreen;
}
.bg-darkgreen {
background: @c-darkgreen;
color: @c-white;
}
.darkblue {
color: @c-darkblue;
}
.bg-darkblue {
background: @c-darkblue;
color: @c-white;
}
.blue {
color: @c-blue;
}
.bg-blue {
background: @c-blue;
color: @c-white;
}
.green {
color: @c-green;
}
.bg-green {
background: @c-green;
color: @c-white;
}
.black {
color: @c-black;
}
.bg-black {
background: @c-black;
color: @c-white;
}
.red {
color: @c-red;
}
.bg-red {
background: @c-red;
color: @c-white;
}
.purple {
color: @c-purple;
}
.bg-purple {
background: @c-purple;
color: @c-white;
}

View File

@ -200,4 +200,8 @@
input::placeholder { input::placeholder {
color: lightgray; color: lightgray;
} }
.property {
margin-top: 2px;
}
} }

View File

@ -6,7 +6,15 @@
overflow-y: auto; overflow-y: auto;
.item-header { .item-header {
font-family: @font-handwrite; font-family: @font-primary;
font-size: 1em;
//font-weight: 500;
color: @colorOlive;
background-color: lightgray;
.item-name {
font-family: @font-tertiary;
font-size: 1.5em;
}
} }
.item { .item {
@ -19,14 +27,40 @@
.item-image { .item-image {
flex: 0 0 30px; flex: 0 0 30px;
margin-right: 5px; padding: 0;
margin: 0 5px 0 0;
height:30px;
width:30px;
min-height:30px;
min-width:30px;
img { img {
padding: 0;
margin: 0; margin: 0;
border: none; border: none;
height:30px;
width:30px;
min-height:30px;
min-width:30px;
}
&.roll-weapon,
&.roll-career {
background-color: transparent;
background-image: url("../../../icons/svg/dice-target.svg") !important;
background-size: 30px 30px;
background-repeat: no-repeat;
background-position: center;
cursor: pointer;
&:hover {
background-color: gray;
img {
visibility: hidden;
}
}
} }
} }
.item-name { .item-name,
.item-field {
margin: 0; margin: 0;
} }
@ -43,19 +77,5 @@
.item-control { .item-control {
color: @colorOlive; color: @colorOlive;
} }
//.item-buttons {
// display: flex;
// flex-wrap: wrap;
// flex-direction: row;
// align-items: center;
// flex: 2;
// justify-content: flex-start;
//}
//.item-button {
// line-height: 1;
// font-size: 11px;
// flex: none;
// width: auto;
//}
} }
} }

View File

@ -27,6 +27,7 @@
@font-primary: 'Signika', sans-serif; @font-primary: 'Signika', sans-serif;
@font-secondary: 'Contrail One', cursive; @font-secondary: 'Contrail One', cursive;
@font-tertiary: "Wolfsbane2Expanded", serif; @font-tertiary: "Wolfsbane2Expanded", cursive;
@font-header: "Wolfsbane2", cursive;
@font-charname: "Wolfsbane2Expanded", cursive; @font-charname: "Wolfsbane2Expanded", cursive;
@font-handwrite: "CCMeanwhile", cursive; @font-handwrite: "CCMeanwhile", cursive;

View File

@ -74,8 +74,8 @@
], ],
"gridDistance": 1.5, "gridDistance": 1.5,
"gridUnits": "m", "gridUnits": "m",
"primaryTokenAttribute": "traits.hp", "primaryTokenAttribute": "resources.hp",
"secondaryTokenAttribute": "traits.hero", "secondaryTokenAttribute": "resources.hero",
"url": "https://github.com/ZigmundKreud/bol", "url": "https://github.com/ZigmundKreud/bol",
"manifest": "https://raw.githubusercontent.com/ZigmundKreud/bol/master/system.json", "manifest": "https://raw.githubusercontent.com/ZigmundKreud/bol/master/system.json",
"download": "https://github.com/ZigmundKreud/bol/archive/refs/heads/master.zip", "download": "https://github.com/ZigmundKreud/bol/archive/refs/heads/master.zip",

View File

@ -119,6 +119,12 @@
"label" : "BOL.resources.power", "label" : "BOL.resources.power",
"value": 0, "value": 0,
"max": 0 "max": 0
},
"villainy" : {
"key" : "villainy",
"label" : "BOL.resources.villainy",
"value": 5,
"max": 5
} }
} }
} }
@ -128,15 +134,13 @@
} }
}, },
"Item": { "Item": {
"types": ["item", "feature", "weapon", "armor"], "types": ["item", "feature"],
"templates": { "templates": {
"base": { "base": {
"category" : null,
"subtype" : "default", "subtype" : "default",
"description": "", "description": "",
"properties" : { "properties" : {}
"d6B": false,
"d6M": false
}
}, },
"equipment" : { "equipment" : {
"quantity": 1, "quantity": 1,
@ -164,9 +168,7 @@
} }
}, },
"item": { "item": {
"templates": ["base", "equipment"], "templates": ["base", "equipment"]
"quantity": 1,
"weight": 0
}, },
"weapon": { "weapon": {
"type": "", "type": "",
@ -197,7 +199,11 @@
}, },
"feature": { "feature": {
"rank": 0, "rank": 0,
"templates": ["base"] "templates": ["base"],
"properties" : {
"d6B": false,
"d6M": false
}
} }
} }
} }

View File

@ -1,17 +1,23 @@
{{#each data.combat as | combat id|}}
{{#if (gt (count combat.items) 0)}}
<ol class="items-list"> <ol class="items-list">
<li class="item flexrow item-header"> <li class="item flexrow item-header">
<div class="item-name">{{localize "BOL.ui.actions"}}</div> <div class="item-name flex2">{{localize combat.label}}</div>
<div class="item-name">{{localize "BOL.ui.damages"}}</div> {{#if protection}}<div class="item-field">{{localize "BOL.ui.protection"}}</div>{{/if}}
{{#if blocking}}<div class="item-field">{{localize "BOL.ui.blocking"}}</div>{{/if}}
{{#if weapon}}<div class="item-field">{{localize "BOL.ui.damages"}}</div>{{/if}}
{{#if ranged}}<div class="item-field">{{localize "BOL.ui.range"}}</div>{{else}}<div class="item-field"></div>{{/if}}
</li> </li>
{{#each data.weapons as |weapon id|}} {{#each combat.items as |item id|}}
<li class="item flexrow" data-item-id="{{weapon._id}}"> <li class="item flexrow" data-item-id="{{item._id}}">
<div class="item-image"><img src="{{weapon.img}}" title="{{weapon.name}}" width="24" height="24"/></div> <div class="item-image {{#if ../weapon}}roll-weapon{{/if}}"><img src="{{item.img}}" title="{{item.name}}"/></div>
<h4 class="item-name"><a class="roll-weapon">{{weapon.name}}</a></h4> <h4 class="item-name flex2"><a class="item-edit">{{item.name}}</a></h4>
<span class="item-name">{{weapon.data.damage}}</span> {{#if ../protection}}<div class="item-field">{{item.data.properties.soak.value}}</div>{{/if}}
<div class="item-controls-2"> {{#if ../blocking}}<div class="item-field">{{item.data.properties.blocking.malus}}</div>{{/if}}
<a class="item-control item-edit" title="Edit Item"><i class="fas fa-edit"></i></a> {{#if ../weapon}}<div class="item-field">{{item.data.properties.damage}}</div>{{/if}}
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> {{#if ../ranged}}<div class="item-field">{{item.data.properties.range}}</div>{{else}}<div class="item-field"></div>{{/if}}
</div>
</li> </li>
{{/each}} {{/each}}
</ol> </ol>
{{/if}}
{{/each}}

View File

@ -1,25 +1,22 @@
<ol class="items-list"> <ol class="items-list">
<li class="item flexrow item-header"> <li class="item flexrow item-header">
<div class="item-name flex1">{{localize "BOL.itemCategory.equipment"}}</div> <div class="item-name flex3">{{localize "BOL.itemCategory.equipment"}}</div>
<!-- <div class="item-controls">--> <div class="item-field">{{localize "BOL.ui.quantity"}}</div>
<!-- <a class="item-control item-create" title="Create item" data-type="item"><i class="fas fa-plus"></i> Add item</a>--> <div class="item-field"></div>
<!-- </div>-->
</li> </li>
{{#each data.equipment as |item id|}} {{#each data.equipment as |item id|}}
<li class="item flexrow" data-item-id="{{item._id}}"> <li class="item flexrow" data-item-id="{{item._id}}">
<div class="item-image"><img src="{{item.img}}" title="{{item.name}}" width="24" height="24"/></div> <div class="item-image"><img src="{{item.img}}" title="{{item.name}}"/></div>
<h4 class="item-name flex1">{{item.name}}</h4> <h4 class="item-name flex3"><a class="item-edit">{{item.name}}</a></h4>
<div class="item-field">{{item.data.quantity}}</div>
{{#if data.properties.equipable}} {{#if data.properties.equipable}}
<div class="item-controls-3">
{{#if data.worn}} {{#if data.worn}}
<a class="item-control item-equip" title="{{localize "BOL.ui.unequip"}}"><i class="fas fa-shield-alt"></i></a> <div class="item-controls-1"><a class="item-control item-equip" title="{{localize "BOL.ui.unequip"}}"><i class="fas fa-shield-alt"></i></a></div>
{{else}} {{else}}
<a class="item-control item-equip" title="{{localize "BOL.ui.equip"}}" style="color:lightgray;"><i class="fas fa-shield-alt"></i></a> <div class="item-controls-1"><a class="item-control item-equip" title="{{localize "BOL.ui.equip"}}" style="color:lightgray;"><i class="fas fa-shield-alt"></i></a></div>
{{/if}} {{/if}}
{{else}}
<div class="item-controls-2">
{{/if}} {{/if}}
<a class="item-control item-edit" title="{{localize "BOL.ui.edit"}}"><i class="fas fa-edit"></i></a> <div class="item-controls-1">
<a class="item-control item-delete" title="{{localize "BOL.ui.delete"}}"><i class="fas fa-trash"></i></a> <a class="item-control item-delete" title="{{localize "BOL.ui.delete"}}"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>

View File

@ -1,21 +1,20 @@
{{#each data.features as | features id|}} {{#each data.features as | features key|}}
{{#if (gt (count features.items) 0)}} {{#if (gt (count features.items) 0)}}
<ol class="items-list"> <ol class="items-list">
<li class="item flexrow item-header"> <li class="item flexrow item-header">
<div class="item-name flex3">{{localize features.label}}</div> <div class="item-name flex2">{{localize features.label}}</div>
{{#if ranked}} {{#if ranked}}
<div class="item-level">{{localize "Level"}}</div> <div class="item-field">{{localize "Level"}}</div>
{{/if}} {{/if}}
</li> </li>
{{#each features.items as |item id|}} {{#each features.items as |item id|}}
<li class="item flexrow" data-item-id="{{item._id}}"> <li class="item flexrow" data-item-id="{{item._id}}">
<div class="item-image"><img src="{{item.img}}" title="{{item.name}}" width="24" height="24"/></div> <div class="item-image {{#if (equals key "careers")}}roll-career{{/if}}"><img src="{{item.img}}" title="{{item.name}}"/></div>
<h4 class="item-name flex4"><a class="roll-career">{{item.name}}</a></h4> <h4 class="item-name flex2"><a class="item-edit">{{item.name}}</a></h4>
{{#if item.data.rank}} {{#if item.data.rank}}
<span class="item-level">{{item.data.rank}}</span> <span class="item-field">{{item.data.rank}}</span>
{{/if}} {{/if}}
<div class="item-controls-2"> <div class="item-controls-1">
<a class="item-control item-edit" title="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> <a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>

View File

@ -1,11 +1,8 @@
<div class="chat-message-header"> <div class="chat-message-header flexrow">
<img class="chat-icon" src="{{actorImg}}" alt="{{alias}}"/> <img class="chat-icon" src="{{actorImg}}" alt="{{alias}}"/>
<h4 class=chat-actor-name>{{alias}}</h4> <h4 class=chat-actor-name>{{alias}}</h4>
</div> </div>
<div class="flexrow">
<hr>
<div>
<h3> <h3>
{{#if (eq mode "attribute")}} {{#if (eq mode "attribute")}}
{{localize attribute.label}} {{localize attribute.label}}
@ -19,13 +16,26 @@
{{/if}} {{/if}}
{{/if}} {{/if}}
</h3> </h3>
<div>
<ul>
<li>Formula : {{formula}}</li>
<li>Modifier : {{modifier}} </li>
<li><strong>Total Roll : {{finalScore}}</strong>
</ul>
</div> </div>
<div class="dice-roll">
<div class="dice-result">
<div class="dice-formula">{{formula}}</div>
<div class="dice-formula">{{modifier}}</div>
<div class="dice-tooltip" style="display: none;">
<section class="tooltip-part">
<div class="dice">
<header class="part-header flexrow">
<span class="part-formula">{{formula}}</span>
<span class="part-total">{{finalScore}}</span>
</header>
<ol class="dice-rolls">
<li class="roll die d6 discarded min">1</li>
<li class="roll die d6">2</li>
<li class="roll die d6">3</li>
</ol>
</div>
</section>
</div>
<h4 class="dice-total">{{finalScore}}</h4>
</div>
</div> </div>

View File

@ -9,14 +9,24 @@
</nav> </nav>
{{!-- Sheet Body --}} {{!-- Sheet Body --}}
<section class="sheet-body"> <section class="sheet-body">
<div class="tab" data-group="primary" data-tab="description"> <div class="tab flexrow active no-wrap" data-group="primary" data-tab="description">
{{#if itemProperties}}
<div class="item-properties">
<ol class="properties-list">
{{#each itemProperties}}
<li>{{localize this}}</li>
{{/each}}
</ol>
</div>
{{/if}}
{{editor content=data.description target="data.description" button=true owner=owner editable=editable}} {{editor content=data.description target="data.description" button=true owner=owner editable=editable}}
</div> </div>
<div class="tab properties" data-group="primary" data-tab="properties"> <div class="tab properties" data-group="primary" data-tab="properties">
{{#if (equals item.type "item")}} {{#if (equals type "item")}}
{{> "systems/bol/templates/item/parts/properties/item-properties.hbs"}} {{> "systems/bol/templates/item/parts/properties/item-properties.hbs"}}
{{/if}} {{/if}}
{{#if (equals item.type "feature")}} {{#if (equals type "feature")}}
{{> "systems/bol/templates/item/parts/properties/feature-properties.hbs"}} {{> "systems/bol/templates/item/parts/properties/feature-properties.hbs"}}
{{/if}} {{/if}}
</div> </div>

View File

@ -1,28 +1 @@
<div class="property flexrow"> <h3 class="form-header">{{localize "BOL.ui.armor"}}</h3>
<label class="property-label">{{localize "subtype"}}</label>
<select name="data.subtype" value="{{data.subtype}}" data-dtype="String">
{{#select data.subtype}}
<option value="boon">{{localize "Avantage"}}</option>
<option value="flaw">{{localize "Flaw"}}</option>
<option value="career">{{localize "Career"}}</option>
<option value="language">{{localize "Language"}}</option>
{{/select}}
</select>
</div>
<!-- <div class="grid grid-2col">-->
<div class="property flexrow">
<label class="property-label">Quantity</label>
<input type="text" name="data.quantity" value="{{data.quantity}}" data-dtype="Number"/>
</div>
<div class="property flexrow">
<label class="property-label">Weight</label>
<input type="text" name="data.weight" value="{{data.weight}}" data-dtype="Number"/>
</div>
<!-- </div>-->
{{#each data.properties as |property key|}}
<div class="property flexrow">
<label class="property-label">{{localize key}}</label>
<label class="attribute-value checkbox"><input type="checkbox" name="data.properties.{{key}}" {{checked property}}/></label>
</div>
{{/each}}

View File

@ -0,0 +1 @@
<h3 class="form-header">{{localize "BOL.ui.equipment"}}</h3>

View File

@ -1,25 +1,14 @@
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "subtype"}}</label> <label class="property-label">{{localize "BOL.ui.subtype"}}</label>
<select name="data.subtype" value="{{data.subtype}}" data-dtype="String"> <select name="data.subtype" value="{{data.subtype}}" data-dtype="String">
{{#select data.subtype}} {{#select data.subtype}}
<option value="boon">{{localize "Avantage"}}</option> {{#each config.featureSubtypes as |item id|}}
<option value="flaw">{{localize "Flaw"}}</option> <option value="{{id}}">{{localize item}}</option>
<option value="career">{{localize "Career"}}</option> {{/each}}
<option value="language">{{localize "Language"}}</option>
{{/select}} {{/select}}
</select> </select>
</div> </div>
<!-- <div class="grid grid-2col">-->
<div class="property flexrow">
<label class="property-label">Quantity</label>
<input type="text" name="data.quantity" value="{{data.quantity}}" data-dtype="Number"/>
</div>
<div class="property flexrow">
<label class="property-label">Weight</label>
<input type="text" name="data.weight" value="{{data.weight}}" data-dtype="Number"/>
</div>
<!-- </div>-->
{{#each data.properties as |property key|}} {{#each data.properties as |property key|}}
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize key}}</label> <label class="property-label">{{localize key}}</label>

View File

@ -1,28 +1,62 @@
<!--<div class="property flexrow">-->
<!-- <label class="property-label">{{localize "BOL.ui.category"}}</label>-->
<!-- <select name="data.subtype" value="{{data.category}}" data-dtype="String">-->
<!-- {{#select data.category}}-->
<!-- {{#each config.itemCategories as |item id|}}-->
<!-- <option value="{{id}}">{{localize item}}</option>-->
<!-- {{/each}}-->
<!-- {{/select}}-->
<!-- </select>-->
<!--</div>-->
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "subtype"}}</label> <label class="property-label">{{localize "BOL.ui.subtype"}}</label>
<select name="data.subtype" value="{{data.subtype}}" data-dtype="String"> <select name="data.subtype" value="{{data.subtype}}" data-dtype="String">
{{#select data.subtype}} {{#select data.subtype}}
<option value="boon">{{localize "Avantage"}}</option> {{#each config.equipmentCategories as |item id|}}
<option value="flaw">{{localize "Flaw"}}</option> <option value="{{id}}">{{localize item}}</option>
<option value="career">{{localize "Career"}}</option> {{/each}}
<option value="language">{{localize "Language"}}</option>
{{/select}} {{/select}}
</select> </select>
</div> </div>
<!-- <div class="grid grid-2col">--> <hr/>
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">Quantity</label> <label class="property-label">{{localize "BOL.ui.quantity"}}</label>
<input type="text" name="data.quantity" value="{{data.quantity}}" data-dtype="Number"/> <input type="text" name="data.quantity" value="{{data.quantity}}" data-dtype="Number"/>
</div> </div>
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">Weight</label> <label class="property-label">{{localize "BOL.ui.weight"}}</label>
<input type="text" name="data.weight" value="{{data.weight}}" data-dtype="Number"/> <input type="text" name="data.weight" value="{{data.weight}}" data-dtype="Number"/>
</div> </div>
<!-- </div>-->
{{#each data.properties as |property key|}}
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize key}}</label> <label class="property-label">{{localize "BOL.ui.price"}}</label>
<label class="attribute-value checkbox"><input type="checkbox" name="data.properties.{{key}}" {{checked property}}/></label> <input type="text" name="data.price" value="{{data.price}}" data-dtype="Number"/>
</div> </div>
<hr/>
<div class="form-group stacked">
<!-- <label>Propriétés</label>-->
<div class="form-fields">
{{#each data.properties as |property key|}}
<label class="checkbox">
<input type="checkbox" name="data.properties.{{key}}" {{checked property}}> {{localize key}} ({{key}})
</label>
{{/each}} {{/each}}
</div>
</div>
{{#if data.properties.equipable}}
{{> "systems/bol/templates/item/parts/properties/equipment-properties.hbs"}}
{{/if}}
{{#if data.properties.weapon}}
{{> "systems/bol/templates/item/parts/properties/weapon-properties.hbs"}}
{{/if}}
{{#if (equals data.properties.protection)}}
{{> "systems/bol/templates/item/parts/properties/protection-properties.hbs"}}
{{/if}}
{{#if data.properties.shield}}
{{> "systems/bol/templates/item/parts/properties/shield-properties.hbs"}}
{{/if}}

View File

@ -1,28 +1 @@
<div class="property flexrow"> <h3 class="form-header">{{localize "BOL.ui.melee"}}</h3>
<label class="property-label">{{localize "subtype"}}</label>
<select name="data.subtype" value="{{data.subtype}}" data-dtype="String">
{{#select data.subtype}}
<option value="boon">{{localize "Avantage"}}</option>
<option value="flaw">{{localize "Flaw"}}</option>
<option value="career">{{localize "Career"}}</option>
<option value="language">{{localize "Language"}}</option>
{{/select}}
</select>
</div>
<!-- <div class="grid grid-2col">-->
<div class="property flexrow">
<label class="property-label">Quantity</label>
<input type="text" name="data.quantity" value="{{data.quantity}}" data-dtype="Number"/>
</div>
<div class="property flexrow">
<label class="property-label">Weight</label>
<input type="text" name="data.weight" value="{{data.weight}}" data-dtype="Number"/>
</div>
<!-- </div>-->
{{#each data.properties as |property key|}}
<div class="property flexrow">
<label class="property-label">{{localize key}}</label>
<label class="attribute-value checkbox"><input type="checkbox" name="data.properties.{{key}}" {{checked property}}/></label>
</div>
{{/each}}

View File

@ -0,0 +1 @@
<h3 class="form-header">{{localize "BOL.ui.armor"}}</h3>

View File

@ -1,28 +1 @@
<div class="property flexrow"> <h3 class="form-header">{{localize "BOL.ui.ranged"}}</h3>
<label class="property-label">{{localize "subtype"}}</label>
<select name="data.subtype" value="{{data.subtype}}" data-dtype="String">
{{#select data.subtype}}
<option value="boon">{{localize "Avantage"}}</option>
<option value="flaw">{{localize "Flaw"}}</option>
<option value="career">{{localize "Career"}}</option>
<option value="language">{{localize "Language"}}</option>
{{/select}}
</select>
</div>
<!-- <div class="grid grid-2col">-->
<div class="property flexrow">
<label class="property-label">Quantity</label>
<input type="text" name="data.quantity" value="{{data.quantity}}" data-dtype="Number"/>
</div>
<div class="property flexrow">
<label class="property-label">Weight</label>
<input type="text" name="data.weight" value="{{data.weight}}" data-dtype="Number"/>
</div>
<!-- </div>-->
{{#each data.properties as |property key|}}
<div class="property flexrow">
<label class="property-label">{{localize key}}</label>
<label class="attribute-value checkbox"><input type="checkbox" name="data.properties.{{key}}" {{checked property}}/></label>
</div>
{{/each}}

View File

@ -0,0 +1 @@
<h3 class="form-header">{{localize "BOL.ui.armor"}}</h3>

View File

@ -1,28 +1,8 @@
<div class="property flexrow"> <h3 class="form-header">{{localize "BOL.ui.weapon"}}</h3>
<label class="property-label">{{localize "subtype"}}</label>
<select name="data.subtype" value="{{data.subtype}}" data-dtype="String">
{{#select data.subtype}}
<option value="boon">{{localize "Avantage"}}</option>
<option value="flaw">{{localize "Flaw"}}</option>
<option value="career">{{localize "Career"}}</option>
<option value="language">{{localize "Language"}}</option>
{{/select}}
</select>
</div>
<!-- <div class="grid grid-2col">--> {{#if data.properties.melee}}
<div class="property flexrow"> {{> "systems/bol/templates/item/parts/properties/melee-properties.hbs"}}
<label class="property-label">Quantity</label> {{/if}}
<input type="text" name="data.quantity" value="{{data.quantity}}" data-dtype="Number"/> {{#if data.properties.ranged}}
</div> {{> "systems/bol/templates/item/parts/properties/ranged-properties.hbs"}}
<div class="property flexrow"> {{/if}}
<label class="property-label">Weight</label>
<input type="text" name="data.weight" value="{{data.weight}}" data-dtype="Number"/>
</div>
<!-- </div>-->
{{#each data.properties as |property key|}}
<div class="property flexrow">
<label class="property-label">{{localize key}}</label>
<label class="attribute-value checkbox"><input type="checkbox" name="data.properties.{{key}}" {{checked property}}/></label>
</div>
{{/each}}

View File

@ -0,0 +1,11 @@
<div class="property flexrow">
<label class="property-label">{{localize "attribut"}}</label>
<select id="rollAttribute" value="rollAttribute">
{{#select rollAttribute}}
<option value="vigor">{{localize "BOL.attributes.vigor"}}</option>
<option value="agility">{{localize "BOL.attributes.agility"}}</option>
<option value="mind">{{localize "BOL.attributes.mind"}}</option>
<option value="appeal">{{localize "BOL.attributes.appeal"}}</option>
{{/select}}
</select>
</div>

View File

@ -0,0 +1,36 @@
<div class="property flexrow">
<label class="property-label">{{localize "d6M"}}</label>
<input class="field-value center" id="d6Malus" name="d6Malus" type="text" value="{{numberFormat d6Malus decimals=0 sign=true}}" data-dtype="Number" style="text-align: center"/>
<!-- <select id="d6Malus" value="d6Malus">-->
<!-- {{!#select d6Malus}}-->
<!-- <option value="0">0</option>-->
<!-- <option value="1">1</option>-->
<!-- <option value="2">2</option>-->
<!-- <option value="3">3</option>-->
<!-- <option value="4">4</option>-->
<!-- {{!/select}}-->
</select>
</div>
<div class="property flexrow">
<label class="property-label">{{localize "d6B"}}</label>
<input class="field-value center" id="d6Bonus" name="d6Bonus" type="text" value="{{numberFormat d6Bonus decimals=0 sign=true}}" data-dtype="Number" style="text-align: center"/>
<!-- <select id="d6Bonus" value="d6Bonus">-->
<!-- {{!#select d6Bonus}}-->
<!-- <option value="0">0</option>-->
<!-- <option value="1">1</option>-->
<!-- <option value="2">2</option>-->
<!-- <option value="3">3</option>-->
<!-- <option value="4">4</option>-->
<!-- {{!/select}}-->
<!-- </select>-->
</div>
<div class="property flexrow">
<label class="property-label">{{localize "Modifier"}}</label>
<select id="bonusMalus" value="bonusMalus">
{{#select bonusMalus}}
{{{optionsBonusMalus}}}
{{/select}}
</select>
</div>

View File

@ -1,39 +1,3 @@
<form class="skill-roll-dialog"> <form class="skill-roll-dialog">
<h2 class="dialog-roll-title">{{title}}</h2> {{> "systems/bol/templates/roll/parts/roll-dialog-modifiers.hbs"}}
<div class="property flexrow">
<label class="property-label">{{localize "d6M"}}</label>
<select id="d6Malus" value="d6Malus">
{{#select d6Malus}}
<option value="0">0</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
{{/select}}
</select>
</div>
<div class="property flexrow">
<label class="property-label">{{localize "d6B"}}</label>
<select id="d6Bonus" value="d6Bonus">
{{#select d6Bonus}}
<option value="0">0</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
{{/select}}
</select>
</div>
<div class="property flexrow">
<label class="property-label">{{localize "Modifier"}}</label>
<select id="bonusMalus" value="bonusMalus">
{{#select bonusMalus}}
{{{optionsBonusMalus}}}
{{/select}}
</select>
</div>
</form> </form>

View File

@ -1,56 +1,8 @@
<form class="skill-roll-dialog"> <form class="skill-roll-dialog">
<h2 class="dialog-roll-title">{{title}}</h2>
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "rank"}}</label> <label class="property-label">{{localize "rank"}}</label>
<label class="property-label">{{career.data.rank}}</label> <label class="property-label">{{career.data.rank}}</label>
</div> </div>
{{> "systems/bol/templates/roll/parts/roll-dialog-attribute.hbs"}}
<div class="property flexrow"> {{> "systems/bol/templates/roll/parts/roll-dialog-modifiers.hbs"}}
<label class="property-label">{{localize "attribut"}}</label>
<select id="rollAttribute" value="rollAttribute">
{{#select rollAttribute}}
<option value="vigor">{{localize "BOL.attributes.vigor"}}</option>
<option value="agility">{{localize "BOL.attributes.agility"}}</option>
<option value="mind">{{localize "BOL.attributes.mind"}}</option>
<option value="appeal">{{localize "BOL.attributes.appeal"}}</option>
{{/select}}
</select>
</div>
<div class="property flexrow">
<label class="property-label">{{localize "d6M"}}</label>
<select id="d6Malus" value="d6Malus">
{{#select d6Malus}}
<option value="0">0</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
{{/select}}
</select>
</div>
<div class="property flexrow">
<label class="property-label">{{localize "d6B"}}</label>
<select id="d6Bonus" value="d6Bonus">
{{#select d6Bonus}}
<option value="0">0</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
{{/select}}
</select>
</div>
<div class="property flexrow">
<label class="property-label">{{localize "Modifier"}}</label>
<select id="bonusMalus" value="bonusMalus">
{{#select bonusMalus}}
{{{optionsBonusMalus}}}
{{/select}}
</select>
</div>
</form> </form>

View File

@ -1,8 +1,4 @@
<form class="skill-roll-dialog"> <form class="spell-roll-dialog">
<h2 class="dialog-roll-title">{{title}}</h2>
<div class="flexrow"> <div class="flexrow">
</div> </div>
</form> </form>

View File

@ -1,74 +1,34 @@
<form class="skill-roll-dialog"> <form class="skill-roll-dialog">
<h2 class="dialog-roll-title">{{title}}</h2> {{#if defender}}
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "Defender"}} : </label> <label class="property-label">{{localize "Defender"}} : </label>
<label class="property-label">{{defender.name}}</label> <label class="property-label">{{defender.name}}</label>
</div>
<div class="property flexrow">
<label class="property-label">{{localize "Defense score"}}</label> <label class="property-label">{{localize "Defense score"}}</label>
<label class="property-label">{{defender.data.aptitudes.def.value}}</label> <label class="property-label">{{defender.data.aptitudes.def.value}}</label>
</div> </div>
{{/if}}
<div class="property flexrow"> {{> "systems/bol/templates/roll/parts/roll-dialog-attribute.hbs"}}
<label class="property-label">{{localize "attribut"}}</label> {{> "systems/bol/templates/roll/parts/roll-dialog-modifiers.hbs"}}
<select id="rollAttribute" value="rollAttribute">
{{#select rollAttribute}}
<option value="vigor">{{localize "BOL.attributes.vigor"}}</option>
<option value="agility">{{localize "BOL.attributes.agility"}}</option>
{{/select}}
</select>
</div>
<div class="property flexrow">
<label class="property-label">{{localize "d6M"}}</label>
<select id="d6Malus" value="d6Malus">
{{#select d6Malus}}
<option value="0">0</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
{{/select}}
</select>
</div>
<div class="property flexrow">
<label class="property-label">{{localize "d6B"}}</label>
<select id="d6Bonus" value="d6Bonus">
{{#select d6Bonus}}
<option value="0">0</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
{{/select}}
</select>
</div>
{{#if isRangedWeapon}} {{#if isRangedWeapon}}
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "Range Modifier"}}</label> <label class="property-label">{{localize "Range Modifier"}}</label>
<select id="rangeModifier" value="rangeModifier"> <input class="field-value center" id="rangeModifier" name="rangeModifier" type="text"
{{#select rangeModifier}} value="{{numberFormat rangeModifier decimals=0 sign=true}}" data-dtype="Number"
<option value="1">{{localize "Point Blank"}}</option> style="text-align: center"/>
<option value="0">{{localize "Short"}}</option> <!-- <select id="rangeModifier" value="rangeModifier">-->
<option value="-1">{{localize "Medium"}}</option> <!-- {{!#select rangeModifier}}-->
<option value="-2">{{localize "Long"}}</option> <!-- <option value="1">{{localize "BOL.range.PointBlank"}}</option>-->
<option value="-4">{{localize "Very Long"}}</option> <!-- <option value="0">{{localize "BOL.range.Short"}}</option>-->
<option value="-6">{{localize "Extreme"}}</option> <!-- <option value="-1">{{localize "BOL.range.Medium"}}</option>-->
<option value="-8">{{localize "Maximum"}}</option> <!-- <option value="-2">{{localize "BOL.range.Long"}}</option>-->
{{/select}} <!-- <option value="-4">{{localize "BOL.range.Very Long"}}</option>-->
</select> <!-- <option value="-6">{{localize "BOL.range.Extreme"}}</option>-->
<!-- <option value="-8">{{localize "BOL.range.Maximum"}}</option>-->
<!-- {{!/select}}-->
<!-- </select>-->
</div> </div>
{{/if}} {{/if}}
<div class="property flexrow">
<label class="property-label">{{localize "Modifier"}}</label>
<select id="bonusMalus" value="bonusMalus">
{{#select bonusMalus}}
{{{optionsBonusMalus}}}
{{/select}}
</select>
</div>
</form> </form>

View File

@ -0,0 +1,42 @@
<form class="skill-roll-dialog">
{{!#if (equals mode "attribute")}}{{!/if}}
{{#if (equals mode "career")}}
<div class="property flexrow">
<label class="property-label">{{localize "rank"}}</label>
<label class="property-label">{{career.data.rank}}</label>
</div>
{{/if}}
{{#if (equals mode "weapon")}}
{{#if defender}}
<div class="property flexrow">
<label class="property-label">{{localize "Defender"}} : </label>
<label class="property-label">{{defender.name}}</label>
</div>
<div class="property flexrow">
<label class="property-label">{{localize "Defense score"}}</label>
<label class="property-label">{{defender.data.aptitudes.def.value}}</label>
</div>
{{/if}}
{{#if isRangedWeapon}}
<div class="property flexrow">
<label class="property-label">{{localize "Range Modifier"}}</label>
<input class="field-value center" id="rangeModifier" name="rangeModifier" type="text" value="{{numberFormat rangeModifier decimals=0 sign=true}}" data-dtype="Number" style="text-align: center"/>
<!-- <select id="rangeModifier" value="rangeModifier">-->
<!-- {{!#select rangeModifier}}-->
<!-- <option value="1">{{localize "BOL.range.PointBlank"}}</option>-->
<!-- <option value="0">{{localize "BOL.range.Short"}}</option>-->
<!-- <option value="-1">{{localize "BOL.range.Medium"}}</option>-->
<!-- <option value="-2">{{localize "BOL.range.Long"}}</option>-->
<!-- <option value="-4">{{localize "BOL.range.Very Long"}}</option>-->
<!-- <option value="-6">{{localize "BOL.range.Extreme"}}</option>-->
<!-- <option value="-8">{{localize "BOL.range.Maximum"}}</option>-->
<!-- {{!/select}}-->
<!-- </select>-->
</div>
{{/if}}
{{/if}}
{{#if (neq mode "attribute")}}
{{> "systems/bol/templates/roll/parts/roll-dialog-attribute.hbs"}}
{{/if}}
{{> "systems/bol/templates/roll/parts/roll-dialog-modifiers.hbs"}}
</form>