From afe5ddcb8da68a80b9b6f073cb3ab9e22020a88c Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Thu, 17 Dec 2020 00:05:32 +0100 Subject: [PATCH 1/6] =?UTF-8?q?Masquer=20les=20d=C3=A9s=20d=C3=A9t=C3=A9ri?= =?UTF-8?q?oration/recul?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/actor.js | 21 +++++++++++++++++---- module/rdd-calendrier.js | 6 ++++-- module/rdd-resolution-table.js | 2 +- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/module/actor.js b/module/actor.js index c30866b2..ae0c8b85 100644 --- a/module/actor.js +++ b/module/actor.js @@ -182,7 +182,10 @@ export class RdDActor extends Actor { let resistance = Misc.toInt(rollData.arme.data.resistance); let msg = ""; // Jet de résistance de l'arme de parade (p.132) - let resistRoll = await RdDResolutionTable.roll( resistance, - dmg ); + let resistRoll = await RdDResolutionTable.rollData({ + caracValue: resistance, + finalLevel: - dmg, + showDice: false}); if (resistRoll.isSuccess) { // Perte de résistance msg = "Votre " + rollData.arme.name + " tient le choc de la parade. " } else { @@ -197,7 +200,10 @@ export class RdDActor extends Actor { } // Jet de désarmement if (resistance > 0 && !rollData.arme.name.toLowerCase().includes('bouclier') ) { // Si l'arme de parade n'est pas un bouclier, jet de désarmement (p.132) - let desarme = await RdDResolutionTable.roll( this.data.data.carac.force.value, Misc.toInt(rollData.competence.data.niveau) -dmg ); + let desarme = await RdDResolutionTable.rollData({ + caracValue: this.data.data.carac.force.value, + finalLevel: Misc.toInt(rollData.competence.data.niveau) - dmg, + showDice: false}); if ( desarme.isEchec) { msg += "Vous ne parvenez pas à garder votre arme en main, elle tombe au sol à vos pieds"; } @@ -214,12 +220,19 @@ export class RdDActor extends Actor { if ( rollData.arme || encaisser ) { if ( (rollData.attackerRoll.particuliereAttaque && rollData.attackerRoll.particuliereAttaque == 'force') || rollData.attackerRoll.tactique == 'charge') { let reculNiveau = Misc.toInt(this.data.data.carac.taille.value) - (rollData.attackerRoll.forceValue+rollData.attackerRoll.arme.data.dommagesReels); - let recul = await RdDResolutionTable.roll( 10, reculNiveau ); + let recul = await RdDResolutionTable.rollData({ + caracValue: 10, + finalLevel: reculNiveau, + showDice: false}); + let msg = ""; if (recul.isSuccess) { msg = " Vous ne reculez pas malgré la force du coup."; } else { - let chute = await RdDResolutionTable.roll( this.data.data.carac.agilite.value, reculNiveau ); + let chute = await RdDResolutionTable.rollData({ + caracValue: this.data.data.carac.agilite.value, + finalLevel: reculNiveau, + showDice: false}); if ( !chute.isSuccess || recul.isETotal ) { msg = "Sous la violence du coup, vous reculez et chutez au sol ! Vous ne pouvez plus attaquer ce round."; } else { diff --git a/module/rdd-calendrier.js b/module/rdd-calendrier.js index bc6d7eab..ee248b73 100644 --- a/module/rdd-calendrier.js +++ b/module/rdd-calendrier.js @@ -234,8 +234,10 @@ export class RdDCalendrier extends Application { console.log( request ); let jourDiff = this.getLectureAstrologieDifficulte( request.date); let niveau = Number(request.astrologie.data.niveau) + Number(request.conditions) + Number(jourDiff) + Number(request.etat); - let rolled = await RdDResolutionTable.roll(request.carac_vue, niveau, undefined, false); - + let rolled = await RdDResolutionTable.rollData({ + caracValue: request.carac_vue, + finalLevel: niveau, + showDice: false}); let nbAstral = this.getNombreAstral( request.date ); let nbAstralFaux = nbAstral; request.isValid = true; diff --git a/module/rdd-resolution-table.js b/module/rdd-resolution-table.js index 06cbe388..4109811e 100644 --- a/module/rdd-resolution-table.js +++ b/module/rdd-resolution-table.js @@ -91,7 +91,7 @@ export class RdDResolutionTable { /* -------------------------------------------- */ static async rollData(rollData) { - rollData.rolled = await this.roll(rollData.caracValue, rollData.finalLevel, rollData.bonus, rollData.needSignificative); + rollData.rolled = await this.roll(rollData.caracValue, rollData.finalLevel, rollData.bonus, rollData.needSignificative, !rollData.showDice); } /* -------------------------------------------- */ From b4f298256a440a69f88fbad9c408f5e0440262c4 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Thu, 17 Dec 2020 00:23:40 +0100 Subject: [PATCH 2/6] =?UTF-8?q?parade=20corps=20=C3=A0=20corps=20#68?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/item-arme.js | 7 ++++--- module/rdd-combat.js | 31 +++++++++++++++++++++++-------- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/module/item-arme.js b/module/item-arme.js index feedde73..ce733b5b 100644 --- a/module/item-arme.js +++ b/module/item-arme.js @@ -69,9 +69,10 @@ export class RdDItemArme extends Item { } static mainsNues() { - return { + const mainsNues = { name: "Mains nues", - data: { unemain: true, deuxmains: false, dommages: 0, dommagesReels: 0, mortalite: 'non-mortel' } - } + data: { unemain: true, deuxmains: false, dommages: 0, dommagesReels: 0, mortalite: 'non-mortel', competence: 'Corps à corps' } + }; + return mainsNues } } diff --git a/module/rdd-combat.js b/module/rdd-combat.js index be291876..c63bc7e0 100644 --- a/module/rdd-combat.js +++ b/module/rdd-combat.js @@ -81,7 +81,10 @@ export class RdDCombat { } switch (button) { case '#particuliere-attaque': return await this.choixParticuliere(rollData, event.currentTarget.attributes['data-mode'].value); - case '#parer-button': return this.parade(rollData, event.currentTarget.attributes['data-armeid'].value); + case '#parer-button': { + const armeId = event.currentTarget.attributes['data-armeid']; + return this.parade(rollData, armeId ? armeId.value : undefined); + } case '#esquiver-button': return this.esquive(rollData); case '#encaisser-button': return this.encaisser(rollData, event.currentTarget.attributes['data-defenderTokenId'].value); } @@ -255,7 +258,10 @@ export class RdDCombat { for (const arme of this._filterArmesParade(this.defender.data.items, rollData.competence.data.categorie)) { content += "
Parer avec " + arme.name + ""; } - + // corps à corps + if (rollData.dmg.mortalite != 'mortel') { + content += "
Parer à mains nues"; + } // esquive if (rollData.competence.data.categorie == 'melee' || rollData.competence.data.categorie == "lancer" || rollData.competence.data.categorie == 'competencecreature') { content += "
Esquiver"; @@ -339,7 +345,8 @@ export class RdDCombat { /* -------------------------------------------- */ async parade(attackerRoll, armeParadeId) { - let arme = this.defender.getOwnedItem(armeParadeId); + + let arme = this._findArmeParade(armeParadeId); console.log("RdDCombat.parade >>>", attackerRoll, armeParadeId, arme); @@ -361,13 +368,21 @@ export class RdDCombat { dialog.render(true); } - _prepareParade(attackerRoll, arme) { + _findArmeParade(armeParadeId) { + if (armeParadeId) { + const armeItem = this.defender.getOwnedItem(armeParadeId); + return armeItem.data; + + } + return RdDItemArme.mainsNues() + } + + _prepareParade(attackerRoll, armeParade) { const isCreature = this.defender.isCreature(); - const compName = isCreature ? arme.name : arme.data.data.competence; + const compName = isCreature ? armeParade.name : armeParade.data.competence; const competence = this.defender.getCompetence(compName); const armeAttaque = attackerRoll.arme; - const armeParade = arme.data; - + if (compName != competence.name) { // TODO: toujours utiliser competence.name ... ui.notifications.warn("Différence entre compétence " + competence.name + " et compétence de l'arme " + compName); @@ -378,7 +393,7 @@ export class RdDCombat { diffLibre: attackerRoll.diffLibre, attackerRoll: attackerRoll, competence: competence, - arme: arme.data, + arme: armeParade, surprise: this.defender.getSurprise(), surpriseDefenseur: this.defender.getSurprise(), needSignificative: this._needSignificative(attackerRoll) || RdDItemArme.needParadeSignificative(armeAttaque, armeParade), From 95708222dce9cada7e3e43ce185c4a2799e09cf2 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Thu, 17 Dec 2020 00:44:32 +0100 Subject: [PATCH 3/6] =?UTF-8?q?jets=20de=20d=C3=A9s=20cach=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/actor.js | 76 ------------------------------ module/rdd-combat.js | 84 ++++++++++++++++++++++++++++++++-- module/rdd-resolution-table.js | 3 +- 3 files changed, 82 insertions(+), 81 deletions(-) diff --git a/module/actor.js b/module/actor.js index ae0c8b85..225b0cdd 100644 --- a/module/actor.js +++ b/module/actor.js @@ -170,82 +170,6 @@ export class RdDActor extends Actor { } } - - /* -------------------------------------------- */ - async computeDeteriorationArme( rollData ) { - const attackerRoll = rollData.attackerRoll; - if (rollData.arme && attackerRoll) { // C'est une parade - // Est-ce que l'attaque est une particulière, en force ou charge et que l'attaque n'en est pas une ? - if ( (rollData.needResist || attackerRoll.particuliereAttaque == 'force' || attackerRoll.tactique == 'charge') - && !rollData.rolled.isPart ) { - const dmg = attackerRoll.dmg.dmgArme + attackerRoll.dmg.dmgActor; - let resistance = Misc.toInt(rollData.arme.data.resistance); - let msg = ""; - // Jet de résistance de l'arme de parade (p.132) - let resistRoll = await RdDResolutionTable.rollData({ - caracValue: resistance, - finalLevel: - dmg, - showDice: false}); - if (resistRoll.isSuccess) { // Perte de résistance - msg = "Votre " + rollData.arme.name + " tient le choc de la parade. " - } else { - resistance -= dmg; - if ( resistance <= 0 ) { - this.deleteEmbeddedEntity("OwnedItem", rollData.arme._id); - msg = "Sous la violence de la parade, votre " + rollData.arme.name + " s'est brisée sous le coup!"; - } else { - this.updateEmbeddedEntity("OwnedItem", {_id: rollData.arme._id, 'data.resistance': resistance }); - msg = "En parant, vous endommagez votre " + rollData.arme.name + ", qui perd " + dmg + " de résistance. "; - } - } - // Jet de désarmement - if (resistance > 0 && !rollData.arme.name.toLowerCase().includes('bouclier') ) { // Si l'arme de parade n'est pas un bouclier, jet de désarmement (p.132) - let desarme = await RdDResolutionTable.rollData({ - caracValue: this.data.data.carac.force.value, - finalLevel: Misc.toInt(rollData.competence.data.niveau) - dmg, - showDice: false}); - if ( desarme.isEchec) { - msg += "Vous ne parvenez pas à garder votre arme en main, elle tombe au sol à vos pieds"; - } - } - ChatMessage.create( { content: msg, - user: game.user._id, - whisper: [game.user._id, ChatMessage.getWhisperRecipients("GM") ] } ); - } - } - } - - /* -------------------------------------------- */ - async computeRecul( rollData, encaisser = undefined ) { // Calcul du recul (p. 132) - if ( rollData.arme || encaisser ) { - if ( (rollData.attackerRoll.particuliereAttaque && rollData.attackerRoll.particuliereAttaque == 'force') || rollData.attackerRoll.tactique == 'charge') { - let reculNiveau = Misc.toInt(this.data.data.carac.taille.value) - (rollData.attackerRoll.forceValue+rollData.attackerRoll.arme.data.dommagesReels); - let recul = await RdDResolutionTable.rollData({ - caracValue: 10, - finalLevel: reculNiveau, - showDice: false}); - - let msg = ""; - if (recul.isSuccess) { - msg = " Vous ne reculez pas malgré la force du coup."; - } else { - let chute = await RdDResolutionTable.rollData({ - caracValue: this.data.data.carac.agilite.value, - finalLevel: reculNiveau, - showDice: false}); - if ( !chute.isSuccess || recul.isETotal ) { - msg = "Sous la violence du coup, vous reculez et chutez au sol ! Vous ne pouvez plus attaquer ce round."; - } else { - msg = "La violence du choc vous fait reculer de quelques mètres ! Vous ne pouvez plus attaquer ce round."; - } - } - ChatMessage.create( {content: msg, - user: game.user._id, - whisper: [game.user._id, ChatMessage.getWhisperRecipients("GM") ] } ); - } - } - } - /* -------------------------------------------- */ getSurprise() { if (this.isEntiteCauchemar()) { diff --git a/module/rdd-combat.js b/module/rdd-combat.js index c63bc7e0..eb4f1819 100644 --- a/module/rdd-combat.js +++ b/module/rdd-combat.js @@ -435,8 +435,8 @@ export class RdDCombat { /* -------------------------------------------- */ async _onParadeNormale(rollData) { console.log("RdDCombat._onParadeNormale >>>", rollData); - await this.defender.computeDeteriorationArme(rollData); - await this.defender.computeRecul(rollData, false); + await this.computeDeteriorationArme(rollData); + await this.computeRecul(rollData, false); let chatOptions = { content: "Test : " + rollData.selectedCarac.label + " / " + rollData.competence.name + "" @@ -477,7 +477,7 @@ export class RdDCombat { ChatUtility.chatWithRollMode(chatOptions, this.defender.name) - await this.defender.computeRecul(rollData, true); + await this.computeRecul(rollData, true); // TODO: gestion message pour chance/encaissement this.encaisser(rollData.attackerRoll); } @@ -574,10 +574,86 @@ export class RdDCombat { ChatUtility.chatWithRollMode(chatOptions, this.defender.name) - await this.defender.computeRecul(rollData, true); + await this.computeRecul(rollData, true); this.encaisser(rollData.attackerRoll); } + + /* -------------------------------------------- */ + async computeDeteriorationArme( rollData ) { + const attackerRoll = rollData.attackerRoll; + if (rollData.arme && attackerRoll) { // C'est une parade + // Est-ce que l'attaque est une particulière, en force ou charge et que l'attaque n'en est pas une ? + if ( (rollData.needResist || attackerRoll.particuliereAttaque == 'force' || attackerRoll.tactique == 'charge') + && !rollData.rolled.isPart ) { + const dmg = attackerRoll.dmg.dmgArme + attackerRoll.dmg.dmgActor; + let resistance = Misc.toInt(rollData.arme.data.resistance); + let msg = ""; + // Jet de résistance de l'arme de parade (p.132) + let resistRoll = await RdDResolutionTable.rollData({ + caracValue: resistance, + finalLevel: - dmg, + showDice: false}); + if (resistRoll.isSuccess) { // Perte de résistance + msg = "Votre " + rollData.arme.name + " tient le choc de la parade. " + } else { + resistance -= dmg; + if ( resistance <= 0 ) { + this.defender.deleteEmbeddedEntity("OwnedItem", rollData.arme._id); + msg = "Sous la violence de la parade, votre " + rollData.arme.name + " s'est brisée sous le coup!"; + } else { + this.defender.updateEmbeddedEntity("OwnedItem", {_id: rollData.arme._id, 'data.resistance': resistance }); + msg = "En parant, vous endommagez votre " + rollData.arme.name + ", qui perd " + dmg + " de résistance. "; + } + } + // Jet de désarmement + if (resistance > 0 && !rollData.arme.name.toLowerCase().includes('bouclier') ) { // Si l'arme de parade n'est pas un bouclier, jet de désarmement (p.132) + let desarme = await RdDResolutionTable.rollData({ + caracValue: this.defender.data.data.carac.force.value, + finalLevel: Misc.toInt(rollData.competence.data.niveau) - dmg, + showDice: false}); + if ( desarme.isEchec) { + msg += "Vous ne parvenez pas à garder votre arme en main, elle tombe au sol à vos pieds"; + } + } + ChatMessage.create( { content: msg, + user: game.user._id, + whisper: [game.user._id, ChatMessage.getWhisperRecipients("GM") ] } ); + } + } + } + /* -------------------------------------------- */ + async computeRecul( rollData, encaisser = undefined ) { // Calcul du recul (p. 132) + if ( rollData.arme || encaisser ) { + if ( (rollData.attackerRoll.particuliereAttaque && rollData.attackerRoll.particuliereAttaque == 'force') || rollData.attackerRoll.tactique == 'charge') { + let reculNiveau = Misc.toInt(this.defender.data.data.carac.taille.value) - (rollData.attackerRoll.forceValue+rollData.attackerRoll.arme.data.dommagesReels); + let recul = await RdDResolutionTable.rollData({ + caracValue: 10, + finalLevel: reculNiveau, + showDice: false}); + + let msg = ""; + if (recul.isSuccess) { + msg = " Vous ne reculez pas malgré la force du coup."; + } else { + let chute = await RdDResolutionTable.rollData({ + caracValue: this.defender.data.data.carac.agilite.value, + finalLevel: reculNiveau, + showDice: false}); + if ( !chute.isSuccess || recul.isETotal ) { + msg = "Sous la violence du coup, vous reculez et chutez au sol ! Vous ne pouvez plus attaquer ce round."; + } else { + msg = "La violence du choc vous fait reculer de quelques mètres ! Vous ne pouvez plus attaquer ce round."; + } + } + ChatMessage.create( {content: msg, + user: game.user._id, + whisper: [game.user._id, ChatMessage.getWhisperRecipients("GM") ] } ); + } + } + } + + /* -------------------------------------------- */ encaisser(attackerRoll) { // TODO: gestion message pour chance/encaissement diff --git a/module/rdd-resolution-table.js b/module/rdd-resolution-table.js index 4109811e..e1a9686b 100644 --- a/module/rdd-resolution-table.js +++ b/module/rdd-resolution-table.js @@ -91,7 +91,8 @@ export class RdDResolutionTable { /* -------------------------------------------- */ static async rollData(rollData) { - rollData.rolled = await this.roll(rollData.caracValue, rollData.finalLevel, rollData.bonus, rollData.needSignificative, !rollData.showDice); + rollData.rolled = await this.roll(rollData.caracValue, rollData.finalLevel, rollData.bonus, rollData.needSignificative, rollData.showDice); + return rollData; } /* -------------------------------------------- */ From fa225f3df970984e233dda852eb2407943c36bdf Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Thu, 17 Dec 2020 01:08:14 +0100 Subject: [PATCH 4/6] =?UTF-8?q?r=C3=A9ordonner=20les=20messages=20de=20d?= =?UTF-8?q?=C3=A9fense?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * jet de défense * jet de recul * détérioration d'arme --- module/rdd-combat.js | 53 +++++++++++++++++++------------------------- 1 file changed, 23 insertions(+), 30 deletions(-) diff --git a/module/rdd-combat.js b/module/rdd-combat.js index eb4f1819..296f8638 100644 --- a/module/rdd-combat.js +++ b/module/rdd-combat.js @@ -141,10 +141,10 @@ export class RdDCombat { label: 'Attaque: ' + (arme ? arme.name : competence.name), callbacks: [ this.attacker.createCallbackExperience(), - { condition: RdDCombat.isParticuliere, action: r => this._onAttaqueParticuliere(r) }, { condition: r => (RdDCombat.isReussite(r) && !RdDCombat.isParticuliere(r)), action: r => this._onAttaqueNormale(r) }, + { condition: RdDCombat.isParticuliere, action: r => this._onAttaqueParticuliere(r) }, + { condition: RdDCombat.isEchec, action: r => this._onAttaqueEchec(r) }, { condition: RdDCombat.isEchecTotal, action: r => this._onAttaqueEchecTotal(r) }, - { condition: RdDCombat.isEchec, action: r => this._onAttaqueEchec(r) } ] } ); dialog.render(true); @@ -186,11 +186,6 @@ export class RdDCombat { dommagesReels: competence.data.dommages } }; - - // rollData.dmg = { - // dmgArme: competence.data.dommages, - // total: competence.data.dommages - // }; } /* -------------------------------------------- */ @@ -217,31 +212,30 @@ export class RdDCombat { let explications = ""; - // Message spécial pour la rapidité, qui reste difficile à gérer automatiquement - if (rollData.particuliereAttaque == 'rapidite') { - ChatMessage.create({ - content: "Vous avez attaqué en Rapidité. Vous pourrez faire une deuxième attaque, ou utiliser votre arme pour vous défendre.", - whisper: ChatMessage.getWhisperRecipients(this.attacker.name) - }); - } rollData.dmg = RdDBonus.dmg(rollData, this.attacker.getBonusDegat(), this.defender.isEntiteCauchemar()); - + if (this.target) { explications += "
Cible : " + this.defender.data.name; } explications += "
Encaissement à " + Misc.toSignedString(rollData.dmg.total) + " (" + rollData.dmg.loc.label + ")"; - + // Save rollData for defender game.system.rdd.rollDataHandler[this.attackerId] = duplicate(rollData); + + // Message spécial pour la rapidité, qui reste difficile à gérer automatiquement + if (rollData.particuliereAttaque == 'rapidite') { + explications += "
Vous avez attaqué en Rapidité. Vous pourrez faire une deuxième attaque, ou utiliser votre arme pour vous défendre."; + } // Final chat message let chatOptions = { content: "Test : " + rollData.selectedCarac.label + " / " + rollData.competence.name + "" - + "
Difficultés libre : " + rollData.diffLibre + " / conditions : " + Misc.toSignedString(rollData.diffConditions) + " / état : " + rollData.etat - + RdDResolutionTable.explain(rollData.rolled) - + explications + + "
Difficultés libre : " + rollData.diffLibre + " / conditions : " + Misc.toSignedString(rollData.diffConditions) + " / état : " + rollData.etat + + RdDResolutionTable.explain(rollData.rolled) + + explications } ChatUtility.chatWithRollMode(chatOptions, this.attacker.name) + if (this.target) { this._messageDefenseur(rollData); } @@ -359,10 +353,10 @@ export class RdDCombat { label: 'Parade: ' + (arme ? arme.name : rollData.competence.name), callbacks: [ this.defender.createCallbackExperience(), - { condition: RdDCombat.isParticuliere, action: r => this._onParadeParticuliere(r) }, { condition: RdDCombat.isReussite, action: r => this._onParadeNormale(r) }, + { condition: RdDCombat.isParticuliere, action: r => this._onParadeParticuliere(r) }, + { condition: RdDCombat.isEchec, action: r => this._onParadeEchec(r) }, { condition: RdDCombat.isEchecTotal, action: r => this._onParadeEchecTotal(r) }, - { condition: RdDCombat.isEchec, action: r => this._onParadeEchec(r) } ] } ); dialog.render(true); @@ -435,17 +429,16 @@ export class RdDCombat { /* -------------------------------------------- */ async _onParadeNormale(rollData) { console.log("RdDCombat._onParadeNormale >>>", rollData); - await this.computeDeteriorationArme(rollData); - await this.computeRecul(rollData, false); - + let chatOptions = { content: "Test : " + rollData.selectedCarac.label + " / " + rollData.competence.name + "" - + "
Difficultés libre : " + rollData.diffLibre + " / conditions : " + Misc.toSignedString(rollData.diffConditions) + " / état : " + rollData.etat - + RdDResolutionTable.explain(rollData.rolled) - + "
Attaque parée!" + + "
Difficultés libre : " + rollData.diffLibre + " / conditions : " + Misc.toSignedString(rollData.diffConditions) + " / état : " + rollData.etat + + RdDResolutionTable.explain(rollData.rolled) + + "
Attaque parée!" } - ChatUtility.chatWithRollMode(chatOptions, this.defender.name) + await this.computeRecul(rollData, false); + await this.computeDeteriorationArme(rollData); } /* -------------------------------------------- */ @@ -498,10 +491,10 @@ export class RdDCombat { label: 'Esquiver', callbacks: [ this.defender.createCallbackExperience(), - { condition: RdDCombat.isParticuliere, action: r => this._onEsquiveParticuliere(r) }, { condition: RdDCombat.isReussite, action: r => this._onEsquiveNormale(r) }, - { condition: RdDCombat.isEchecTotal, action: r => this._onEsquiveEchecTotal(r) }, + { condition: RdDCombat.isParticuliere, action: r => this._onEsquiveParticuliere(r) }, { condition: RdDCombat.isEchec, action: r => this._onEsquiveEchec(r) }, + { condition: RdDCombat.isEchecTotal, action: r => this._onEsquiveEchecTotal(r) }, ] }); dialog.render(true); From 22ddb94f97970444bbd0f87208d210963abd6391 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Thu, 17 Dec 2020 02:20:03 +0100 Subject: [PATCH 5/6] Ajout des queues et souffles automatique --- module/actor.js | 48 +++++++++++++++++++++------------------- module/rdd-rolltables.js | 26 ++++++++++++++-------- module/rdd-tmr-dialog.js | 3 +-- module/tmr-utility.js | 12 ---------- 4 files changed, 43 insertions(+), 46 deletions(-) diff --git a/module/actor.js b/module/actor.js index 225b0cdd..e0a26280 100644 --- a/module/actor.js +++ b/module/actor.js @@ -444,12 +444,10 @@ export class RdDActor extends Actor { message += "
Vous gagnez une Tête de dragon: " + tete; } if (roll.isEchec) { - message += "
Vous subissez une Queue de Dragon"; - this.ajouterQueue(); + message += "
Vous subissez une Queue de Dragon: " + await this.ajouterQueue(); } if (roll.isETotal) { - message += "
A cause de votre échec total, vous subissez une deuxième Queue de Dragon !" - this.ajouterQueue(); + message += "
A cause de votre échec total, vous subissez une deuxième Queue de Dragon: " + await this.ajouterQueue(); } return message; } @@ -694,7 +692,7 @@ export class RdDActor extends Actor { let total = new Roll("1d20").roll().total; if ( total <= refoulement.value ) { refoulement.value = 0; - this.ajouterSouffle(); + this.ajouterSouffle({chat: true}); ret = "souffle"; } @@ -703,17 +701,20 @@ export class RdDActor extends Actor { } /* -------------------------------------------- */ - ajouterSouffle() { + async ajouterSouffle(options = {chat : false}) { let souffle = RdDRollTables.getSouffle(); - // ChatMessage.create({ - // title: "Souffle de Dragon", - // content: this.name + " subit un Souffle de Dragon : " + souffle.name - // }); - // this.actor.createOwnedItem(souffle); + await this.createOwnedItem(souffle); + if (options.chat){ + ChatMessage.create({ + whisper: ChatUtility.getWhisperRecipientsAndGMs( this.name ), + content: this.name + " subit un Souffle de Dragon : " + souffle.name + }); + } + return souffle; } /* -------------------------------------------- */ - async ajouterQueue() { + async ajouterQueue(options = {chat : false}) { // TODO: Déterminer si Thanatos a été utilisé? => laisser le joueur ne pas choisir Thanatos => choisir sa voie? let utiliseThanatos = false; let queue; @@ -724,17 +725,14 @@ export class RdDActor extends Actor { else { queue = await RdDRollTables.getQueue(); } - /* - // TODO: convertir la queue obtenue en nouvel item ... - // ou bien l'ajouter à la liste spécifique => this.data.data.reve.queues - this.createOwnedItem(queue); - - ChatMessage.create({ - content: this.name + " subit un Queue de Dragon : " + queue.name - }); - - return queue.name; - */ + await this.createOwnedItem(queue); + if (options.chat){ + ChatMessage.create({ + whisper: ChatUtility.getWhisperRecipientsAndGMs( this.name ), + content: this.name + " subit une Queue de Dragon : " + queue.name + }); + } + return queue; } /* -------------------------------------------- */ @@ -1313,6 +1311,10 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async rollCompetence( name ) { + if (name == 'queue') { + await this.ajouterQueue({chat: true}); + return; + } let rollData = { competence: duplicate(this.getCompetence(name)), needSignificative : !this.isEntiteCauchemar() && this.data.data.sante.sonne.value diff --git a/module/rdd-rolltables.js b/module/rdd-rolltables.js index 0ab3b7c9..3e2c3ea2 100644 --- a/module/rdd-rolltables.js +++ b/module/rdd-rolltables.js @@ -6,38 +6,46 @@ export class RdDRollTables { const index = await pack.getIndex(); const entry = index.find(e => e.name === tableName); const table = await pack.getEntity(entry._id); - const result = await table.draw({ displayChat: toChat }); - console.log("RdDRollTables", tableName, toChat, ":", result); - return result; + const draw = await table.draw({ displayChat: toChat }); + console.log("RdDRollTables", tableName, toChat, ":", draw); + console.log("RdDRollTables", tableName, toChat, ":", draw.roll, draw.results); + return draw; } + /* -------------------------------------------- */ + static async drawItemFromRollTable(tableName, toChat) { + const draw = await RdDRollTables.genericGetTableResult(tableName, toChat); + const drawnItemRef = draw.results.length > 0 ? draw.results[0] : undefined; + const pack = game.packs.get(drawnItemRef.collection); + return await pack.getEntity(drawnItemRef.resultId); + } /* -------------------------------------------- */ static async getSouffle(toChat = true) { - return RdDRollTables.genericGetTableResult("Souffles de Dragon", toChat); + return await RdDRollTables.drawItemFromRollTable("Souffles de Dragon", toChat); } /* -------------------------------------------- */ static async getQueue(toChat = true) { - return RdDRollTables.genericGetTableResult("Queues de dragon", toChat); + return await RdDRollTables.drawItemFromRollTable("Queues de dragon", toChat); } /* -------------------------------------------- */ static async getTete(toChat = true) { - return RdDRollTables.genericGetTableResult("Têtes de Dragon pour haut-rêvants", toChat); + return await RdDRollTables.drawItemFromRollTable("Têtes de Dragon pour haut-rêvants", toChat); } /* -------------------------------------------- */ static async getTeteHR(toChat = true) { - return RdDRollTables.genericGetTableResult("Têtes de Dragon pour tous personnages", toChat); + return await RdDRollTables.drawItemFromRollTable("Têtes de Dragon pour tous personnages", toChat); } /* -------------------------------------------- */ static async getOmbre(toChat = true) { - return RdDRollTables.genericGetTableResult("Ombre de Thanatos", toChat); + return await RdDRollTables.drawItemFromRollTable("Ombre de Thanatos", toChat); } /* -------------------------------------------- */ static async getTarot(toChat = true) { - return RdDRollTables.genericGetTableResult("Tarot Draconique", toChat); + return await RdDRollTables.drawItemFromRollTable("Tarot Draconique", toChat); } } diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js index 815f4acf..1f9071f8 100644 --- a/module/rdd-tmr-dialog.js +++ b/module/rdd-tmr-dialog.js @@ -342,10 +342,9 @@ export class RdDTMRDialog extends Dialog { + RdDResolutionTable.explain(rolled); if (rolled.isETotal) { - let souffle = await RdDRollTables.getSouffle(); + let souffle = await this.actor.ajouterSouffle({chat: false}); explication += "
Vous avez fait un Echec Total. Vous subissez un Souffle de Dragon : " + souffle.name; msg2MJ += "
Et a reçu un Souffle de Dragon : " + souffle.name; - this.actor.createOwnedItem(souffle); } if (rolled.isPart) { explication += "
Vous avez fait une Réussite Particulière"; diff --git a/module/tmr-utility.js b/module/tmr-utility.js index 1012cdad..41a13ea4 100644 --- a/module/tmr-utility.js +++ b/module/tmr-utility.js @@ -525,18 +525,6 @@ export class TMRUtility { } return { message: message, state: state }; } - - /* -------------------------------------------- */ - static async genericGetTableResult( tableName, toChat) - { - let pack = game.packs.get("foundryvtt-reve-de-dragon.tables-diverses"); - await pack.getIndex(); - let entry = pack.index.find(e => e.name === tableName); - let rollQueues = await pack.getEntity(entry._id); - let result = await rollQueues.draw( { displayChat: toChat } ); - console.log("CAT", result); - return result; - } /* -------------------------------------------- */ static getTMRAleatoire() From 78eeee39c0ce96ba397d64d23f7813b02a7a431b Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Thu, 17 Dec 2020 02:45:43 +0100 Subject: [PATCH 6/6] =?UTF-8?q?Suppression=20des=20quues/souffles/t=C3=AAt?= =?UTF-8?q?es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- templates/actor-sheet.html | 62 +++++++++++++++++++++----------------- 1 file changed, 34 insertions(+), 28 deletions(-) diff --git a/templates/actor-sheet.html b/templates/actor-sheet.html index e868b0e2..6223eaa5 100644 --- a/templates/actor-sheet.html +++ b/templates/actor-sheet.html @@ -470,43 +470,49 @@ {{!-- Queues, Souffles, Tetes, Ombre --}} +

Queues:

    + {{#each data.queues as |queue key|}}
  • -

    Queues:

    - {{#each data.queues as |queue key|}} - {{queue.name}} -
    - -
    - {{/each}} + {{queue.name}} +
    + +
  • + {{/each}} +
+

Souffles:

+
    + {{#each data.souffles as |souffle key|}}
  • -

    Souffles:

    - {{#each data.souffles as |souffle key|}} - {{souffle.name}} -
    - -
    - {{/each}} + {{souffle.name}} +
    + +
  • + {{/each}} +
+

Tetes:

+
    + {{#each data.tetes as |tete key|}}
  • -

    Tetes:

    - {{#each data.tetes as |tete key|}} - {{tete.name}} -
    - -
    - {{/each}} + {{tete.name}} +
    + +
  • + {{/each}} +
+

Ombres de Thanatos:

+
    + {{#each data.ombres as |ombre key|}}
  • -

    Ombres de Thanatos:

    - {{#each data.ombres as |ombre key|}} - {{ombre.name}} -
    - -
    - {{/each}} + {{ombre.name}} +
    + +
  • + {{/each}}