Fixes sur calculs enc et prix

Ajout de la classe de base RdDItem qui se charge du calcul pour un Item

Formatage de la zone d'équipement pour avoir de la place pour le Nom

Simplification des calculs de totaux
This commit is contained in:
Vincent Vandemeulebrouck 2021-04-06 23:36:35 +02:00
parent 4792e36922
commit 674582d6e8
8 changed files with 88 additions and 71 deletions

View File

@ -11,6 +11,7 @@ import { RdDBonus } from "./rdd-bonus.js";
import { Misc } from "./misc.js"; import { Misc } from "./misc.js";
import { RdDCombatManager } from "./rdd-combat.js"; import { RdDCombatManager } from "./rdd-combat.js";
import { RdDCarac } from "./rdd-carac.js"; import { RdDCarac } from "./rdd-carac.js";
import { RdDItem } from "./item.js";
/* -------------------------------------------- */ /* -------------------------------------------- */
export class RdDActorSheet extends ActorSheet { export class RdDActorSheet extends ActorSheet {
@ -183,7 +184,7 @@ export class RdDActorSheet extends ActorSheet {
/* -------------------------------------------- */ /* -------------------------------------------- */
async selectObjetType() { async selectObjetType() {
let typeObjets = ["objet", "arme", "armure", "conteneur", "herbe", "ingredient", "livre", "potion", "munition", "monnaie"]; let typeObjets = RdDItem.getTypeObjetsEquipement();
let options = `<span class="competence-label">Selectionnez le type d'équipement</span><select class="item-type">`; let options = `<span class="competence-label">Selectionnez le type d'équipement</span><select class="item-type">`;
for (let typeName of typeObjets) { for (let typeName of typeObjets) {
options += `<option value="${typeName}">${typeName}</option>` options += `<option value="${typeName}">${typeName}</option>`
@ -205,7 +206,7 @@ export class RdDActorSheet extends ActorSheet {
/* -------------------------------------------- */ /* -------------------------------------------- */
async selectTypeOeuvre() { async selectTypeOeuvre() {
let typeOeuvres = ["oeuvre", "recettecuisine", "musique", "chant", "danse", "jeu" ]; let typeOeuvres = RdDItem.getTypesOeuvres();
let options = `<span class="competence-label">Selectionnez le type d'oeuvre</span><select class="item-type">`; let options = `<span class="competence-label">Selectionnez le type d'oeuvre</span><select class="item-type">`;
for (let typeName of typeOeuvres) { for (let typeName of typeOeuvres) {
options += `<option value="${typeName}">${typeName}</option>` options += `<option value="${typeName}">${typeName}</option>`

View File

@ -240,7 +240,7 @@ export class RdDActor extends Actor {
return Math.floor(Misc.templateData(this).prixTotalEquipement ?? 0); return Math.floor(Misc.templateData(this).prixTotalEquipement ?? 0);
} }
getSurenc() { getSurenc() {
return Misc.toInt(Misc.templateData(this).compteurs.surenc?.value); return Misc.templateData(this).compteurs.surenc?.value ?? 0;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
getCompetence(name) { getCompetence(name) {
@ -956,8 +956,9 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
detectSurEncombrement() { detectSurEncombrement() {
return Math.max(0, Math.ceil(Number(this.data.encTotal) - this.getEncombrementMax())); return Math.max(0, Math.ceil(Number(this.encTotal) - this.getEncombrementMax()));
} }
getEncombrementMax() { getEncombrementMax() {
return (this.data.type == 'vehicule') return (this.data.type == 'vehicule')
? Misc.templateData(this).capacite_encombrement ? Misc.templateData(this).capacite_encombrement
@ -980,17 +981,11 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
computeEncombrement() { computeEncombrement() {
Misc.templateData(this).encTotal = this.filterItemsData(it => it.data.encombrement) const tplData = Misc.templateData(this);
.map(it => this._calcEncItem(it)) tplData.encTotal = this.filterItemsData(it => it.data.encombrement != undefined)
.map(it => it.data.encTotal)
.reduce(Misc.sum(), 0); .reduce(Misc.sum(), 0);
return Misc.templateData(this).encTotal; return tplData.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;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -1007,17 +1002,12 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
computePrixTotalEquipement() { computePrixTotalEquipement() {
let prixTotalEquipement = 0; const tplData = Misc.templateData(this);
tplData.prixTotalEquipement = this.filterItemsData(it => it.data.prixTotal)
// prix total de l'équipement est la somme du cout de chaque équipement multiplié par sa quantité. .map(it => it.data.prixTotal ?? 0)
for (const itemData of this.filterItemsData(it => it?.data.cout)) { .reduce(Misc.sum(), 0);
const cout = Math.min(Number(itemData.data.cout ?? 0), 0);
const quantite = Math.min(Number(itemData.data?.quantite ?? 1), 1);
prixTotalEquipement += cout * quantite;
}
// Mise à jour valeur totale de l'équipement // Mise à jour valeur totale de l'équipement
Misc.templateData(this).prixTotalEquipement = prixTotalEquipement; return tplData.prixTotalEquipement;
return prixTotalEquipement;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -1068,7 +1058,7 @@ export class RdDActor extends Actor {
state += Math.min(0, (actorData.data.compteurs.ethylisme?.value ?? 0)); state += Math.min(0, (actorData.data.compteurs.ethylisme?.value ?? 0));
actorData.data.compteurs.etat.value = state; actorData.data.compteurs.etat.value = state;
if (actorData.data.compteurs && actorData.data.compteurs.surenc) { if (actorData.data.compteurs?.surenc) {
actorData.data.compteurs.surenc.value = - this.detectSurEncombrement(); actorData.data.compteurs.surenc.value = - this.detectSurEncombrement();
} }
} }

View File

@ -1,6 +1,6 @@
import { RdDItemSort } from "./item-sort.js"; import { RdDItemSort } from "./item-sort.js";
import { RdDUtility } from "./rdd-utility.js"; import { RdDUtility } from "./rdd-utility.js";
import { RdDItem } from "./item-rdd.js"; import { RdDItem } from "./item.js";
import { RdDAlchimie } from "./rdd-alchimie.js"; import { RdDAlchimie } from "./rdd-alchimie.js";
import { RdDItemCompetence } from "./item-competence.js"; import { RdDItemCompetence } from "./item-competence.js";
import { RdDHerbes } from "./rdd-herbes.js"; import { RdDHerbes } from "./rdd-herbes.js";

View File

@ -1,9 +1,32 @@
import { Misc } from "./misc.js"; import { Misc } from "./misc.js";
import { RdDUtility } from "./rdd-utility.js"; import { RdDUtility } from "./rdd-utility.js";
const typesObjetsEquipement = ["objet", "arme", "armure", "conteneur", "herbe", "ingredient", "livre", "potion", "munition", "nourritureboisson"];
const typesObjetsOeuvres = ["oeuvre", "recettecuisine", "musique", "chant", "danse", "jeu"];
/* -------------------------------------------- */ /* -------------------------------------------- */
export class RdDItem extends Item { export class RdDItem extends Item {
static getTypeObjetsEquipement() {
return typesObjetsEquipement;
}
static getTypesOeuvres() {
return typesObjetsOeuvres;
}
prepareDerivedData() {
super.prepareDerivedData();
const itemData = this.data;
const tplData = itemData.data;
if (RdDItem.getTypeObjetsEquipement().includes(itemData.type)) {
const quantite = itemData.type == 'conteneur' ? 1 : (tplData.quantite ?? 0);
if (tplData.encombrement != undefined) {
tplData.encTotal = Math.max(tplData.encombrement, 0) * quantite;
}
if (tplData.cout != undefined) {
tplData.prixTotal = Math.max(tplData.cout, 0) * quantite;
}
}
}
/* -------------------------------------------- */ /* -------------------------------------------- */
async postItem() { async postItem() {
console.log(this); console.log(this);
@ -17,13 +40,13 @@ export class RdDItem extends Item {
chatData.data.cout_deniers = 0; chatData.data.cout_deniers = 0;
let dialogResult = [-1, -1]; // dialogResult[0] = quantité, dialogResult[1] = prix let dialogResult = [-1, -1]; // dialogResult[0] = quantité, dialogResult[1] = prix
if (chatData.hasPrice ) if (chatData.hasPrice) {
{
let sols = chatData.data.cout; let sols = chatData.data.cout;
chatData.data.cout_deniers = Math.floor(sols * 100); chatData.data.cout_deniers = Math.floor(sols * 100);
dialogResult = await new Promise( (resolve, reject) => {new Dialog({ dialogResult = await new Promise((resolve, reject) => {
content : new Dialog({
`<p>Modifier la quantité?</p> content:
`<p>Modifier la quantité?</p>
<div class="form-group"> <div class="form-group">
<label> Quantité</label> <label> Quantité</label>
<input name="quantity" type="text" value="1"/> <input name="quantity" type="text" value="1"/>
@ -34,43 +57,40 @@ export class RdDItem extends Item {
<input name="price" type="text" value="${chatData.data.cout}"/> <input name="price" type="text" value="${chatData.data.cout}"/>
</div> </div>
`, `,
title : "Quantité & Prix", title: "Quantité & Prix",
buttons : { buttons: {
post : { post: {
label : "Soumettre", label: "Soumettre",
callback: (dlg) => { callback: (dlg) => {
resolve( [ dlg.find('[name="quantity"]').val(), dlg.find('[name="price"]').val() ] ) resolve([dlg.find('[name="quantity"]').val(), dlg.find('[name="price"]').val()])
} }
}, },
} }
}).render(true) }).render(true)
}) })
} }
if (dialogResult[0] > 0) if (dialogResult[0] > 0) {
{ if (this.isOwned) {
if (this.isOwned)
{
if (itemData.data.quantite == 0) if (itemData.data.quantite == 0)
dialogResult[0] = -1 dialogResult[0] = -1
else if (itemData.data.quantite < dialogResult[0]) else if (itemData.data.quantite < dialogResult[0]) {
{
dialogResult[0] = itemData.data.quantite; dialogResult[0] = itemData.data.quantite;
ui.notifications.notify(`Impossible de poster plus que ce que vous avez. La quantité à été réduite à ${dialogResult[0]}.`) ui.notifications.notify(`Impossible de poster plus que ce que vous avez. La quantité à été réduite à ${dialogResult[0]}.`)
this.update({"data.quantite" : 0}) this.update({ "data.quantite": 0 })
} }
else { else {
ui.notifications.notify(`Quantité réduite par ${dialogResult[0]}.`) ui.notifications.notify(`Quantité réduite par ${dialogResult[0]}.`)
this.update({"data.quantite" : itemData.data.quantite - dialogResult[0]}) this.update({ "data.quantite": itemData.data.quantite - dialogResult[0] })
} }
} }
} }
if ( chatData.hasPrice ) { if (chatData.hasPrice) {
if (dialogResult[0] > 0) if (dialogResult[0] > 0)
chatData.postQuantity = Number(dialogResult[0]); chatData.postQuantity = Number(dialogResult[0]);
if (dialogResult[1] > 0) { if (dialogResult[1] > 0) {
chatData.postPrice = dialogResult[1]; chatData.postPrice = dialogResult[1];
chatData.data.cout_deniers = Math.floor(dialogResult[1] * 100); // Mise à jour cout en deniers chatData.data.cout_deniers = Math.floor(dialogResult[1] * 100); // Mise à jour cout en deniers
} }
chatData.finalPrice = Number(chatData.postPrice) * Number(chatData.postQuantity); chatData.finalPrice = Number(chatData.postPrice) * Number(chatData.postQuantity);
@ -81,14 +101,14 @@ export class RdDItem extends Item {
// Don't post any image for the item (which would leave a large gap) if the default image is used // Don't post any image for the item (which would leave a large gap) if the default image is used
if (chatData.img.includes("/blank.png")) if (chatData.img.includes("/blank.png"))
chatData.img = null; chatData.img = null;
// JSON object for easy creation // JSON object for easy creation
chatData.jsondata = JSON.stringify( chatData.jsondata = JSON.stringify(
{ {
compendium : "postedItem", compendium: "postedItem",
payload: itemData, payload: itemData,
}); });
renderTemplate('systems/foundryvtt-reve-de-dragon/templates/post-item.html', chatData).then(html => { renderTemplate('systems/foundryvtt-reve-de-dragon/templates/post-item.html', chatData).then(html => {
let chatOptions = RdDUtility.chatDataSetup(html); let chatOptions = RdDUtility.chatDataSetup(html);
ChatMessage.create(chatOptions) ChatMessage.create(chatOptions)

View File

@ -29,6 +29,7 @@ import { TMRRencontres } from "./tmr-rencontres.js";
import { RdDHotbar } from "./rdd-hotbar-drop.js" import { RdDHotbar } from "./rdd-hotbar-drop.js"
import { EffetsDraconiques } from "./tmr/effets-draconiques.js"; import { EffetsDraconiques } from "./tmr/effets-draconiques.js";
import { RdDHerbes } from "./rdd-herbes.js"; import { RdDHerbes } from "./rdd-herbes.js";
import { RdDItem } from "./item.js";
/* -------------------------------------------- */ /* -------------------------------------------- */
/* Foundry VTT Initialization */ /* Foundry VTT Initialization */
@ -134,6 +135,7 @@ Hooks.once("init", async function () {
/* -------------------------------------------- */ /* -------------------------------------------- */
// Define custom Entity classes // Define custom Entity classes
CONFIG.Actor.documentClass = RdDActor; CONFIG.Actor.documentClass = RdDActor;
CONFIG.Item.documentClass = RdDItem;
CONFIG.RDD = { CONFIG.RDD = {
resolutionTable: RdDResolutionTable.resolutionTable, resolutionTable: RdDResolutionTable.resolutionTable,
carac_array: RdDUtility.getCaracArray(), carac_array: RdDUtility.getCaracArray(),

View File

@ -206,7 +206,9 @@ table {border: 1px solid #7a7971;}
.flex-shrink { .flex-shrink {
flex: 'flex-shrink' ; flex: 'flex-shrink' ;
} }
.flex-grow {
flex-grow : 3;
}
/* Styles limited to foundryvtt-reve-de-dragon sheets */ /* Styles limited to foundryvtt-reve-de-dragon sheets */
.foundryvtt-reve-de-dragon .sheet-header { .foundryvtt-reve-de-dragon .sheet-header {

View File

@ -2,15 +2,17 @@
<img class="sheet-competence-img" src="{{item.img}}" title="{{item.name}}"/> <img class="sheet-competence-img" src="{{item.img}}" title="{{item.name}}"/>
{{#if (eq item.type 'conteneur')}} {{#if (eq item.type 'conteneur')}}
<span class="item-name conteneur-name"><a data-item-id="{{item._id}}">+{{item.name}}</a></span> <span class="item-name conteneur-name flex-grow"><a data-item-id="{{item._id}}">+{{item.name}}</a></span>
{{else}} {{else}}
<span class="item-name">{{item.name}}</span> <span class="item-name flex-grow">{{item.name}}</span>
{{/if}} {{/if}}
<span class="item-quantite">{{item.data.quantite}}</span> <span class="item-quantite">{{item.data.quantite}}</span>
<span class="item-quantite">{{numberFormat item.data.encTotal decimals=2}}</span> <span class="item-quantite">{{numberFormat item.data.encTotal decimals=2}}</span>
<div class="item-controls"> <div class="item-controls flex-grow">
<a class="item-control item-edit" title="Editer"><i class="fas fa-edit"></i></a> <a class="item-control item-edit" title="Editer"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="item-control item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
{{#if (eq item.type 'nourritureboisson')}}
<a class="item-name item-consommer">Consommer</a>
{{/if}}
</div> </div>
</li> </li>

View File

@ -748,23 +748,23 @@
<ul class="item-list alterne-list"> <ul class="item-list alterne-list">
<li class="competence-header flexrow"> <li class="competence-header flexrow">
<img class="sheet-competence-img" src="systems/foundryvtt-reve-de-dragon/icons/objets/sac_a_dos.webp" title="Equipement"/> <img class="sheet-competence-img" src="systems/foundryvtt-reve-de-dragon/icons/objets/sac_a_dos.webp" title="Equipement"/>
<span class="competence-title competence-label">Nom</span> <span class="competence-title flex-grow">Nom</span>
<span class="competence-title competence-label">Q.</span> <span class="competence-title">Q.</span>
<span class="competence-title competence-label">Enc.</span> <span class="competence-title">Enc.</span>
<span class="competence-title competence-label">Equiper/Editer/Suppr.</span> <span class="competence-title flex-grow">Equiper/Editer/Suppr.</span>
</li> </li>
{{#each objets as |item id|}} {{#each objets as |item id|}}
{{#unless item.estContenu}} {{#unless item.estContenu}}
{{#if (ne item.type 'conteneur')}} {{#if (ne item.type 'conteneur')}}
<li class="item flexrow list-item" data-item-id="{{item._id}}"> <li class="item flexrow list-item" data-item-id="{{item._id}}">
<img class="sheet-competence-img" src="{{item.img}}" title="{{item.name}}"/> <img class="sheet-competence-img" src="{{item.img}}" title="{{item.name}}"/>
<span class="item-name">{{item.name}}</span> <span class="item-name flex-grow">{{item.name}}</span>
<span class="item-quantite">{{item.data.quantite}}</span> <span class="item-quantite">{{item.data.quantite}}</span>
<span class="item-quantite">{{numberFormat item.data.encTotal decimals=2}}</span> <span class="item-quantite">{{numberFormat item.data.encTotal decimals=2}}</span>
<span class="item-controls"> <span class="item-controls flex-grow">
<a class="item-control item-equip" title="Equiper">{{#if item.data.equipe}}<i class="fas fa-circle"></i>{{else}}<i class="fas fa-genderless"></i>{{/if}}</a> <a class="item-control item-equip" title="Equiper">{{#if item.data.equipe}}<i class="fas fa-circle"></i>{{else}}<i class="fas fa-genderless"></i>{{/if}}</a>
<a class="item-control item-edit" title="Editer"><i class="fas fa-edit"></i></a> <a class="item-control item-edit" title="Editer"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="item-control item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
</span> </span>
</li> </li>
{{/if}} {{/if}}