forked from public/foundryvtt-reve-de-dragon
Fixes suite aux test de combat
* séparation des bonus dégâts * jet d'encaissement fait par le défenseur * début gestion demi surprise ou surprise * ajout du nom de la personne qui recule * xp sur maîrise du fleuve * xp sur combat "courants" * fix affichage localisation des blessures ("loc") * fix dommages armes une main (ou 2 mains) seulement * fix message attaque échouée * fix esquive
This commit is contained in:
105
module/actor.js
105
module/actor.js
@ -17,7 +17,6 @@ import { RdDRollTables } from "./rdd-rolltables.js";
|
||||
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";
|
||||
|
||||
@ -120,10 +119,16 @@ 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;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
getBonusDegat() {
|
||||
return parseInt(this.data.data.attributs.plusdom.value);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
getCompetence(compName) {
|
||||
return RdDUtility.findCompetence(this.data.items, compName);
|
||||
@ -156,7 +161,7 @@ export class RdDActor extends Actor {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async performRoll(rollData, attacker = undefined) {
|
||||
rollData.demiSurprise = this.isDemiSurprise();
|
||||
rollData.surprise = this.getSurprise();
|
||||
|
||||
// Manage weapon categories when parrying (cf. page 115 )
|
||||
if (rollData.arme && rollData.attackerRoll) { // Manage parade depending on weapon type, and change roll results
|
||||
@ -240,13 +245,13 @@ export class RdDActor extends Actor {
|
||||
let recul = await RdDResolutionTable.roll( 10, reculNiveau );
|
||||
let msg = "";
|
||||
if (recul.isSuccess) {
|
||||
msg = "Jet de Recul réussi, aucun effet !";
|
||||
msg = this.data.name + " - Jet de Recul réussi, aucun effet !";
|
||||
} else {
|
||||
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.";
|
||||
msg = this.data.name + " - 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.";
|
||||
msg = this.data.name + " - Jet de Recul : Vous subissez le recul du coup, et vous reculez de quelques mètres ! Vous ne pouvez plus attaquer ce round.";
|
||||
}
|
||||
}
|
||||
ChatMessage.create( {content: msg,
|
||||
@ -262,7 +267,7 @@ export class RdDActor extends Actor {
|
||||
let quality = rolled.quality
|
||||
|
||||
console.log(">>> ROLL", rollData, rolled);
|
||||
let xpmsg = RdDResolutionTable.buildXpMessage(rolled, rollData.finalLevel);
|
||||
this._appliquerAjoutExperience(rollData)
|
||||
|
||||
let resumeCompetence = (rollData.competence) ? rollData.competence.name : (rollData.diffLibre + rollData.diffConditions);
|
||||
let explications = "<br>Points de taches : " + rolled.ptTache + ", ajustement qualité: " + rolled.ptQualite;
|
||||
@ -296,9 +301,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._calculBonusDegats(rollData);
|
||||
rollData.degats = new Roll("2d10").roll().total + rollData.domArmePlusDom; // Dégats totaux
|
||||
rollData.loc = RdDUtility.getLocalisation();
|
||||
|
||||
rollData.dmg = RdDCombat.calculBonusDegats(rollData, this);
|
||||
|
||||
if (target)
|
||||
{
|
||||
@ -306,7 +310,7 @@ export class RdDActor extends Actor {
|
||||
defenseMsg = RdDUtility.buildDefenseChatCard(this, target, rollData);
|
||||
explications += "<br><strong>Cible</strong> : " + target.actor.data.name;
|
||||
}
|
||||
explications += "<br>Encaissement : " + rollData.degats + "<br>Localisation : " + rollData.loc.label;
|
||||
explications += "<br>Encaissement : " + rollData.degats + "<br>Localisation : " + rollData.dmg.loc.label;
|
||||
} else {
|
||||
explications = "<br>Echec ! Pas de dégâts";
|
||||
}
|
||||
@ -321,8 +325,7 @@ export class RdDActor extends Actor {
|
||||
content: "<strong>Test : " + rollData.selectedCarac.label + " / " + resumeCompetence + "</strong>"
|
||||
+ "<br>Difficultés <strong>libre : " + rollData.diffLibre + "</strong> / conditions : " + Misc.toSignedString(rollData.diffConditions) +" / état : " + rollData.etat
|
||||
+ RdDResolutionTable.explain(rolled)
|
||||
+ "<br><strong>" + quality + "</strong>"
|
||||
+ explications + xpmsg
|
||||
+ explications
|
||||
}
|
||||
|
||||
ChatUtility.chatWithRollMode(chatOptions, this.name)
|
||||
@ -355,7 +358,6 @@ export class RdDActor extends Actor {
|
||||
if (this.isEntiteCauchemar()) {
|
||||
return '';
|
||||
}
|
||||
// TODO: gestion des conditions de demi-surprise
|
||||
if ( this.data.data.sante.sonne.value) {
|
||||
return 'demi';
|
||||
}
|
||||
@ -379,26 +381,6 @@ export class RdDActor extends Actor {
|
||||
return mortalite;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
_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);
|
||||
switch (caracName) {
|
||||
case "Tir": return 0;
|
||||
case "Lancer": return Math.max(0, Math.min(dmgArme, dmgPerso));
|
||||
}
|
||||
return dmgPerso;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async dormirChateauDormant() {
|
||||
let message = {
|
||||
@ -455,7 +437,7 @@ export class RdDActor extends Actor {
|
||||
if (!retrograde) {
|
||||
return false;
|
||||
}
|
||||
mergeObject(retrograde, { "active": true, "premiers_soins": 0, "soins_complets": 0, "jours": 0, "localisation": blessure.localisation });
|
||||
mergeObject(retrograde, { "active": true, "premiers_soins": 0, "soins_complets": 0, "jours": 0, "loc": blessure.loc });
|
||||
}
|
||||
this._supprimerBlessure(blessure);
|
||||
return true;
|
||||
@ -463,7 +445,7 @@ export class RdDActor extends Actor {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
_supprimerBlessure(blessure) {
|
||||
mergeObject(blessure, { "active": false, "premiers_soins": 0, "soins_complets": 0, "jours": 0, "localisation": "" });
|
||||
mergeObject(blessure, { "active": false, "premiers_soins": 0, "soins_complets": 0, "jours": 0, "loc": "" });
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@ -509,18 +491,22 @@ export class RdDActor extends Actor {
|
||||
whisper: ChatUtility.getWhisperRecipientsAndGMs( this.name ),
|
||||
content : "Remise à neuf de " + this.name
|
||||
};
|
||||
const blessures = duplicate(this.data.data.blessures);
|
||||
for (let listeBlessures of [blessures.legeres.liste, blessures.graves.liste, blessures.critiques.liste]) {
|
||||
for (let blessure of listeBlessures) {
|
||||
this._supprimerBlessure(blessure);
|
||||
if (this.data.data.blessures){
|
||||
const blessures = duplicate(this.data.data.blessures);
|
||||
for (let listeBlessures of [blessures.legeres.liste, blessures.graves.liste, blessures.critiques.liste]) {
|
||||
for (let blessure of listeBlessures) {
|
||||
this._supprimerBlessure(blessure);
|
||||
}
|
||||
}
|
||||
await this.update( {"data.blessures": blessures } );
|
||||
}
|
||||
await this.update( {"data.blessures": blessures } );
|
||||
await this.santeIncDec("vie", this.data.data.sante.vie.max - this.data.data.sante.vie.value);
|
||||
await this.santeIncDec("endurance", this.data.data.sante.endurance.max - this.data.data.sante.endurance.value);
|
||||
let fatigue = duplicate(this.data.data.sante.fatigue)
|
||||
fatigue.value = 0;
|
||||
await this.update( {"data.sante.fatigue": fatigue } );
|
||||
if (this.data.data.sante.fatigue){
|
||||
let fatigue = duplicate(this.data.data.sante.fatigue)
|
||||
fatigue.value = 0;
|
||||
await this.update( {"data.sante.fatigue": fatigue } );
|
||||
}
|
||||
ChatMessage.create( message );
|
||||
}
|
||||
|
||||
@ -1121,7 +1107,7 @@ export class RdDActor extends Actor {
|
||||
blessure.premiers_soins = 0;
|
||||
blessure.soins_complets = 0;
|
||||
blessure.jours = 0;
|
||||
blessure.localisation = "";
|
||||
blessure.loc = "";
|
||||
}
|
||||
//console.log("Blessure update", bType, index, blessure, bList );
|
||||
await this.update( { 'data.blessures': bList } );
|
||||
@ -1134,12 +1120,12 @@ export class RdDActor extends Actor {
|
||||
blessure.premiers_soins = psoins;
|
||||
blessure.soins_complets = pcomplets;
|
||||
blessure.jours = jours;
|
||||
blessure.localisation = loc;
|
||||
blessure.loc = loc;
|
||||
await this.update( { 'data.blessures': bList } );
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
manageBlessures( blessuresData )
|
||||
manageBlessures( blessuresData )
|
||||
{
|
||||
// Fast exit
|
||||
if ( this.data.type == 'entite') return; // Une entité n'a pas de blessures
|
||||
@ -1555,6 +1541,9 @@ export class RdDActor extends Actor {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
ajustementAstrologique() {
|
||||
if (this.isCreature()) {
|
||||
return 0;
|
||||
}
|
||||
// selon l'heure de naissance...
|
||||
return game.system.rdd.calendrier.getAjustementAstrologique(this.data.data.heure);
|
||||
}
|
||||
@ -1810,8 +1799,8 @@ export class RdDActor extends Actor {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
computeArmure( locData, domArmePlusDom )
|
||||
{
|
||||
computeArmure( locData, domArmePlusDom, arme = undefined ) {
|
||||
// TODO: arc ignore armure
|
||||
let protection = 0;
|
||||
for (const item of this.data.items) {
|
||||
if (item.type == "armure" && item.data.equipe) {
|
||||
@ -1839,28 +1828,32 @@ export class RdDActor extends Actor {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async encaisserDommages( attackerRoll, attacker = undefined ) {
|
||||
|
||||
if (attacker && !await attacker.accorder(this, 'avant-encaissement')) {
|
||||
return;
|
||||
}
|
||||
|
||||
console.log("encaisserDommages", attackerRoll )
|
||||
const armure = this.computeArmure( attackerRoll.loc, attackerRoll.domArmePlusDom);
|
||||
let degatsReel = attackerRoll.degats - armure;
|
||||
const armure = this.computeArmure( attackerRoll.loc, attackerRoll.domArmePlusDom, attackerRoll.arme);
|
||||
|
||||
let result = RdDUtility.computeBlessuresSante(degatsReel, attackerRoll.mortalite);
|
||||
const rollEncaissement = new Roll("2d10 + @dmg - @armure",{
|
||||
dmg: attackerRoll.dmg.total,
|
||||
armure: armure
|
||||
}).roll();
|
||||
RdDDice.show(rollEncaissement, )
|
||||
let result = RdDUtility.computeBlessuresSante(rollEncaissement.total, attackerRoll.mortalite, attackerRoll.dmg.loc);
|
||||
result.endurance = Math.max(result.endurance, -Number(this.data.data.sante.endurance.value));
|
||||
await this.santeIncDec("vie", result.vie);
|
||||
await this.santeIncDec("endurance", result.endurance, (result.critiques > 0));
|
||||
result.locName = (attackerRoll.loc) ? attackerRoll.loc.label : "Corps";
|
||||
|
||||
this.manageBlessures(result); // Will upate the result table
|
||||
const blessureLegere = (result.legeres > 0 ? "une blessure légère" : "");
|
||||
const blessureGrave = (result.graves > 0 ? "une blessure grave" : "");
|
||||
const blessureCritique = (result.critiques > 0 ? "une blessure critique" : "");
|
||||
let commonMsg = { title: "Blessures !", content: this.data.name + " a encaissé : " +
|
||||
"<br>Encaissement final : " + degatsReel +
|
||||
"<br>" + blessureLegere + blessureGrave + blessureCritique }
|
||||
let commonMsg = {
|
||||
title: "Blessures !",
|
||||
roll: rollEncaissement ,
|
||||
content: this.data.name + " a encaissé " + blessureLegere + blessureGrave + blessureCritique
|
||||
}
|
||||
let addonMsg = "<br>Et a perdu : <br>" + result.endurance + " Endurance et " + result.vie + " Points de Vie";
|
||||
if ( this.hasPlayerOwner ) {
|
||||
commonMsg.content += addonMsg; // Message pour tout le monde
|
||||
|
Reference in New Issue
Block a user