|
|
|
@ -16,27 +16,56 @@ export class BoLRoll {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
|
static attributeCheck(actor, key) {
|
|
|
|
|
static updateApplicableEffects(rollData) {
|
|
|
|
|
let appEffects = []
|
|
|
|
|
for( let effect of rollData.bolEffects) {
|
|
|
|
|
if(effect.system.properties.identifier =="always") {
|
|
|
|
|
appEffects.push(effect)
|
|
|
|
|
} else if (effect.system.properties.identifier.includes(rollData.attribute.key)) {
|
|
|
|
|
appEffects.push(effect)
|
|
|
|
|
} else if ( rollData.aptitude && effect.system.properties.identifier.includes(rollData.aptitude.key)) {
|
|
|
|
|
appEffects.push(effect)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return appEffects
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let attribute = eval(`actor.system.attributes.${key}`)
|
|
|
|
|
let label = (attribute.label) ? game.i18n.localize(attribute.label) : null
|
|
|
|
|
let description = game.i18n.localize('BOL.ui.attributeCheck') + " - " + game.i18n.localize(attribute.label)
|
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
|
static getCommonRollData(actor, mode, attribute, aptitude = undefined ) {
|
|
|
|
|
|
|
|
|
|
let rollData = {
|
|
|
|
|
mode: "attribute",
|
|
|
|
|
mode: mode,
|
|
|
|
|
actorId: actor.id,
|
|
|
|
|
img: actor.img,
|
|
|
|
|
attribute: attribute,
|
|
|
|
|
attrValue: attribute.value,
|
|
|
|
|
aptValue: 0,
|
|
|
|
|
label: label,
|
|
|
|
|
careerBonus: 0,
|
|
|
|
|
description: description,
|
|
|
|
|
armorAgiMalus: actor.getArmorAgiMalus(),
|
|
|
|
|
armorInitMalus: actor.getArmorInitMalus(),
|
|
|
|
|
adv: "0",
|
|
|
|
|
mod: 0
|
|
|
|
|
mod: 0,
|
|
|
|
|
modRanged: 0,
|
|
|
|
|
aptValue: 0,
|
|
|
|
|
bolEffects: actor.boleffects
|
|
|
|
|
}
|
|
|
|
|
if (aptitude) {
|
|
|
|
|
rollData.aptitude = aptitude
|
|
|
|
|
rollData.aptValue = aptitude.value
|
|
|
|
|
}
|
|
|
|
|
rollData.bolApplicableEffects = this.updateApplicableEffects(rollData)
|
|
|
|
|
return rollData
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
|
static attributeCheck(actor, key) {
|
|
|
|
|
|
|
|
|
|
let attribute = eval(`actor.system.attributes.${key}`)
|
|
|
|
|
|
|
|
|
|
let rollData = this.getCommonRollData(actor, "attribute", attribute)
|
|
|
|
|
rollData.description = game.i18n.localize('BOL.ui.attributeCheck') + " - " + game.i18n.localize(attribute.label)
|
|
|
|
|
rollData.label = (attribute.label) ? game.i18n.localize(attribute.label) : null
|
|
|
|
|
|
|
|
|
|
console.log(">>>>>>>>>>", rollData, actor)
|
|
|
|
|
return this.displayRollDialog(rollData)
|
|
|
|
|
}
|
|
|
|
@ -48,25 +77,12 @@ export class BoLRoll {
|
|
|
|
|
let attrKey = this.getDefaultAttribute(key)
|
|
|
|
|
let attribute = eval(`actor.system.attributes.${attrKey}`)
|
|
|
|
|
|
|
|
|
|
let label = (aptitude.label) ? game.i18n.localize(aptitude.label) : null;
|
|
|
|
|
let description = game.i18n.localize('BOL.ui.aptitudeCheck') + " - " + game.i18n.localize(aptitude.label);
|
|
|
|
|
return this.displayRollDialog(
|
|
|
|
|
{
|
|
|
|
|
mode: "aptitude",
|
|
|
|
|
actorId: actor.id,
|
|
|
|
|
img: actor.img,
|
|
|
|
|
attribute: attribute,
|
|
|
|
|
aptitude: aptitude,
|
|
|
|
|
attrValue: attribute.value,
|
|
|
|
|
aptValue: aptitude.value,
|
|
|
|
|
armorAgiMalus: actor.getArmorAgiMalus(),
|
|
|
|
|
armorInitMalus: actor.getArmorInitMalus(),
|
|
|
|
|
label: label,
|
|
|
|
|
careerBonus: 0,
|
|
|
|
|
adv: "0",
|
|
|
|
|
description: description,
|
|
|
|
|
mod: 0
|
|
|
|
|
})
|
|
|
|
|
let rollData = this.getCommonRollData(actor, "aptitude", attribute, aptitude)
|
|
|
|
|
|
|
|
|
|
rollData.label = (aptitude.label) ? game.i18n.localize(aptitude.label) : null
|
|
|
|
|
rollData.description = game.i18n.localize('BOL.ui.aptitudeCheck') + " - " + game.i18n.localize(aptitude.label)
|
|
|
|
|
|
|
|
|
|
return this.displayRollDialog( rollData)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
@ -116,6 +132,8 @@ export class BoLRoll {
|
|
|
|
|
let attribute = eval(`actor.system.attributes.${weaponData.properties.attackAttribute}`)
|
|
|
|
|
let aptitude = eval(`actor.system.aptitudes.${weaponData.properties.attackAptitude}`)
|
|
|
|
|
|
|
|
|
|
let rollData = this.getCommonRollData(actor, "weapon", attribute, aptitude)
|
|
|
|
|
|
|
|
|
|
// Compute distance
|
|
|
|
|
this.detectDistance( weapon, target)
|
|
|
|
|
|
|
|
|
@ -125,31 +143,19 @@ export class BoLRoll {
|
|
|
|
|
ui.notifications.warn(`{{actor.name}} est en Défense Totale ! Il ne peut pas attaquer ce round.`)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
// Build the roll structure
|
|
|
|
|
let rolldata = {
|
|
|
|
|
mode: "weapon",
|
|
|
|
|
actorId: actor.id,
|
|
|
|
|
img: actor.img,
|
|
|
|
|
weapon: weapon,
|
|
|
|
|
isRanged: weaponData.properties.ranged || weaponData.properties.throwing,
|
|
|
|
|
targetId: target?.id,
|
|
|
|
|
fightOption: fightOption,
|
|
|
|
|
careerBonus: 0,
|
|
|
|
|
defenderId: target?.actor.id,
|
|
|
|
|
attribute: attribute,
|
|
|
|
|
aptitude: aptitude,
|
|
|
|
|
attrValue: attribute.value,
|
|
|
|
|
aptValue: aptitude.value,
|
|
|
|
|
armorAgiMalus: actor.getArmorAgiMalus(),
|
|
|
|
|
armorInitMalus: actor.getArmorInitMalus(),
|
|
|
|
|
mod: 0,
|
|
|
|
|
modRanged: 0,
|
|
|
|
|
adv: "0",
|
|
|
|
|
label: (weapon.name) ? weapon.name : game.i18n.localize('BOL.ui.noWeaponName'),
|
|
|
|
|
description: game.i18n.localize('BOL.ui.weaponAttack') + " : " + weapon.name,
|
|
|
|
|
}
|
|
|
|
|
return this.displayRollDialog(rolldata)
|
|
|
|
|
|
|
|
|
|
// Update the roll structure
|
|
|
|
|
rollData.weapon = weapon
|
|
|
|
|
rollData.isRanged = weaponData.properties.ranged || weaponData.properties.throwing
|
|
|
|
|
rollData.targetId = target?.id
|
|
|
|
|
rollData.fightOption = fightOption
|
|
|
|
|
rollData.defenderId = target?.actor.id
|
|
|
|
|
rollData.label = (weapon.name) ? weapon.name : game.i18n.localize('BOL.ui.noWeaponName')
|
|
|
|
|
rollData.description = game.i18n.localize('BOL.ui.weaponAttack') + " : " + weapon.name
|
|
|
|
|
|
|
|
|
|
return this.displayRollDialog(rollData)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
|
static weaponCheck(actor, event) {
|
|
|
|
|
const li = $(event.currentTarget).parents(".item")
|
|
|
|
@ -173,55 +179,39 @@ export class BoLRoll {
|
|
|
|
|
alchemy = duplicate(alchemy)
|
|
|
|
|
let alchemyData = alchemy.system
|
|
|
|
|
if (alchemyData.properties.pccurrent < alchemyData.properties.pccost) {
|
|
|
|
|
ui.notifications.warn("Pas assez de Points de Cration investis dans la Préparation !")
|
|
|
|
|
ui.notifications.warn("Pas assez de Points de Création investis dans la Préparation !")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let alchemyDef = {
|
|
|
|
|
mode: "alchemy",
|
|
|
|
|
actorId: actor.id,
|
|
|
|
|
img: actor.img,
|
|
|
|
|
alchemy: alchemy,
|
|
|
|
|
attribute: actor.system.attributes.mind,
|
|
|
|
|
attrValue: actor.system.attributes.mind.value,
|
|
|
|
|
aptValue: 0,
|
|
|
|
|
adv: "0",
|
|
|
|
|
careerBonus: actor.getAlchemistBonus(),
|
|
|
|
|
pcCost: Number(alchemyData.properties.pccost),
|
|
|
|
|
pcCostCurrent: Number(alchemyData.properties.pccurrent),
|
|
|
|
|
mod: Number(alchemyData.properties.difficulty),
|
|
|
|
|
armorAgiMalus: actor.getArmorAgiMalus(),
|
|
|
|
|
armorInitMalus: actor.getArmorInitMalus(),
|
|
|
|
|
label: alchemy.name,
|
|
|
|
|
description: game.i18n.localize('BOL.ui.makeAlchemy') + "+" + alchemy.name,
|
|
|
|
|
}
|
|
|
|
|
let rollData = this.getCommonRollData(actor, "alchemy", actor.system.attributes.mind)
|
|
|
|
|
|
|
|
|
|
rollData.alchemy = alchemy
|
|
|
|
|
rollData.careerBonus = actor.getAlchemistBonus()
|
|
|
|
|
rollData.pcCost = Number(alchemyData.properties.pccost)
|
|
|
|
|
rollData.pcCostCurrent = Number(alchemyData.properties.pccurrent)
|
|
|
|
|
rollData.mod = Number(alchemyData.properties.difficulty)
|
|
|
|
|
rollData.label = alchemy.name
|
|
|
|
|
rollData.description = game.i18n.localize('BOL.ui.makeAlchemy') + "+" + alchemy.name
|
|
|
|
|
|
|
|
|
|
console.log("ALCHEMY!", alchemyDef);
|
|
|
|
|
return this.displayRollDialog(alchemyDef);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
|
static spellCheckWithSpell( actor, spell ) {
|
|
|
|
|
let spellDef = {
|
|
|
|
|
mode: "spell",
|
|
|
|
|
actorId: actor.id,
|
|
|
|
|
img: actor.img,
|
|
|
|
|
spell: spell,
|
|
|
|
|
attribute: actor.system.attributes.mind,
|
|
|
|
|
attrValue: actor.system.attributes.mind.value,
|
|
|
|
|
aptValue: 0,
|
|
|
|
|
adv: "0",
|
|
|
|
|
ppCurrent: Number(actor.system.resources.power.value),
|
|
|
|
|
careerBonus: actor.getSorcererBonus(),
|
|
|
|
|
ppCostArmor: actor.getPPCostArmor(),
|
|
|
|
|
ppCost: Number(spell.system.properties.ppcost),
|
|
|
|
|
mod: Number(spell.system.properties.difficulty),
|
|
|
|
|
armorAgiMalus: actor.getArmorAgiMalus(),
|
|
|
|
|
armorInitMalus: actor.getArmorInitMalus(),
|
|
|
|
|
label: spell.name,
|
|
|
|
|
description: game.i18n.localize('BOL.ui.focusSpell') + " : " + spell.name,
|
|
|
|
|
}
|
|
|
|
|
let rollData = this.getCommonRollData(actor, "spell", actor.system.attributes.mind)
|
|
|
|
|
|
|
|
|
|
rollData.spell = spell
|
|
|
|
|
rollData.ppCurrent = Number(actor.system.resources.power.value),
|
|
|
|
|
rollData.careerBonus = actor.getSorcererBonus(),
|
|
|
|
|
rollData.ppCostArmor = actor.getPPCostArmor(),
|
|
|
|
|
rollData.ppCost = Number(spell.system.properties.ppcost),
|
|
|
|
|
rollData.mod = Number(spell.system.properties.difficulty),
|
|
|
|
|
rollData.label = spell.name,
|
|
|
|
|
rollData.description = game.i18n.localize('BOL.ui.focusSpell') + " : " + spell.name
|
|
|
|
|
|
|
|
|
|
//console.log("SPELL!", spellDef)
|
|
|
|
|
return this.displayRollDialog(spellDef)
|
|
|
|
|
return this.displayRollDialog(rollData)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
@ -246,8 +236,29 @@ export class BoLRoll {
|
|
|
|
|
this.updateArmorMalus(this.rollData)
|
|
|
|
|
this.updatePPCost(this.rollData)
|
|
|
|
|
|
|
|
|
|
// get basic dices from boons/flaws
|
|
|
|
|
let effectModifier = 0
|
|
|
|
|
this.rollData.bmDice = this.rollData.nbBoons - this.rollData.nbFlaws + this.rollData.bDice - this.rollData.mDice
|
|
|
|
|
// add applicable bonus/malus dices effects
|
|
|
|
|
for (let effect of this.rollData.bolApplicableEffects) {
|
|
|
|
|
if (effect.system.properties.modifier == "1B") {
|
|
|
|
|
this.rollData.bmDice++;
|
|
|
|
|
} else if (effect.system.properties.modifier == "1B") {
|
|
|
|
|
this.rollData.bmDice+=2;
|
|
|
|
|
} else if (effect.system.properties.modifier == "1M") {
|
|
|
|
|
this.rollData.bmDice--;
|
|
|
|
|
} else if (effect.system.properties.modifier == "2M") {
|
|
|
|
|
this.rollData.bmDice-=2;
|
|
|
|
|
} else {
|
|
|
|
|
effectModifier += Number(effect.system.properties.modifier)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// Keep track of the final effect modifier
|
|
|
|
|
this.rollData.effectModifier = effectModifier
|
|
|
|
|
|
|
|
|
|
// Final number of dices
|
|
|
|
|
this.rollData.nbDice = 2 + Math.abs(this.rollData.bmDice)
|
|
|
|
|
// Bonus or Malus ?
|
|
|
|
|
if (this.rollData.bmDice == 0) {
|
|
|
|
|
$('#roll-nbdice').val("2")
|
|
|
|
|
} else {
|
|
|
|
@ -260,7 +271,14 @@ export class BoLRoll {
|
|
|
|
|
}
|
|
|
|
|
$('#roll-modifier').val(rollbase + "+" + this.rollData.careerBonus + "+" + this.rollData.mod + "+" +
|
|
|
|
|
this.rollData.modRanged + "+" + this.rollData.weaponModifier + "-" + this.rollData.defence + "-" + this.rollData.modArmorMalus + "-" +
|
|
|
|
|
this.rollData.shieldMalus + "+" + this.rollData.attackModifier + "+" + this.rollData.appliedArmorMalus)
|
|
|
|
|
this.rollData.shieldMalus + "+" + this.rollData.attackModifier + "+" + this.rollData.appliedArmorMalus + "+" + effectModifier)
|
|
|
|
|
|
|
|
|
|
// Rebuild lits of applicable effects
|
|
|
|
|
let selectEffects = ""
|
|
|
|
|
for(let effect of this.rollData.bolApplicableEffects) {
|
|
|
|
|
selectEffects += `<option value="${effect.id}" selected>${effect.name}</option>`
|
|
|
|
|
}
|
|
|
|
|
$('#applicable-effects').html(selectEffects)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
@ -337,6 +355,7 @@ export class BoLRoll {
|
|
|
|
|
let actor = game.actors.get( this.rollData.actorId)
|
|
|
|
|
this.rollData.attribute = duplicate(actor.system.attributes[attrKey])
|
|
|
|
|
this.rollData.attrValue = actor.system.attributes[attrKey].value
|
|
|
|
|
this.rollData.bolApplicableEffects = this.updateApplicableEffects(this.rollData)
|
|
|
|
|
this.updateTotalDice()
|
|
|
|
|
})
|
|
|
|
|
html.find('#apt').change((event) => {
|
|
|
|
@ -344,6 +363,7 @@ export class BoLRoll {
|
|
|
|
|
let actor = game.actors.get( this.rollData.actorId)
|
|
|
|
|
this.rollData.aptitude = duplicate(actor.system.aptitudes[aptKey])
|
|
|
|
|
this.rollData.aptValue = actor.system.aptitudes[aptKey].value
|
|
|
|
|
this.rollData.bolApplicableEffects = this.updateApplicableEffects(this.rollData)
|
|
|
|
|
this.updateTotalDice()
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
@ -485,7 +505,7 @@ export class BoLRoll {
|
|
|
|
|
if ( rollData.weapon && rollData.weapon.system.properties.onlymodifier ) {
|
|
|
|
|
rollbase = 0
|
|
|
|
|
}
|
|
|
|
|
const modifiers = rollbase + rollData.careerBonus + rollData.mod + rollData.weaponModifier - rollData.defence - rollData.modArmorMalus + rollData.shieldMalus + rollData.attackModifier + rollData.appliedArmorMalus
|
|
|
|
|
const modifiers = rollbase + rollData.careerBonus + rollData.mod + rollData.weaponModifier - rollData.defence - rollData.modArmorMalus + rollData.shieldMalus + rollData.attackModifier + rollData.appliedArmorMalus + rollData.effectModifier
|
|
|
|
|
const formula = (isMalus) ? rollData.nbDice + "d6kl2 + " + modifiers : rollData.nbDice + "d6kh2 + " + modifiers
|
|
|
|
|
rollData.formula = formula
|
|
|
|
|
rollData.modifiers = modifiers
|
|
|
|
|