Merge branch 'v1.4-hautreve' into 'v1.4'

#174: Limiter le draconic aux Haut rêvant

See merge request LeRatierBretonnien/foundryvtt-reve-de-dragon!186
This commit is contained in:
Leratier Bretonnien 2021-04-02 06:44:58 +00:00
commit 8f58e12c05
6 changed files with 80 additions and 53 deletions

View File

@ -95,7 +95,7 @@ export class RdDActorSheet extends ActorSheet {
caracTotal: RdDCarac.computeTotal(formData.data.carac, formData.data.beaute), caracTotal: RdDCarac.computeTotal(formData.data.carac, formData.data.beaute),
// Mise à jour de l'encombrement total et du prix de l'équipement // Mise à jour de l'encombrement total et du prix de l'équipement
encTotal: await this.actor.computeEncombrementTotalEtMalusArmure(), encTotal: await this.actor.computeEncombrementTotalEtMalusArmure(),
prixTotalEquipement: await this.actor.computePrixTotalEquipement(), prixTotalEquipement: this.actor.computePrixTotalEquipement(),
surprise: RdDBonus.find(this.actor.getSurprise(false)).descr, surprise: RdDBonus.find(this.actor.getSurprise(false)).descr,
fatigue: { fatigue: {
malus: RdDUtility.calculMalusFatigue(formData.data.sante.fatigue.value, formData.data.sante.endurance.max), malus: RdDUtility.calculMalusFatigue(formData.data.sante.fatigue.value, formData.data.sante.endurance.max),

View File

@ -89,7 +89,6 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
prepareData() { prepareData() {
super.prepareData(); super.prepareData();
const actorData = this.data; const actorData = this.data;
// Dynamic computing fields // Dynamic computing fields
@ -138,6 +137,7 @@ export class RdDActor extends Actor {
async _prepareCharacterData(actorData) { async _prepareCharacterData(actorData) {
// Initialize empty items // Initialize empty items
RdDCarac.computeCarac(actorData.data); RdDCarac.computeCarac(actorData.data);
this.computeIsHautRevant();
this.computeEncombrementTotalEtMalusArmure(); this.computeEncombrementTotalEtMalusArmure();
this.computePrixTotalEquipement(); this.computePrixTotalEquipement();
this.computeEtatGeneral(); this.computeEtatGeneral();
@ -232,7 +232,7 @@ export class RdDActor extends Actor {
return Math.floor(this.encTotal ?? 0); return Math.floor(this.encTotal ?? 0);
} }
getPrixTotalEquipement() { getPrixTotalEquipement() {
return Math.floor(this.prixTotalEquipement ?? 0); return Math.floor(Misc.templateData(this).prixTotalEquipement ?? 0);
} }
getSurenc() { getSurenc() {
return Misc.toInt(Misc.templateData(this).compteurs.surenc?.value); return Misc.toInt(Misc.templateData(this).compteurs.surenc?.value);
@ -948,57 +948,67 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
detectSurEncombrement() { detectSurEncombrement() {
let maxEnc = 0; return Math.max(0, Math.ceil(Number(this.data.encTotal) - this.getEncombrementMax()));
if (this.data.type == 'vehicule') }
maxEnc = Misc.templateData(this).capacite_encombrement; getEncombrementMax() {
else return (this.data.type == 'vehicule')
maxEnc = Misc.templateData(this).attributs.encombrement.value; ? Misc.templateData(this).capacite_encombrement
let diffEnc = Number(this.data.encTotal) - Number(maxEnc); : Misc.templateData(this).attributs.encombrement.value;
return Math.max(0, Math.ceil(diffEnc)); }
/* -------------------------------------------- */
async computeIsHautRevant() {
const tplData = Misc.templateData(this);
tplData.attributs.hautrevant.value = this.listItemsData('tete').find(it => Grammar.toLowerCaseNoAccent(it.name) == 'don de haut-reve')
? "Haut rêvant"
: "";
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async computeEncombrementTotalEtMalusArmure() { async computeEncombrementTotalEtMalusArmure() {
let encTotal = 0; await this.computeMalusArmure();
let newMalusArmure = 0; return this.computeEncombrement();
for (const itemData of this.filterItemsData(it => it.data.encombrement)) {
if (itemData.type == 'armure' && itemData.data.equipe) { // Armure équipée, intégration du malus armure total
newMalusArmure += itemData.data.malus;
} }
// Calcul encombrement
if (itemData.data && itemData.data.encombrement != undefined) {
if (!Number(itemData.data.encombrement)) itemData.data.encombrement = 0; // Auto-fix
if (itemData.data.quantite == undefined) itemData.data.quantite = 1; // Auto-fix
if (itemData.data.quantite < 0) itemData.data.quantite = 0; // Auto-fix
itemData.data.encTotal = Number(itemData.data.encombrement) * Number(itemData.data.quantite);
encTotal += itemData.data.encTotal;
} else {
itemData.data.encTotal = 0; // Force default enc
}
}
// Mise à jour valeur totale et états
this.data.encTotal = encTotal;
this.detectSurEncombrement();
/* -------------------------------------------- */
computeEncombrement() {
Misc.templateData(this).encTotal = this.filterItemsData(it => it.data.encombrement)
.map(it => this._calcEncItem(it))
.reduce(Misc.sum(), 0);
return Misc.templateData(this).encTotal;
}
_calcEncItem(it) {
it.data.encombrement = Number(it.data.encombrement ?? 0);
it.data.quantite = Math.min(1, Number(it.data.quantite ?? 1));
it.data.encTotal = it.data.encombrement * it.data.quantite;
return it.data.encTotal;
}
/* -------------------------------------------- */
async computeMalusArmure() {
const newMalusArmure = this.filterItemsData(it => it.type == 'armure' && it.data.equipe)
.map(it => it.data.malus ?? 0)
.reduce(Misc.sum(), 0);
// Mise à jour éventuelle du malus armure // Mise à jour éventuelle du malus armure
if (newMalusArmure && Misc.templateData(this).attributs?.malusarmure?.value != newMalusArmure) { if (newMalusArmure && Misc.templateData(this).attributs?.malusarmure?.value != newMalusArmure) {
await this.updateAttributeValue("malusarmure", newMalusArmure); await this.updateAttributeValue("malusarmure", newMalusArmure);
} }
return encTotal; return newMalusArmure;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async computePrixTotalEquipement() { computePrixTotalEquipement() {
let prixTotalEquipement = 0; let prixTotalEquipement = 0;
// prix total de l'équipement est la somme du cout de chaque équipement multiplié par sa quantité. // prix total de l'équipement est la somme du cout de chaque équipement multiplié par sa quantité.
for (const itemData of this.filterItemsData(it => it?.data.cout)) { for (const itemData of this.filterItemsData(it => it?.data.cout)) {
const cout = Math.min(Number(itemData.data.cout) ?? 0, 0); const cout = Math.min(Number(itemData.data.cout ?? 0), 0);
const quantite = Math.min(Number(itemData.data.quantite) ?? 1, 1); const quantite = Math.min(Number(itemData.data?.quantite ?? 1), 1);
prixTotalEquipement += cout * quantite; prixTotalEquipement += cout * quantite;
} }
// Mise à jour valeur totale de l'équipement // Mise à jour valeur totale de l'équipement
this.prixTotalEquipement = prixTotalEquipement; Misc.templateData(this).prixTotalEquipement = prixTotalEquipement;
return prixTotalEquipement; return prixTotalEquipement;
} }

File diff suppressed because one or more lines are too long

View File

@ -6,7 +6,7 @@
"manifestPlusVersion": "1.0.0", "manifestPlusVersion": "1.0.0",
"minimumCoreVersion": "0.7.5", "minimumCoreVersion": "0.7.5",
"compatibleCoreVersion": "0.7.9", "compatibleCoreVersion": "0.7.9",
"templateVersion": 96, "templateVersion": 97,
"author": "LeRatierBretonnien", "author": "LeRatierBretonnien",
"authors": [ "authors": [
{ {

View File

@ -430,6 +430,12 @@
"value": 0, "value": 0,
"label": "Protection naturelle", "label": "Protection naturelle",
"derivee": false "derivee": false
},
"hautrevant": {
"type": "string",
"value": "",
"label": "Haut rêvant",
"derivee": true
} }
}, },
"reve": { "reve": {

View File

@ -1,3 +1,5 @@
{{log 'calc' calc}}
<form class="{{cssClass}}" autocomplete="off"> <form class="{{cssClass}}" autocomplete="off">
{{!-- Sheet Header --}} {{!-- Sheet Header --}}
@ -59,9 +61,11 @@
<span class="gm-only remise-a-neuf"><a title="Remise à neuf"><img class="button-img" src="icons/svg/regen.svg" alt="Remise à neuf"/></a></span> <span class="gm-only remise-a-neuf"><a title="Remise à neuf"><img class="button-img" src="icons/svg/regen.svg" alt="Remise à neuf"/></a></span>
<span id="dormir-une-heure"><a title="Dormir une heure"><img class="button-img" src="icons/svg/sleep.svg" alt="Dormir une heure"/></a></span> <span id="dormir-une-heure"><a title="Dormir une heure"><img class="button-img" src="icons/svg/sleep.svg" alt="Dormir une heure"/></a></span>
<span id="dormir-chateau-dormant"><a title="Chateau Dormant"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/icons/heures/hd12.svg" alt="Chateau Dormant"/></a></span> <span id="dormir-chateau-dormant"><a title="Chateau Dormant"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/icons/heures/hd12.svg" alt="Chateau Dormant"/></a></span>
{{#if (eq data.attributs.hautrevant.value 'Haut rêvant')}}
<span id="monte-tmr"><a title="Montée dans les Terres M&eacute;dianes !"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-normal.svg" alt="Montée dans les Terres M&eacute;dianes !"/></a></span> <span id="monte-tmr"><a title="Montée dans les Terres M&eacute;dianes !"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-normal.svg" alt="Montée dans les Terres M&eacute;dianes !"/></a></span>
<span id="monte-tmr-rapide"><a title="Montée accélérée dans les Terres M&eacute;dianes !"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-rapide.svg" alt="Montée accélérée dans les Terres M&eacute;dianes !"/></a></span> <span id="monte-tmr-rapide"><a title="Montée accélérée dans les Terres M&eacute;dianes !"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-rapide.svg" alt="Montée accélérée dans les Terres M&eacute;dianes !"/></a></span>
<span id="visu-tmr"><a title="Regarder les Terres M&eacute;dianes"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-view.svg" alt="Regarder les Terres M&eacute;dianes"/></a></span> <span id="visu-tmr"><a title="Regarder les Terres M&eacute;dianes"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-view.svg" alt="Regarder les Terres M&eacute;dianes"/></a></span>
{{/if}}
</div> </div>
<div class="flexrow"> <div class="flexrow">
<span class="tooltip">Malus de fatigue : {{calc.fatigue.malus}} <span class="tooltip">Malus de fatigue : {{calc.fatigue.malus}}
@ -295,6 +299,7 @@
{{/each}} {{/each}}
</ul> </ul>
{{#if (eq data.attributs.hautrevant.value 'Haut rêvant')}}
<header class="competence-header flexrow"> <header class="competence-header flexrow">
<span class="competence-title">Draconic</span> <span class="competence-title">Draconic</span>
</header> </header>
@ -303,6 +308,8 @@
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-competence-partial.html" comp}} {{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-competence-partial.html" comp}}
{{/each}} {{/each}}
</ul> </ul>
{{/if}}
<div> <div>
<ul class="item-list"> <ul class="item-list">
<li class="item flexrow"> <li class="item flexrow">
@ -548,6 +555,7 @@
<div> <div>
<h3>Haut rêve:</h3> <h3>Haut rêve:</h3>
<ul class="item-list"> <ul class="item-list">
{{#if (eq data.attributs.hautrevant.value 'Haut rêvant')}}
<li class="item flexrow"> <li class="item flexrow">
<span class="competence-label">Position en TMR :</span> <span class="competence-label">Position en TMR :</span>
<span> <span>
@ -558,6 +566,7 @@
{{/if}} {{/if}}
</span> </span>
</li> </li>
{{/if}}
<li class="item flexrow"> <li class="item flexrow">
<span class="competence-label">Seuil de Rêve :</span> <span class="competence-label">Seuil de Rêve :</span>
<span> <span>
@ -581,6 +590,7 @@
</ul> </ul>
</div> </div>
<hr> <hr>
{{#if (eq data.attributs.hautrevant.value 'Haut rêvant')}}
<div> <div>
<h3>Sorts:</h3> <h3>Sorts:</h3>
<ul class="item-list"> <ul class="item-list">
@ -649,9 +659,10 @@
{{/each}} {{/each}}
</ul> </ul>
</div> </div>
<hr>
{{/if}}
{{!-- Queues, Souffles, Tetes, Ombre --}} {{!-- Queues, Souffles, Tetes, Ombre --}}
<hr>
<h3>Queues:</h3> <h3>Queues:</h3>
<ul class="flex-group-left"> <ul class="flex-group-left">
{{#each queues as |queue key|}} {{#each queues as |queue key|}}