forked from public/foundryvtt-reve-de-dragon
		
	fix pertes de vie/ endurance
Lors de la 3eme grave changée en critique, la perte de vie n'était pas bien affichée. Dans le message, on avait: "une blessure grave une blessure critique" La localisation est maintenant donnée à l'encaissement
This commit is contained in:
		
							
								
								
									
										178
									
								
								module/actor.js
									
									
									
									
									
								
							
							
						
						
									
										178
									
								
								module/actor.js
									
									
									
									
									
								
							| @@ -1107,68 +1107,6 @@ export class RdDActor extends Actor { | |||||||
|     await this.update( { 'data.blessures': bList } );     |     await this.update( { 'data.blessures': bList } );     | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */   |  | ||||||
|   manageBlessures( blessuresData )  |  | ||||||
|   { |  | ||||||
|     // Fast exit |  | ||||||
|     if ( this.data.type == 'entite') return; // Une entité n'a pas de blessures |  | ||||||
|     if ( blessuresData.legeres + blessuresData.graves + blessuresData.critiques == 0 ) return; |  | ||||||
|  |  | ||||||
|     let workData = duplicate(blessuresData);     |  | ||||||
|     let blessures = duplicate(this.data.data.blessures); |  | ||||||
|     // Manage blessures |  | ||||||
|     if ( workData.legeres > 0 ) {  |  | ||||||
|       for (let k=0; k<blessures.legeres.liste.length; k++) { |  | ||||||
|         let bless = blessures.legeres.liste[k]; |  | ||||||
|         if ( !bless.active ){ |  | ||||||
|           bless.active = true; |  | ||||||
|           bless.loc = workData.locName; |  | ||||||
|           workData.legeres--; |  | ||||||
|         } |  | ||||||
|         if (workData.legeres == 0) break; |  | ||||||
|       } |  | ||||||
|     }       |  | ||||||
|      |  | ||||||
|     if ( workData.legeres > 0 ) { |  | ||||||
|       workData.graves += 1; |  | ||||||
|       blessuresData.graves += 1; |  | ||||||
|     } |  | ||||||
|        |  | ||||||
|     if ( workData.graves > 0) { |  | ||||||
|       for (let k=0; k<blessures.graves.liste.length; k++) { |  | ||||||
|         let bless = blessures.graves.liste[k]; |  | ||||||
|         if ( !bless.active ) { |  | ||||||
|           bless.active = true; |  | ||||||
|           bless.loc = workData.locName; |  | ||||||
|           workData.graves--; |  | ||||||
|         } |  | ||||||
|         if ( workData.graves == 0) break; |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     workData.from3Graves = false; |  | ||||||
|     if ( workData.graves > 0 ) {  |  | ||||||
|       workData.critiques = 1; |  | ||||||
|       blessuresData.critiques = 1; |  | ||||||
|       workData.from3Graves = true; |  | ||||||
|     } |  | ||||||
|        |  | ||||||
|     if ( workData.critiques > 0 ) { |  | ||||||
|       if ( blessures.critiques.liste[0].active ) { |  | ||||||
|         ChatMessage.create(`<strong>${game.user.name} vient de succomber à une seconde blessure critique ! Que les Dragons gardent son Archétype en paix !</strong>`); |  | ||||||
|       } else { |  | ||||||
|         if ( workData.from3Graves) { // Si la blessure critique provient d'une quatrième grave |  | ||||||
|           this.santeIncDec("endurance", -this.data.data.sante.endurance.value); // Endurance à 0; |  | ||||||
|           this.santeIncDec("vie", -4); // Vie à -4; |  | ||||||
|         } |  | ||||||
|         blessures.critiques.liste[0].active = true; |  | ||||||
|         blessures.critiques.liste[0].loc  = workData.locName; |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|        |  | ||||||
|     this.update( { "data.blessures": blessures } ); |  | ||||||
|   } |  | ||||||
|    |  | ||||||
|   /* -------------------------------------------- */   |   /* -------------------------------------------- */   | ||||||
|   async jetDeMoral(situation) { |   async jetDeMoral(situation) { | ||||||
|     let jetMoral = new Roll("1d20").roll(); |     let jetMoral = new Roll("1d20").roll(); | ||||||
| @@ -2132,28 +2070,24 @@ export class RdDActor extends Actor { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     console.log("encaisserDommages", attackerRoll ) |     console.log("encaisserDommages", attackerRoll ) | ||||||
|     const armure = this.computeArmure( attackerRoll ); |  | ||||||
|  |  | ||||||
|     const rollEncaissement = new Roll("2d10 + @dmg - @armure",{ |     let encaissement = this.jetEncaissement(attackerRoll); | ||||||
|       dmg: attackerRoll.dmg.total, |  | ||||||
|       armure: armure |     this.ajouterBlessure(encaissement); // Will upate the result table | ||||||
|     }).roll(); |  | ||||||
|     RdDDice.show(rollEncaissement); |     await this.santeIncDec("vie", encaissement.vie); | ||||||
|     let result = RdDUtility.computeBlessuresSante(rollEncaissement.total, attackerRoll.dmg.mortalite, attackerRoll.dmg.loc); |     await this.santeIncDec("endurance", encaissement.endurance, (encaissement.critiques > 0)); | ||||||
|     result.endurance = Math.max(result.endurance, -Number(this.data.data.sante.endurance.value)); |  | ||||||
|     await this.santeIncDec("vie", result.vie); |     const blessureLegere = (encaissement.legeres > 0 ? "une blessure légère" : ""); | ||||||
|     await this.santeIncDec("endurance", result.endurance, (result.critiques > 0)); |     const blessureGrave = (encaissement.graves > 0 ? "une blessure grave" : ""); | ||||||
|  |     const blessureCritique = (encaissement.critiques > 0 ? "une blessure critique" : ""); | ||||||
|  |  | ||||||
|     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 = { |     let commonMsg = { | ||||||
|        title: "Blessures !",  |        title: "Blessures !",  | ||||||
|        roll: rollEncaissement , |        roll: encaissement.roll, | ||||||
|        content: this.data.name + " a encaissé " + blessureLegere + blessureGrave + blessureCritique |        content: `${this.data.name} a encaissé ${blessureLegere}${blessureGrave}${blessureCritique} (${encaissement.locName})` | ||||||
|     } |     } | ||||||
|     let addonMsg = "<br>Et a perdu : <br>" + result.endurance + " Endurance et " + result.vie + " Points de Vie"; |     let addonMsg = "<br>Et a perdu : <br>" + encaissement.endurance + " Endurance et " + encaissement.vie + " Points de Vie"; | ||||||
|     if ( this.hasPlayerOwner ) { |     if ( this.hasPlayerOwner ) { | ||||||
|       commonMsg.content += addonMsg; // Message pour tout le monde |       commonMsg.content += addonMsg; // Message pour tout le monde | ||||||
|       ChatMessage.create( commonMsg ); |       ChatMessage.create( commonMsg ); | ||||||
| @@ -2169,6 +2103,92 @@ export class RdDActor extends Actor { | |||||||
|     this.sheet.render(false); |     this.sheet.render(false); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   jetEncaissement(rollData) { | ||||||
|  |  | ||||||
|  |     rollData.dmg.loc = rollData.dmg.loc?? RdDUtility.getLocalisation(); | ||||||
|  |  | ||||||
|  |     const roll = new Roll("2d10 + @dmg - @armure", { | ||||||
|  |       dmg: rollData.dmg.total, | ||||||
|  |       armure: this.computeArmure( rollData ) | ||||||
|  |     }).roll(); | ||||||
|  |     RdDDice.show(roll, game.settings.get("core", "rollMode")); | ||||||
|  |  | ||||||
|  |     let encaissement = RdDUtility.selectEncaissement(roll.total, rollData.dmg.mortalite) | ||||||
|  |     let over20 =  Math.max(roll.total - 20, 0); | ||||||
|  |     encaissement.roll = roll; | ||||||
|  |     encaissement.vie = - RdDUtility._evaluatePerte(encaissement.vie, over20); | ||||||
|  |     encaissement.endurance = - RdDUtility._evaluatePerte(encaissement.endurance, over20); | ||||||
|  |     encaissement.loc = rollData.dmg.loc; | ||||||
|  |     encaissement.locName = rollData.dmg.loc.label ?? "Corps"; | ||||||
|  |     return encaissement; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */   | ||||||
|  |   ajouterBlessure( encaissement )  | ||||||
|  |   { | ||||||
|  |     // Fast exit | ||||||
|  |     if ( this.data.type == 'entite') return; // Une entité n'a pas de blessures | ||||||
|  |     if ( encaissement.legeres + encaissement.graves + encaissement.critiques == 0 ) return; | ||||||
|  |  | ||||||
|  |     const endActuelle = Number(this.data.data.sante.endurance.value); | ||||||
|  |     let blessures = duplicate(this.data.data.blessures); | ||||||
|  |  | ||||||
|  |     let count = encaissement.legeres; | ||||||
|  |     // Manage blessures | ||||||
|  |     while (count > 0) { | ||||||
|  |       let legere = blessures.legeres.liste.find(it => !it.active); | ||||||
|  |       if (legere) { | ||||||
|  |         this._setBlessure(legere, encaissement); | ||||||
|  |         count--; | ||||||
|  |       } | ||||||
|  |       else { | ||||||
|  |         encaissement.graves += count; | ||||||
|  |         encaissement.legeres -= count; | ||||||
|  |         break; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     count = encaissement.graves; | ||||||
|  |     while (count > 0) { | ||||||
|  |       let grave = blessures.graves.liste.find(it => !it.active); | ||||||
|  |       if (grave) { | ||||||
|  |         this._setBlessure(grave, encaissement); | ||||||
|  |         count--; | ||||||
|  |       } | ||||||
|  |       else{ | ||||||
|  |         encaissement.critiques += count; | ||||||
|  |         encaissement.graves -= count; | ||||||
|  |         encaissement.endurance = -endActuelle; | ||||||
|  |         encaissement.vie = -4; | ||||||
|  |         break; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     count = encaissement.critique; | ||||||
|  |     while( count > 0 ) { | ||||||
|  |       let critique = blessures.critiques.liste[0]; | ||||||
|  |       if (!critique.active ) { | ||||||
|  |         this._setBlessure(critique, encaissement); | ||||||
|  |         count--; | ||||||
|  |       } else { | ||||||
|  |         // TODO: status effect dead | ||||||
|  |         ChatMessage.create({ content: `<strong>${this.name} vient de succomber à une seconde blessure critique ! Que les Dragons gardent son Archétype en paix !</strong>`}); | ||||||
|  |         encaissement.critique -= count; | ||||||
|  |         break; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     encaissement.endurance = Math.max(encaissement.endurance, -endActuelle); | ||||||
|  |     this.update( { "data.blessures": blessures } ); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */   | ||||||
|  |   _setBlessure(blessure, encaissement) { | ||||||
|  |     blessure.active = true; | ||||||
|  |     blessure.loc = encaissement.locName; | ||||||
|  |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */   |   /* -------------------------------------------- */   | ||||||
|   /** @override */ |   /** @override */ | ||||||
|   getRollData() { |   getRollData() { | ||||||
|   | |||||||
| @@ -18,7 +18,7 @@ export class RdDBonus { | |||||||
|     return conditionsTactiques.find(e => e.type == condition) || conditionsTactiques.find(e => e.type == 'pret'); |     return conditionsTactiques.find(e => e.type == condition) || conditionsTactiques.find(e => e.type == 'pret'); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|    |  | ||||||
|   static isAjustementAstrologique(rollData) { |   static isAjustementAstrologique(rollData) { | ||||||
|     return RdDCarac.isChance(rollData.selectedCarac) || |     return RdDCarac.isChance(rollData.selectedCarac) || | ||||||
|       rollData.selectedSort?.data.isrituel; |       rollData.selectedSort?.data.isrituel; | ||||||
| @@ -27,10 +27,10 @@ export class RdDBonus { | |||||||
|   static isDefenseAttaqueFinesse(rollData) { |   static isDefenseAttaqueFinesse(rollData) { | ||||||
|     return rollData.attackerRoll?.particuliere == 'finesse'; |     return rollData.attackerRoll?.particuliere == 'finesse'; | ||||||
|   } |   } | ||||||
|    |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static dmg(rollData, dmgActor, isCauchemar = false) { |   static dmg(rollData, dmgActor, isCauchemar = false) { | ||||||
|     let dmg = { total: 0, loc: RdDUtility.getLocalisation() }; |     let dmg = { total: 0 }; | ||||||
|     if (rollData.arme && rollData.arme.name.toLowerCase() == "esquive") { |     if (rollData.arme && rollData.arme.name.toLowerCase() == "esquive") { | ||||||
|       // Specific case management |       // Specific case management | ||||||
|       ui.notifications.warn("Calcul de bonus dégats sur eswquive"); |       ui.notifications.warn("Calcul de bonus dégats sur eswquive"); | ||||||
| @@ -55,26 +55,25 @@ export class RdDBonus { | |||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static dmgBonus(condition) { |   static dmgBonus(condition) { | ||||||
|     return RdDBonus.find(condition).dmg; |     return RdDBonus.find(condition).dmg; | ||||||
|   }   |   } | ||||||
|    |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static bonusAttaque(condition) { |   static bonusAttaque(condition) { | ||||||
|     return RdDBonus.find(condition).attaque; |     return RdDBonus.find(condition).attaque; | ||||||
|   }     |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static _calculMortalite(rollData, isCauchemar) { |   static _calculMortalite(rollData, isCauchemar) { | ||||||
|     if (isCauchemar){ |     if (isCauchemar) { | ||||||
|       return "cauchemar"; |       return "cauchemar"; | ||||||
|     }if (rollData.dmg && rollData.dmg.mortalite) { |  | ||||||
|       return rollData.dmg.mortalite; |  | ||||||
|     } |     } | ||||||
|     if (rollData.arme && rollData.arme.data.mortalite) { |     return isCauchemar | ||||||
|       return rollData.arme.data.mortalite; |       ? "cauchemar" | ||||||
|     } |       : rollData.dmg?.mortalite | ||||||
|     return "mortel"; |       ?? rollData.arme?.data.mortalite | ||||||
|  |       ?? "mortel"; | ||||||
|   } |   } | ||||||
|    |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static _dmgArme(rollData) { |   static _dmgArme(rollData) { | ||||||
|     return parseInt(rollData.arme?.data.dommages ?? 0); |     return parseInt(rollData.arme?.data.dommages ?? 0); | ||||||
| @@ -83,7 +82,7 @@ export class RdDBonus { | |||||||
|   static _peneration(rollData) { |   static _peneration(rollData) { | ||||||
|     return parseInt(rollData.arme?.data.penetration ?? 0); |     return parseInt(rollData.arme?.data.penetration ?? 0); | ||||||
|   } |   } | ||||||
|    |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static _dmgPerso(dmgActor, categorie, dmgArme) { |   static _dmgPerso(dmgActor, categorie, dmgArme) { | ||||||
|     switch (categorie) { |     switch (categorie) { | ||||||
| @@ -92,7 +91,7 @@ export class RdDBonus { | |||||||
|     } |     } | ||||||
|     return dmgActor; |     return dmgActor; | ||||||
|   } |   } | ||||||
|    |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static _dmgParticuliere(rollData) { |   static _dmgParticuliere(rollData) { | ||||||
|     return rollData.particuliere == 'force' ? 5 : 0; |     return rollData.particuliere == 'force' ? 5 : 0; | ||||||
|   | |||||||
| @@ -626,6 +626,7 @@ export class RdDUtility  { | |||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static getLocalisation( )  |   static getLocalisation( )  | ||||||
|   {     |   {     | ||||||
|  |     // TODO: bouger dans une RollTable du compendium et chercher dans les RoolTable puis compendium pour permettre le changement? | ||||||
|     let result = new Roll("1d20").roll().total; |     let result = new Roll("1d20").roll().total; | ||||||
|     let txt = "" |     let txt = "" | ||||||
|     if ( result <= 3 )  txt = "Jambe, genou, pied, jarret"; |     if ( result <= 3 )  txt = "Jambe, genou, pied, jarret"; | ||||||
| @@ -640,16 +641,6 @@ export class RdDUtility  { | |||||||
|     return { result: result, label: txt }; |     return { result: result, label: txt }; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |  | ||||||
|   static computeBlessuresSante( degats, mortalite, loc) { |  | ||||||
|     let encaissement = RdDUtility.selectEncaissement(degats, mortalite) |  | ||||||
|     let over20 =  Math.max(degats - 20, 0); |  | ||||||
|     encaissement.endurance = - RdDUtility._evaluatePerte(encaissement.endurance, over20); |  | ||||||
|     encaissement.vie = - RdDUtility._evaluatePerte(encaissement.vie, over20); |  | ||||||
|     encaissement.locName = loc ? loc.label : "Corps"; |  | ||||||
|     return encaissement; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static selectEncaissement( degats, mortalite ) { |   static selectEncaissement( degats, mortalite ) { | ||||||
|     const table = definitionsEncaissement[mortalite] === undefined ? definitionsEncaissement["mortel"] : definitionsEncaissement[mortalite]; |     const table = definitionsEncaissement[mortalite] === undefined ? definitionsEncaissement["mortel"] : definitionsEncaissement[mortalite]; | ||||||
|   | |||||||
| @@ -24,7 +24,6 @@ | |||||||
|       <span class="rdd-roll-etotal">{{numberFormat dmg.total decimals=0 sign=true}}</span> (entités de cauchemar) |       <span class="rdd-roll-etotal">{{numberFormat dmg.total decimals=0 sign=true}}</span> (entités de cauchemar) | ||||||
|       {{~/if}}. |       {{~/if}}. | ||||||
|       {{#if show.isRecul}}Si votre adversaire n'esquive pas, il devra résister à l'impact ou reculer sous le choc!{{/if}} |       {{#if show.isRecul}}Si votre adversaire n'esquive pas, il devra résister à l'impact ou reculer sous le choc!{{/if}} | ||||||
|       Le coup vise: {{dmg.loc.label}}. |  | ||||||
|     </span> |     </span> | ||||||
|   </div> |   </div> | ||||||
|   {{#if (eq particuliere 'rapidite')}} |   {{#if (eq particuliere 'rapidite')}} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user