From 2cbd4965172d0a14e104c4924981eb8d255f22b1 Mon Sep 17 00:00:00 2001 From: sladecraven Date: Tue, 24 Nov 2020 17:41:14 +0100 Subject: [PATCH] #20 Gestion des RollModes et gestion initiative plus fine --- module/rdd-main.js | 39 +++++++++++++++--------------- module/rdd-utility.js | 56 +++++++++++++++++++++++++++++++++++-------- system.json | 2 +- 3 files changed, 67 insertions(+), 30 deletions(-) diff --git a/module/rdd-main.js b/module/rdd-main.js index 0db900d7..bbc31000 100644 --- a/module/rdd-main.js +++ b/module/rdd-main.js @@ -27,7 +27,7 @@ import { RdDResolutionTable } from "./rdd-resolution-table.js"; const _patch_initiative = () => { Combat.prototype.rollInitiative = async function ( ids, - formula = null, + formula = undefined, messageOptions = {} ) { console.log( @@ -39,31 +39,32 @@ const _patch_initiative = () => { // Structure input data ids = typeof ids === "string" ? [ids] : ids; const currentId = this.combatant._id; - // calculate initiative for ( let cId = 0; cId < ids.length; cId++) { const c = this.getCombatant( ids[cId] ); //if (!c) return results; - - let armeCombat, rollFormula, competence; - if ( c.actor.data.type == 'creature' || c.actor.data.type == 'entite') { - for (const competenceItem of c.actor.data.items) { - if ( competenceItem.data.iscombat) { - competence = duplicate(competenceItem); + + let rollFormula = formula; // Init per default + if ( !rollFormula ) { + let armeCombat, competence; + if ( c.actor.data.type == 'creature' || c.actor.data.type == 'entite') { + for (const competenceItem of c.actor.data.items) { + if ( competenceItem.data.iscombat) { + competence = duplicate(competenceItem); + } } - } - rollFormula = "1d6+" + competence.data.niveau + "+" + Math.ceil(competence.data.carac_value / 2); - } else { - for (const item of c.actor.data.items) { - if (item.type == "arme" && item.data.equipe) { - armeCombat = duplicate(item); + rollFormula = "1d6+" + competence.data.niveau + "+" + Math.ceil(competence.data.carac_value / 2); + } else { + for (const item of c.actor.data.items) { + if (item.type == "arme" && item.data.equipe) { + armeCombat = duplicate(item); + } } + let compName = ( armeCombat == undefined ) ? "Corps à corps" : armeCombat.data.competence; + competence = RdDUtility.findCompetence( c.actor.data.items, compName ); + rollFormula = "1d6+" + competence.data.niveau + "+" + Math.ceil(c.actor.data.data.carac[competence.data.defaut_carac].value/2); } - let compName = ( armeCombat == undefined ) ? "Corps à corps" : armeCombat.data.competence; - competence = RdDUtility.findCompetence( c.actor.data.items, compName ); - rollFormula = "1d6+" + competence.data.niveau + "+" + Math.ceil(c.actor.data.data.carac[competence.data.defaut_carac].value/2); } - //console.log("Combatat", c); const roll = this._getInitiativeRoll(c, rollFormula); //console.log("Compute init for", armeCombat, competence, rollFormula, roll.total); @@ -82,7 +83,7 @@ const _patch_initiative = () => { alias: c.token.name, sound: CONFIG.sounds.dice, }, - flavor: `${c.token.name} a fait son jet d'Initiative (Compétence ${competence.name})`, + flavor: `${c.token.name} a fait son jet d'Initiative`, }, messageOptions ); diff --git a/module/rdd-utility.js b/module/rdd-utility.js index 81685439..9ddad681 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -668,9 +668,32 @@ export class RdDUtility { /* -------------------------------------------- */ static rollInitiativeCompetence( combatantId, arme ) { const combatant = game.combat.getCombatant(combatantId); + const actor = combatant.actor; + + let initOffset = 0; + let caracForInit = 0; let competence = RdDUtility.findCompetence( combatant.actor.data.items, arme.data.competence); - let rollFormula = "1d6+" + competence.data.niveau + "+" + Math.ceil(combatant.actor.data.data.carac[competence.data.defaut_carac].value/2); - console.log("Roll !", combatantId, arme ); + + if ( actor.data.type == 'creature' || actor.data.type == 'entite') { + caracForInit = competence.data.carac_value; + } else { + if (arme.name == "Draconic") { + initOffset = 200; + competence = { name: "Draconic", data : { niveau: 0 } }; // Fake + } else { + caracForInit = actor.data.data.carac[competence.data.defaut_carac].value; + if (competence.data.categorie == "lancer" ) { // Offset de principe pour les armes de jet + initOffset = 40; + } + if (competence.data.categorie == "tir" ) { // Offset de principe pour les armes de jet + initOffset = 80; + } + } + } + // Cas des créatures et entités vs personnages + let rollFormula = "1d6+" + competence.data.niveau + "+" + Math.ceil(caracForInit/2) + "+" + initOffset; + game.combat.rollInitiative(combatantId, rollFormula ); + console.log("Roll !", competence, arme, rollFormula ); } /* -------------------------------------------- */ @@ -678,11 +701,26 @@ export class RdDUtility { // Recupération du combatant et de l'acteur associé const combatant = game.combat.getCombatant(combatantId); const actor = combatant.actor; - console.log("Combattant : ", combatant); - // Recupération des items 'arme' - let itemsByType = RdDUtility.buildItemsClassification( combatant.actor.data.items ); - let armesList = itemsByType['arme']; - if ( armesList ) { // Do something... + //console.log("Combattant : ", combatant); + + let armesList = []; + if ( actor.data.type == 'creature' || actor.data.type == 'entite') { + for (const competenceItem of actor.data.items) { + if ( competenceItem.data.iscombat) { // Siule un item de type arme + armesList.push( { name: competenceItem.name, data: { niveau: competenceItem.data.niveau, competence: competenceItem.name } } ); + } + } + } else { + // Recupération des items 'arme' + let itemsByType = RdDUtility.buildItemsClassification( combatant.actor.data.items ); + armesList = itemsByType['arme']; + // Force corps à corps et Draconic + let cc = RdDUtility.findCompetence( combatant.actor.data.items, "Corps à corps"); + armesList.push( { name: "Corps à corps", data: { niveau: cc.data.niveau, description: "", force: 6, competence: "Corps à corps", dommages: combatant.actor.data.data.attributs.plusdom.value } } ); + armesList.push( { name: "Draconic", data: { competence: "Draconic" } } ); + } + // Build the relevant submenu + if ( armesList ) { let menuItems = []; for ( let arme of armesList ) { menuItems.push( { @@ -690,7 +728,7 @@ export class RdDUtility { icon: "", callback: target => { RdDUtility.rollInitiativeCompetence( combatantId, arme ) } } ); } - new ContextMenu(html, "", menuItems, undefined, defaultMenuItem ).render(); + new ContextMenu(html, ".directory-list", menuItems ).render(); } } @@ -703,8 +741,6 @@ export class RdDUtility { icon: '', callback: target => { RdDUtility.displayInitiativeMenu( html, target.data('combatant-id') ); - //WFRP_Utility.displayStatus(target.attr("data-token-id")); - //$(`#sidebar-tabs`).find(`.item[data-tab="chat"]`).click(); } }); } diff --git a/system.json b/system.json index ddbcaeda..0ccf74f4 100644 --- a/system.json +++ b/system.json @@ -2,7 +2,7 @@ "name": "foundryvtt-reve-de-dragon", "title": "Rêve de Dragon", "description": "Rêve de Dragon RPG for FoundryVTT", - "version": "0.9.82", + "version": "0.9.83", "minimumCoreVersion": "0.7.5", "compatibleCoreVersion": "0.7.6", "templateVersion": 48,