Corrections prix et enc. équipement

Affichage de la valeur si option activée
Utilisation de boutons au lieu des liens
This commit is contained in:
Vincent Vandemeulebrouck 2022-10-04 01:58:49 +02:00
parent efdc676776
commit 22091ef431
6 changed files with 70 additions and 50 deletions

View File

@ -139,7 +139,6 @@ export class RdDActor extends Actor {
// Dynamic computing fields // Dynamic computing fields
this.encTotal = 0; this.encTotal = 0;
this.prixTotalEquipement = 0;
// Make separate methods for each Actor type (character, npc, etc.) to keep // Make separate methods for each Actor type (character, npc, etc.) to keep
// things organized. // things organized.
@ -299,11 +298,6 @@ export class RdDActor extends Actor {
return Math.floor(this.encTotal ?? 0); return Math.floor(this.encTotal ?? 0);
} }
/* -------------------------------------------- */
getPrixTotalEquipement() {
return Math.floor(this.system.prixTotalEquipement ?? 0)
}
/* -------------------------------------------- */ /* -------------------------------------------- */
getCompetence(idOrName, options = {}) { getCompetence(idOrName, options = {}) {
return RdDItemCompetence.findCompetence(this.items, idOrName, options) return RdDItemCompetence.findCompetence(this.items, idOrName, options)
@ -1375,11 +1369,10 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
computePrixTotalEquipement() { computePrixTotalEquipement() {
this.prixTotalEquipement = this.filterItems(it => it.system.prixTotal) const deniers = this.items.filter(it => it.isEquipement())
.map(it => it.system.prixTotal ?? 0) .map(it => it.prixTotalDeniers())
.reduce(Misc.sum(), 0); .reduce(Misc.sum(), 0);
// Mise à jour valeur totale de l'équipement return deniers / 100;
return this.prixTotalEquipement;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */

View File

@ -1,12 +1,27 @@
import { DialogItemVente } from "./dialog-item-vente.js"; import { DialogItemVente } from "./dialog-item-vente.js";
import { Grammar } from "./grammar.js"; import { Grammar } from "./grammar.js";
import { Misc } from "./misc.js";
import { RdDHerbes } from "./rdd-herbes.js"; import { RdDHerbes } from "./rdd-herbes.js";
import { RdDUtility } from "./rdd-utility.js"; import { RdDUtility } from "./rdd-utility.js";
const typesObjetsEquipement = ["objet", "arme", "armure", "gemme", "conteneur", "herbe", "ingredient", "livre", "potion", "munition", "nourritureboisson", "monnaie"] const typesObjetsEquipement = [
"arme",
"armure",
"conteneur",
"gemme",
"herbe",
"ingredient",
"livre",
"monnaie",
"munition",
"nourritureboisson",
"objet",
"potion",
]
const typesObjetsOeuvres = ["oeuvre", "recettecuisine", "musique", "chant", "danse", "jeu"] const typesObjetsOeuvres = ["oeuvre", "recettecuisine", "musique", "chant", "danse", "jeu"]
const encBrin = 0.00005;// un brin = 1 décigramme = 1/10g = 1/10000kg = 1/20000 enc const encBrin = 0.00005; // un brin = 1 décigramme = 1/10g = 1/10000kg = 1/20000 enc
const encPepin = 0.0007; /* un pépin de gemme = 1/10 cm3 = 1/1000 l = 3.5/1000 kg = 7/2000 kg = 7/1000 enc
densité 3.5 (~2.3 à 4, parfois plus) -- https://www.juwelo.fr/guide-des-pierres/faits-et-chiffres/
*/
export const defaultItemImg = { export const defaultItemImg = {
competence: "systems/foundryvtt-reve-de-dragon/icons/competence_defaut.webp", competence: "systems/foundryvtt-reve-de-dragon/icons/competence_defaut.webp",
@ -50,7 +65,7 @@ export class RdDItem extends Item {
super(itemData, context); super(itemData, context);
} }
static getTypeObjetsEquipement() { static getTypesObjetsEquipement() {
return typesObjetsEquipement return typesObjetsEquipement
} }
@ -62,6 +77,9 @@ export class RdDItem extends Item {
return this.type == 'competence'; return this.type == 'competence';
} }
isEquipement() {
return typesObjetsEquipement.includes(this.type)
}
isConteneur() { isConteneur() {
return this.type == 'conteneur'; return this.type == 'conteneur';
} }
@ -87,11 +105,6 @@ export class RdDItem extends Item {
isPotion() { isPotion() {
return this.type == 'potion'; return this.type == 'potion';
} }
isEquipement() {
return RdDItem.getTypeObjetsEquipement().includes(this.type)
}
isCristalAlchimique() { isCristalAlchimique() {
return this.type == 'objet' && Grammar.toLowerCaseNoAccent(this.name) == 'cristal alchimique' && this.system.quantite > 0; return this.type == 'objet' && Grammar.toLowerCaseNoAccent(this.name) == 'cristal alchimique' && this.system.quantite > 0;
} }
@ -100,22 +113,36 @@ export class RdDItem extends Item {
return this.system.magique return this.system.magique
} }
getEncTotal() { getQuantite() {
return Number(this.system.encombrement ?? 0) * Number(this.system.quantite ?? 1) return Math.round(this.isConteneur() ? 1 : (this.system.quantite ?? 0))
} }
getEncTotal() {
return this.getEnc() * this.getQuantite();
}
getEnc() { getEnc() {
switch (this.type) { switch (this.type) {
case 'herbe': case 'herbe':
return encBrin; return encBrin;
case 'gemme':
return encPepin * this.system.taille;
} }
return this.system.encombrement ?? 0; return Math.max(this.system.encombrement ?? 0, 0);
}
prixTotalDeniers() {
return this.getQuantite() * this.valeurDeniers()
}
valeurDeniers() {
return Math.max(Math.round(this.system.cout ? (this.system.cout * 100) : (this.system.valeur_deniers ?? 0)), 0)
} }
prepareDerivedData() { prepareDerivedData() {
super.prepareDerivedData(); super.prepareDerivedData();
if (this.isEquipement()) { if (this.isEquipement()) {
this._calculsEquipement(); this.system.encTotal = this.getEncTotal();
if (this.isPotion()) { if (this.isPotion()) {
this.prepareDataPotion() this.prepareDataPotion()
} }
@ -134,17 +161,6 @@ export class RdDItem extends Item {
} }
} }
_calculsEquipement() {
const quantite = this.isConteneur() ? 1 : (this.system.quantite ?? 0);
const enc = this.getEnc();
if (enc != undefined) {
this.system.encTotal = Math.max(enc, 0) * quantite;
}
if (this.cout != undefined) {
this.system.prixTotal = Math.max(this.cout, 0) * quantite;
}
}
getActionPrincipale(options = { warnIfNot: true }) { getActionPrincipale(options = { warnIfNot: true }) {
const warn = options.warnIfNot; const warn = options.warnIfNot;
switch (this.type) { switch (this.type) {
@ -202,18 +218,18 @@ export class RdDItem extends Item {
if (!other || !this.isEquipement()) return undefined; if (!other || !this.isEquipement()) return undefined;
let message = undefined; let message = undefined;
if (this.type != other.type) { if (this.system.quantite == undefined) {
message = `Impossible de regrouper ${this.type} avec ${other.type}`; message = `Impossible de regrouper des ${this.type}, ils ne sont pas empilables`;
}
else if (this.type != other.type) {
message = `Impossible de regrouper des ${this.type} avec des ${other.type}`;
} }
else if (this.name != other.name) { else if (this.name != other.name) {
message = `Impossible de regrouper ${this.name} avec ${other.name}`; message = `Impossible de regrouper ${this.name} avec ${other.name}`;
} }
else if (this.system.quantite == undefined) {
message = `Impossible de regrouper des ${this.type}, ils ne sont pas empilables`;
}
else { else {
const differences = Object.entries(this.system) const differences = Object.entries(this.system)
.filter(([key, value]) => !['quantite', 'encTotal', 'prixTotal', 'cout'].includes(key) && value != other.system[key]); .filter(([key, value]) => !['quantite', 'cout'].includes(key) && value != other.system[key]);
if (differences.length > 0) { if (differences.length > 0) {
message = `Impossible de regrouper les ${this.type} ${this.name}: `; message = `Impossible de regrouper les ${this.type} ${this.name}: `;
for (const [key, value] of differences) { for (const [key, value] of differences) {

View File

@ -262,6 +262,7 @@ export class RdDUtility {
Handlebars.registerHelper('caseTmr-type', coord => TMRUtility.getTMRType(coord)); Handlebars.registerHelper('caseTmr-type', coord => TMRUtility.getTMRType(coord));
Handlebars.registerHelper('typeTmr-name', coord => TMRUtility.typeTmrName(coord)); Handlebars.registerHelper('typeTmr-name', coord => TMRUtility.typeTmrName(coord));
Handlebars.registerHelper('min', (...args) => Math.min(...args.slice(0, -1))); Handlebars.registerHelper('min', (...args) => Math.min(...args.slice(0, -1)));
Handlebars.registerHelper('regle-optionnelle', (option) => ReglesOptionelles.isUsing(option) );
Handlebars.registerHelper('filtreTriCompetences', competences => competences.filter(it => it.system.isVisible) Handlebars.registerHelper('filtreTriCompetences', competences => competences.filter(it => it.system.isVisible)
.sort((a, b) => { .sort((a, b) => {
@ -307,7 +308,7 @@ export class RdDUtility {
/* -------------------------------------------- */ /* -------------------------------------------- */
static async selectObjetType(actorSheet) { static async selectObjetType(actorSheet) {
let typeObjets = RdDItem.getTypeObjetsEquipement(); let typeObjets = RdDItem.getTypesObjetsEquipement();
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>`

View File

@ -12,10 +12,11 @@ const listeReglesOptionelles = [
{ name: 'degat-minimum-malus-libre', group: 'Règles de combat', descr: "Le malus libre d'attaque remplace une valeur de dés d'encaissement si elle est plus petite. Exemple : la difficulté libre de l'attaquant est de -4. Sur le jet d'encaissement, tout résultat inférieur à 4 devient 4.", default: false }, { name: 'degat-minimum-malus-libre', group: 'Règles de combat', descr: "Le malus libre d'attaque remplace une valeur de dés d'encaissement si elle est plus petite. Exemple : la difficulté libre de l'attaquant est de -4. Sur le jet d'encaissement, tout résultat inférieur à 4 devient 4.", default: false },
{ name: 'degat-ajout-malus-libre', group: 'Règles de combat', descr: "Le malus libre d'attaque s'ajoute au jet d'encaissement et aux autres bonus. Exemple : la difficulté libre de l'attaquant est de -4. Le jet d'encaissement est effectué à 2d10+4, plus les bonus de situation et d'armes.", default: false }, { name: 'degat-ajout-malus-libre', group: 'Règles de combat', descr: "Le malus libre d'attaque s'ajoute au jet d'encaissement et aux autres bonus. Exemple : la difficulté libre de l'attaquant est de -4. Le jet d'encaissement est effectué à 2d10+4, plus les bonus de situation et d'armes.", default: false },
{ name: 'astrologie', group: 'Règles générales', descr: "Appliquer les ajustements astrologiques aux jets de chance et aux rituels", default: true }, { name: 'astrologie', group: 'Règles générales', descr: "Appliquer les ajustements astrologiques aux jets de chance et aux rituels", default: true },
{ name: 'afficher-prix-joueurs', group: 'Règles générales', descr: "Afficher le prix de l'équipement des joueurs", default: true }, { name: 'afficher-prix-joueurs', group: 'Règles générales', descr: "Afficher le prix de l'équipement des joueurs", default: true, uniquementJoueur: true},
{ name: 'appliquer-fatigue', group: 'Règles générales', descr: "Appliquer les règles de fatigue", default: true }, { name: 'appliquer-fatigue', group: 'Règles générales', descr: "Appliquer les règles de fatigue", default: true },
{ name: 'afficher-colonnes-reussite', group: 'Règles générales', descr: "Afficher le nombre de colonnes de réussite ou d'échec", default: false }, { name: 'afficher-colonnes-reussite', group: 'Règles générales', descr: "Afficher le nombre de colonnes de réussite ou d'échec", default: false },
]; ];
const uniquementJoueur = listeReglesOptionelles.filter(it => it.uniquementJoueur).map(it=>it.name);
export class ReglesOptionelles extends FormApplication { export class ReglesOptionelles extends FormApplication {
static init() { static init() {
@ -71,6 +72,9 @@ export class ReglesOptionelles extends FormApplication {
} }
static isUsing(name) { static isUsing(name) {
if (game.user.isGM && uniquementJoueur.includes(name)) {
return true;
}
return game.settings.get(SYSTEM_RDD, ReglesOptionelles._getIdRegle(name)); return game.settings.get(SYSTEM_RDD, ReglesOptionelles._getIdRegle(name));
} }

View File

@ -1,11 +1,17 @@
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/inventaire-monnaie.html" monnaie=monnaie}} {{> "systems/foundryvtt-reve-de-dragon/templates/actor/inventaire-monnaie.html" monnaie=monnaie}}
<span class="item-name"><h4>Equipement</h4></span> <h4>Equipement</h4>
<span class="item-name">Encombrement total/max : {{numberFormat calc.encTotal decimals=2}} / {{system.attributs.encombrement.value}} <b>{{calc.surEncombrementMessage}}</b></span> - <span class="item-name">
<span class="item-name"><a class="creer-un-objet">Créer un objet</a></span> Encombrement: {{numberFormat calc.encTotal decimals=2}} (max: {{system.attributs.encombrement.value}}){{#if calc.surEncombrementMessage}}<b>{{calc.surEncombrementMessage}}</b>{{/if}}
{{#if options.isGM}} {{#if (regle-optionnelle 'afficher-prix-joueurs')}}
<span class="item-name"> - <a id="nettoyer-conteneurs">Vider tout les conteneurs</a></span> &hyphen; Valeur: {{numberFormat calc.prixTotalEquipement decimals=2}} Sols
{{/if}} {{/if}}
&hyphen;
<a class="chat-card-button creer-un-objet">Nouvel objet</a>
{{#if options.isGM}}
<a class="chat-card-button nettoyer-conteneurs">Tout vider</a>
{{/if}}
</span>
<ul class="item-list alterne-list"> <ul class="item-list alterne-list">
<li class="competence-header flexrow"> <li class="competence-header flexrow">
<span class="equipement-nom">Nom</span> <span class="equipement-nom">Nom</span>

View File

@ -1,4 +1,4 @@
<h3>Tâches</h3><a class='creer-tache'>Créer une nouvelle Tâche</a> <h3>Tâches</h3><a class="chat-card-button creer-tache">Nouvelle Tâche</a>
<ul class="item-list alterne-list"> <ul class="item-list alterne-list">
{{#each taches as |tache id|}} {{#each taches as |tache id|}}
<li class="item flexrow list-item" data-item-id="{{tache._id}}"> <li class="item flexrow list-item" data-item-id="{{tache._id}}">