forked from public/foundryvtt-reve-de-dragon
Combat séparé par actions
la classe RdDCombat a pour vocation de gérer les interactions entre attaques, défenses, ... Séparation de: - attaque - parades - esquive - encaisser gestion des résultats de dés par actions - _onAttaqueParticuliere - _onAttaqueNormale - _onAttaqueEchec - _onAttaqueEchecTotal - _onParadeParticuliere - _onParadeNormale - _onParadeEchec - _onParadeEchecTotal - _onEsquiveParticuliere - _onEsquiveNormale - _onEsquiveEchec - _onEsquiveEchecTotal Séparation de demiSurprise et de needSignificative les callbacks des boutons dans le chat sont enregistrés cette classe Par ailleurs: - Fix mortel/non-mortel (coche puis décoche restait non-mortel) - création de classes pour les armes, les compétences - fix du recul (ne pouvait pas marcher)
This commit is contained in:
226
module/actor.js
226
module/actor.js
@ -18,6 +18,8 @@ import { ChatUtility } from "./chat-utility.js";
|
||||
import { RdDItemSort } from "./item-sort.js";
|
||||
import { Grammar } from "./grammar.js";
|
||||
import { RdDCalendrier } from "./rdd-calendrier.js";
|
||||
import { RdDItemArme } from "./item-arme.js";
|
||||
import { RdDCombat } from "./rdd-combat.js";
|
||||
|
||||
export class RdDActor extends Actor {
|
||||
|
||||
@ -105,6 +107,10 @@ export class RdDActor extends Actor {
|
||||
this.computeEtatGeneral();
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
isCreature() {
|
||||
return this.data.type == 'creature' || this.data.type == 'entite';
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
getReveActuel() {
|
||||
return this.data.data.reve.reve.value;
|
||||
@ -114,6 +120,14 @@ export class RdDActor extends Actor {
|
||||
return this.data.data.compteurs.chance.value;
|
||||
}
|
||||
|
||||
getForceValue() {
|
||||
return this.data.data.carac.force ? this.data.data.carac.force.value : this.data.data.carac.reve.value;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
getCompetence(compName) {
|
||||
return RdDUtility.findCompetence(this.data.items, compName);
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
getBestDraconic() {
|
||||
const list = this.getDraconicList().sort((a, b) => b.data.niveau - a.data.niveau);
|
||||
@ -142,6 +156,24 @@ export class RdDActor extends Actor {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async performRoll(rollData, attacker = undefined) {
|
||||
rollData.demiSurprise = this.isDemiSurprise();
|
||||
|
||||
// Manage weapon categories when parrying (cf. page 115 )
|
||||
if (rollData.arme && rollData.attackerRoll) { // Manage parade depending on weapon type, and change roll results
|
||||
let attCategory = RdDItemArme.getCategorieArme(rollData.attackerRoll.arme);
|
||||
let defCategory = RdDItemArme.getCategorieArme(rollData.arme);
|
||||
if (defCategory == "bouclier")
|
||||
rollData.needSignificative = false;
|
||||
else if (attCategory != defCategory)
|
||||
rollData.needSignificative = true;
|
||||
// Do we need to make resistance roll for defender ?
|
||||
if (attCategory.match("epee") && (defCategory == "hache" || defCategory == "lance"))
|
||||
rollData.needResist = true;
|
||||
}
|
||||
if (!this.isEntiteCauchemar() && rollData.particuliereAttaque == "finesse") {
|
||||
rollData.needSignificative = true;
|
||||
}
|
||||
|
||||
// garder le résultat
|
||||
await RdDResolutionTable.rollData(rollData);
|
||||
|
||||
@ -152,11 +184,11 @@ export class RdDActor extends Actor {
|
||||
|
||||
if (rollData.rolled.isPart && rollData.arme && !rollData.attackerRoll) { // Réussite particulière avec attaque -> choix !
|
||||
let message = "<strong>Réussite particulière en attaque</strong>";
|
||||
message = message + "<br><a class='chat-card-button' id='particuliere-attaque' data-mode='force' data-attackerid='" + this.data._id + "'>Attaquer en Force</a>";
|
||||
message = message + "<br><a class='chat-card-button' id='particuliere-attaque' data-mode='force' data-attackerId='" + this.data._id + "'>Attaquer en Force</a>";
|
||||
// Finesse et Rapidité seulement en mêlée et si la difficulté libre est de -1 minimum
|
||||
if (rollData.selectedCarac.label == "Mêlée" && rollData.diffLibre < 0 ) {
|
||||
message = message + "<br><a class='chat-card-button' id='particuliere-attaque' data-mode='rapidite' data-attackerid='"+ this.data._id + "'>Attaquer en Rapidité</a>";
|
||||
message = message + "<br><a class='chat-card-button' id='particuliere-attaque' data-mode='finesse' data-attackerid='"+ this.data._id + "'>Attaquer en Finesse</a>";
|
||||
message = message + "<br><a class='chat-card-button' id='particuliere-attaque' data-mode='rapidite' data-attackerId='"+ this.data._id + "'>Attaquer en Rapidité</a>";
|
||||
message = message + "<br><a class='chat-card-button' id='particuliere-attaque' data-mode='finesse' data-attackerId='"+ this.data._id + "'>Attaquer en Finesse</a>";
|
||||
}
|
||||
ChatMessage.create( {content : message, whisper: ChatMessage.getWhisperRecipients( this.name ) } );
|
||||
} else {
|
||||
@ -201,23 +233,23 @@ export class RdDActor extends Actor {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
computeRecul( rollData, encaisser = undefined ) { // Calcul du recul (p. 132)
|
||||
async computeRecul( rollData, encaisser = undefined ) { // Calcul du recul (p. 132)
|
||||
if ( rollData.arme || encaisser ) {
|
||||
if ( (rollData.attackerRoll.particuliereAttaque && rollData.attackerRoll.particuliereAttaque == 'force') || rollData.attackerRoll.isCharge) {
|
||||
let reculNiveau = this.data.data.taille.value - (rollData.attackerRoll.forceValue+rollData.attackerRoll.arme.dommages);
|
||||
let recul = RdDResolutionTable.roll( 10, reculNiveau );
|
||||
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 msg = "";
|
||||
if (recul.isSuccess) {
|
||||
msg = "Jet de Recul réussit, aucun effet !";
|
||||
msg = "Jet de Recul réussi, aucun effet !";
|
||||
} else {
|
||||
let chute = RdDResolutionTable.roll( this.data.data.carac.agilite.value, reculNiveau );
|
||||
let chute = await RdDResolutionTable.roll( this.data.data.carac.agilite.value, reculNiveau );
|
||||
if ( !chute.isSuccess || recul.isETotal ) {
|
||||
msg = "Jet de Recul : Vous subissez le recul du coup, et vous chutez au sol ! Vous ne pouvez plus attaquer ce round.";
|
||||
} else {
|
||||
msg = "Jet de Recul : Vous subissez le recul du coup, et vous reculez de quelques mètres ! Vous ne pouvez plus attaquer ce round.";
|
||||
}
|
||||
}
|
||||
ChatMessage( {content: msg,
|
||||
ChatMessage.create( {content: msg,
|
||||
user: game.user._id,
|
||||
whisper: [game.user._id, ChatMessage.getWhisperRecipients("GM") ] } );
|
||||
}
|
||||
@ -229,22 +261,6 @@ export class RdDActor extends Actor {
|
||||
let rolled = rollData.rolled;
|
||||
let quality = rolled.quality
|
||||
|
||||
// Manage weapon categories when parrying (cf. page 115 )
|
||||
let need_resist = false; // Do we need to make resistance roll for defender ?
|
||||
if (rollData.arme && rollData.attackerRoll) { // Manage parade depending on weapon type, and change roll results
|
||||
let attCategory = RdDUtility.getArmeCategory(rollData.attackerRoll.arme);
|
||||
let defCategory = RdDUtility.getArmeCategory(rollData.arme);
|
||||
if (defCategory == "bouclier")
|
||||
rollData.needSignificative = false;
|
||||
else if (attCategory != defCategory)
|
||||
rollData.needSignificative = true;
|
||||
if (attCategory.match("epee") && (defCategory == "hache" || defCategory == "lance"))
|
||||
need_resist = true;
|
||||
}
|
||||
if (!this.isEntiteCauchemar() && (this.data.data.sante.sonne.value || rollData.particuliereAttaque == "finesse")) {
|
||||
rollData.needSignificative = true;
|
||||
}
|
||||
|
||||
console.log(">>> ROLL", rollData, rolled);
|
||||
let xpmsg = RdDResolutionTable.buildXpMessage(rolled, rollData.finalLevel);
|
||||
|
||||
@ -267,7 +283,7 @@ export class RdDActor extends Actor {
|
||||
explications += " Significative nécessaire!";
|
||||
}
|
||||
encaisser = rollData.needSignificative ? !rolled.isSign : !rolled.isSuccess;
|
||||
this.computeRecul( rollData, encaisser );
|
||||
await this.computeRecul( rollData, encaisser );
|
||||
} else { // This is the attack roll!
|
||||
if (rolled.isSuccess) {
|
||||
let target = this._getTarget();
|
||||
@ -280,8 +296,8 @@ export class RdDActor extends Actor {
|
||||
ChatMessage.create( { content: "Vous avez attaqué en Rapidité. Ce cas n'est pas géré autmatiquement, donc suivez les directives de votre MJ pour gérer ce cas.",
|
||||
whisper: ChatMessage.getWhisperRecipients( this.name ) } );
|
||||
}
|
||||
rollData.domArmePlusDom = this._calculBonusDommages(rollData.selectedCarac, rollData.arme, rollData.particuliereAttaque == 'force' );
|
||||
rollData.degats = new Roll("2d10").roll().total + rollData.domArmePlusDom + ((rollData.isCharge)?2:0); // Dégats totaux
|
||||
rollData.domArmePlusDom = this._calculBonusDegats(rollData);
|
||||
rollData.degats = new Roll("2d10").roll().total + rollData.domArmePlusDom; // Dégats totaux
|
||||
rollData.loc = RdDUtility.getLocalisation();
|
||||
|
||||
if (target)
|
||||
@ -334,6 +350,25 @@ export class RdDActor extends Actor {
|
||||
}
|
||||
}
|
||||
|
||||
getSurprise() {
|
||||
if (this.isEntiteCauchemar()) {
|
||||
return '';
|
||||
}
|
||||
// TODO: gestion des conditions de demi-surprise
|
||||
if ( this.data.data.sante.sonne.value) {
|
||||
return 'demi';
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
isDemiSurprise() {
|
||||
return this.getSurprise() == 'demi';
|
||||
}
|
||||
|
||||
isSurpriseTotale() {
|
||||
return this.getSurprise() == 'totale';
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static _calculMortaliteEncaissement(rollData, target) {
|
||||
const mortalite = target.actor.isEntiteCauchemar() ? "cauchemar" : (rollData.mortalite ? rollData.mortalite : "mortel");
|
||||
@ -342,20 +377,23 @@ export class RdDActor extends Actor {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
_calculBonusDommages(carac, arme, isForce=false) {
|
||||
if ( arme.name.toLowerCase() == "esquive") return 0; // Specific case management
|
||||
let dmgArme = 0;
|
||||
_calculBonusDegats(rollData) {
|
||||
if ( rollData.arme.name.toLowerCase() == "esquive") return 0; // Specific case management
|
||||
|
||||
const dmgConditions = rollData.isCharge ? 2 : 0;
|
||||
const dmgParticuliere = rollData.particuliereAttaque == 'force' ? 5 : 0;
|
||||
const dmgArme = parseInt(rollData.arme.data.dommages);
|
||||
const dmgPerso = this._calculBonusDegatsActor(rollData.selectedCarac.label, dmgArme);
|
||||
return dmgArme + dmgPerso + dmgConditions + dmgParticuliere;
|
||||
}
|
||||
|
||||
_calculBonusDegatsActor(caracName, dmgArme) {
|
||||
const dmgPerso = parseInt(this.data.data.attributs.plusdom.value);
|
||||
if ( arme.data.dommages ) {
|
||||
dmgArme = parseInt(arme.data.dommages) + (isForce)? 5 : 0;
|
||||
if (carac.label == "Tir") {
|
||||
return dmgArme;
|
||||
}
|
||||
if (carac.label == "Lancer") {
|
||||
return dmgArme + Math.min(dmgArme, dmgPerso);
|
||||
}
|
||||
switch (caracName) {
|
||||
case "Tir": return 0;
|
||||
case "Lancer": return Math.max(0, Math.min(dmgArme, dmgPerso));
|
||||
}
|
||||
return dmgArme + dmgPerso;
|
||||
return dmgPerso;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@ -639,7 +677,7 @@ export class RdDActor extends Actor {
|
||||
/* -------------------------------------------- */
|
||||
async updateCreatureCompetence( compName, fieldName, compValue )
|
||||
{
|
||||
let comp = RdDUtility.findCompetence( this.data.items, compName);
|
||||
let comp = this.getCompetence(compName);
|
||||
console.log( comp );
|
||||
if ( comp ) {
|
||||
const update = {_id: comp._id }
|
||||
@ -657,7 +695,7 @@ export class RdDActor extends Actor {
|
||||
/* -------------------------------------------- */
|
||||
async updateCompetence( compName, compValue )
|
||||
{
|
||||
let comp = RdDUtility.findCompetence( this.data.items, compName);
|
||||
let comp = this.getCompetence(compName);
|
||||
if ( comp ) {
|
||||
let troncList = RdDUtility.isTronc( compName );
|
||||
let maxNiveau = compValue;
|
||||
@ -679,7 +717,7 @@ export class RdDActor extends Actor {
|
||||
/* -------------------------------------------- */
|
||||
async updateCompetenceXP( compName, compValue )
|
||||
{
|
||||
let comp = RdDUtility.findCompetence( this.data.items, compName);
|
||||
let comp = this.getCompetence(compName);
|
||||
if ( comp ) {
|
||||
const update = {_id: comp._id, 'data.xp': compValue };
|
||||
const updated = await this.updateEmbeddedEntity("OwnedItem", update); // Updates one EmbeddedEntity
|
||||
@ -1251,13 +1289,13 @@ export class RdDActor extends Actor {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
_createCallbackExperience() {
|
||||
createCallbackExperience() {
|
||||
return {
|
||||
condition: r => r.rolled.isPart && r.finalLevel < 0 && game.settings.get("core", "rollMode") != 'selfroll',
|
||||
action: r => this._appliquerAjoutExperience(r)
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async _appliquerAjoutExperience(rollData) {
|
||||
this.appliquerExperience( rollData.rolled, rollData.selectedCarac.label, (rollData.competence) ? rollData.competence.data.name: undefined );
|
||||
@ -1296,7 +1334,7 @@ export class RdDActor extends Actor {
|
||||
name: 'lancer-un-sort',
|
||||
label: 'Lancer un sort',
|
||||
callbacks: [
|
||||
this._createCallbackExperience(),
|
||||
this.createCallbackExperience(),
|
||||
{ action: r => this._rollUnSortResult(r, false) }
|
||||
]
|
||||
},
|
||||
@ -1304,7 +1342,7 @@ export class RdDActor extends Actor {
|
||||
name: 'mettre-en-reserve',
|
||||
label: 'Mettre un sort en réserve',
|
||||
callbacks: [
|
||||
this._createCallbackExperience(),
|
||||
this.createCallbackExperience(),
|
||||
{ action: r => this._rollUnSortResult(r, true) }
|
||||
]
|
||||
}
|
||||
@ -1405,7 +1443,7 @@ export class RdDActor extends Actor {
|
||||
name: 'jet-'+caracName,
|
||||
label: 'Jet ' + Grammar.apostrophe('de', rollData.selectedCarac.label),
|
||||
callbacks: [
|
||||
this._createCallbackExperience(),
|
||||
this.createCallbackExperience(),
|
||||
{ action: this._rollCaracResult }
|
||||
]
|
||||
}
|
||||
@ -1434,25 +1472,25 @@ export class RdDActor extends Actor {
|
||||
/* -------------------------------------------- */
|
||||
async rollCompetence( name ) {
|
||||
let rollData = {
|
||||
competence: duplicate(RdDUtility.findCompetence( this.data.items, name)),
|
||||
competence: duplicate(this.getCompetence(name)),
|
||||
needSignificative : !this.isEntiteCauchemar() && this.data.data.sante.sonne.value
|
||||
}
|
||||
|
||||
if (rollData.competence.type == 'competencecreature') {
|
||||
// Fake competence pour créature
|
||||
mergeObject(rollData.competence, { data : { defaut_carac: "carac_creature", categorie: "creature" } });
|
||||
rollData.competence.data = { defaut_carac: "carac_creature", categorie: "creature" };
|
||||
rollData.carac = { carac_creature: { label: competence.name, value: competence.data.carac_value } };
|
||||
}
|
||||
else{
|
||||
rollData.carac = this.data.data.carac;
|
||||
}
|
||||
console.log("rollCompetence !!!", rollData.competence);
|
||||
console.log("rollCompetence !!!", rollData);
|
||||
|
||||
const dialog = await RdDRoll.create(this, rollData, {html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-competence.html'}, {
|
||||
name: 'jet-competence',
|
||||
label: 'Jet ' +Grammar.apostrophe('de', name),
|
||||
callbacks: [
|
||||
this._createCallbackExperience(),
|
||||
this.createCallbackExperience(),
|
||||
{ action: this._competenceResult }
|
||||
]
|
||||
} );
|
||||
@ -1480,7 +1518,7 @@ export class RdDActor extends Actor {
|
||||
name: 'appelChance',
|
||||
label: 'Appel à la chance',
|
||||
callbacks: [
|
||||
this._createCallbackExperience(),
|
||||
this.createCallbackExperience(),
|
||||
{ action: r => this._appelChanceResult(r) }
|
||||
]
|
||||
}
|
||||
@ -1516,21 +1554,24 @@ export class RdDActor extends Actor {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
appliquerExperience( rolled, caracName, competenceName = undefined ) {
|
||||
// TODO gestion derobe/tir/lance/melee
|
||||
if (caracName == 'derobee') caracName = 'agilite';
|
||||
|
||||
// TODO: en cas de désir lancinant, pas d'expérience sur particulière
|
||||
if ( rolled.isPart && rolled.finalLevel < 0) {
|
||||
if ( !compentenceName) {
|
||||
this.actor.data.data.carac[caracName].xp += 1;
|
||||
|
||||
if (caracName == 'derobee') caracName = 'agilite';
|
||||
|
||||
let xp = Math.abs(rolled.finalLevel);
|
||||
let xpCarac = Math.floor(xp / 2); // impair: arrondi inférieur en carac
|
||||
|
||||
if ( !competenceName) {
|
||||
this.actor.data.data.carac[caracName].xp += Math.max(xpCarac, 1);
|
||||
} else {
|
||||
let competence = RdDUtility.findCompetence( this.data.items, competenceName );
|
||||
let xpCarac = Math.floor(Math.abs(rolled.finalLevel) / 2);
|
||||
if ( xpCarac == 0 ) {
|
||||
competence.data.xp += 1; // XP en priorité à la compétencence
|
||||
} else
|
||||
competence.data.xp += Math.ceil(Math.abs(rolled.finalLevel) / 2); // XP majoritaire en compentece (ie cas impair)
|
||||
let xpComp = xp - xpCarac;
|
||||
|
||||
competence.data.xp += xpComp;
|
||||
this.actor.data.data.carac[caracName].xp += xpCarac;
|
||||
}
|
||||
// TODO: save actor?
|
||||
}
|
||||
}
|
||||
|
||||
@ -1630,10 +1671,8 @@ export class RdDActor extends Actor {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async rollCompetenceCreature( compName ) {
|
||||
let competence = RdDUtility.findCompetence( this.data.items, compName);
|
||||
|
||||
let competence = this.getCompetence(compName);
|
||||
if ( competence.type == 'competencecreature' && competence.data.iscombat ) {
|
||||
armeItem = { name: compName, data: { dommages: competence.data.dommages, dommagesReels: competence.data.dommages} };
|
||||
this.rollCompetenceCombat(competence, armeItem);
|
||||
}
|
||||
else {
|
||||
@ -1642,27 +1681,31 @@ export class RdDActor extends Actor {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
rollArme(competenceName, armeName) {
|
||||
rollArme(compName, armeName = undefined) {
|
||||
|
||||
let armeItem = this.data.items.find(item=>item.type==="arme" && (item.name === armeName));
|
||||
if (armeItem && competenceName == undefined) competenceName = armeItem.data.competence;
|
||||
let competence = RdDUtility.findCompetence(this.data.items, competenceName == undefined? armeName : competenceName);
|
||||
|
||||
if (armeItem==undefined && competence.type == 'competencecreature' && competence.data.iscombat ) {
|
||||
armeItem = { name: name, data: { dommages: competence.data.dommages, dommagesReels: competence.data.dommages} };
|
||||
}
|
||||
|
||||
if (armeItem || armeName) {
|
||||
this.rollCompetenceCombat( competenceName, armeItem );
|
||||
if (armeItem && compName == undefined) compName = armeItem.data.competence;
|
||||
let competence = this.getCompetence(compName == undefined? armeName : compName);
|
||||
|
||||
if (armeItem || armeName || (competence.type == 'competencecreature' && competence.data.iscombat)) {
|
||||
this.rollCompetenceCombat( compName, armeItem );
|
||||
} else {
|
||||
this.rollCompetence( competence.name );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async rollCompetenceCombat( name, armeItem=undefined, attackerRoll=undefined, attacker = undefined) {
|
||||
let competence = RdDUtility.findCompetence( this.data.items, name);
|
||||
async rollCompetenceCombat( compName, armeItem=undefined, attackerRoll=undefined, attacker = undefined) {
|
||||
let competence = this.getCompetence(compName);
|
||||
|
||||
if (RdDCombat.isActive()) {
|
||||
const assaut = RdDCombat.createUsingTarget(this);
|
||||
assaut.attaque(competence, armeItem);
|
||||
return;
|
||||
}
|
||||
|
||||
if ( competence.type == 'competencecreature' && competence.data.iscombat ) {
|
||||
armeItem = { name: name, data: { dommages: competence.data.dommages, dommagesReels: competence.data.dommages} };
|
||||
armeItem = { name: compName, data: { dommages: competence.data.dommages, dommagesReels: competence.data.dommages} };
|
||||
}
|
||||
|
||||
console.log("rollCompetenceCombat !!!", competence, armeItem, attackerRoll);
|
||||
@ -1672,7 +1715,7 @@ export class RdDActor extends Actor {
|
||||
difficultesLibres: CONFIG.RDD.difficultesLibres,
|
||||
etat: this.data.data.compteurs.etat.value,
|
||||
diffConditions: 0,
|
||||
forceValue : attackerRoll ? (this.data.data.carac.force ? this.data.data.carac.force.value : this.data.data.carac.reve.value) : 0, // Utilisé pour le jet de recul
|
||||
forceValue : attackerRoll ? this.getForceValue() : 0, // Utilisé pour le jet de recul
|
||||
diffLibre: (attackerRoll) ? attackerRoll.diffLibre : 0,
|
||||
attackerRoll: attackerRoll,
|
||||
finalLevel: 0,
|
||||
@ -1690,7 +1733,7 @@ export class RdDActor extends Actor {
|
||||
rollData.surencMalusFlag = (this.data.data.compteurs.surenc.value < 0);
|
||||
rollData.surencMalusValue = this.data.data.compteurs.surenc.value;
|
||||
rollData.surencMalusApply = false;
|
||||
rollData.isNatation = name.toLowerCase().includes("natation");
|
||||
rollData.isNatation = compName.toLowerCase().includes("natation");
|
||||
rollData.useEncForNatation = false;
|
||||
rollData.encValueForNatation = (this.encombrementTotal) ? Math.round(this.encombrementTotal) : 0;
|
||||
}
|
||||
@ -1700,24 +1743,11 @@ export class RdDActor extends Actor {
|
||||
competence.data.categorie = "creature"; // Fake default competence
|
||||
rollData.competence = competence;
|
||||
rollData.arme = armeItem;
|
||||
rollData.carac = { carac_creature: { label: name, value: competence.data.carac_value } };
|
||||
rollData.carac = { carac_creature: { label: compName, value: competence.data.carac_value } };
|
||||
} else { // Usual competence
|
||||
rollData.competence = competence;
|
||||
if (armeItem ) {
|
||||
armeItem.data.dommagesReels = armeItem.data.dommages; // Per default
|
||||
if ( !armeItem.data.unemain && !armeItem.data.deuxmains) // Force default
|
||||
armeItem.data.unemain = true;
|
||||
if (armeItem.data.unemain && armeItem.data.deuxmains) { // manage 1/2 main
|
||||
//console.log("Weapon", armeItem.data.dommages);
|
||||
if ( armeItem.data.dommages.includes("/") ) { // Sanity check
|
||||
if ( name.toLowerCase().includes("1 main") )
|
||||
armeItem.data.dommagesReels = Number(armeItem.data.dommages.split("/")[0]);
|
||||
else // 2 mains
|
||||
armeItem.data.dommagesReels = Number(armeItem.data.dommages.split("/")[1]);
|
||||
} else {
|
||||
ui.notifications.info("Les dommages de l'arme à 1/2 mains " + name + " ne sont pas corrects (ie sous la forme X/Y)");
|
||||
}
|
||||
}
|
||||
if (armeItem) {
|
||||
armeItem = RdDItemArme.armeUneOuDeuxMains(armeItem, compName.toLowerCase().includes("1 main"));
|
||||
}
|
||||
rollData.arme = armeItem;
|
||||
rollData.carac = this.data.data.carac;
|
||||
|
Reference in New Issue
Block a user