Test/debug combat

This commit is contained in:
sladecraven 2020-07-27 18:58:10 +02:00
parent 77f5fe0a21
commit 0efaac8d68
4 changed files with 46 additions and 31 deletions

View File

@ -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: "<strong>Test : " + rollData.selectedCarac.label + " / " + lvl + "</strong><br>Jet : " +
rollData.selectedCarac.value + " / " + rollData.finalLevelStr + " -> " + rollData.rollTarget.score + "%<br><strong>Résutat : </strong>" + result + "<br>" +
"<strong>" + quality + "</strong>" + specialStr + xpmsg,
user: game.user._id,
title: "Résultat du test"
}
rollData.selectedCarac.value + " / " + rollData.finalLevelStr + " -> " + rollData.rollTarget.score + "%<br><strong>Résutat : </strong>" + result + "<br>" +
"<strong>" + quality + "</strong>" + 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() {

View File

@ -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!<br><span class='chat-card-button-area'>" +
"<a class='chat-card-button' id='encaisser-button' data-attackerid='"+attacker.data._id + "' data-defenderid='" + target.actor.data._id + "'>Encaisser !</a></span>",
whisper: ChatMessage.getWhisperRecipients(target.actor.data.name) };
content: "<strong>"+myTarget.name+"</strong> doit se défendre : <br><span class='chat-card-button-area'>" +
"<a class='chat-card-button' id='encaisser-button' data-attackerid='"+attacker.data._id + "' data-defenderid='" + myTarget.data._id + "'>Encaisser !</a></span>",
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 += "<br><a class='chat-card-button' id='parer-button' data-attackerid='"+attacker.data._id + "' data-defenderid='" + target.actor.data._id + "' data-armeid='"+arme._id+"'>Parer avec " + arme.name + "</a></span>";
defenseMsg.content += "<br><a class='chat-card-button' id='parer-button' data-attackerid='"+attacker.data._id + "' data-defenderid='" + myTarget.data._id + "' data-armeid='"+arme._id+"'>Parer avec " + arme.name + "</a></span>";
}
}
defenseMsg.content += "<br><a class='chat-card-button' id='esquiver-button' data-attackerid='"+attacker.data._id + "' data-defenderid='" + target.actor.data._id + "'>Esquiver</a></span>";
defenseMsg.content += "<br><a class='chat-card-button' id='esquiver-button' data-attackerid='"+attacker.data._id + "' data-defenderid='" + myTarget.data._id + "'>Esquiver</a></span>";
}
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 += "<br><a class='chat-card-button' id='parer-button' data-attackerid='"+attacker.data._id + "' data-defenderid='" + target.actor.data._id + "' data-armeid='"+arme._id+"'>Parer avec " + arme.name + "</a></span>";
defenseMsg.content += "<br><a class='chat-card-button' id='parer-button' data-attackerid='"+attacker.data._id + "' data-defenderid='" + myTarget.data._id + "' data-armeid='"+arme._id+"'>Parer avec " + arme.name + "</a></span>";
}
}
}
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 += "<br><a class='chat-card-button' id='parer-button' data-attackerid='"+attacker.data._id + "' data-defenderid='" + target.actor.data._id + "' data-armeid='"+arme._id+"'>Parer avec " + arme.name + "</a></span>";
defenseMsg.content += "<br><a class='chat-card-button' id='parer-button' data-attackerid='"+attacker.data._id + "' data-defenderid='" + myTarget.data._id + "' data-armeid='"+arme._id+"'>Parer avec " + arme.name + "</a></span>";
}
}
defenseMsg.content += "<br><a class='chat-card-button' id='esquiver-button' data-attackerid='"+attacker.data._id + "' data-defenderid='" + target.actor.data._id + "'>Esquiver</a></span>";
defenseMsg.content += "<br><a class='chat-card-button' id='esquiver-button' data-attackerid='"+attacker.data._id + "' data-defenderid='" + myTarget.data._id + "'>Esquiver</a></span>";
}
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 );
});
}

View File

@ -1,5 +1,5 @@
{"_id":"3wVxF2IRf3c1lOxC","name":"Communication avec les créatures invoquées","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"flags":{},"content":"<p>Seul le haut-r&ecirc;vant invocateur peut communiquer avec sa cr&eacute;ature invoqu&eacute;e (Guerrier Sorde, Kanaillou, etc.) et ne peut le faire qu&rsquo;oralement. Cela sous-entend que le haut-r&ecirc;vant doit &ecirc;tre en mesure de parler.</p>"}
{"name":"Documentation MJ/Joueurs","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"flags":{},"content":"<h1>Pr&eacute;ambule</h1>\n<p>Ce syst&egrave;me pour Foundry est un impl&eacute;mentation de R&ecirc;ve de Dragon, un jeu de Denis Gerfaud, publi&eacute; dans sa troisi&egrave;me &eacute;dition par \"Le Scriptarium\". Tout les droits leur en reviennent naturellement.</p>\n<p>Merci &agrave; Fred et Fab du Discord Foudry Francophone pour le gros travail de saisie des Compendiums !</p>\n<p>Pour me contacter : https://discord.gg/pPSDNJk , Pseudo LeRatierBretonnien</p>\n<h1>Cr&eacute;er un Personnage</h1>\n<p>Tout se fait manuellement &agrave; l'heure actuelle, il convient donc proc&eacute;der comme suit :&nbsp;</p>\n<ul>\n<li>Renseignez les caract&eacute;ristiques dans l'onglet concern&eacute;.</li>\n<li>Renseignez les niveaux de comp&eacute;tences n&eacute;cessaires</li>\n<li>Ouvrez le compendium de l'&eacute;quipement et faites glisser/d&eacute;placer sur l'&eacute;quipement que vous souhaitez</li>\n<li>Si votre personnage est haut-&ecirc;vant, ouvrez le compendium des sorts et faites glisser/d&eacute;placer pour attribuer les sorts.</li>\n</ul>\n<p>Chaque &eacute;l&eacute;ment appara&icirc;t dans son onglet propre.</p>\n<p>Pour r&eacute;aliser un jet, il suffit de cliquer sur le nom d'une caract&eacute;ristique, comp&eacute;tence ou objet. Ce click ouvre la boite de dialogue des jets, qui permet de param&eacute;trer les diff&eacute;rentes options (difficult&eacute;, comp&eacute;tence/carac, etc). Le lancer affiche les r&eacute;sultats dans le tchat, avec le r&eacute;sultat, la qualit&eacute; de la r&eacute;ussite, les points d'exp&eacute;rience &eacute;ventuels et les points de taches.</p>\n<h1>Combat</h1>\n<p>Pour l'instant, l'initiative est &agrave; r&eacute;gler manuellement. Une fois qu'un personnage est cibl&eacute;, l'attaquant clique sur <strong>l'arme </strong>( et pas la comp&eacute;tence) concern&eacute;. La difficult&eacute; libre est alors propos&eacute;e.&nbsp;</p>\n<p>Si l'attaque r&eacute;ussit, le d&eacute;feseur se voit ouvrir un message dans le tchat avec ses actions de r&eacute;ponse possibles, selon ses comp&eacute;tences : Encaisser, Esquiver, Parer, ...</p>\n<p>Un click sur ces actions g&eacute;n&egrave;re le jet de riposte et produit les r&eacute;sultats. Les Blessures et l'&eacute;tat g&eacute;n&eacute;ral est automatiquement mis &agrave; jour.</p>\n<h1>Haut R&ecirc;ve</h1>\n<p>Pour monter dans les Terres M&eacute;dianes, il suffit de cliquer sur le lien \"<strong>Monter dans les Terres M&eacute;dianes!</strong>\".</p>\n<p>La description des sorts est disponible en cliquant sur le sort.</p>\n<p>La fiche des TMR apparait alors, vous permettant de vous d&eacute;placer. Le point de r&ecirc;ve de mont&eacute;e, la fatigue, les rencontres, les cases humides sont automatiquement g&eacute;r&eacute;s. Lorsque vous &ecirc;tes sur la bonne case, il vous suffit de cliquer sur 'Lancer le sort', qui ouvre la boite de dialogue du lancement.<br /><br /></p>\n<h1>Ce qui n'est pas impl&eacute;ment&eacute;/en cours</h1>\n<ul>\n<li>Rendre plus jolie les feuilles de perso</li>\n<li>Mettre un bouton permettant de re-initialiser tout les champs et compteurs (notamment pour cr&eacute;ation de personnage).</li>\n<li>Le Stress et les jets associ&eacute;s</li>\n<li>La mont&eacute; rapide en TMR</li>\n<li>Les points d'XP sur les&nbsp; particuli&egrave;res sont &agrave; v&eacute;rifier</li>\n<li>Des messages pour le MJ sur certaines actions des joueurs, pour le pr&eacute;venir (TMR notamment)</li>\n<li>Ajouter des commandes de tirage et d'aides pour le MJ (commande /table&nbsp; &agrave; compl&eacute;ter)</li>\n</ul>","_id":"7uGrUHGdPu0EmIu2"}
{"name":"Documentation MJ/Joueurs","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"flags":{},"content":"<h1>Pr&eacute;ambule</h1>\n<p>Ce syst&egrave;me pour Foundry est un impl&eacute;mentation de R&ecirc;ve de Dragon, un jeu de Denis Gerfaud, publi&eacute; dans sa troisi&egrave;me &eacute;dition par \"Le Scriptarium\". Tout les droits leur en reviennent naturellement.</p>\n<p>Merci &agrave; Fred et Fab du Discord Foudry Francophone pour le gros travail de saisie des Compendiums !</p>\n<p>Pour me contacter : https://discord.gg/pPSDNJk , Pseudo LeRatierBretonnien</p>\n<h1>Cr&eacute;er un Personnage</h1>\n<p>Tout se fait manuellement &agrave; l'heure actuelle, il convient donc proc&eacute;der comme suit :&nbsp;</p>\n<ul>\n<li>Renseignez les caract&eacute;ristiques dans l'onglet concern&eacute;.</li>\n<li>Renseignez les niveaux de comp&eacute;tences n&eacute;cessaires</li>\n<li>Ouvrez le compendium de l'&eacute;quipement et faites glisser/d&eacute;placer sur l'&eacute;quipement que vous souhaitez</li>\n<li>Si votre personnage est haut-&ecirc;vant, ouvrez le compendium des sorts et faites glisser/d&eacute;placer pour attribuer les sorts.</li>\n</ul>\n<p>Chaque &eacute;l&eacute;ment appara&icirc;t dans son onglet propre.</p>\n<p>Pour r&eacute;aliser un jet, il suffit de cliquer sur le nom d'une caract&eacute;ristique, comp&eacute;tence ou objet. Ce click ouvre la boite de dialogue des jets, qui permet de param&eacute;trer les diff&eacute;rentes options (difficult&eacute;, comp&eacute;tence/carac, etc). Le lancer affiche les r&eacute;sultats dans le tchat, avec le r&eacute;sultat, la qualit&eacute; de la r&eacute;ussite, les points d'exp&eacute;rience &eacute;ventuels et les points de taches.</p>\n<h1>Combat</h1>\n<p>Pour l'instant, l'initiative est &agrave; r&eacute;gler manuellement. Une fois qu'un personnage est cibl&eacute;, l'attaquant clique sur <strong>l'arme </strong>( et pas la comp&eacute;tence) concern&eacute;. La difficult&eacute; libre est alors propos&eacute;e.&nbsp;</p>\n<p>Si l'attaque r&eacute;ussit, le d&eacute;feseur se voit ouvrir un message dans le tchat avec ses actions de r&eacute;ponse possibles, selon ses comp&eacute;tences : Encaisser, Esquiver, Parer, ...</p>\n<p>Un click sur ces actions g&eacute;n&egrave;re le jet de riposte et produit les r&eacute;sultats. Les Blessures et l'&eacute;tat g&eacute;n&eacute;ral est automatiquement mis &agrave; jour.</p>\n<h1>Haut R&ecirc;ve</h1>\n<p>Pour monter dans les Terres M&eacute;dianes, il suffit de cliquer sur le lien \"<strong>Monter dans les Terres M&eacute;dianes!</strong>\".</p>\n<p>La description des sorts est disponible en cliquant sur le sort.</p>\n<p>La fiche des TMR apparait alors, vous permettant de vous d&eacute;placer. Le point de r&ecirc;ve de mont&eacute;e, la fatigue, les rencontres, les cases humides sont automatiquement g&eacute;r&eacute;s. Lorsque vous &ecirc;tes sur la bonne case, il vous suffit de cliquer sur 'Lancer le sort', qui ouvre la boite de dialogue du lancement.<br /><br /></p>\n<h1>Ce qui n'est pas impl&eacute;ment&eacute;/en cours</h1>\n<ul>\n<li>Rendre plus jolie les feuilles de perso</li>\n<li>Mettre un bouton permettant de re-initialiser tout les champs et compteurs (notamment pour cr&eacute;ation de personnage).</li>\n<li>Le Stress et les jets associ&eacute;s</li>\n<li>Les points d'XP sur les&nbsp; particuli&egrave;res sont &agrave; v&eacute;rifier</li>\n<li>Des messages pour le MJ sur certaines actions des joueurs, pour le pr&eacute;venir (TMR notamment)</li>\n<li>Ajouter des commandes de tirage et d'aides pour le MJ (commande /table&nbsp; &agrave; compl&eacute;ter)</li>\n</ul>","_id":"7uGrUHGdPu0EmIu2"}
{"name":"Passeur fou","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"flags":{},"content":"<p>Non ma&icirc;tris&eacute;, le Passeur fou emporte imm&eacute;diatement le demi- r&ecirc;ve du haut-r&ecirc;vant jusqu&rsquo;&agrave; la plus proche case o&ugrave; il a un sort en r&eacute;serve, l&rsquo;obligeant &agrave; le d&eacute;clencher. Peu importe la distance, m&ecirc;me si elle exc&egrave;de les 2d8. &Agrave; distances &eacute;gales, choisir le haut de la carte en priorit&eacute; et tourner dans le sens des aiguilles d&rsquo;une montre. Si aucun sort n&rsquo;est en r&eacute;serve, le Passeur fou emporte le demi-r&ecirc;ve du haut-r&ecirc;vant dans une direction al&eacute;atoire et &agrave; un nombre de cases &eacute;quivalent &agrave; sa force.</p>","_id":"G2WDlZwZaEyH94Au"}
{"_id":"GRKYbbNDIHdzVNaj","name":"Note sur les invocations de créatures","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"flags":{},"content":"<p>Les cr&eacute;atures invoqu&eacute;es ne sont pas des hologrammes sans substance mais des pr&eacute;sences physiques v&eacute;ritables. La plupart d&rsquo;entre elles, comme les guerriers, peuvent &ecirc;tre bless&eacute;es, sonn&eacute;es, tu&eacute;es. &Agrave; l&rsquo;exception du Kanaillou, chaque type de cr&eacute;ature invoqu&eacute;e ne peut accomplir qu&rsquo;un genre de t&acirc;che sp&eacute;cifique. Le ciblage doit &ecirc;tre fait, dans les limites de la port&eacute;e, sur un point du sol libre de tout obstacle, o&ugrave; la cr&eacute;ature puisse se mat&eacute;rialiser. La dur&eacute;e de l&rsquo;invocation d&eacute;pend de la t&acirc;che, mais ne peut exc&eacute;der la fin de l&rsquo;heure de naissance du haut-r&ecirc;vant. &Agrave; ce moment, la cr&eacute;ature se d&eacute;mat&eacute;rialise int&eacute;gralement, ainsi que tout son &eacute;quipement. M&ecirc;me chose si elle est tu&eacute;e. Il est vain de songer &agrave; r&eacute;cup&eacute;rer l&rsquo;armure et les armes d&rsquo;un Guerrier Sorde. Chaque type de cr&eacute;ature est toujours invoqu&eacute; dans une case sp&eacute;cifique et non pas dans n&rsquo;importe quelle case du m&ecirc;me genre. Par ailleurs, ces rituels ob&eacute;issent &agrave; toutes les r&egrave;gles standard d&rsquo;application des rituels.</p>"}
{"name":"Tourbillon rouge","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"flags":{},"content":"<p>Le Tourbillon rouge est un tourbillon vampire. Il fonctionne comme les Tourbillons blancs et noirs, sauf que chaque round tant qu&rsquo;il n&rsquo;est pas ma&icirc;tris&eacute; fait d&eacute;river le demi-r&ecirc;ve de 4 cases, draine 2 points de r&ecirc;ve et 1 point de vie.</p>\n<p>On peut se d&eacute;rober normalement devant ces rencontres ou les refouler. <em>Toutefois, leur refoulement co&ucirc;te 2 points au lieu d&rsquo;un, sauf le Tourbillon rouge qui en co&ucirc;te 3</em>.</p>","_id":"K42KNuBHizMppV5F"}

View File

@ -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"],