2021-05-07 17:27:02 +02:00
import { DialogItemVente } from "./dialog-item-vente.js" ;
2023-01-14 01:15:15 +01:00
import { Environnement } from "./environnement.js" ;
2021-04-12 00:16:23 +02:00
import { Grammar } from "./grammar.js" ;
2022-12-03 22:32:32 +01:00
import { Misc } from "./misc.js" ;
2022-09-07 18:47:56 +02:00
import { RdDHerbes } from "./rdd-herbes.js" ;
2023-01-05 00:55:04 +01:00
import { RdDTimestamp } from "./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" ;
2023-01-13 04:54:29 +01:00
import { RdDRaretes } from "./tirage/raretes.js" ;
2021-01-01 21:11:56 +01:00
2023-01-03 00:31:32 +01:00
const typesInventaireMateriel = [
2022-10-04 01:58:49 +02:00
"arme" ,
"armure" ,
"conteneur" ,
2023-01-03 00:31:32 +01:00
"faune" ,
2022-10-04 01:58:49 +02:00
"gemme" ,
"herbe" ,
2023-01-14 01:15:15 +01:00
"plante" ,
2022-10-04 01:58:49 +02:00
"ingredient" ,
"livre" ,
"monnaie" ,
"munition" ,
"nourritureboisson" ,
"objet" ,
"potion" ,
]
2023-01-03 00:31:32 +01:00
const typesInventaire = {
materiel : typesInventaireMateriel ,
all : [ 'service' ] . concat ( typesInventaireMateriel ) ,
}
2022-06-12 08:17:59 +02:00
const typesObjetsOeuvres = [ "oeuvre" , "recettecuisine" , "musique" , "chant" , "danse" , "jeu" ]
2022-11-05 18:19:53 +01:00
const typesObjetsDraconiques = [ "queue" , "ombre" , "souffle" , "tete" , "signedraconique" , "sortreserve" , "rencontre" ]
2022-10-04 23:23:43 +02:00
const typesObjetsConnaissance = [ "meditation" , "recettealchimique" , "sort" ]
const typesObjetsEffet = [ "possession" , "poison" , "maladie" ]
2022-10-09 02:19:33 +02:00
const typesObjetsCompetence = [ "competence" , "competencecreature" ]
2023-01-05 00:55:04 +01:00
const typesObjetsTemporels = [ "poison" , "maladie" , "queue" , "ombre" , "souffle" , "signedraconique" , "rencontre" ]
2023-01-14 01:15:15 +01:00
const typesEnvironnement = Environnement . typesEnvironnement ( ) ;
2022-10-04 01:58:49 +02:00
const encBrin = 0.00005 ; // un brin = 1 décigramme = 1/10g = 1/10000kg = 1/20000 enc
const encPepin = 0.0007 ; / * u n p é p i n d e g e m m e = 1 / 1 0 c m 3 = 1 / 1 0 0 0 l = 3 . 5 / 1 0 0 0 k g = 7 / 2 0 0 0 k g = 7 / 1 0 0 0 e n c
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
2021-05-18 19:50:24 +02:00
export const defaultItemImg = {
competence : "systems/foundryvtt-reve-de-dragon/icons/competence_defaut.webp" ,
2022-10-09 02:19:33 +02:00
competencecreature : "systems/foundryvtt-reve-de-dragon/icons/competence_defaut.webp" ,
2021-05-18 19:50:24 +02:00
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" ,
2022-12-03 18:31:05 +01:00
faune : "systems/foundryvtt-reve-de-dragon/icons/faune/rongeur.webp" ,
2021-05-18 19:50:24 +02:00
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" ,
2022-11-05 18:19:53 +01:00
rencontre : "systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp" ,
2021-05-18 19:50:24 +02:00
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" ,
2021-05-18 19:50:24 +02:00
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" ,
2022-11-16 03:00:38 +01:00
extraitpoetique : "systems/foundryvtt-reve-de-dragon/icons/competence_ecriture.webp" ,
2022-11-26 03:13:45 +01:00
tarot : "systems/foundryvtt-reve-de-dragon/icons/tarots/dos-tarot.webp" ,
2021-05-18 19:50:24 +02:00
}
2021-01-01 21:11:56 +01:00
/* -------------------------------------------- */
export class RdDItem extends Item {
2022-11-26 03:13:45 +01:00
static getDefaultImg ( itemType ) {
2022-12-23 00:22:13 +01:00
return game . system . rdd . itemClasses [ itemType ] ? . defaultIcon ? ? defaultItemImg [ itemType ] ;
2022-11-26 03:13:45 +01:00
}
2022-12-03 15:33:16 +01:00
static isFieldInventaireModifiable ( type , field ) {
2022-11-29 00:01:54 +01:00
switch ( field ) {
case 'quantite' :
if ( [ 'conteneur' ] . includes ( type ) ) {
return false ;
}
break ;
case 'cout' :
2022-12-03 15:33:16 +01:00
if ( [ 'monnaie' ] . includes ( type ) ) {
return game . user . isGM ;
2022-11-29 00:01:54 +01:00
}
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 ) ;
}
2023-01-03 00:31:32 +01:00
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 ;
}
static getItemTypesEnvironnement ( ) {
return typesEnvironnement ;
}
2022-12-23 00:22:13 +01:00
static getTypesOeuvres ( ) {
return typesObjetsOeuvres
}
constructor ( docData , context = { } ) {
if ( ! context . rdd ? . ready ) {
mergeObject ( context , { rdd : { ready : true } } ) ;
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 ) ;
}
super ( docData , context ) ;
}
static get defaultIcon ( ) {
return undefined ;
}
2022-12-03 22:32:32 +01:00
getUniteQuantite ( ) {
switch ( this . type ) {
2022-11-29 00:01:54 +01:00
case "monnaie" : return "(Pièces)"
2022-12-03 22:32:32 +01:00
case "herbe" :
switch ( this . system . categorie ) {
case 'Alchimie' : case 'Repos' : case 'Soin' :
return "(Brins)"
case 'Cuisine' : return '' ;
}
return '' ;
2022-11-29 00:01:54 +01:00
case "ingredient" : return "(Pépins ou Brins)"
}
return '' ;
}
2022-11-26 03:13:45 +01:00
2022-12-23 00:22:13 +01:00
isCompetencePersonnage ( ) { return this . type == 'competence' }
isCompetenceCreature ( ) { return this . type == 'competencecreature' }
isConteneur ( ) { return this . type == 'conteneur' ; }
isMonnaie ( ) { return this . type == 'monnaie' ; }
2023-01-07 23:28:30 +01:00
isPotion ( ) { return this . type == 'potion' ; }
2022-12-23 00:22:13 +01:00
isNourritureBoisson ( ) { return this . type == 'nourritureboisson' ; }
isService ( ) { return this . type == 'service' ; }
2023-01-07 23:28:30 +01:00
2023-01-05 00:55:04 +01:00
isCompetence ( ) { return typesObjetsCompetence . includes ( this . type ) }
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 ) }
2023-01-05 00:55:04 +01:00
isEffet ( ) { return typesObjetsEffet . includes ( this . type ) }
isConnaissance ( ) { return typesObjetsConnaissance . includes ( this . type ) }
isInventaire ( mode = 'materiel' ) { return RdDItem . getItemTypesInventaire ( mode ) . includes ( this . type ) ; }
2023-01-07 23:28:30 +01:00
isAlcool ( ) { return this . isNourritureBoisson ( ) && this . system . boisson && this . system . alcoolise ; }
isHerbeAPotion ( ) { return this . type == 'herbe' && ( this . system . categorie == 'Soin' || this . system . categorie == 'Repos' ) ; }
2023-01-13 04:54:29 +01:00
isEnvironnement ( ) { return RdDItem . getItemTypesEnvironnement ( ) . includes ( this . type ) }
isPresentDansMilieux ( milieux ) {
return this . getEnvironnements ( milieux ) . length > 0
}
getEnvironnements ( milieux = undefined ) {
return this . isEnvironnement ( )
? this . system ? . environnement . filter ( env => ! milieux || milieux . includes ( env . milieu ) )
: [ ]
}
getEnvRarete ( milieux = undefined ) {
if ( this . isEnvironnement ( ) ) {
const list = this . getEnvironnements ( milieux ) ;
const frequenceMax = Math . max ( ... list . map ( env => env . frequence ) ) ;
return list . find ( env => env . frequence == frequenceMax ) ;
}
return { }
}
getRarete ( milieux = undefined ) {
if ( this . isEnvironnement ( ) ) {
const env = this . getEnvRarete ( milieux ) ;
return RdDRaretes . getRarete ( env . rarete ) ;
}
if ( this . isInventaire ( ) ) {
return RdDRaretes . rareteEquipement ( this )
}
return RdDRaretes . getRareteFrequente ( ) ;
}
getFrequence ( milieux = undefined ) {
const frequence = this . getRarete ( milieux ) ? . frequence ;
return frequence == undefined ? 1 : frequence ;
}
2022-12-23 00:22:13 +01:00
2022-10-04 23:23:43 +02:00
getItemGroup ( ) {
2022-12-03 15:33:16 +01:00
if ( this . isInventaire ( ) ) return "equipement" ;
2022-10-04 23:23:43 +02:00
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" ;
}
2023-01-07 23:28:30 +01:00
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 ,
'system.temporel.debut' : duplicate ( timestampDebut ) ,
'system.temporel.fin' : duplicate ( timestampFin ) ,
} ] )
}
}
async calculerFinPeriodeTemporel ( timestampDebut ) {
return timestampDebut ;
2021-12-10 01:18:59 +01:00
}
2023-01-07 23:28:30 +01:00
async onFinPeriodeTemporel ( oldTimestamp , newTimestamp ) {
if ( this . isTemporel ( ) && this . actor ) {
await this . onFinPeriode ( oldTimestamp , newTimestamp ) ;
}
2021-12-10 01:18:59 +01:00
}
2023-01-07 23:28:30 +01:00
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
}
2021-04-13 22:42:39 +02:00
2022-12-03 22:32:32 +01:00
isComestible ( ) {
switch ( this . type ) {
case 'nourritureboisson' : return 'pret' ;
case 'herbe' :
return this . system . categorie == 'Cuisine' && this . system . sust > 0 ? 'brut' : '' ;
case 'faune' :
return this . system . sust > 0 ? 'brut' : '' ;
}
return '' ;
}
2021-04-20 23:16:18 +02:00
isCristalAlchimique ( ) {
2022-04-30 23:42:55 +02:00
return this . type == 'objet' && Grammar . toLowerCaseNoAccent ( 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-05-06 21:36:40 +02:00
}
2021-04-13 22:42:39 +02:00
2023-01-07 23:28:30 +01:00
isItemCommerce ( ) {
return this . parent ? . type == 'commerce' ;
}
2022-10-04 01:58:49 +02:00
getQuantite ( ) {
2023-01-03 13:38:04 +01:00
return this . isService ( ) ? undefined : Math . round ( this . system . quantite ? ? 0 )
2021-05-27 22:40:12 +02:00
}
2022-10-04 01:58:49 +02:00
getEncTotal ( ) {
2023-01-03 13:38:04 +01:00
return ( this . isService ( ) ? 0 : this . getQuantite ( ) ) * this . getEnc ( ) ;
2022-12-03 15:33:16 +01:00
}
2022-10-04 01:58:49 +02:00
2021-04-13 22:42:39 +02:00
getEnc ( ) {
2022-06-12 08:17:59 +02:00
switch ( this . type ) {
2023-01-03 13:38:04 +01:00
case 'service' :
return 0 ;
2021-04-13 22:42:39 +02:00
case 'herbe' :
2022-12-03 22:32:32 +01:00
return this . getEncHerbe ( ) ;
2022-10-04 01:58:49 +02:00
case 'gemme' :
return encPepin * this . system . taille ;
2021-04-13 22:42:39 +02:00
}
2022-10-04 01:58:49 +02:00
return Math . max ( this . system . encombrement ? ? 0 , 0 ) ;
}
2022-12-03 22:32:32 +01:00
getEncHerbe ( ) {
switch ( this . system . categorie ) {
case 'Repos' : case 'Soin' : case 'Alchimie' :
return encBrin ;
}
return this . system . encombrement ;
}
2022-11-29 00:01:54 +01:00
valeurTotale ( ) {
2023-01-03 13:38:04 +01:00
return ( this . isService ( ) ? 1 : this . getQuantite ( ) ) * this . valeur ( )
2022-10-04 01:58:49 +02:00
}
2022-11-29 00:01:54 +01:00
valeur ( ) {
return this . system . cout ? ? 0
2021-04-13 22:42:39 +02:00
}
2023-01-03 01:37:50 +01:00
calculerPrixCommercant ( ) {
2023-01-03 23:46:08 +01:00
if ( this . isItemCommerce ( ) ) {
2023-01-03 01:37:50 +01:00
// appliquer le pourcentage
return this . parent . calculerPrix ( this ) ;
}
return this . system . cout ;
}
2021-04-06 23:36:35 +02:00
prepareDerivedData ( ) {
super . prepareDerivedData ( ) ;
2022-12-03 15:33:16 +01:00
if ( this . isInventaire ( ) ) {
2022-10-04 01:58:49 +02:00
this . system . encTotal = this . getEncTotal ( ) ;
2021-12-05 16:48:18 +01:00
if ( this . isPotion ( ) ) {
this . prepareDataPotion ( )
}
2022-09-07 00:09:17 +02:00
this . system . actionPrincipale = this . getActionPrincipale ( { warnIfNot : false } ) ;
2021-04-08 20:37:11 +02:00
}
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' ) ) {
2022-10-08 14:25:31 +02:00
// TODO: utiliser calculPointsRepos / calculPointsGuerison
this . system . puissance = RdDHerbes . calculPuissancePotion ( this ) ;
2021-04-12 00:16:23 +02:00
}
}
2021-04-08 20:37:11 +02:00
}
2021-04-11 18:47:00 +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 ) {
2022-09-23 00:57:02 +02:00
case 'conteneur' : return 'Ouvrir' ;
2022-12-03 22:32:32 +01:00
}
if ( this . actor ? . isPersonnage ( ) ) {
const warn = options . warnIfNot ;
if ( this . isComestible ( ) == 'brut' ) {
return 'Utiliser' ;
}
switch ( this . type ) {
case 'nourritureboisson' : return this . _actionOrWarnQuantiteZero ( this . system . boisson ? 'Boire' : 'Manger' , warn ) ;
case 'potion' : return this . _actionOrWarnQuantiteZero ( 'Boire' , warn ) ;
case 'livre' : return this . _actionOrWarnQuantiteZero ( 'Lire' , warn ) ;
case 'herbe' : return this . isHerbeAPotion ( ) ? this . _actionOrWarnQuantiteZero ( 'Décoction' , warn ) : undefined ;
case 'queue' : case 'ombre' : return this . system . refoulement > 0 ? 'Refouler' : undefined ;
}
2022-09-16 23:27:26 +02:00
}
return undefined ;
}
2022-12-23 00:34:17 +01:00
2022-12-03 22:32:32 +01:00
/* -------------------------------------------- */
async actionPrincipale ( actor , onActionItem = async ( ) => { } ) {
if ( ! this . getActionPrincipale ( ) ) {
return ;
}
if ( await actor . actionNourritureboisson ( this , onActionItem ) ) {
return ;
}
switch ( this . type ) {
case 'potion' : return await actor . consommerPotion ( this , onActionItem ) ;
case 'livre' : return await actor . actionLire ( this ) ;
case 'conteneur' : return await this . sheet . render ( true ) ;
case 'herbe' : return await actor . actionHerbe ( this ) ;
case 'queue' : case 'ombre' : return await actor . actionRefoulement ( this ) ;
}
}
2022-09-16 23:27:26 +02:00
2022-12-03 15:33:16 +01: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 ) ;
}
2022-12-03 22:32:32 +01:00
async onCreateDecoupeComestible ( actor ) {
if ( actor && this . isComestible ( ) == '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' : Misc . keepDecimals ( this . system . cout / sust , 2 ) ,
'system.sust' : 1
} ] )
}
}
}
async empiler ( item ) {
if ( this . isComestible ( ) == '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 ) ;
}
await item . delete ( ) ;
}
2023-01-02 01:37:08 +01:00
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. ` ) ;
2022-09-07 18:47:56 +02:00
await this . update ( { "system.quantite" : 0 } ) ;
2021-04-13 22:42:39 +02:00
}
2021-04-12 01:03:37 +02:00
}
else {
2022-09-07 18:47:56 +02:00
await this . update ( { "system.quantite" : reste } ) ;
2021-04-12 01:03:37 +02:00
}
2021-04-11 18:47:00 +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é
2022-12-03 15:33:16 +01:00
isInventaireEmpilable ( other ) {
if ( ! other || ! this . isInventaire ( ) ) {
2022-10-17 21:19:01 +02:00
return [ false , undefined ] ;
}
2022-10-04 01:58:49 +02:00
if ( this . system . quantite == undefined ) {
2022-10-17 21:19:01 +02:00
return [ false , ` Impossible de regrouper des ${ this . type } , ils ne sont pas empilables ` ] ;
2022-12-03 15:33:16 +01:00
}
2022-10-04 01:58:49 +02:00
else if ( this . type != other . type ) {
2022-10-17 21:19:01 +02:00
return [ false , ` Impossible de regrouper des ${ this . type } avec des ${ other . type } ` ] ;
2022-09-07 00:09:17 +02:00
}
else if ( this . name != other . name ) {
2022-10-17 21:19:01 +02:00
return [ false , ` Impossible de regrouper ${ this . name } avec ${ other . name } ` ] ;
2022-09-07 00:09:17 +02:00
}
else {
2023-01-02 01:37:08 +01:00
const excludedProperties = [ 'quantite' , 'cout' , 'encTotal' , 'environnement' ] ;
2022-12-03 22:32:32 +01:00
if ( this . isComestible ( ) ) {
excludedProperties . push ( 'sust' , 'encombrement' ) ;
}
let differences = Object . entries ( this . system )
. filter ( ( [ key , value ] ) => ! excludedProperties . includes ( key ) )
. filter ( ( [ key , value ] ) => value != other . system [ key ] )
2022-09-07 00:09:17 +02:00
if ( differences . length > 0 ) {
2022-10-17 21:19:01 +02:00
let message = ` Impossible de regrouper les ${ this . type } ${ this . name } : ` ;
2022-09-07 00:09:17 +02:00
for ( const [ key , value ] of differences ) {
message += ` <br> ${ key } : ${ value } vs ${ other . system [ key ] } ` ;
}
2022-10-17 21:19:01 +02:00
return [ false , message ] ;
2021-06-02 23:41:25 +02:00
}
2022-09-07 00:09:17 +02:00
}
2022-10-17 21:19:01 +02:00
return [ true , undefined ] ;
2021-04-13 22:42:39 +02:00
}
2023-01-01 22:16:26 +01:00
async proposerVente ( quantiteMax = undefined ) {
2021-05-07 17:27:02 +02:00
console . log ( this ) ;
2021-12-10 01:18:59 +01:00
if ( this . isConteneurNonVide ( ) ) {
2022-10-07 19:05:56 +02:00
ui . notifications . warn ( ` Votre ${ this . name } n'est pas vide, pas possible de le proposer ` ) ;
2021-12-10 01:18:59 +01:00
return ;
}
2022-12-23 00:34:17 +01:00
await DialogItemVente . display ( {
item : this ,
quantiteMax ,
callback : async ( vente ) => {
vente [ "properties" ] = this . getProprietes ( ) ;
if ( vente . isOwned ) {
if ( vente . quantiteNbLots * vente . tailleLot > vente . quantiteMax ) {
ui . notifications . warn ( ` Vous avez ${ vente . quantiteMax } ${ vente . item . name } , ce n'est pas suffisant pour vendre ${ vente . quantiteNbLots } de ${ vente . tailleLot } ` )
return ;
}
2022-10-07 19:05:56 +02:00
}
2022-12-23 00:34:17 +01:00
vente . jsondata = JSON . stringify ( vente . item ) ;
2022-12-03 15:33:16 +01:00
2022-12-23 00:34:17 +01:00
let html = await renderTemplate ( 'systems/foundryvtt-reve-de-dragon/templates/chat-vente-item.html' , vente ) ;
ChatMessage . create ( RdDUtility . chatDataSetup ( html ) ) ;
}
2022-10-07 19:05:56 +02:00
} ) ;
2021-05-07 17:27:02 +02:00
}
2021-04-13 22:42:39 +02:00
2021-10-29 21:31:58 +02:00
/* -------------------------------------------- */
2021-06-08 00:32:27 +02:00
getProprietes ( ) {
2022-12-23 00:34:17 +01:00
if ( this [ ` _ ${ this . type } ChatData ` ] ) {
return this [ ` _ ${ this . type } ChatData ` ] ( ) . filter ( it => it != undefined ) ;
}
return [ ] ;
2021-06-08 00:32:27 +02:00
}
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 ,
2023-01-03 00:31:32 +01:00
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
}
2022-12-23 00:34:17 +01: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 )
} ) ;
}
2022-12-23 00:34:17 +01:00
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 ;
2021-04-11 18:47:00 +02:00
}
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
}
2021-04-11 18:47:00 +02: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-04-11 18:47:00 +02:00
}
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 } ` ,
` <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
]
}
/* -------------------------------------------- */
2022-12-03 18:31:05 +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 } ` ,
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 } ` ,
2022-12-03 22:01:06 +01:00
RdDItem . propertyIfDefined ( 'Points de Tâche' , this . system . points _de _tache , this . system . cacher _points _de _tache ) ,
... 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
]
}
/* -------------------------------------------- */
2022-11-05 18:19:53 +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 } ` ,
2022-11-05 18:19:53 +01:00
` <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 ) ,
2022-11-05 18:19:53 +01:00
]
}
/* -------------------------------------------- */
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 [
2022-12-03 15:33:16 +01:00
` <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 ) ,
2022-12-03 15:33:16 +01:00
]
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
}