diff --git a/lang/en.json b/lang/en.json index 2de175f..87ad2d9 100644 --- a/lang/en.json +++ b/lang/en.json @@ -54,6 +54,7 @@ "BOL.ui.roll" : "Utiliser", "BOL.ui.equipment" : "Équipement", "BOL.ui.equipmentProperties" : "Propiétés d'équipement", + "BOL.ui.weaponAttack" : "Weapon attack", "BOL.ui.weaponProperties" : "Propiétés offensives", "BOL.ui.protectionProperties" : "Protection", "BOL.ui.magicalProperties" : "Propriétés magiques", diff --git a/lang/fr.json b/lang/fr.json index 670e5bd..a24983b 100644 --- a/lang/fr.json +++ b/lang/fr.json @@ -54,6 +54,7 @@ "BOL.ui.roll" : "Utiliser", "BOL.ui.equipment" : "Équipement", "BOL.ui.equipmentProperties" : "Propriétés d'équipement", + "BOL.ui.weaponAttack" : "Attaque d'arme", "BOL.ui.weaponProperties" : "Propriétés offensives", "BOL.ui.protectionProperties" : "Protection", "BOL.ui.magicalProperties" : "Propriétés magiques", diff --git a/module/actor/actor-sheet.js b/module/actor/actor-sheet.js index 18070af..b062461 100644 --- a/module/actor/actor-sheet.js +++ b/module/actor/actor-sheet.js @@ -182,6 +182,7 @@ export class BoLActorSheet extends ActorSheet { const dataset = element.dataset; const actorData = this.getData(); const rollType = dataset.rollType; + const li = $(event.currentTarget).closest(".item"); switch(rollType) { case "attribute" : BoLRoll.attributeCheck(this.actor, actorData, dataset, event); @@ -192,6 +193,12 @@ export class BoLActorSheet extends ActorSheet { case "weapon": BoLRoll.weaponCheck(this.actor, actorData, dataset, event); break; + case "protection": + this.actor.rollProtection(li.data("item-id")) + break; + case "damage": + this.actor.rollWeaponDamage(li.data("item-id")) + break; default : break; } } diff --git a/module/actor/actor.js b/module/actor/actor.js index e02dcb8..220af12 100644 --- a/module/actor/actor.js +++ b/module/actor/actor.js @@ -1,3 +1,5 @@ +import { BoLDefaultRoll } from "../controllers/bol-rolls.js"; + /** * Extend the base Actor entity by defining a custom roll data structure which is ideal for the Simple system. * @extends {Actor} @@ -270,6 +272,27 @@ export class BoLActor extends Actor { return (formula == "") ? 0 :formula; } + /* -------------------------------------------- */ + rollProtection( itemId) { + let armor = this.data.items.get( itemId ) + if ( armor ) { + let armorFormula = armor.data.data.properties.soak.formula; + let rollArmor = new Roll(armorFormula) + rollArmor.roll( {async: false} ).toMessage(); + } + } + + /* -------------------------------------------- */ + rollWeaponDamage( itemId) { + let weapon = this.data.items.get(itemId ) + if ( weapon ) { + console.log("WE", weapon) + let r = new BoLDefaultRoll( { id: randomID(16), isSuccess: true, mode: "weapon", weapon: weapon, actor: this} ) + r.setSuccess(true) + r.processResult() + } + } + /* -------------------------------------------- */ toggleEquipItem(item) { const equipable = item.data.data.properties.equipable; diff --git a/module/controllers/bol-rolls.js b/module/controllers/bol-rolls.js index 91ee36f..aef7101 100644 --- a/module/controllers/bol-rolls.js +++ b/module/controllers/bol-rolls.js @@ -1,10 +1,16 @@ import { BoLUtility } from "../system/bol-utility.js"; +const __adv2dice = { ["1B"]: 3, ["2B"]: 4, ["2"]: 2, ["1M"]: 3, ["2M"]: 4} export class BoLRoll { static options() { return { classes: ["bol", "dialog"] }; } + static convertToAdv( adv) { + if (adv == 0) return "2" + return Math.abs(adv) + (adv < 0)?'M':'B'; + } + static attributeCheck(actor, actorData, dataset, event) { // const elt = $(event.currentTarget)[0]; // let key = elt.attributes["data-rolling"].value; @@ -13,7 +19,17 @@ export class BoLRoll { let attribute = eval(`actor.data.data.attributes.${key}`); let label = (attribute.label) ? game.i18n.localize(attribute.label) : null; let description = actor.name + " - " + game.i18n.localize('BOL.ui.attributeCheck') + " - " + game.i18n.localize(attribute.label); - return this.attributeRollDialog(actor, actorData, attribute, label, description, adv, 0); + return this.displayRollDialog( + { + mode: "attribute", + actor: actor, + actorData: actorData, + attribute: attribute, + label: label, + description: description, + adv: this.convertToAdv(adv), + mod: 0 + }); } static aptitudeCheck(actor, actorData, dataset, event) { @@ -24,7 +40,17 @@ export class BoLRoll { let aptitude = eval(`actor.data.data.aptitudes.${key}`); let label = (aptitude.label) ? game.i18n.localize(aptitude.label) : null; let description = actor.name + " - " + game.i18n.localize('BOL.ui.aptitudeCheck') + " - " + game.i18n.localize(aptitude.label); - return this.aptitudeRollDialog(actor, actorData, aptitude, label, description, adv, 0); + return this.displayRollDialog( + { + mode: "aptitude", + actor: actor, + actorData: actorData, + aptitude: aptitude, + label: label, + description: description, + adv: this.convertToAdv(adv), + mod: 0 + }); } static weaponCheck(actor, actorData, dataset, event) { @@ -39,102 +65,57 @@ export class BoLRoll { } let weaponData = weapon.data.data; let attackDef = { - id: randomID(16), - attacker: actor, - attackerData: actorData, + mode: "weapon", + actor: actor, + actorData: actorData, weapon: weapon, - mod: 0, target: target, defender: (target) ? game.actors.get(target.data.actorId) : undefined, - adv: dataset.adv || 0, attribute: eval(`actor.data.data.attributes.${weaponData.properties.attackAttribute}`), aptitude: eval(`actor.data.data.aptitudes.${weaponData.properties.attackAptitude}`), label: (weapon.name) ? weapon.name : game.i18n.localize('BOL.ui.noWeaponName'), description: actor.name + " - " + game.i18n.localize('BOL.ui.weaponAttack'), + adv: "2", + } console.debug("WEAPON!", attackDef, weaponData); - return this.weaponRollDialog(attackDef); + return this.displayRollDialog(attackDef); } /* -------------------------------------------- */ /* ROLL DIALOGS */ /* -------------------------------------------- */ - static async attributeRollDialog(actor, actorData, attribute, label, description, adv, mod, onEnter = "submit") { - const rollOptionTpl = 'systems/bol/templates/dialogs/attribute-roll-dialog.hbs'; - const dialogData = { - adv: adv, - mod: mod, - attr: attribute, - careers: actorData.features.careers, - boons: actorData.features.boons, - flaws: actorData.features.flaws - }; + static async displayRollDialog(rollData, onEnter = "submit") { - const rollOptionContent = await renderTemplate(rollOptionTpl, dialogData); - let d = new Dialog({ - title: label, - content: rollOptionContent, - buttons: { - cancel: { - icon: '', - label: game.i18n.localize("BOL.ui.cancel"), - callback: () => { - } - }, - submit: { - icon: '', - label: game.i18n.localize("BOL.ui.submit"), - callback: (html) => { - const attr = html.find('#attr').val(); - const adv = html.find('#adv').val(); - const mod = html.find('#mod').val(); - let careers = html.find('#career').val(); - const career = (!careers || careers.length == 0) ? 0 : Math.max(...careers.map(i => parseInt(i))); - const isMalus = adv < 0; - const dicePool = (isMalus) ? 2 - parseInt(adv) : 2 + parseInt(adv); - const attrValue = eval(`actor.data.data.attributes.${attr}.value`); - const modifiers = parseInt(attrValue) + parseInt(mod) + parseInt(career); - const formula = (isMalus) ? dicePool + "d6kl2 + " + modifiers : dicePool + "d6kh2 + " + modifiers; - let r = new BoLDefaultRoll(label, formula, description); - r.roll(actor); - } + const rollOptionTpl = `systems/bol/templates/dialogs/${rollData.mode}-roll-dialog.hbs` + rollData.careers = rollData.actorData.features.careers + rollData.boons = rollData.actorData.features.boons + rollData.flaws = rollData.actorData.features.flaws + rollData.defence = 0 + rollData.mod = 0 + rollData.id = randomID(16) + + // Weapon mode specific management + if (rollData.mode == "weapon") { + if (rollData.defender) { // If target is selected + rollData.defence = rollData.defender.defenseValue, + rollData.shieldBlock = 'none' + let shields = rollData.defender.shields + for (let shield of shields) { + rollData.shieldBlock = (shield.data.properties.blocking.blockingAll) ? 'blockall' : 'blockone'; + rollData.shieldAttackMalus = (shield.data.properties.blocking.malus) ? shield.data.properties.blocking.malus : 1; + rollData.applyShieldMalus = false } - }, - default: onEnter, - close: () => { } - }, this.options()); - return d.render(true); - } - - static async weaponRollDialog(attackDef) { - const rollOptionTpl = 'systems/bol/templates/dialogs/weapon-roll-dialog.hbs'; - const dialogData = { - attr: attackDef.attribute, - adv: attackDef.adv, - mod: attackDef.mod, - apt: attackDef.aptitude, - weapon: attackDef.weapon, - attackId: attackDef.id, - careers: attackDef.attackerData.features.careers, - boons: attackDef.attackerData.features.boons, - flaws: attackDef.attackerData.features.flaws, - defence: 0 - }; - - if (attackDef.defender) { - dialogData.defence = attackDef.defender.defenseValue, - dialogData.shieldBlock = 'none' - let shields = attackDef.defender.shields - for (let shield of shields) { - dialogData.shieldBlock = (shield.data.properties.blocking.blockingAll) ? 'blockall' : 'blockone'; - dialogData.shieldAttackMalus = (shield.data.properties.blocking.malus) ? shield.data.properties.blocking.malus : 1; - dialogData.applyShieldMalus = false } } - const rollOptionContent = await renderTemplate(rollOptionTpl, dialogData); + + console.log("ROL1", rollData) + + const rollOptionContent = await renderTemplate(rollOptionTpl, rollData); let d = new Dialog({ - title: attackDef.label, + title: rollData.label, content: rollOptionContent, + rollData: rollData, buttons: { cancel: { icon: '', @@ -146,74 +127,34 @@ export class BoLRoll { icon: '', label: game.i18n.localize("BOL.ui.submit"), callback: (html) => { - const attr = html.find('#attr').val(); - const apt = html.find('#apt').val(); - const adv = html.find('#adv').val(); - const mod = html.find('#mod').val() || 0; + rollData.attrKey = html.find('#attr').val(); + rollData.aptKey = html.find('#apt').val(); + rollData.adv = $("input[name='adv']:checked").val() || "2"; + //rollData.adv = html.find('#adv').val() || 0; + rollData.mod = html.find('#mod').val() || 0; + let careers = html.find('#career').val(); + rollData.career = (!careers || careers.length == 0) ? 0 : Math.max(...careers.map(i => parseInt(i))); let shieldMalus = 0; - const applyShieldMalus = html.find('#applyShieldMalus').val() || false; - if (applyShieldMalus || dialogData.shieldBlock == 'blockall') { - shieldMalus = dialogData.shieldAttackMalus; + if ( rollData.mode == "weapon") { + const applyShieldMalus = html.find('#applyShieldMalus').val() || false; + if (applyShieldMalus || rollData.shieldBlock == 'blockall') { + shieldMalus = rollData.shieldAttackMalus; + } } - let careers = html.find('#career').val(); - const career = (!careers || careers.length == 0) ? 0 : Math.max(...careers.map(i => parseInt(i))); - const isMalus = adv < 0; - const dicePool = (isMalus) ? 2 - parseInt(adv) : 2 + parseInt(adv); - const attrValue = eval(`attackDef.attacker.data.data.attributes.${attr}.value`); - const aptValue = eval(`attackDef.attacker.data.data.aptitudes.${apt}.value`); - const modifiers = parseInt(attrValue) + parseInt(aptValue) + parseInt(mod) + parseInt(career) - dialogData.defence - shieldMalus; + const isMalus = rollData.adv.includes('M'); + const dicePool = __adv2dice[rollData.adv] + //// const dicePool = (isMalus) ? 2 - parseInt(rollData.adv) : 2 + parseInt(rollData.adv); + const attrValue = (rollData.attrKey) && eval(`rollData.actor.data.data.attributes.${rollData.attrKey}.value`) || 0; + const aptValue = (rollData.aptKey) && eval(`rollData.actor.data.data.aptitudes.${rollData.aptKey}.value`) || 0 + + const modifiers = parseInt(attrValue) + parseInt(aptValue) + parseInt(rollData.mod) + parseInt(rollData.career) - rollData.defence - shieldMalus; const formula = (isMalus) ? dicePool + "d6kl2 + " + modifiers : dicePool + "d6kh2 + " + modifiers; - attackDef.formula = formula; - let r = new BoLAttackRoll(attackDef); - r.roll(); - } - } - }, - default: 'submit', - close: () => { } - }, this.options()); - return d.render(true); - } + rollData.formula = formula; - static async aptitudeRollDialog(actor, actorData, aptitude, label, description, adv, mod, onEnter = "submit") { - const rollOptionTpl = 'systems/bol/templates/dialogs/aptitude-roll-dialog.hbs'; - const dialogData = { - adv: adv, - mod: mod, - apt: aptitude, - careers: actorData.features.careers, - boons: actorData.features.boons, - flaws: actorData.features.flaws - }; - const rollOptionContent = await renderTemplate(rollOptionTpl, dialogData); - let d = new Dialog({ - title: label, - content: rollOptionContent, - buttons: { - cancel: { - icon: '', - label: game.i18n.localize("BOL.ui.cancel"), - callback: () => { - } - }, - submit: { - icon: '', - label: game.i18n.localize("BOL.ui.submit"), - callback: (html) => { - const apt = html.find('#apt').val(); - const adv = html.find('#adv').val(); - const mod = html.find('#mod').val(); - let careers = html.find('#career').val(); - const career = (!careers || careers.length == 0) ? 0 : Math.max(...careers.map(i => parseInt(i))); - const isMalus = adv < 0; - const dicePool = (isMalus) ? 2 - parseInt(adv) : 2 + parseInt(adv); - const aptValue = eval(`actor.data.data.aptitudes.${apt}.value`); - const modifiers = parseInt(aptValue) + parseInt(mod) + parseInt(career); - const formula = (isMalus) ? dicePool + "d6kl2 + " + modifiers : dicePool + "d6kh2 + " + modifiers; - let r = new BoLDefaultRoll(label, formula, description); - r.roll(actor); + let r = new BoLDefaultRoll(rollData); + r.roll(); } } }, @@ -225,192 +166,92 @@ export class BoLRoll { } export class BoLDefaultRoll { - constructor(label, formula, description, isWeapon = false) { - this._label = label; - this._formula = formula; - this._isSuccess = false; - this._isCritical = false; - this._isFumble = false; - this._isWeapon = isWeapon; - this._description = description; - } - - async roll(actor) { - const r = new Roll(this._formula); - await r.roll({ "async": true }); - const activeDice = r.terms[0].results.filter(r => r.active); - const diceTotal = activeDice.map(r => r.result).reduce((a, b) => a + b); - this._isSuccess = (r.total >= 9); - this._isCritical = (diceTotal === 12); - this._isFumble = (diceTotal === 2); - this._buildChatMessage(actor).then(msgFlavor => { - r.toMessage({ - user: game.user.id, - flavor: msgFlavor, - speaker: ChatMessage.getSpeaker({ actor: actor }), - flags: { msgType: "default" } - }); - }); - if (this._isSuccess && this._isWeapon) { - - } - } - - _buildChatMessage(actor) { - const rollMessageTpl = 'systems/bol/templates/chat/rolls/default-roll-card.hbs'; - const tplData = { - actor: actor, - label: this._label, - reroll: actor.heroReroll(), - isSuccess: this._isSuccess, - isFailure: !this._isSuccess, - isCritical: this._isCritical, - isFumble: this._isFumble, - hasDescription: this._description && this._description.length > 0, - description: this._description - }; - return renderTemplate(rollMessageTpl, tplData); - } - -} - -export class BoLAttackRoll { - constructor(attackDef) { - this.attackDef = attackDef; - this._isSuccess = false; - this._isCritical = false; - this._isFumble = false; + constructor(rollData) { + BoLUtility.storeRoll(rollData); + this.rollData = rollData + this.rollData.isSuccess = false; + this.rollData.isCritical = false; + this.rollData.isFumble = false; } async roll() { - console.log("Attack def",this.attackDef.formula ) - const r = new Roll(this.attackDef.formula); + console.log("ROLL", this.rollData) + + const r = new Roll(this.rollData.formula); await r.roll({ "async": false }); - await BoLUtility.showDiceSoNice(r); + //await BoLUtility.showDiceSoNice(r); const activeDice = r.terms[0].results.filter(r => r.active); const diceTotal = activeDice.map(r => r.result).reduce((a, b) => a + b); - this._isSuccess = (r.total >= 9); - this._isCritical = (diceTotal === 12); - this._isFumble = (diceTotal === 2); - this._buildChatMessage(this.attackDef.attacker).then(msgFlavor => { + this.rollData.isSuccess = (r.total >= 9); + this.rollData.isCritical = (diceTotal === 12); + this.rollData.isFumble = (diceTotal === 2); + this.rollData.isFailure = !this.rollData.isSuccess + this.rollData.reroll = this.rollData.actor.heroReroll() + + this._buildChatMessage(this.rollData).then(msgFlavor => { r.toMessage({ user: game.user.id, flavor: msgFlavor, - speaker: ChatMessage.getSpeaker({ actor: this.attackDef.attacker }), + speaker: ChatMessage.getSpeaker({ actor: this.rollData.actor }), flags: { msgType: "default" } - }).then( this.processResult() ); + }).then(this.processResult()); }); } async processDefense() { - if (this._isCritical) { + if (this.rollData.isCritical) { ChatMessage.create({ - alias: this.attackDef.attacker.name, - whisper: BoLUtility.getWhisperRecipientsAndGMs(this.attackDef.attacker.name), - content: await renderTemplate('systems/bol/templates/chat/rolls/attack-heroic-card.hbs', { - attackId: attackDef.id, - attacker: attackDef.attacker, - defender: attackDef.defender, - defenderWeapons: defenderWeapons, - damageTotal: attackDef.damageRoll.total - }) + alias: this.rollData.actor.name, + whisper: BoLUtility.getWhisperRecipientsAndGMs(this.rollData.actor.name), + content: await renderTemplate('systems/bol/templates/chat/rolls/attack-heroic-card.hbs', this.rollData ) }) } else { - BoLUtility.sendAttackSuccess( this.attackDef); + BoLUtility.sendAttackSuccess(this.rollData); } } + + setSuccess( flag) { + this.rollData.isSuccess = flag + } - async processResult( ) { - if (this._isSuccess) { - let attrDamage = this.attackDef.weapon.data.data.properties.damageAttribute; - let weaponFormula = BoLUtility.getDamageFormula(this.attackDef.weapon.data.data.properties.damage, - this.attackDef.weapon.data.data.properties.damageModifiers, - this.attackDef.weapon.data.data.properties.damageMultiplier) - let damageFormula = weaponFormula + "+" + this.attackDef.attacker.data.data.attributes[attrDamage].value; - console.log("Formula", damageFormula) - this.damageRoll = new Roll(damageFormula); - await this.damageRoll.roll({ "async": false }); - await BoLUtility.showDiceSoNice(this.damageRoll); - // Update attackDef object - this.attackDef.damageFormula = damageFormula; - this.attackDef.damageRoll = this.damageRoll; + async processResult() { + if ( this.rollData.mode != "weapon") { // Only specific process in Weapon mode + return; + } - this._buildDamageChatMessage(this.attackDef.attacker, this.attackDef.weapon, this.damageRoll.total).then(msgFlavor => { - this.damageRoll.toMessage({ + if (this.rollData.isSuccess) { + let attrDamage = this.rollData.weapon.data.data.properties.damageAttribute; + let weaponFormula = BoLUtility.getDamageFormula(this.rollData.weapon.data.data.properties.damage, + this.rollData.weapon.data.data.properties.damageModifiers, + this.rollData.weapon.data.data.properties.damageMultiplier) + let damageFormula = weaponFormula + ((attrDamage) ? "+" + this.rollData.actor.data.data.attributes[attrDamage].value : "+0"); + + //console.log("Formula", weaponFormula, damageFormula, this.rollData.weapon.data.data.properties.damage) + this.rollData.damageRoll = new Roll(damageFormula); + await this.rollData.damageRoll.roll({ "async": false }); + await BoLUtility.showDiceSoNice(this.rollData.damageRoll); + // Update rollData object + this.rollData.damageFormula = damageFormula; + + this._buildDamageChatMessage( this.rollData ).then(msgFlavor => { + this.rollData.damageRoll.toMessage({ user: game.user.id, flavor: msgFlavor, - speaker: ChatMessage.getSpeaker({ actor: this.attackDef.attacker }), + speaker: ChatMessage.getSpeaker({ actor: this.rollData.actor }), flags: { msgType: "default" } - }).then( this.processDefense() ); + }).then(this.processDefense()); }); } } - _buildDamageChatMessage(actor, weapon, total) { - const rollMessageTpl = 'systems/bol/templates/chat/rolls/damage-roll-card.hbs'; - const tplData = { - actor: actor, - label: this._label, - weapon: weapon, - damage: total, - isCritical: this._isCritical, - }; - return renderTemplate(rollMessageTpl, tplData); - } + _buildDamageChatMessage(rollData) { + const rollMessageTpl = 'systems/bol/templates/chat/rolls/damage-roll-card.hbs'; + return renderTemplate(rollMessageTpl, rollData); + } - _buildChatMessage(actor) { - const rollMessageTpl = 'systems/bol/templates/chat/rolls/default-roll-card.hbs'; - const tplData = { - actor: actor, - label: this._label, - reroll: actor.heroReroll(), - isSuccess: this._isSuccess, - isFailure: !this._isSuccess, - isCritical: this._isCritical, - isFumble: this._isFumble, - hasDescription: this._description && this._description.length > 0, - description: this._description - }; - return renderTemplate(rollMessageTpl, tplData); - } + _buildChatMessage(rollData) { + const rollMessageTpl = 'systems/bol/templates/chat/rolls/default-roll-card.hbs'; + return renderTemplate(rollMessageTpl, rollData); + } } -// export class BoLWeaponRoll { -// constructor(actor, label, formula, isCritical, description){ -// this._label = label; -// this._formula = formula; -// this._isCritical = isCritical; -// this._description = description; -// } -// -// _buildChatMessage() { -// const rollMessageTpl = 'systems/bol/templates/chat/rolls/weapon-roll-card.hbs'; -// const tplData = { -// label : this._label, -// isCritical : this._isCritical, -// hasDescription : this._description && this._description.length > 0, -// description : this._description -// }; -// return renderTemplate(rollMessageTpl, tplData); -// } -// } - -// export class BoLSpellRoll { -// constructor(actor, label, formula, isCritical, description){ -// this._label = label; -// this._formula = formula; -// this._isCritical = isCritical; -// this._description = description; -// } -// -// _buildChatMessage() { -// const rollMessageTpl = 'systems/bol/templates/chat/rolls/spell-roll-card.hbs'; -// const tplData = { -// label : this._label, -// isCritical : this._isCritical, -// hasDescription : this._description && this._description.length > 0, -// description : this._description -// }; -// return renderTemplate(rollMessageTpl, tplData); -// } -// } diff --git a/module/system/bol-utility.js b/module/system/bol-utility.js index 6ff321a..3932411 100644 --- a/module/system/bol-utility.js +++ b/module/system/bol-utility.js @@ -1,11 +1,11 @@ +import { BoLDefaultRoll } from "../controllers/bol-rolls.js"; export class BoLUtility { /* -------------------------------------------- */ static async init() { - this.attackStore = {}; - Hooks.on('renderChatLog', (log, html, data) => BoLUtility.chatListeners(html)); + this.attackStore = {} } /* -------------------------------------------- */ @@ -25,6 +25,16 @@ export class BoLUtility { return it; } + /* -------------------------------------------- */ + static storeRoll(roll) { + this.lastRoll = roll + } + + /* -------------------------------------------- */ + static getLastRoll() { + return this.lastRoll + } + /* -------------------------------------------- */ static createDirectOptionList(min, max) { let options = {}; @@ -121,9 +131,13 @@ export class BoLUtility { } }); - html.on("click", '.hero-reroll', event => { + html.on("click", '.hero-reroll', event => { event.preventDefault(); - ui.notifications.warn("Not implemented up to now"); + + let rollData = BoLUtility.getLastRoll() + rollData.actor.subHeroPoints(1) + let r = new BoLDefaultRoll( rollData ) + r.roll(); } ); html.on("click", '.damage-handling', event => { diff --git a/module/system/templates.js b/module/system/templates.js index 42fe80e..afea3a2 100644 --- a/module/system/templates.js +++ b/module/system/templates.js @@ -30,9 +30,15 @@ export const preloadHandlebarsTemplates = async function () { "systems/bol/templates/item/parts/properties/feature/flaw-properties.hbs", "systems/bol/templates/item/parts/properties/feature/origin-properties.hbs", "systems/bol/templates/item/parts/properties/feature/race-properties.hbs", + // DIALOGS "systems/bol/templates/roll/parts/roll-dialog-modifiers.hbs", - "systems/bol/templates/roll/parts/roll-dialog-attribute.hbs" + "systems/bol/templates/roll/parts/roll-dialog-attribute.hbs", + "systems/bol/templates/dialogs/aptitude-roll-part.hbs", + "systems/bol/templates/dialogs/attribute-roll-part.hbs", + "systems/bol/templates/dialogs/mod-roll-part.hbs", + "systems/bol/templates/dialogs/adv-roll-part.hbs", + "systems/bol/templates/dialogs/career-roll-part.hbs", ]; // Load the template parts diff --git a/system.json b/system.json index ebedc65..518890f 100644 --- a/system.json +++ b/system.json @@ -7,7 +7,7 @@ "url": "https://github.com/ZigmundKreud/bol", "license": "LICENSE.txt", "flags": {}, - "version": "0.8.9.6", + "version": "0.8.9.7", "templateVersion": 14, "minimumCoreVersion": "0.8.6", "compatibleCoreVersion": "9",