diff --git a/module/actor.js b/module/actor.js index e05f934d..84d0ceb2 100644 --- a/module/actor.js +++ b/module/actor.js @@ -205,11 +205,7 @@ export class RdDActor extends Actor { } } } - - // Save it for fight - await this.setFlag( "foundryvtt-reve-de-dragon", "rollData", undefined ); - await this.setFlag( "foundryvtt-reve-de-dragon", "rollData", rollData ); - + // Sort management let lvl = "" if ( rollData.selectedSort) { // Lancement de sort ! @@ -254,16 +250,20 @@ export class RdDActor extends Actor { } else { lvl = (rollData.competence) ? rollData.competence.name : rollData.bmValue; } + + // Save it for fight in the flags area + await this.setFlag( 'world', 'rollData', null ); + await this.setFlag( 'world', 'rollData', rollData ); // Final chat message let chatOptions = { content: "Test : " + rollData.selectedCarac.label + " / " + lvl + "
Jet : " + - rollData.selectedCarac.value + " / " + rollData.finalLevelStr + " -> " + rollData.rollTarget.score + "%
Résutat : " + result + "
" + - "" + quality + "" + specialStr + xpmsg, - user: game.user._id, - title: "Résultat du test" - } + rollData.selectedCarac.value + " / " + rollData.finalLevelStr + " -> " + rollData.rollTarget.score + "%
Résutat : " + result + "
" + + "" + quality + "" + specialStr + xpmsg, + user: game.user._id, + title: "Résultat du test" + } ChatMessage.create( chatOptions ); - + // This an attack, generate the defense message if ( defenseMsg ) { // target hit ! ChatMessage.create( defenseMsg ); @@ -272,7 +272,7 @@ export class RdDActor extends Actor { if ( encaisser ) { this.encaisserDommages( rollData.attackerRoll ); } - } +} /* -------------------------------------------- */ updateCarac( caracName, caracValue ) @@ -701,6 +701,13 @@ export class RdDActor extends Actor { this.rollCompetence( armeItem.data.data.competence, armeItem.data, attackerRoll ); } + /* -------------------------------------------- */ + esquiverAttaque( attackerRoll ) + { + console.log("Going to DODGE !!!!!!!!!", attackerRoll.bmValue); + this.rollCompetence( "esquive", undefined, attackerRoll ); + } + /* -------------------------------------------- */ /** @override */ getRollData() { diff --git a/module/rdd-utility.js b/module/rdd-utility.js index 3499f5d5..f91f222d 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -426,38 +426,38 @@ export class RdDUtility { /* -------------------------------------------- */ static buildDefenseChatCard( attacker, target, rollData ) { - console.log("Target", target); + let myTarget = target.actor; let defenseMsg = { title: "Défense en combat", - content: "Action de défense en combat!
" + - "Encaisser !", - whisper: ChatMessage.getWhisperRecipients(target.actor.data.name) }; + content: ""+myTarget.name+" doit se défendre :
" + + "Encaisser !", + whisper: ChatMessage.getWhisperRecipients( myTarget.name ) }; if ( rollData.competence.data.categorie == "melee" ) { // Melee attack let defenderArmes = []; - for (const arme of target.actor.data.items) { + for (const arme of myTarget.data.items) { if (arme.type == "arme" && this.isArmeMelee(arme.data.competence)) { defenderArmes.push( arme ); - defenseMsg.content += "
Parer avec " + arme.name + ""; + defenseMsg.content += "
Parer avec " + arme.name + ""; } } - defenseMsg.content += "
Esquiver"; + defenseMsg.content += "
Esquiver"; } if ( rollData.competence.data.categorie == "tir" ) { - for (const arme of target.actor.data.items) { // Bouclier for parry + for (const arme of myTarget.data.items) { // Bouclier for parry if ( arme.type == "arme" && arme.name.toLowerCase.match("bouclier") ) { defenderArmes.push( arme ); - defenseMsg.content += "
Parer avec " + arme.name + ""; + defenseMsg.content += "
Parer avec " + arme.name + ""; } } } if ( rollData.competence.data.categorie == "lancer" ) { - for (const arme of target.actor.data.items) { // Bouclier for parry Dodge/Esquive + for (const arme of myTarget.data.items) { // Bouclier for parry Dodge/Esquive if ( arme.type == "arme" && arme.name.toLowerCase.match("bouclier") ) { defenderArmes.push( arme ); - defenseMsg.content += "
Parer avec " + arme.name + ""; + defenseMsg.content += "
Parer avec " + arme.name + ""; } } - defenseMsg.content += "
Esquiver"; + defenseMsg.content += "
Esquiver"; } return defenseMsg; @@ -482,7 +482,7 @@ export class RdDUtility { html.on("click", '#encaisser-button', event => { event.preventDefault(); let attackerActor = game.actors.get( event.currentTarget.attributes['data-attackerid'].value ); - let rollData = attackerActor.getFlag("foundryvtt-reve-de-dragon", "rollData"); + let rollData = attackerActor.getFlag( "world", "rollData" ); rollData.attackerid = event.currentTarget.attributes['data-attackerid'].value; rollData.defenderid = event.currentTarget.attributes['data-defenderid'].value; let defenderActor = game.actors.get( rollData.defenderid ); @@ -495,15 +495,23 @@ export class RdDUtility { data: rollData } ); } - }); + }); html.on("click", '#parer-button', event => { event.preventDefault(); let attackerActor = game.actors.get(event.currentTarget.attributes['data-attackerid'].value ); let defenderActor = game.actors.get(event.currentTarget.attributes['data-defenderid'].value ); let armeId = event.currentTarget.attributes['data-armeid'].value; - let rollData = attackerActor.getFlag("foundryvtt-reve-de-dragon", "rollData"); - defenderActor.parerAttaque( rollData, armeId); + let rollData = attackerActor.getFlag( "world", "rollData" ); + defenderActor.parerAttaque( rollData, armeId ); + }); + + html.on("click", '#esquiver-button', event => { + event.preventDefault(); + let attackerActor = game.actors.get(event.currentTarget.attributes['data-attackerid'].value ); + let defenderActor = game.actors.get(event.currentTarget.attributes['data-defenderid'].value ); + let rollData = attackerActor.getFlag( "world", "rollData" ); + defenderActor.esquiverAttaque( rollData ); }); } diff --git a/packs/rappel-des-regles.db b/packs/rappel-des-regles.db index d5da8361..31ef1c47 100644 --- a/packs/rappel-des-regles.db +++ b/packs/rappel-des-regles.db @@ -1,5 +1,5 @@ {"_id":"3wVxF2IRf3c1lOxC","name":"Communication avec les créatures invoquées","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"flags":{},"content":"

Seul le haut-rêvant invocateur peut communiquer avec sa créature invoquée (Guerrier Sorde, Kanaillou, etc.) et ne peut le faire qu’oralement. Cela sous-entend que le haut-rêvant doit être en mesure de parler.

"} -{"name":"Documentation MJ/Joueurs","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"flags":{},"content":"

Préambule

\n

Ce système pour Foundry est un implémentation de Rêve de Dragon, un jeu de Denis Gerfaud, publié dans sa troisième édition par \"Le Scriptarium\". Tout les droits leur en reviennent naturellement.

\n

Merci à Fred et Fab du Discord Foudry Francophone pour le gros travail de saisie des Compendiums !

\n

Pour me contacter : https://discord.gg/pPSDNJk , Pseudo LeRatierBretonnien

\n

Créer un Personnage

\n

Tout se fait manuellement à l'heure actuelle, il convient donc procéder comme suit : 

\n\n

Chaque élément apparaît dans son onglet propre.

\n

Pour réaliser un jet, il suffit de cliquer sur le nom d'une caractéristique, compétence ou objet. Ce click ouvre la boite de dialogue des jets, qui permet de paramétrer les différentes options (difficulté, compétence/carac, etc). Le lancer affiche les résultats dans le tchat, avec le résultat, la qualité de la réussite, les points d'expérience éventuels et les points de taches.

\n

Combat

\n

Pour l'instant, l'initiative est à régler manuellement. Une fois qu'un personnage est ciblé, l'attaquant clique sur l'arme ( et pas la compétence) concerné. La difficulté libre est alors proposée. 

\n

Si l'attaque réussit, le défeseur se voit ouvrir un message dans le tchat avec ses actions de réponse possibles, selon ses compétences : Encaisser, Esquiver, Parer, ...

\n

Un click sur ces actions génère le jet de riposte et produit les résultats. Les Blessures et l'état général est automatiquement mis à jour.

\n

Haut Rêve

\n

Pour monter dans les Terres Médianes, il suffit de cliquer sur le lien \"Monter dans les Terres Médianes!\".

\n

La description des sorts est disponible en cliquant sur le sort.

\n

La fiche des TMR apparait alors, vous permettant de vous déplacer. Le point de rêve de montée, la fatigue, les rencontres, les cases humides sont automatiquement gérés. Lorsque vous êtes sur la bonne case, il vous suffit de cliquer sur 'Lancer le sort', qui ouvre la boite de dialogue du lancement.

\n

Ce qui n'est pas implémenté/en cours

\n","_id":"7uGrUHGdPu0EmIu2"} +{"name":"Documentation MJ/Joueurs","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"flags":{},"content":"

Préambule

\n

Ce système pour Foundry est un implémentation de Rêve de Dragon, un jeu de Denis Gerfaud, publié dans sa troisième édition par \"Le Scriptarium\". Tout les droits leur en reviennent naturellement.

\n

Merci à Fred et Fab du Discord Foudry Francophone pour le gros travail de saisie des Compendiums !

\n

Pour me contacter : https://discord.gg/pPSDNJk , Pseudo LeRatierBretonnien

\n

Créer un Personnage

\n

Tout se fait manuellement à l'heure actuelle, il convient donc procéder comme suit : 

\n\n

Chaque élément apparaît dans son onglet propre.

\n

Pour réaliser un jet, il suffit de cliquer sur le nom d'une caractéristique, compétence ou objet. Ce click ouvre la boite de dialogue des jets, qui permet de paramétrer les différentes options (difficulté, compétence/carac, etc). Le lancer affiche les résultats dans le tchat, avec le résultat, la qualité de la réussite, les points d'expérience éventuels et les points de taches.

\n

Combat

\n

Pour l'instant, l'initiative est à régler manuellement. Une fois qu'un personnage est ciblé, l'attaquant clique sur l'arme ( et pas la compétence) concerné. La difficulté libre est alors proposée. 

\n

Si l'attaque réussit, le défeseur se voit ouvrir un message dans le tchat avec ses actions de réponse possibles, selon ses compétences : Encaisser, Esquiver, Parer, ...

\n

Un click sur ces actions génère le jet de riposte et produit les résultats. Les Blessures et l'état général est automatiquement mis à jour.

\n

Haut Rêve

\n

Pour monter dans les Terres Médianes, il suffit de cliquer sur le lien \"Monter dans les Terres Médianes!\".

\n

La description des sorts est disponible en cliquant sur le sort.

\n

La fiche des TMR apparait alors, vous permettant de vous déplacer. Le point de rêve de montée, la fatigue, les rencontres, les cases humides sont automatiquement gérés. Lorsque vous êtes sur la bonne case, il vous suffit de cliquer sur 'Lancer le sort', qui ouvre la boite de dialogue du lancement.

\n

Ce qui n'est pas implémenté/en cours

\n","_id":"7uGrUHGdPu0EmIu2"} {"name":"Passeur fou","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"flags":{},"content":"

Non maîtrisé, le Passeur fou emporte immédiatement le demi- rêve du haut-rêvant jusqu’à la plus proche case où il a un sort en réserve, l’obligeant à le déclencher. Peu importe la distance, même si elle excède les 2d8. À distances égales, choisir le haut de la carte en priorité et tourner dans le sens des aiguilles d’une montre. Si aucun sort n’est en réserve, le Passeur fou emporte le demi-rêve du haut-rêvant dans une direction aléatoire et à un nombre de cases équivalent à sa force.

","_id":"G2WDlZwZaEyH94Au"} {"_id":"GRKYbbNDIHdzVNaj","name":"Note sur les invocations de créatures","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"flags":{},"content":"

Les créatures invoquées ne sont pas des hologrammes sans substance mais des présences physiques véritables. La plupart d’entre elles, comme les guerriers, peuvent être blessées, sonnées, tuées. À l’exception du Kanaillou, chaque type de créature invoquée ne peut accomplir qu’un genre de tâche spécifique. Le ciblage doit être fait, dans les limites de la portée, sur un point du sol libre de tout obstacle, où la créature puisse se matérialiser. La durée de l’invocation dépend de la tâche, mais ne peut excéder la fin de l’heure de naissance du haut-rêvant. À ce moment, la créature se dématérialise intégralement, ainsi que tout son équipement. Même chose si elle est tuée. Il est vain de songer à récupérer l’armure et les armes d’un Guerrier Sorde. Chaque type de créature est toujours invoqué dans une case spécifique et non pas dans n’importe quelle case du même genre. Par ailleurs, ces rituels obéissent à toutes les règles standard d’application des rituels.

"} {"name":"Tourbillon rouge","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"flags":{},"content":"

Le Tourbillon rouge est un tourbillon vampire. Il fonctionne comme les Tourbillons blancs et noirs, sauf que chaque round tant qu’il n’est pas maîtrisé fait dériver le demi-rêve de 4 cases, draine 2 points de rêve et 1 point de vie.

\n

On peut se dérober normalement devant ces rencontres ou les refouler. Toutefois, leur refoulement coûte 2 points au lieu d’un, sauf le Tourbillon rouge qui en coûte 3.

","_id":"K42KNuBHizMppV5F"} diff --git a/system.json b/system.json index 73819c14..1d039ba9 100644 --- a/system.json +++ b/system.json @@ -2,10 +2,10 @@ "name": "foundryvtt-reve-de-dragon", "title": "Rêve de Dragon", "description": "L'implémentation de Rêve de Dragon pour FoundryVTT", - "version": "0.8.2", + "version": "0.8.3", "minimumCoreVersion": "0.6.0", "compatibleCoreVersion": "0.6.2", - "templateVersion": 20, + "templateVersion": 23, "author": "LeRatierBretonnien", "esmodules": [ "module/rdd-main.js", "module/hook-renderChatLog.js" ], "styles": ["styles/simple.css"],