Sync attempt

This commit is contained in:
sladecraven 2022-01-09 13:23:20 +01:00
parent 8538af1907
commit 915b89a8c4
4 changed files with 52 additions and 24 deletions

View File

@ -134,6 +134,17 @@ export class BoLActor extends Actor {
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && (i.data.subtype === "other" ||i.data.subtype === "container" ||i.data.subtype === "scroll" || i.data.subtype === "jewel")); return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && (i.data.subtype === "other" ||i.data.subtype === "container" ||i.data.subtype === "scroll" || i.data.subtype === "jewel"));
} }
heroReroll( ) {
if (this.type == 'character') {
return this.data.data.resources.hero.value > 0;
} else {
if (this.data.data.type == 'adversary') {
return this.data.data.resources.hero.value > 0;
}
}
return false
}
getResourcesFromType() { getResourcesFromType() {
let resources = {}; let resources = {};
if (this.type == 'encounter') { if (this.type == 'encounter') {

View File

@ -89,7 +89,7 @@ export class BoLRoll {
const adv = html.find('#adv').val(); const adv = html.find('#adv').val();
const mod = html.find('#mod').val(); const mod = html.find('#mod').val();
let careers = html.find('#career').val(); let careers = html.find('#career').val();
const career = (careers && careers.length == 0) ? 0 : Math.max(...careers.map(i => parseInt(i))); const career = (!careers || careers.length == 0) ? 0 : Math.max(...careers.map(i => parseInt(i)));
const isMalus = adv < 0; const isMalus = adv < 0;
const dicePool = (isMalus) ? 2 - parseInt(adv) : 2 + parseInt(adv); const dicePool = (isMalus) ? 2 - parseInt(adv) : 2 + parseInt(adv);
const attrValue = eval(`actor.data.data.attributes.${attr}.value`); const attrValue = eval(`actor.data.data.attributes.${attr}.value`);
@ -158,7 +158,7 @@ export class BoLRoll {
} }
let careers = html.find('#career').val(); let careers = html.find('#career').val();
const career = (careers && careers.length == 0) ? 0 : Math.max(...careers.map(i => parseInt(i))); const career = (!careers || careers.length == 0) ? 0 : Math.max(...careers.map(i => parseInt(i)));
const isMalus = adv < 0; const isMalus = adv < 0;
const dicePool = (isMalus) ? 2 - parseInt(adv) : 2 + parseInt(adv); const dicePool = (isMalus) ? 2 - parseInt(adv) : 2 + parseInt(adv);
const attrValue = eval(`attackDef.attacker.data.data.attributes.${attr}.value`); const attrValue = eval(`attackDef.attacker.data.data.attributes.${attr}.value`);
@ -206,7 +206,7 @@ export class BoLRoll {
const adv = html.find('#adv').val(); const adv = html.find('#adv').val();
const mod = html.find('#mod').val(); const mod = html.find('#mod').val();
let careers = html.find('#career').val(); let careers = html.find('#career').val();
const career = (careers && careers.length == 0) ? 0 : Math.max(...careers.map(i => parseInt(i))); const career = (!careers || careers.length == 0) ? 0 : Math.max(...careers.map(i => parseInt(i)));
const isMalus = adv < 0; const isMalus = adv < 0;
const dicePool = (isMalus) ? 2 - parseInt(adv) : 2 + parseInt(adv); const dicePool = (isMalus) ? 2 - parseInt(adv) : 2 + parseInt(adv);
const aptValue = eval(`actor.data.data.aptitudes.${apt}.value`); const aptValue = eval(`actor.data.data.aptitudes.${apt}.value`);
@ -261,6 +261,7 @@ export class BoLDefaultRoll {
const tplData = { const tplData = {
actor: actor, actor: actor,
label: this._label, label: this._label,
reroll: actor.heroReroll(),
isSuccess: this._isSuccess, isSuccess: this._isSuccess,
isFailure: !this._isSuccess, isFailure: !this._isSuccess,
isCritical: this._isCritical, isCritical: this._isCritical,
@ -285,7 +286,7 @@ export class BoLAttackRoll {
console.log("Attack def",this.attackDef.formula ) console.log("Attack def",this.attackDef.formula )
const r = new Roll(this.attackDef.formula); const r = new Roll(this.attackDef.formula);
await r.roll({ "async": false }); await r.roll({ "async": false });
//await BoLUtility.showDiceSoNice(r); await BoLUtility.showDiceSoNice(r);
const activeDice = r.terms[0].results.filter(r => r.active); const activeDice = r.terms[0].results.filter(r => r.active);
const diceTotal = activeDice.map(r => r.result).reduce((a, b) => a + b); const diceTotal = activeDice.map(r => r.result).reduce((a, b) => a + b);
this._isSuccess = (r.total >= 9); this._isSuccess = (r.total >= 9);
@ -297,16 +298,36 @@ export class BoLAttackRoll {
flavor: msgFlavor, flavor: msgFlavor,
speaker: ChatMessage.getSpeaker({ actor: this.attackDef.attacker }), speaker: ChatMessage.getSpeaker({ actor: this.attackDef.attacker }),
flags: { msgType: "default" } flags: { msgType: "default" }
}); }).then( this.processResult() );
}); });
}
async processDefense() {
if (this._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
})
})
} else {
BoLUtility.sendAttackSuccess( this.attackDef);
}
}
async processResult( ) {
if (this._isSuccess) { if (this._isSuccess) {
let attrDamage = this.attackDef.weapon.data.data.properties.damageAttribute; let attrDamage = this.attackDef.weapon.data.data.properties.damageAttribute;
let weaponFormula = BoLUtility.getDamageFormula(this.attackDef.weapon.data.data.properties.damage) let weaponFormula = BoLUtility.getDamageFormula(this.attackDef.weapon.data.data.properties.damage)
let damageFormula = weaponFormula + "+" + this.attackDef.attacker.data.data.attributes[attrDamage].value; let damageFormula = weaponFormula + "+" + this.attackDef.attacker.data.data.attributes[attrDamage].value;
this.damageRoll = new Roll(damageFormula); this.damageRoll = new Roll(damageFormula);
await this.damageRoll.roll({ "async": false }); await this.damageRoll.roll({ "async": false });
//await BoLUtility.showDiceSoNice(this.damageRoll); await BoLUtility.showDiceSoNice(this.damageRoll);
// Update attackDef object // Update attackDef object
this.attackDef.damageFormula = damageFormula; this.attackDef.damageFormula = damageFormula;
this.attackDef.damageRoll = this.damageRoll; this.attackDef.damageRoll = this.damageRoll;
@ -317,23 +338,8 @@ export class BoLAttackRoll {
flavor: msgFlavor, flavor: msgFlavor,
speaker: ChatMessage.getSpeaker({ actor: this.attackDef.attacker }), speaker: ChatMessage.getSpeaker({ actor: this.attackDef.attacker }),
flags: { msgType: "default" } flags: { msgType: "default" }
}); }).then( this.processDefense() );
}); });
if (this._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
})
})
} else {
BoLUtility.sendAttackSuccess( this.attackDef);
}
} }
} }
@ -354,6 +360,7 @@ export class BoLAttackRoll {
const tplData = { const tplData = {
actor: actor, actor: actor,
label: this._label, label: this._label,
reroll: actor.heroReroll(),
isSuccess: this._isSuccess, isSuccess: this._isSuccess,
isFailure: !this._isSuccess, isFailure: !this._isSuccess,
isCritical: this._isCritical, isCritical: this._isCritical,

View File

@ -111,6 +111,7 @@ export class BoLUtility {
static async chatListeners(html) { static async chatListeners(html) {
// Damage handling // Damage handling
html.on("click", '.damage-increase', event => { html.on("click", '.damage-increase', event => {
event.preventDefault();
let attackId = event.currentTarget.attributes['data-attack-id'].value; let attackId = event.currentTarget.attributes['data-attack-id'].value;
let damageMode = event.currentTarget.attributes['data-damage-mode'].value; let damageMode = event.currentTarget.attributes['data-damage-mode'].value;
if ( game.user.isGM) { if ( game.user.isGM) {
@ -120,7 +121,13 @@ export class BoLUtility {
} }
}); });
html.on("click", '.hero-reroll', event => {
event.preventDefault();
ui.notifications.warn("Not implemented up to now");
} );
html.on("click", '.damage-handling', event => { html.on("click", '.damage-handling', event => {
event.preventDefault();
let attackId = event.currentTarget.attributes['data-attack-id'].value; let attackId = event.currentTarget.attributes['data-attack-id'].value;
let defenseMode = event.currentTarget.attributes['data-defense-mode'].value; let defenseMode = event.currentTarget.attributes['data-defense-mode'].value;
let weaponId = (event.currentTarget.attributes['data-weapon-id']) ? event.currentTarget.attributes['data-weapon-id'].value : -1 let weaponId = (event.currentTarget.attributes['data-weapon-id']) ? event.currentTarget.attributes['data-weapon-id'].value : -1

View File

@ -13,7 +13,10 @@
<h2 class="failure"><i class="fas fa-times"></i>&nbsp;{{localize "BOL.ui.failure"}}...</h2> <h2 class="failure"><i class="fas fa-times"></i>&nbsp;{{localize "BOL.ui.failure"}}...</h2>
{{/if}} {{/if}}
{{/if}} {{/if}}
<h3><strong>{{description}}</strong> <h3><strong>{{description}}</strong></h3>
{{#if reroll}}
<a class="button hero-reroll" data-actor-id="{{actor.id}}">Relancer!</a>
{{/if}}
{{!#if hasDescription}} {{!#if hasDescription}}
<!--<h4>--> <!--<h4>-->
<!-- <pre class="rollDescr-line">{{!description}}</pre>--> <!-- <pre class="rollDescr-line">{{!description}}</pre>-->