foundryvtt-reve-de-dragon/module/item.js

926 lines
32 KiB
JavaScript
Raw Normal View History

import { DialogItemVente } from "./achat-vente/dialog-item-vente.js";
2021-04-12 00:16:23 +02:00
import { Grammar } from "./grammar.js";
import { Misc } from "./misc.js";
import { RdDHerbes } from "./rdd-herbes.js";
import { RdDTimestamp } from "./time/rdd-timestamp.js";
2021-01-01 21:11:56 +01:00
import { RdDUtility } from "./rdd-utility.js";
2022-12-23 00:22:13 +01:00
import { SystemCompendiums } from "./settings/system-compendiums.js";
import { RdDRaretes } from "./item/raretes.js";
import { CATEGORIES_COMPETENCES } from "./item-competence.js";
import { CATEGORIES_COMPETENCES_CREATURES } from "./item-competencecreature.js";
2021-01-01 21:11:56 +01:00
export const ACTOR_TYPES = {
personnage: 'personnage',
creature: 'creature',
entite: 'entite',
commerce: 'commerce',
vehicule: 'vehicule'
}
export const ITEM_TYPES = {
competence: 'competence',
competencecreature: 'competencecreature',
empoignade: 'empoignade',
possession: 'possession',
blessure: 'blessure',
maladie: 'maladie',
poison: 'poison',
arme: 'arme',
armure: 'armure',
conteneur: 'conteneur',
objet: 'objet',
monnaie: 'monnaie',
gemme: 'gemme',
munition: 'munition',
nourritureboisson: 'nourritureboisson',
herbe: 'herbe',
plante: 'plante',
ingredient: 'ingredient',
faune: 'faune',
livre: 'livre',
potion: 'potion',
service: 'service',
musique: 'musique',
danse: 'danse',
chant: 'chant',
jeu: 'jeu',
recettecuisine: 'recettecuisine',
oeuvre: 'oeuvre',
recettealchimique: 'recettealchimique',
tache: 'tache',
sort: 'sort',
sortreserve: 'sortreserve',
rencontre: 'rencontre',
queue: 'queue',
ombre: 'ombre',
souffle: 'souffle',
tete: 'tete',
casetmr: 'casetmr',
meditation: 'meditation',
signedraconique: 'signedraconique',
tarot: 'tarot',
nombreastral: 'nombreastral',
extraitpoetique: 'extraitpoetique',
}
const typesInventaireMateriel = [
ITEM_TYPES.arme,
ITEM_TYPES.armure,
ITEM_TYPES.conteneur,
ITEM_TYPES.faune,
ITEM_TYPES.gemme,
ITEM_TYPES.herbe,
ITEM_TYPES.plante,
ITEM_TYPES.ingredient,
ITEM_TYPES.livre,
ITEM_TYPES.monnaie,
ITEM_TYPES.munition,
ITEM_TYPES.nourritureboisson,
ITEM_TYPES.objet,
ITEM_TYPES.potion,
]
const typesInventaire = {
materiel: typesInventaireMateriel,
all: ['service'].concat(typesInventaireMateriel),
}
const typesObjetsOeuvres = [ITEM_TYPES.oeuvre, ITEM_TYPES.recettecuisine, ITEM_TYPES.musique, ITEM_TYPES.chant, ITEM_TYPES.danse, ITEM_TYPES.jeu]
const typesObjetsDraconiques = [ITEM_TYPES.queue, ITEM_TYPES.ombre, ITEM_TYPES.souffle, ITEM_TYPES.tete, ITEM_TYPES.signedraconique, ITEM_TYPES.sortreserve, ITEM_TYPES.rencontre]
const typesObjetsConnaissance = [ITEM_TYPES.meditation, ITEM_TYPES.recettealchimique, ITEM_TYPES.sort]
const typesObjetsEffet = [ITEM_TYPES.possession, ITEM_TYPES.poison, ITEM_TYPES.maladie, ITEM_TYPES.blessure]
const typesObjetsCompetence = [ITEM_TYPES.competence, ITEM_TYPES.competencecreature]
const typesObjetsTemporels = [ITEM_TYPES.blessure, ITEM_TYPES.poison, ITEM_TYPES.maladie, ITEM_TYPES.queue, ITEM_TYPES.ombre, ITEM_TYPES.souffle, ITEM_TYPES.signedraconique, ITEM_TYPES.rencontre]
const typesObjetsEquipable = [ITEM_TYPES.arme, ITEM_TYPES.armure, ITEM_TYPES.objet];
2023-01-18 00:11:10 +01:00
const typesEnvironnement = typesInventaireMateriel;
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/
*/
2021-04-13 22:42:39 +02:00
export const defaultItemImg = {
competence: "systems/foundryvtt-reve-de-dragon/icons/competence_defaut.webp",
competencecreature: "systems/foundryvtt-reve-de-dragon/icons/competence_defaut.webp",
arme: "systems/foundryvtt-reve-de-dragon/icons/armes_armures/epee_gnome.webp",
armure: "systems/foundryvtt-reve-de-dragon/icons/armes_armures/armure_plaques.webp",
conteneur: "systems/foundryvtt-reve-de-dragon/icons/objets/sac_a_dos.webp",
sort: "systems/foundryvtt-reve-de-dragon/icons/competence_oniros.webp",
2021-11-10 20:03:04 +01:00
herbe: "systems/foundryvtt-reve-de-dragon/icons/botanique/Endorlotte.webp",
faune: "systems/foundryvtt-reve-de-dragon/icons/faune/rongeur.webp",
ingredient: "systems/foundryvtt-reve-de-dragon/icons/objets/sable_poudre.webp",
livre: "systems/foundryvtt-reve-de-dragon/icons/objets/livre.webp",
potion: "systems/foundryvtt-reve-de-dragon/icons/objets/liqueur_de_bagdol.webp",
rencontre: "systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp",
queue: "systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp",
ombre: "systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp",
souffle: "systems/foundryvtt-reve-de-dragon/icons/souffle_dragon.webp",
tete: "systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp",
meditation: "systems/foundryvtt-reve-de-dragon/icons/meditations_ecrits/meditation_alchimie.webp",
recettealchimique: "systems/foundryvtt-reve-de-dragon/icons/competence_alchimie.webp",
chant: "systems/foundryvtt-reve-de-dragon/icons/arts/chant_0.webp",
danse: "systems/foundryvtt-reve-de-dragon/icons/arts/danse_0.webp",
jeu: "systems/foundryvtt-reve-de-dragon/icons/arts/jeux_petasse.webp",
recettecuisine: "systems/foundryvtt-reve-de-dragon/icons/arts/recette_cuisine_1.webp",
musique: "systems/foundryvtt-reve-de-dragon/icons/arts/chant_0.webp",
maladie: "systems/foundryvtt-reve-de-dragon/icons/maladies_venins/maladie.webp",
poison: "systems/foundryvtt-reve-de-dragon/icons/maladies_venins/venin.webp",
oeuvre: "systems/foundryvtt-reve-de-dragon/icons/competence_comedie.webp",
nourritureboisson: "systems/foundryvtt-reve-de-dragon/icons/objets/provision_crue.webp",
2023-01-01 22:21:30 +01:00
service: "systems/foundryvtt-reve-de-dragon/icons/services/lit.webp",
signedraconique: "systems/foundryvtt-reve-de-dragon/icons/tmr/signe_draconique.webp",
2022-06-12 08:17:59 +02:00
gemme: "systems/foundryvtt-reve-de-dragon/icons/gemmes/almaze.webp",
2022-09-17 16:07:38 +02:00
possession: "systems/foundryvtt-reve-de-dragon/icons/entites/possession2.webp",
sortreserve: "systems/foundryvtt-reve-de-dragon/icons/competence_oniros.webp",
extraitpoetique: "systems/foundryvtt-reve-de-dragon/icons/competence_ecriture.webp",
tarot: "systems/foundryvtt-reve-de-dragon/icons/tarots/dos-tarot.webp",
2023-04-21 18:18:20 +02:00
empoignade: "systems/foundryvtt-reve-de-dragon/icons/competence_corps_a_corps.webp"
}
2021-01-01 21:11:56 +01:00
/* -------------------------------------------- */
export class RdDItem extends Item {
static get defaultIcon() {
return undefined;
}
static getDefaultImg(itemType) {
2022-12-23 00:22:13 +01:00
return game.system.rdd.itemClasses[itemType]?.defaultIcon ?? defaultItemImg[itemType];
}
static isFieldInventaireModifiable(type, field) {
switch (field) {
case 'quantite':
if ([ITEM_TYPES.conteneur].includes(type)) {
return false;
}
break;
case 'cout':
if ([ITEM_TYPES.monnaie].includes(type)) {
return game.user.isGM;
}
break;
}
return true;
}
2022-12-23 00:22:13 +01:00
static async getCorrespondingItem(itemRef) {
if (itemRef.pack) {
return await SystemCompendiums.loadDocument(itemRef)
}
return game.items.get(itemRef.id ?? itemRef._id);
}
static getItemTypesInventaire(mode = 'materiel') {
return typesInventaire[mode ?? 'materiel']
2022-12-23 00:22:13 +01:00
}
2023-01-13 04:54:29 +01:00
static getItemTypesDraconiques() {
return typesObjetsDraconiques;
}
2023-01-13 04:54:29 +01:00
static getItemTypesEnvironnement() {
return typesEnvironnement;
}
2022-12-23 00:22:13 +01:00
static getTypesOeuvres() {
return typesObjetsOeuvres
}
static getCategories(itemType) {
switch (itemType) {
case ITEM_TYPES.competence:
return CATEGORIES_COMPETENCES
case ITEM_TYPES.competencecreature:
return CATEGORIES_COMPETENCES_CREATURES
}
return {}
}
2022-12-23 00:22:13 +01:00
constructor(docData, context = {}) {
if (!context.rdd?.ready) {
2024-05-26 22:16:42 +02:00
foundry.utils.mergeObject(context, { rdd: { ready: true } });
2022-12-23 00:22:13 +01:00
const ItemConstructor = game.system.rdd.itemClasses[docData.type];
if (ItemConstructor) {
if (!docData.img) {
docData.img = ItemConstructor.defaultIcon;
}
return new ItemConstructor(docData, context);
}
}
if (!docData.img) {
docData.img = RdDItem.getDefaultImg(docData.type);
}
context.rdd = undefined
2022-12-23 00:22:13 +01:00
super(docData, context);
}
getUniteQuantite() {
switch (this.type) {
case ITEM_TYPES.monnaie: return "(Pièces)"
case ITEM_TYPES.herbe:
switch (this.system.categorie) {
case 'Alchimie': case 'Repos': case 'Soin':
return "(Brins)"
case 'Cuisine': return '';
}
return '';
case ITEM_TYPES.ingredient: return "(Pépins ou Brins)"
}
return '';
}
isEquipable() {
return typesObjetsEquipable.includes(this.type)
}
isCompetencePersonnage() { return this.type == ITEM_TYPES.competence }
isCompetenceCreature() { return this.type == ITEM_TYPES.competencecreature }
isConteneur() { return this.type == ITEM_TYPES.conteneur; }
isMonnaie() { return this.type == ITEM_TYPES.monnaie; }
isPotion() { return this.type == ITEM_TYPES.potion; }
isNourritureBoisson() { return this.type == ITEM_TYPES.nourritureboisson; }
isService() { return this.type == ITEM_TYPES.service; }
isCompetence() { return typesObjetsCompetence.includes(this.type) }
isEsquive() {
return (this.isCompetence()
&& this.system.categorie == 'melee'
&& Grammar.includesLowerCaseNoAccent(this.name, 'Esquive'));
}
isCorpsACorps() {
return this.isCompetence()
&& this.system.categorie == 'melee'
&& Grammar.includesLowerCaseNoAccent(this.name, 'Corps à Corps')
}
isCompetenceArme() {
return this.isCompetence() && ['melee', 'tir', 'lancer'].includes(this.system.categorie)
}
isCompetencePossession() { return ITEM_TYPES.competencecreature == this.type && this.system.categorie == "possession" }
isTemporel() { return typesObjetsTemporels.includes(this.type) }
isOeuvre() { return typesObjetsOeuvres.includes(this.type) }
2023-01-13 04:54:29 +01:00
isDraconique() { return RdDItem.getItemTypesDraconiques().includes(this.type) }
isQueueDragon() { return [ITEM_TYPES.queue, ITEM_TYPES.ombre].includes(this.type) }
isEffet() { return typesObjetsEffet.includes(this.type) }
isConnaissance() { return typesObjetsConnaissance.includes(this.type) }
isInventaire(mode = 'materiel') { return RdDItem.getItemTypesInventaire(mode).includes(this.type); }
2023-01-18 00:11:10 +01:00
isBoisson() { return this.isNourritureBoisson() && this.system.boisson; }
isAlcool() { return this.isNourritureBoisson() && this.system.boisson && this.system.alcoolise; }
isHerbeAPotion() { return this.type == ITEM_TYPES.herbe && (this.system.categorie == 'Soin' || this.system.categorie == 'Repos'); }
isBlessure() { return this.type == ITEM_TYPES.blessure }
2023-01-13 04:54:29 +01:00
isPresentDansMilieux(milieux) {
return this.getEnvironnements(milieux).length > 0
2023-01-13 04:54:29 +01:00
}
2023-01-18 00:11:10 +01:00
getEnvironnements(milieux = undefined) {
const environnements = this.isInventaire() ? this.system.environnement : undefined;
if (milieux == undefined || !environnements) {
return environnements ?? [];
}
return environnements.filter(env => milieux.includes(env.milieu))
2023-01-18 00:11:10 +01:00
}
getMilieux() {
return this.getEnvironnements().map(env => env.milieu);
2023-01-13 04:54:29 +01:00
}
getRaretes(milieux = undefined) {
2023-01-13 04:54:29 +01:00
if (this.isInventaire()) {
const raretes = this.getEnvironnements(milieux).map(env => RdDRaretes.byCode(env.rarete));
if (milieux == undefined && raretes.length == 0) {
return [RdDRaretes.rareteFrequente()];
}
return raretes;
2023-01-13 04:54:29 +01:00
}
return [RdDRaretes.rareteEgale()];
2023-01-13 04:54:29 +01:00
}
2023-01-13 04:54:29 +01:00
getFrequence(milieux = undefined) {
const frequences = this.getEnvironnements(milieux).map(it => it.frequence);
return frequences.length == 0 ? 0 : Math.max(...frequences);
2023-01-13 04:54:29 +01:00
}
2022-12-23 00:22:13 +01:00
getItemGroup() {
if (this.isInventaire()) return "equipement";
if (this.isOeuvre()) return "oeuvre";
if (this.isDraconique()) return "draconique";
if (this.isConnaissance()) return "connaissance";
if (this.isEffet()) return "effet";
if (this.isCompetence()) return "competence";
return "autres";
}
isConteneurNonVide() { return this.isConteneur() && (this.system.contenu?.length ?? 0) > 0; }
isConteneurVide() { return this.isConteneur() && (this.system.contenu?.length ?? 0) == 0; }
isVideOuNonConteneur() { return !this.isConteneur() || (this.system.contenu?.length ?? 0) == 0; }
isFinPeriode(oldTimestamp, newTimestamp) {
if (!this.isTemporel()) {
return false;
}
const finPeriode = new RdDTimestamp(this.system.temporel.fin);
return oldTimestamp.compare(finPeriode) < 0 && finPeriode.compare(newTimestamp) <= 0
}
async onCreateItemTemporel(actor) {
if (this.isTemporel()) {
const timestampDebut = game.system.rdd.calendrier.timestamp;
const timestampFin = await this.calculerFinPeriodeTemporel(timestampDebut);
await actor.updateEmbeddedDocuments('Item', [{
_id: this.id,
2024-05-02 14:08:02 +02:00
'system.temporel.debut': foundry.utils.duplicate(timestampDebut),
'system.temporel.fin': foundry.utils.duplicate(timestampFin),
}])
}
}
async calculerFinPeriodeTemporel(timestampDebut) {
return timestampDebut;
}
async onFinPeriodeTemporel(oldTimestamp, newTimestamp) {
if (this.isTemporel() && this.actor) {
await this.onFinPeriode(oldTimestamp, newTimestamp);
}
}
async onFinPeriode(oldTimestamp, newTimestamp) {
console.log(`${this.actor.name}: l'objet ${this.name} a expiré et été supprimé`);
await this.actor?.deleteEmbeddedDocuments('Item', [this.id]);
2021-05-07 17:27:02 +02:00
}
2023-01-18 00:11:10 +01:00
2023-01-15 15:54:40 +01:00
getUtilisation() {
switch (this.type) {
case ITEM_TYPES.potion:
2023-01-20 23:46:37 +01:00
switch (this.system.categorie) {
case 'Alchimie': case 'AlchimieEnchante': case 'AlchimieAutre': return 'alchimie'
case 'Cuisine': return 'cuisine'
case 'Remede': case 'Repos': case 'ReposEnchante': case 'Soin': case 'SoinEnchante': return 'soins'
}
return '';
case ITEM_TYPES.nourritureboisson: return 'cuisine';
case ITEM_TYPES.herbe: case ITEM_TYPES.faune: case ITEM_TYPES.ingredient: case ITEM_TYPES.plante:
2023-01-15 15:54:40 +01:00
switch (this.system.categorie) {
case 'Cuisine': return 'cuisine';
2023-01-20 23:45:57 +01:00
case 'Toxique': case 'Poison': return 'poison';
2023-01-15 15:54:40 +01:00
case 'Alchimie': return 'alchimie'
case 'Soin': case 'Repos': return 'soins'
}
return this.system.sust > 0 ? 'cuisine' : '';
}
return '';
}
2023-01-18 00:11:10 +01:00
2023-01-15 15:54:40 +01:00
getUtilisationCuisine() {
if (this.getUtilisation() == 'cuisine') {
switch (this.type) {
case ITEM_TYPES.nourritureboisson:
2023-01-15 15:54:40 +01:00
return 'pret';
case ITEM_TYPES.herbe: case ITEM_TYPES.faune: case ITEM_TYPES.ingredient: case ITEM_TYPES.plante:
2023-01-15 15:54:40 +01:00
return 'brut';
}
}
return '';
}
2021-04-20 23:16:18 +02:00
isCristalAlchimique() {
return this.type == ITEM_TYPES.objet && Grammar.includesLowerCaseNoAccent(this.name, 'cristal alchimique') && this.system.quantite > 0;
2021-04-20 23:16:18 +02:00
}
2021-05-07 17:27:02 +02:00
isMagique() {
2022-06-12 08:17:59 +02:00
return this.system.magique
}
2021-04-13 22:42:39 +02:00
isItemCommerce() {
return this.parent?.type == 'commerce';
}
isNomLike(texte) {
return Grammar.includesLowerCaseNoAccent(this.name, texte)
}
isNomTypeLike(texte) {
return this.isNomLike(texte) || Grammar.includesLowerCaseNoAccent(Misc.typeName(this.type, 'Item'), texte)
}
getQuantite() {
return this.isService() ? undefined : Math.round(this.system.quantite ?? 0)
}
getEncTotal() {
return (this.getQuantite() ?? 0) * this.getEnc();
}
2021-04-13 22:42:39 +02:00
getEnc() {
2022-06-12 08:17:59 +02:00
switch (this.type) {
case ITEM_TYPES.service:
return 0;
case ITEM_TYPES.herbe:
return this.getEncHerbe();
case ITEM_TYPES.gemme:
return encPepin * this.system.taille;
2021-04-13 22:42:39 +02:00
}
return Math.max(this.system.encombrement ?? 0, 0);
}
getEncContenu() {
return this.getContenu()
.map(it => it.getRecursiveEnc())
.reduce(Misc.sum(), 0);
}
getRecursiveEnc() {
return this.getEncTotal() + this.getEncContenu()
}
getEncHerbe() {
switch (this.system.categorie) {
case 'Repos': case 'Soin': case 'Alchimie':
return encBrin;
}
return this.system.encombrement;
}
getContenu() {
if (this.isConteneur()) {
return this.system.contenu.map(idContenu => this.actor.getItem(idContenu));
}
return []
}
isConteneurContenu(conteneur) {
return this.getContenu()
.find(it => it.id == conteneur.id || it.isConteneurContenu(conteneur))
}
valeurTotale() {
return (this.isService() ? 1 : this.getQuantite()) * this.valeur()
}
valeur() {
return this.system.cout ?? 0
2021-04-13 22:42:39 +02:00
}
calculerPrixCommercant() {
if (this.isItemCommerce()) {
// appliquer le pourcentage
return this.parent.calculerPrix(this);
}
return this.system.cout;
}
prepareDerivedData() {
super.prepareDerivedData();
if (this.isInventaire()) {
this.system.encTotal = this.getEncTotal();
2021-12-05 16:48:18 +01:00
if (this.isPotion()) {
this.prepareDataPotion()
}
this.system.actionPrincipale = this.getActionPrincipale({ warnIfNot: false });
}
this.equipable = this.isEquipable();
2021-04-12 00:16:23 +02:00
}
prepareDataPotion() {
2022-06-12 08:17:59 +02:00
const categorie = Grammar.toLowerCaseNoAccent(this.system.categorie);
this.system.magique = categorie.includes('enchante');
if (this.system.magique) {
2021-04-12 00:16:23 +02:00
if (categorie.includes('soin') || categorie.includes('repos')) {
// TODO: utiliser calculPointsRepos / calculPointsGuerison
this.system.puissance = RdDHerbes.calculPuissancePotion(this);
2021-04-12 00:16:23 +02:00
}
}
}
2021-04-12 00:16:23 +02:00
getActionPrincipale(options = { warnIfNot: true }) {
2022-09-16 23:27:26 +02:00
switch (this.type) {
case ITEM_TYPES.conteneur: return 'Ouvrir';
}
if (this.actor?.isPersonnage()) {
const warn = options.warnIfNot;
2023-01-15 15:54:40 +01:00
if (this.getUtilisationCuisine() == 'brut') {
return 'Cuisiner';
}
switch (this.type) {
case ITEM_TYPES.nourritureboisson: return this._actionOrWarnQuantiteZero(this.system.boisson ? 'Boire' : 'Manger', warn);
case ITEM_TYPES.potion: return this._actionOrWarnQuantiteZero('Consommer', warn);
case ITEM_TYPES.livre: return this._actionOrWarnQuantiteZero('Lire', warn);
case ITEM_TYPES.herbe: return this.isHerbeAPotion() ? this._actionOrWarnQuantiteZero('Décoction', warn) : undefined;
case ITEM_TYPES.queue: case ITEM_TYPES.ombre: return this.system.refoulement > 0 ? 'Refouler' : undefined;
}
2022-09-16 23:27:26 +02:00
}
return undefined;
}
/* -------------------------------------------- */
async actionPrincipale(actor, onActionItem = async () => { }) {
if (!this.getActionPrincipale()) { return }
await actor?.actionPrincipale(this, onActionItem);
}
2022-09-16 23:27:26 +02:00
_actionOrWarnQuantiteZero(actionName, warn) {
2022-09-16 23:27:26 +02:00
if ((this.system.quantite ?? 0) <= 0) {
if (warn) {
2022-06-12 08:17:59 +02:00
ui.notifications.warn(`Vous n'avez plus de ${this.name}.`);
2021-04-11 23:01:10 +02:00
}
2021-04-12 00:16:23 +02:00
return undefined;
2021-04-11 23:01:10 +02:00
}
2022-09-16 23:27:26 +02:00
else {
return actionName;
2021-04-11 23:01:10 +02:00
}
}
2021-04-12 01:03:37 +02:00
async diminuerQuantite(nombre, options = { diminuerQuantite: true, supprimerSiZero: false }) {
if (options.diminuerQuantite == false) return;
2021-04-13 22:42:39 +02:00
await this.quantiteIncDec(-nombre, options);
}
async onCreateDecoupeComestible(actor) {
2023-01-15 15:54:40 +01:00
if (actor && this.getUtilisationCuisine() == 'brut' && this.system.sust != 1) {
if (this.system.sust < 1) {
await actor.updateEmbeddedDocuments('Item', [{
_id: this.id,
'system.sust': 0
}])
}
else {
const sust = Math.floor(this.system.sust);
await actor.updateEmbeddedDocuments('Item', [{
_id: this.id,
'system.quantite': this.system.quantite * sust,
'system.encombrement': Misc.keepDecimals(this.system.encombrement / sust, 2),
'system.cout': Math.max(0, Misc.keepDecimals(this.system.cout / sust, 2)),
'system.sust': 1
}])
}
}
}
async empiler(item) {
2023-01-15 15:54:40 +01:00
if (this.getUtilisationCuisine() == 'brut') {
const sust = this.system.sust + item.system.sust;
const encombrement = this.system.encombrement + item.system.encombrement;
await this.update({
"system.sust": sust,
"system.encombrement": encombrement
});
}
else {
await this.quantiteIncDec(item.system.quantite);
}
2024-11-29 22:11:24 +01:00
// TODO: suppression dans les conteneurs!
await item.delete();
}
async quantiteIncDec(nombre, options = { supprimerSiZero: false }) {
2022-06-12 08:17:59 +02:00
const quantite = Number(this.system.quantite ?? -1);
2021-05-07 17:27:02 +02:00
if (quantite >= 0) {
2021-04-14 21:51:29 +02:00
const reste = Math.max(quantite + Number(nombre), 0);
2021-04-13 22:42:39 +02:00
if (reste == 0) {
2021-05-07 17:27:02 +02:00
if (options.supprimerSiZero) {
2022-06-12 08:17:59 +02:00
ui.notifications.notify(`${this.name} supprimé de votre équipement`);
2021-04-13 22:42:39 +02:00
await this.delete();
}
else {
2022-06-12 08:17:59 +02:00
ui.notifications.notify(`Il ne vous reste plus de ${this.name}, vous pouvez le supprimer de votre équipement, ou trouver un moyen de vous en procurer.`);
await this.update({ "system.quantite": 0 });
2021-04-13 22:42:39 +02:00
}
2021-04-12 01:03:37 +02:00
}
else {
await this.update({ "system.quantite": reste });
2021-04-12 01:03:37 +02:00
}
}
}
2021-04-13 22:42:39 +02:00
/* -------------------------------------------- */
// détermine si deux équipements sont similaires: de même type, et avec les même champs hormis la quantité
isInventaireEmpilable(other) {
if (!other || !this.isInventaire()) {
return [false, undefined];
}
2024-11-29 22:11:24 +01:00
if (this.isConteneur()){
return [false, `Impossible de regrouper des conteneurs, ils ne sont pas empilables`];
}
if (this.system.quantite == undefined) {
return [false, `Impossible de regrouper des ${this.type}, ils ne sont pas empilables`];
}
else if (this.type != other.type) {
return [false, `Impossible de regrouper des ${this.type} avec des ${other.type}`];
}
else if (this.name != other.name) {
return [false, `Impossible de regrouper ${this.name} avec ${other.name}`];
}
else {
const excludedProperties = ['quantite', 'cout', 'encTotal', 'environnement', 'contenu'];
2023-01-15 15:54:40 +01:00
if (this.getUtilisationCuisine()) {
excludedProperties.push('sust', 'encombrement');
}
let differences = Object.entries(this.system)
.filter(([key, value]) => !excludedProperties.includes(key))
.filter(([key, value]) => value != other.system[key])
if (differences.length > 0) {
let message = `Impossible de regrouper les ${this.type} ${this.name}: `;
for (const [key, value] of differences) {
message += `<br>${key}: ${value} vs ${other.system[key]}`;
}
return [false, message];
2021-06-02 23:41:25 +02:00
}
}
return [true, undefined];
2021-04-13 22:42:39 +02:00
}
async proposerVente(quantiteMax = undefined) {
2021-05-07 17:27:02 +02:00
console.log(this);
if (this.isConteneurNonVide()) {
ui.notifications.warn(`Votre ${this.name} n'est pas vide, pas possible de le proposer`);
return;
}
await DialogItemVente.display({ item: this, quantiteMax })
2021-05-07 17:27:02 +02:00
}
2021-04-13 22:42:39 +02:00
2021-10-29 21:31:58 +02:00
/* -------------------------------------------- */
getProprietes() {
if (this[`_${this.type}ChatData`]) {
return this[`_${this.type}ChatData`]().filter(it => it != undefined);
}
return [];
}
2021-01-01 21:11:56 +01:00
/* -------------------------------------------- */
2022-12-29 02:25:45 +01:00
async postItemToChat(modeOverride) {
2021-01-01 21:11:56 +01:00
console.log(this);
2022-12-29 02:25:45 +01:00
let chatData = {
doctype: 'Item',
id: this.id,
type: this.type,
img: this.img,
pack: this.pack,
name: this.name,
actor: this.actor ? { id: this.actor.id } : undefined,
2022-12-29 02:25:45 +01:00
system: { description: this.system.description },
properties: this.getProprietes(),
2021-04-14 22:40:12 +02:00
}
renderTemplate(this.getChatItemTemplate(), chatData).then(html => {
2021-10-29 21:31:58 +02:00
let chatOptions = RdDUtility.chatDataSetup(html, modeOverride);
2021-01-01 21:11:56 +01:00
ChatMessage.create(chatOptions)
});
}
getChatItemTemplate() {
return 'systems/foundryvtt-reve-de-dragon/templates/post-item.html';
}
2022-12-03 22:01:06 +01:00
static propertyIfDefined(name, val, condition = true) {
return condition ? `<b>${name}</b>: ${val}` : undefined;
}
2022-12-03 22:01:06 +01:00
_inventaireTemplateChatData() {
return [
RdDItem.propertyIfDefined('Qualité', this.system.qualite, this.system.qualite != 0),
RdDItem.propertyIfDefined('Encombrement', this.system.encombrement)
// cout et quantité masqués
]
}
2021-01-01 21:11:56 +01:00
/* -------------------------------------------- */
_objetChatData() {
2022-12-03 22:01:06 +01:00
return this._inventaireTemplateChatData()
2021-01-01 21:11:56 +01:00
}
/* -------------------------------------------- */
_nourritureboissonChatData() {
2022-12-03 22:01:06 +01:00
return [
2022-11-05 18:06:30 +01:00
RdDItem.propertyIfDefined('Sustentation', this.system.sust, this.system.sust > 0),
RdDItem.propertyIfDefined('Désaltère', this.system.desaltere, this.system.boisson),
RdDItem.propertyIfDefined('Force alcool', this.system.force, this.system.boisson && this.system.alcoolise),
RdDItem.propertyIfDefined('Exotisme', this.system.exotisme, this.system.exotisme < 0),
2022-12-03 22:01:06 +01:00
...this._inventaireTemplateChatData()
]
}
2021-01-01 21:11:56 +01:00
/* -------------------------------------------- */
_armeChatData() {
2022-11-05 18:06:30 +01:00
return [
`<b>Compétence</b>: ${this.system.competence}`,
`<b>Dommages</b>: ${this.system.dommages} ${this.system.mortalite == 'non-mortel' ? '(Non mortel)' : ''}`,
2022-11-05 18:06:30 +01:00
`<b>Force minimum</b>: ${this.system.force}`,
`<b>Resistance</b>: ${this.system.resistance}`,
2022-12-03 22:01:06 +01:00
...this._inventaireTemplateChatData()
2021-01-01 21:11:56 +01:00
]
}
/* -------------------------------------------- */
_conteneurChatData() {
2022-11-05 18:06:30 +01:00
return [
`<b>Capacité</b>: ${this.system.capacite} Enc.`,
2022-12-03 22:01:06 +01:00
...this._inventaireTemplateChatData()
2021-01-01 21:11:56 +01:00
]
}
/* -------------------------------------------- */
_munitionChatData() {
2022-12-03 22:01:06 +01:00
return this._inventaireTemplateChatData()
2021-01-01 21:11:56 +01:00
}
/* -------------------------------------------- */
_armureChatData() {
2022-11-05 18:06:30 +01:00
return [
`<b>Protection</b>: ${this.system.protection}`,
`<b>Détérioration</b>: ${this.system.deterioration}`,
`<b>Malus armure</b>: ${this.system.malus}`,
2022-12-03 22:01:06 +01:00
...this._inventaireTemplateChatData()
2021-01-01 21:11:56 +01:00
]
}
/* -------------------------------------------- */
_competenceChatData() {
2022-11-05 18:06:30 +01:00
return [
`<b>Catégorie</b>: ${this.system.categorie}`,
`<b>Niveau</b>: ${this.system.niveau}`,
`<b>Caractéristique par défaut</b>: ${this.system.carac_defaut}`,
`<b>XP</b>: ${this.system.xp}`
2021-01-01 21:11:56 +01:00
]
}
/* -------------------------------------------- */
_competencecreatureChatData() {
2022-11-05 18:06:30 +01:00
return [
`<b>Catégorie</b>: ${this.system.categorie}`,
`<b>Niveau</b>: ${this.system.niveau}`,
`<b>Caractéristique</b>: ${this.system.carac_value}`,
`<b>XP</b>: ${this.system.xp}`
2021-01-01 21:11:56 +01:00
]
}
/* -------------------------------------------- */
_sortChatData() {
2022-11-05 18:06:30 +01:00
return [
`<b>Draconic</b>: ${this.system.draconic}`,
`<b>Difficulté</b>: ${this.system.difficulte}`,
`<b>Case TMR</b>: ${this.system.caseTMR}`,
`<b>Points de Rêve</b>: ${this.system.ptreve}`
2021-01-01 21:11:56 +01:00
]
}
/* -------------------------------------------- */
_herbeChatData() {
2022-11-05 18:06:30 +01:00
return [
`<b>Milieu</b>: ${this.system.milieu}`,
`<b>Catégorie</b>: ${this.system.categorie}`,
2022-12-03 22:01:06 +01:00
...this._inventaireTemplateChatData()
2021-01-01 21:11:56 +01:00
]
}
/* -------------------------------------------- */
_ingredientChatData() {
2022-11-05 18:06:30 +01:00
return [
`<b>Milieu</b>: ${this.system.milieu}`,
`<b>Catégorie</b>: ${this.system.categorie}`,
2022-12-03 22:01:06 +01:00
...this._inventaireTemplateChatData()
2021-01-01 21:11:56 +01:00
]
}
/* -------------------------------------------- */
_fauneChatData() {
return [
`<b>Sustentation</b>: ${this.system.sust}`,
`<b>Milieu</b>: ${this.system.milieu}`,
...this._inventaireTemplateChatData()
]
}
/* -------------------------------------------- */
2021-01-01 21:11:56 +01:00
_tacheChatData() {
2022-11-05 18:06:30 +01:00
return [
`<b>Caractéristique</b>: ${this.system.carac}`,
`<b>Compétence</b>: ${this.system.competence}`,
`<b>Périodicité</b>: ${this.system.periodicite}`,
`<b>Fatigue</b>: ${this.system.fatigue}`,
2022-12-03 22:01:06 +01:00
`<b>Difficulté</b>: ${this.system.difficulte}`,
2023-11-10 22:38:33 +01:00
RdDItem.propertyIfDefined('Points de Tâche', this.system.points_de_tache, !this.system.cacher_points_de_tache),
2022-11-05 18:06:30 +01:00
`<b>Points de Tâche atteints</b>: ${this.system.points_de_tache_courant}`]
2021-01-01 21:11:56 +01:00
}
/* -------------------------------------------- */
_livreChatData() {
2022-11-05 18:06:30 +01:00
return [
`<b>Compétence</b>: ${this.system.competence}`,
`<b>Auteur</b>: ${this.system.auteur}`,
`<b>Difficulté</b>: ${this.system.difficulte}`,
2023-11-10 22:38:33 +01:00
RdDItem.propertyIfDefined('Points de Tâche', this.system.points_de_tache, !this.system.cacher_points_de_tache),
2022-12-03 22:01:06 +01:00
...this._inventaireTemplateChatData()
2021-01-01 21:11:56 +01:00
]
}
/* -------------------------------------------- */
_potionChatData() {
2022-11-05 18:06:30 +01:00
return [
`<b>Rareté</b>: ${this.system.rarete}`,
`<b>Catégorie</b>: ${this.system.categorie}`,
2022-12-03 22:01:06 +01:00
...this._inventaireTemplateChatData()
2021-01-01 21:11:56 +01:00
]
}
/* -------------------------------------------- */
_queueChatData() {
2022-12-03 22:01:06 +01:00
function label(categorie) {
switch (categorie) {
case 'ideefixe': return 'Idée fixe';
case 'lancinant': return 'Désir lancinant';
}
return ''
}
2022-11-05 18:06:30 +01:00
return [
2022-12-03 22:01:06 +01:00
`<b>Refoulement</b>: ${this.system.refoulement}`,
`<b>Catégorie</b>: ${label(this.system.categorie)}`,
`<b>Affecte</b>: ${this.system.hautrevant ? 'les haut-rêvants' : 'tout le monde'}`,
2021-01-01 21:11:56 +01:00
]
}
/* -------------------------------------------- */
_ombreChatData() {
2022-12-03 22:01:06 +01:00
return this._queueChatData()
2021-01-01 21:11:56 +01:00
}
/* -------------------------------------------- */
_souffleChatData() {
2022-12-03 22:01:06 +01:00
return [
`<b>Affecte</b>: ${this.system.hautrevant ? 'les haut-rêvants' : 'tout le monde'}`,
];
2021-01-01 21:11:56 +01:00
}
/* -------------------------------------------- */
_teteChatData() {
2022-12-03 22:01:06 +01:00
return [
`<b>Affecte</b>: ${this.system.hautrevant ? 'les haut-rêvants' : 'tout le monde'}`,
];
2021-01-01 21:11:56 +01:00
}
/* -------------------------------------------- */
_tarotChatData() {
2022-11-05 18:06:30 +01:00
return [
2022-12-03 22:01:06 +01:00
RdDItem.propertyIfDefined('Carte', RdDUtility.linkCompendium(this.pack, this.id, this.name), this.pack),
2022-11-05 18:06:30 +01:00
`<b>Concept</b>: ${this.system.concept}`,
`<b>Aspect</b>: ${this.system.aspect}`,
2021-01-01 21:11:56 +01:00
]
}
/* -------------------------------------------- */
_nombreastralChatData() {
2022-11-05 18:06:30 +01:00
return [
`<b>Valeur</b>: ${this.system.value}`,
`<b>Jour</b>: ${this.system.jourlabel}`,
2021-01-01 21:11:56 +01:00
]
}
/* -------------------------------------------- */
_monnaieChatData() {
2022-12-03 22:01:06 +01:00
return this._inventaireTemplateChatData()
2021-01-01 21:11:56 +01:00
}
/* -------------------------------------------- */
_meditationChatData() {
2022-11-05 18:06:30 +01:00
return [
`<b>Thème</b>: ${this.system.theme}`,
`<b>Compétence</b>: ${this.system.competence}`,
`<b>Support</b>: ${this.system.support}`,
`<b>Heure</b>: ${this.system.heure}`,
`<b>Purification</b>: ${this.system.purification}`,
`<b>Vêture</b>: ${this.system.veture}`,
`<b>Comportement</b>: ${this.system.comportement}`,
`<b>Case TMR</b>: ${this.system.tmr}`
2021-01-01 21:11:56 +01:00
]
}
/* -------------------------------------------- */
_rencontreChatData() {
if (this.system.coord) {
return [
`<b>Force</b>: ${this.system.force}`,
`<b>Coordonnées</b>: ${this.system.coord}`,
]
}
return [
2022-12-03 22:01:06 +01:00
`<b>Force</b>: ${this.system.formule}`,
`<b>Refoulement</b>: ${this.system.refoulement}`,
2022-12-03 22:01:06 +01:00
RdDItem.propertyIfDefined('<b>Présent de cités</b>', '', this.system.presentCite),
]
}
/* -------------------------------------------- */
2021-01-01 21:11:56 +01:00
_casetmrChatData() {
2022-11-05 18:06:30 +01:00
return [
`<b>Coordonnée</b>: ${this.system.coord}`,
`<b>Spécificité</b>: ${this.system.specific}`
2021-01-01 21:11:56 +01:00
]
}
2021-10-29 21:31:58 +02:00
/* -------------------------------------------- */
_maladieChatData() {
2022-11-05 18:06:30 +01:00
if (!this.system.identifie) {
return [`<b>Inconnue</b>`]
}
2022-12-03 22:01:06 +01:00
return [
`<b>Malignité</b>: ${this.system.malignite}`,
`<b>Périodicité</b>: ${this.system.periodicite}`,
2022-12-03 22:01:06 +01:00
`<b>Dommages</b>: ${this.system.dommages}`,
RdDItem.propertyIfDefined('<b>Remedes</b>', this.system.remedes, this.system.remedesconnus),
]
2021-10-29 21:31:58 +02:00
}
/* -------------------------------------------- */
_poisonChatData() {
return this._maladieChatData();
}
/* -------------------------------------------- */
_gemmeChatData() {
2022-11-05 18:06:30 +01:00
return [
`<b>Pureté</b>: ${this.system.purete}`,
`<b>Taille</b>: ${this.system.taille}`,
`<b>Inertie</b>: ${this.system.inertie}`,
`<b>Enchantabilité</b>: ${this.system.enchantabilite}`,
2022-12-03 22:01:06 +01:00
...this._inventaireTemplateChatData()
2021-10-29 21:31:58 +02:00
]
}
2021-01-01 21:11:56 +01:00
}