Merge branch 'v1.4-fix-items' into 'v1.4'
Methode getItemOfType, Misc.data pour Items, remplacement de OwnedItems, fix casetmrs, et plus See merge request LeRatierBretonnien/foundryvtt-reve-de-dragon!180
This commit is contained in:
		| @@ -71,14 +71,14 @@ export class RdDActorEntiteSheet extends ActorSheet { | |||||||
|     // Update Inventory Item |     // Update Inventory Item | ||||||
|     html.find('.item-edit').click(ev => { |     html.find('.item-edit').click(ev => { | ||||||
|       const li = $(ev.currentTarget).parents(".item"); |       const li = $(ev.currentTarget).parents(".item"); | ||||||
|       const item = this.actor.getOwnedItem(li.data("itemId")); |       const item = this.actor.getEmbeddedDocuments('Item', li.data("itemId")); | ||||||
|       item.sheet.render(true); |       item.sheet.render(true); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     // Delete Inventory Item |     // Delete Inventory Item | ||||||
|     html.find('.item-delete').click(ev => { |     html.find('.item-delete').click(ev => { | ||||||
|       const li = $(ev.currentTarget).parents(".item"); |       const li = $(ev.currentTarget).parents(".item"); | ||||||
|       this.actor.deleteOwnedItem(li.data("itemId")); |       this.actor.deleteEmbeddedDocuments('Item', [li.data("itemId")]); | ||||||
|       li.slideUp(200, () => this.render(false)); |       li.slideUp(200, () => this.render(false)); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -407,19 +407,19 @@ export class RdDActorSheet extends ActorSheet { | |||||||
|     // Display info about queue |     // Display info about queue | ||||||
|     html.find('.queuesouffle-label a').click((event) => { |     html.find('.queuesouffle-label a').click((event) => { | ||||||
|       let myID = event.currentTarget.attributes['data-item-id'].value; |       let myID = event.currentTarget.attributes['data-item-id'].value; | ||||||
|       const item = this.actor.getOwnedItem(myID); |       const item = this.actor.getEmbeddedDocuments('Item', myID); | ||||||
|       item.sheet.render(true); |       item.sheet.render(true); | ||||||
|     }); |     }); | ||||||
|     // Info sort |     // Info sort | ||||||
|     html.find('.sort-label a').click((event) => { |     html.find('.sort-label a').click((event) => { | ||||||
|       let myID = event.currentTarget.attributes['data-id'].value; |       let myID = event.currentTarget.attributes['data-id'].value; | ||||||
|       const item = this.actor.getOwnedItem(myID); |       const item = this.actor.getEmbeddedDocuments('Item', myID); | ||||||
|       item.sheet.render(true); |       item.sheet.render(true); | ||||||
|     }); |     }); | ||||||
|     // Info sort |     // Info sort | ||||||
|     html.find('.case-label a').click((event) => { |     html.find('.case-label a').click((event) => { | ||||||
|       let myID = event.currentTarget.attributes['data-id'].value; |       let myID = event.currentTarget.attributes['data-id'].value; | ||||||
|       const item = this.actor.getOwnedItem(myID); |       const item = this.actor.getEmbeddedDocuments('Item', myID); | ||||||
|       item.sheet.render(true); |       item.sheet.render(true); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -87,7 +87,7 @@ export class RdDActorVehiculeSheet extends ActorSheet { | |||||||
|     // Update Inventory Item |     // Update Inventory Item | ||||||
|     html.find('.item-edit').click(ev => { |     html.find('.item-edit').click(ev => { | ||||||
|       const li = $(ev.currentTarget).parents(".item"); |       const li = $(ev.currentTarget).parents(".item"); | ||||||
|       const item = this.actor.getOwnedItem(li.data("itemId")); |       const item = this.actor.getEmbeddedDocuments('Item', li.data("itemId")); | ||||||
|       item.sheet.render(true); |       item.sheet.render(true); | ||||||
|     }); |     }); | ||||||
|     // Delete Inventory Item |     // Delete Inventory Item | ||||||
|   | |||||||
							
								
								
									
										428
									
								
								module/actor.js
									
									
									
									
									
								
							
							
						
						
									
										428
									
								
								module/actor.js
									
									
									
									
									
								
							| @@ -37,11 +37,17 @@ import { Monnaie } from "./item-monnaie.js"; | |||||||
| export class RdDActor extends Actor { | export class RdDActor extends Actor { | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static init() { |   static init() { | ||||||
|     Hooks.on("deleteActiveEffect", (actor, effect, options) => actor.onDeleteActiveEffect(effect, options)); |     Hooks.on("deleteActiveEffect", (effect, options, userId) => RdDActor.getParentActor(effect)?.onDeleteActiveEffect(effect, options)); | ||||||
|     Hooks.on("createActiveEffect", (actor, effect, options) => actor.onCreateActiveEffect(effect, options)); |     Hooks.on("createActiveEffect", (effect, options, userId) => RdDActor.getParentActor(effect)?.onCreateActiveEffect(effect, options)); | ||||||
|     Hooks.on("createOwnedItem", (actor, item, options, id) => actor.onCreateOwnedItem(item, options, id)); |  | ||||||
|     Hooks.on("deleteOwnedItem", (actor, item, options, id) => actor.onDeleteOwnedItem(item, options, id)); |     Hooks.on("preUpdateItem", (item, change, options, id) => RdDActor.getParentActor(item)?.onPreUpdateItem(item, change, options, id)); | ||||||
|     Hooks.on("updateActor", (actor, update, options, actorId) => actor.onUpdateActor(update, options, actorId)); |     Hooks.on("createItem", (item, options, id) => RdDActor.getParentActor(item)?.onCreateItem(item, options, id)); | ||||||
|  |     Hooks.on("deleteItem", (item, options, id) => RdDActor.getParentActor(item)?.onDeleteItem(item, options, id)); | ||||||
|  |     Hooks.on("updateActor", (actor, change, options, actorId) => actor.onUpdateActor(change, options, actorId)); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   static getParentActor(document) { | ||||||
|  |     return document?.parent instanceof Actor ? document.parent : undefined | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
| @@ -236,33 +242,47 @@ export class RdDActor extends Actor { | |||||||
|     return RdDItemCompetence.findCompetence(this.data.items, name); |     return RdDItemCompetence.findCompetence(this.data.items, name); | ||||||
|   } |   } | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|  |   getObjet(id) { | ||||||
|  |     return id ? this.data.items.find(it => it.id == id) : undefined; | ||||||
|  |   } | ||||||
|  |   getItemOfType(id, type) { | ||||||
|  |     return id ? this.data.items.find(it => it.id == id && it.type == type) : undefined; | ||||||
|  |   } | ||||||
|  |   getMonnaie(id) { | ||||||
|  |     return this.getItemOfType(id, 'monnaie'); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   getTache(id) { |   getTache(id) { | ||||||
|     return this.data.items.find(item => item.type == 'tache' && item._id == id); |     return this.getItemOfType(id, 'tache'); | ||||||
|   } |   } | ||||||
|   getMeditation(id) { |   getMeditation(id) { | ||||||
|     return this.data.items.find(item => item.type == 'meditation' && item._id == id); |     return this.getItemOfType(id, 'meditation'); | ||||||
|   } |   } | ||||||
|   getChant(id) { |   getChant(id) { | ||||||
|     return this.data.items.find(item => item.type == 'chant' && item._id == id); |     return this.getItemOfType(id, 'chant'); | ||||||
|   } |   } | ||||||
|   getDanse(id) { |   getDanse(id) { | ||||||
|     return this.data.items.find(item => item.type == 'danse' && item._id == id); |     return this.getItemOfType(id, 'danse'); | ||||||
|   } |   } | ||||||
|   getMusique(id) { |   getMusique(id) { | ||||||
|     return this.data.items.find(item => item.type == 'musique' && item._id == id); |     return this.getItemOfType(id, 'musique'); | ||||||
|   } |   } | ||||||
|   getOeuvre(id, type = 'oeuvre') { |   getOeuvre(id, type = 'oeuvre') { | ||||||
|     return this.data.items.find(item => item.type == type && item._id == id); |     return this.getItemOfType(id, type); | ||||||
|   } |   } | ||||||
|   getJeu(id) { |   getJeu(id) { | ||||||
|     return this.data.items.find(item => item.type == 'jeu' && item._id == id); |     return this.getItemOfType(id, 'jeu'); | ||||||
|   } |   } | ||||||
|   getRecetteCuisine(id) { |   getRecetteCuisine(id) { | ||||||
|     return this.data.items.find(item => item.type == 'recettecuisine' && item._id == id); |     return this.getItemOfType(id, 'recettecuisine'); | ||||||
|  |   } | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   getDraconicList() { | ||||||
|  |     return this.items.filter(it => Misc.data(it).type == 'competence' && Misc.templateData(it).categorie == 'draconic') | ||||||
|   } |   } | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   getBestDraconic() { |   getBestDraconic() { | ||||||
|     const list = this.getDraconicList().sort((a, b) => b.data.data.niveau - a.data.data.niveau); |     const list = this.getDraconicList().sort(Misc.descending(it => Misc.templateData(it).niveau)); | ||||||
|     if (list.length == 0) { |     if (list.length == 0) { | ||||||
|       return { name: "Aucun", data: { name: "Aucun", data: { niveau: -11 } } }; |       return { name: "Aucun", data: { name: "Aucun", data: { niveau: -11 } } }; | ||||||
|     } |     } | ||||||
| @@ -271,6 +291,7 @@ export class RdDActor extends Actor { | |||||||
|   getDemiReve() { |   getDemiReve() { | ||||||
|     return Misc.templateData(this).reve.tmrpos.coord; |     return Misc.templateData(this).reve.tmrpos.coord; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   async deleteSortReserve(sortReserve) { |   async deleteSortReserve(sortReserve) { | ||||||
|     let reserve = duplicate(Misc.templateData(this).reve.reserve); |     let reserve = duplicate(Misc.templateData(this).reve.reserve); | ||||||
| @@ -289,7 +310,7 @@ export class RdDActor extends Actor { | |||||||
|   getSurprise(isCombat = undefined) { |   getSurprise(isCombat = undefined) { | ||||||
|     let niveauSurprise = Array.from(this.effects?.values() ?? []) |     let niveauSurprise = Array.from(this.effects?.values() ?? []) | ||||||
|       .map(effect => StatusEffects.valeurSurprise(effect.data, isCombat)) |       .map(effect => StatusEffects.valeurSurprise(effect.data, isCombat)) | ||||||
|       .reduce((a, b) => a + b, 0); |       .reduce(Misc.sum(), 0); | ||||||
|     if (niveauSurprise > 1) { |     if (niveauSurprise > 1) { | ||||||
|       return 'totale'; |       return 'totale'; | ||||||
|     } |     } | ||||||
| @@ -593,10 +614,10 @@ export class RdDActor extends Actor { | |||||||
|   async resultCombatReveDeDragon(rollData) { |   async resultCombatReveDeDragon(rollData) { | ||||||
|     rollData.queues = []; |     rollData.queues = []; | ||||||
|     if (rollData.rolled.isEchec) { |     if (rollData.rolled.isEchec) { | ||||||
|       rollData.queues.push(await this.ajouterQueue()); |       rollData.queues.push(Misc.data(await this.ajouterQueue())); | ||||||
|     } |     } | ||||||
|     if (rollData.rolled.isETotal) { |     if (rollData.rolled.isETotal) { | ||||||
|       rollData.queues.push(await this.ajouterQueue()); |       rollData.queues.push(Misc.data(await this.ajouterQueue())); | ||||||
|     } |     } | ||||||
|     if (rollData.rolled.isSuccess) { |     if (rollData.rolled.isSuccess) { | ||||||
|       await this.updatePointDeSeuil(); |       await this.updatePointDeSeuil(); | ||||||
| @@ -614,31 +635,6 @@ export class RdDActor extends Actor { | |||||||
|     }); |     }); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |  | ||||||
|   async appliquerReveDeDragon(roll, force) { |  | ||||||
|     let message = ""; |  | ||||||
|     if (roll.isSuccess) { |  | ||||||
|       message += "<br>Vous gagnez " + force + " points de Rêve"; |  | ||||||
|       await this.updatePointDeSeuil(); |  | ||||||
|       await this.reveActuelIncDec(force); |  | ||||||
|     } |  | ||||||
|     if (roll.isPart) { |  | ||||||
|       // TODO: Dialog pour choix entre HR opu général? |  | ||||||
|       message += "<br>Vous gagnez une Tête de dragon: Demander à votre MJ d'effectuer un tirage sur la table des Hauts Rêvants ou des Vrais Rêvants, selon votre choix."; |  | ||||||
|     } |  | ||||||
|     if (roll.isEchec) { |  | ||||||
|       message += "<br>Vous subissez une Queue de Dragon: " + await this.ajouterQueue(); |  | ||||||
|     } |  | ||||||
|     if (roll.isETotal) { |  | ||||||
|       message += "<br>A cause de votre échec total, vous subissez une deuxième Queue de Dragon: " + await this.ajouterQueue(); |  | ||||||
|     } |  | ||||||
|     ChatMessage.create({ |  | ||||||
|       whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), |  | ||||||
|       content: message |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   async sortMisEnReserve(rollData, sort) { |   async sortMisEnReserve(rollData, sort) { | ||||||
|     let reserve = duplicate(Misc.templateData(this).reve.reserve.list); |     let reserve = duplicate(Misc.templateData(this).reve.reserve.list); | ||||||
| @@ -683,7 +679,7 @@ export class RdDActor extends Actor { | |||||||
|     let comp = this.getCompetence(compName); |     let comp = this.getCompetence(compName); | ||||||
|     //console.log(comp); |     //console.log(comp); | ||||||
|     if (comp) { |     if (comp) { | ||||||
|       const update = { _id: comp._id } |       const update = { _id: comp.id } | ||||||
|       if (fieldName == "niveau") |       if (fieldName == "niveau") | ||||||
|         update['data.niveau'] = compValue; |         update['data.niveau'] = compValue; | ||||||
|       else if (fieldName == "dommages") |       else if (fieldName == "dommages") | ||||||
| @@ -691,7 +687,7 @@ export class RdDActor extends Actor { | |||||||
|       else |       else | ||||||
|         update['data.carac_value'] = compValue; |         update['data.carac_value'] = compValue; | ||||||
|       //console.log(update); |       //console.log(update); | ||||||
|       const updated = await this.updateEmbeddedEntity("Item", update); // Updates one EmbeddedEntity |       const updated = await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -711,8 +707,8 @@ export class RdDActor extends Actor { | |||||||
|           content: message |           content: message | ||||||
|         }); |         }); | ||||||
|       } |       } | ||||||
|       const update = { _id: comp._id, 'data.niveau': nouveauNiveau }; |       const update = { _id: comp.id, 'data.niveau': nouveauNiveau }; | ||||||
|       await this.updateEmbeddedEntity("Item", update); // Updates one EmbeddedEntity |       await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity | ||||||
|     } else { |     } else { | ||||||
|       console.log("Competence not found", compName); |       console.log("Competence not found", compName); | ||||||
|     } |     } | ||||||
| @@ -724,8 +720,8 @@ export class RdDActor extends Actor { | |||||||
|     if (comp) { |     if (comp) { | ||||||
|       compValue = compValue ?? 0; |       compValue = compValue ?? 0; | ||||||
|       this.checkCompetenceXP(compName, compValue); |       this.checkCompetenceXP(compName, compValue); | ||||||
|       const update = { _id: comp._id, 'data.xp': compValue }; |       const update = { _id: comp.id, 'data.xp': compValue }; | ||||||
|       await this.updateEmbeddedEntity("OwnedItem", update); // Updates one EmbeddedEntity |       await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity | ||||||
|     } else { |     } else { | ||||||
|       console.log("Competence not found", compName); |       console.log("Competence not found", compName); | ||||||
|     } |     } | ||||||
| @@ -737,8 +733,8 @@ export class RdDActor extends Actor { | |||||||
|     let comp = this.getCompetence(compName); |     let comp = this.getCompetence(compName); | ||||||
|     if (comp) { |     if (comp) { | ||||||
|       compValue = compValue ?? 0; |       compValue = compValue ?? 0; | ||||||
|       const update = { _id: comp._id, 'data.xp_sort': compValue }; |       const update = { _id: comp.id, 'data.xp_sort': compValue }; | ||||||
|       await this.updateEmbeddedEntity("OwnedItem", update); // Updates one EmbeddedEntity |       await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity | ||||||
|     } else { |     } else { | ||||||
|       console.log("Competence not found", compName); |       console.log("Competence not found", compName); | ||||||
|     } |     } | ||||||
| @@ -749,8 +745,8 @@ export class RdDActor extends Actor { | |||||||
|     let comp = this.getCompetence(compName); |     let comp = this.getCompetence(compName); | ||||||
|     if (comp) { |     if (comp) { | ||||||
|       compValue = compValue ?? 0; |       compValue = compValue ?? 0; | ||||||
|       const update = { _id: comp._id, 'data.niveau_archetype': compValue }; |       const update = { _id: comp.id, 'data.niveau_archetype': compValue }; | ||||||
|       await this.updateEmbeddedEntity("OwnedItem", update); // Updates one EmbeddedEntity |       await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity | ||||||
|     } else { |     } else { | ||||||
|       console.log("Competence not found", compName); |       console.log("Competence not found", compName); | ||||||
|     } |     } | ||||||
| @@ -768,42 +764,55 @@ export class RdDActor extends Actor { | |||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   validateConteneur(itemId, conteneurId) { |   validateConteneur(itemId, conteneurId) { | ||||||
|     let conteneurDest = this.items.find(conteneur => conteneurId == conteneur.id);  // recup conteneur |     const dest = this.getObjet(conteneurId); | ||||||
|     let conteneurSrc = this.items.find(conteneur => itemId == conteneur.id && conteneur.type == 'conteneur'); |     if (dest?.type != 'conteneur') { | ||||||
|     if (conteneurSrc) { // Si c'est un conteneur, il faut vérifier qu'on ne le déplace pas vers un sous-conteneur lui appartenant |       ui.notifications.warn(`Impossible de déplacer un objet (${item.name}) vers un ${dest.type} qui n'est pas un conteneur (${dest.name}) !`); | ||||||
|       for (let id of conteneurSrc.data.data.contenu) { |       return false; | ||||||
|         let subObjet = this.items.find(subobj => id == subobj.id); |     } | ||||||
|         if (subObjet && subObjet.id == conteneurDest.id) { |     const item = this.getObjet(itemId); | ||||||
|           ui.notifications.warn("Impossible de déplacer un conteneur parent dans son fils !"); |     if (this._isConteneurContenu(item, conteneurId)) { | ||||||
|  |       ui.notifications.warn(`Impossible de déplacer un conteneur parent (${item.name}) dans un de ses contenus ${dest.name} !`); | ||||||
|       return false; // Loop detected ! |       return false; // Loop detected ! | ||||||
|     } |     } | ||||||
|         if (subObjet && subObjet.type == 'conteneur') { |  | ||||||
|           return this.validateConteneur(subObjet.id, conteneurId); |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|     return true; |     return true; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   _isConteneurContenu(item, conteneurId) { | ||||||
|  |     if (item?.type == 'conteneur') { // Si c'est un conteneur, il faut vérifier qu'on ne le déplace pas vers un sous-conteneur lui appartenant | ||||||
|  |       for (let id of Misc.templateData(item).contenu) { | ||||||
|  |         let subObjet = this.getObjet(id); | ||||||
|  |         if (subObjet?.id == conteneurId) { | ||||||
|  |           return true; // Loop detected ! | ||||||
|  |         } | ||||||
|  |         if (subObjet?.type == 'conteneur') { | ||||||
|  |           return this._isConteneurContenu(subObjet, conteneurId); | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     return false; | ||||||
|  |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   getRecursiveEnc(objet) { |   getRecursiveEnc(objet) { | ||||||
|     let sumEnc = 0; |     if (!objet) { | ||||||
|     if (objet.type == 'conteneur') { |       return 0; | ||||||
|       for (let id of objet.data.data.contenu) { |  | ||||||
|         let subobjet = this.items.find(objet => (id == objet.id)); |  | ||||||
|         if (subobjet) { |  | ||||||
|           if (subobjet && subobjet.type == 'conteneur') { |  | ||||||
|             sumEnc += this.getRecursiveEnc(subobjet); |  | ||||||
|           } else { |  | ||||||
|             sumEnc += Number(subobjet.data.data.encombrement) * Number(subobjet.data.data.quantite); |  | ||||||
|     } |     } | ||||||
|  |     const tplData = Misc.templateData(objet); | ||||||
|  |     if (objet.type != 'conteneur') { | ||||||
|  |       return Number(tplData.encombrement) * Number(tplData.quantite); | ||||||
|     } |     } | ||||||
|  |     const encContenus = tplData.contenu.map(idContenu => this.getRecursiveEnc(this.getObjet(idContenu))); | ||||||
|  |     return encContenus.reduce(Misc.sum(), 0) | ||||||
|  |       + Number(tplData.encombrement) /* TODO? Number(tplData.quantite) -- on pourrait avoir plusieurs conteneurs...*/ | ||||||
|   } |   } | ||||||
|       sumEnc += Number(objet.data.data.encombrement) |  | ||||||
|     } else { |   /* -------------------------------------------- */ | ||||||
|       sumEnc += Number(objet.data.data.encombrement) * Number(objet.data.data.quantite); |   isConteneurSuffisant(itemId, conteneurId) { | ||||||
|  |     if (!conteneurId) { | ||||||
|  |       // on peut toujours vider son sac | ||||||
|  |       return true; | ||||||
|     } |     } | ||||||
|     return sumEnc; |     return this.validateConteneur(itemId, conteneurId) && this.testConteneurCapacite(itemId, conteneurId); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
| @@ -811,65 +820,66 @@ export class RdDActor extends Actor { | |||||||
|    * pour recevoir le nouvel objet |    * pour recevoir le nouvel objet | ||||||
|    */ |    */ | ||||||
|   testConteneurCapacite(itemId, conteneurId) { |   testConteneurCapacite(itemId, conteneurId) { | ||||||
|     if (!conteneurId) return true; // pas de conteneur (porté sur soi), donc toujours OK. |     let conteneur = this.getObjet(conteneurId);  // recup conteneur (ou undefined) | ||||||
|     let conteneur = this.items.find(conteneur => conteneurId == conteneur.id);  // recup conteneur |  | ||||||
|     //console.log("Conteneur trouvé : ", conteneur); |     //console.log("Conteneur trouvé : ", conteneur); | ||||||
|     if (conteneur && conteneur.type == "conteneur") { |     if (conteneur?.type != "conteneur") { | ||||||
|       // Calculer le total actuel des contenus |       return true; | ||||||
|       let encContenu = this.getRecursiveEnc(conteneur) - Number(conteneur.data.data.encombrement); |  | ||||||
|       let nouvelObjet = this.items.find(objet => (itemId == objet.id)); // On chope l'objet |  | ||||||
|       let newEnc = (nouvelObjet) ? this.getRecursiveEnc(nouvelObjet) : 0; // Calculer le total actuel du nouvel objet |  | ||||||
|       //console.log( currentEnc, newEnc, conteneur.data.data.capacite, conteneur.name); |  | ||||||
|       if (nouvelObjet && ((encContenu + newEnc) > Number(conteneur.data.data.capacite))) { |  | ||||||
|         ui.notifications.warn("Capacité d'encombrement insuffisante dans le conteneur !"); |  | ||||||
|         return false; |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     const tplConteneur = Misc.templateData(conteneur); | ||||||
|  |     // Calculer le total actuel des contenus | ||||||
|  |     let encContenu = this.getRecursiveEnc(conteneur) - Number(tplConteneur.encombrement); | ||||||
|  |     let nouvelObjet = this.getObjet(itemId); | ||||||
|  |     let newEnc = this.getRecursiveEnc(nouvelObjet); // Calculer le total actuel du nouvel objet | ||||||
|  |     //console.log( currentEnc, newEnc, tplConteneur.capacite, conteneur.name); | ||||||
|  |     if (nouvelObjet && ((encContenu + newEnc) > Number(tplConteneur.capacite))) { | ||||||
|  |       ui.notifications.warn( | ||||||
|  |         `Le conteneur ${conteneur.name} a une capacité de ${tplConteneur.capacite}, et contient déjà ${encContenu}. | ||||||
|  |         Impossible d'y ranger: ${nouvelObjet.name} d'encombrement ${newEnc}!`); | ||||||
|  |       return false; | ||||||
|     } |     } | ||||||
|     return true; |     return true; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   buildSubConteneurObjetList(conteneurId, deleteList) { |   buildSubConteneurObjetList(conteneurId, deleteList) { | ||||||
|     let conteneur = this.items.find(conteneur => conteneurId == conteneur._id);  // recup conteneur |     let conteneur = this.getObjet(conteneurId); | ||||||
|     if (conteneur && conteneur.type == 'conteneur') { // Si présent |     if (conteneur?.type == 'conteneur') { // Si c'est un conteneur | ||||||
|       for (let subId of conteneur.data.data.contenu) { |       for (let subId of Misc.templateData(conteneur).contenu) { | ||||||
|         let subObj = this.items.find(subobjet => subId == subobjet._id);  // recup conteneur |         let subObj = this.getObjet(subId); | ||||||
|         if (subObj && subObj.type == 'conteneur') { |         if (subObj) { | ||||||
|  |           if (subObj.type == 'conteneur') { | ||||||
|             this.buildSubConteneurObjetList(subId, deleteList); |             this.buildSubConteneurObjetList(subId, deleteList); | ||||||
|           } |           } | ||||||
|         if (subObj) // Robust... |  | ||||||
|           deleteList.push({ id: subId, conteneurId: conteneurId }); |           deleteList.push({ id: subId, conteneurId: conteneurId }); | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   async deleteAllConteneur(itemId) { |   async deleteAllConteneur(itemId) { | ||||||
|     let list = []; |     let list = []; | ||||||
|     list.push({ id: itemId, conteneurId: undefined }); // Init list |     list.push({ id: itemId, conteneurId: undefined }); // Init list | ||||||
|     this.buildSubConteneurObjetList(itemId, list); |     this.buildSubConteneurObjetList(itemId, list); | ||||||
|     //console.log("List to delete", list); |     await this.deleteEmbeddedDocuments('Item', list.map(it => it.id)); | ||||||
|     for (let item of list) { |  | ||||||
|       await this.deleteOwnedItem(item.id); |  | ||||||
|     } |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   /** Supprime un item d'un conteneur, sur la base  |   /** Supprime un item d'un conteneur, sur la base  | ||||||
|    * de leurs ID */ |    * de leurs ID */ | ||||||
|   async enleverDeConteneur(itemId, conteneurId) { |   async enleverDeConteneur(itemId, conteneurId) { | ||||||
|     if (!conteneurId) return; // pas de conteneur (porté sur soi) |     let conteneur = this.getObjet(conteneurId); | ||||||
|     let conteneur = this.items.find(conteneur => conteneurId == conteneur.id);  // recup conteneur |     if (conteneur?.type == 'conteneur') { // Si présent | ||||||
|     if (conteneur) { // Si présent |       let data2use = duplicate(Misc.data(conteneur)); | ||||||
|       let data2use = duplicate(conteneur.data); |       //console.log("Suppression du conteneur1", conteneurId, itemId,  data2use.data.contenu); | ||||||
|       //console.log("Suppression du conteneur1", conteneurId, itemId,  conteneur.data.data.contenu); |  | ||||||
|       let contenu = data2use.data.contenu; |       let contenu = data2use.data.contenu; | ||||||
|       let index = contenu.indexOf(itemId); |       let index = contenu.indexOf(itemId); | ||||||
|       while (index >= 0) { // Force cleanup, itemId is unique |       while (index >= 0) { // Force cleanup, itemId is unique | ||||||
|         contenu.splice(index, 1); |         contenu.splice(index, 1); | ||||||
|         index = contenu.indexOf(itemId); |         index = contenu.indexOf(itemId); | ||||||
|       } |       } | ||||||
|       await this.updateEmbeddedEntity("OwnedItem", data2use); |       await this.updateEmbeddedDocuments('Item', [data2use]); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -877,27 +887,26 @@ export class RdDActor extends Actor { | |||||||
|   /** Ajoute un item dans un conteneur, sur la base  |   /** Ajoute un item dans un conteneur, sur la base  | ||||||
|    * de leurs ID */ |    * de leurs ID */ | ||||||
|   async ajouterAConteneur(itemId, conteneurId) { |   async ajouterAConteneur(itemId, conteneurId) { | ||||||
|     if (!conteneurId) return; // pas de conteneur (porté sur soi) |     let conteneur = this.getObjet(conteneurId); | ||||||
|     let conteneur = this.items.find(conteneur => conteneurId == conteneur.id); |     if (conteneur?.type == 'conteneur') { | ||||||
|     if (conteneur && conteneur.data.type == 'conteneur') { |       let data2use = duplicate(Misc.data(conteneur)); | ||||||
|       let data2use = duplicate(conteneur.data); |  | ||||||
|       data2use.data.contenu.push(itemId); |       data2use.data.contenu.push(itemId); | ||||||
|       await this.updateEmbeddedEntity("OwnedItem", data2use); |       await this.updateEmbeddedDocuments('Item', [data2use]); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   /** Fonction de remise à plat de l'équipement (ie vide les champs 'contenu') */ |   /** Fonction de remise à plat de l'équipement (ie vide les champs 'contenu') */ | ||||||
|   async nettoyerConteneurs() { |   async nettoyerConteneurs() { | ||||||
|     let conteneurList = this.items.filter(conteneur => conteneur.type == 'conteneur'); |     let conteneurs = this.items.filter(it => it.type == 'conteneur'); | ||||||
|     let conteneurFixedList = []; |     let conteneurFixedList = []; | ||||||
|     for (let conteneur of conteneurList) { |     for (let conteneur of conteneurs) { | ||||||
|       if (conteneur.data.data.contenu.length > 0) { |       if (Misc.templateData(conteneur).contenu.length > 0) { | ||||||
|         conteneurFixedList.push({ _id: conteneur._id, 'data.contenu': [] }); |         conteneurFixedList.push({ _id: conteneur._id, 'data.contenu': [] }); | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|     if (conteneurFixedList.length > 0) |     if (conteneurFixedList.length > 0) | ||||||
|       await this.updateOwnedItem(conteneurFixedList); |       await this.updateEmbeddedDocuments('Item', conteneurFixedList); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
| @@ -925,11 +934,11 @@ export class RdDActor extends Actor { | |||||||
|         console.log('New conteneur filling!', newConteneur, newItemId, item); |         console.log('New conteneur filling!', newConteneur, newItemId, item); | ||||||
|         let contenu = duplicate(newConteneur.data.contenu); |         let contenu = duplicate(newConteneur.data.contenu); | ||||||
|         contenu.push(newItemId); |         contenu.push(newItemId); | ||||||
|         await this.updateOwnedItem({ _id: newConteneurId, 'data.contenu': contenu }); |         await this.updateEmbeddedDocuments('Item', [{ _id: newConteneurId, 'data.contenu': contenu }]); | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|     for (let item of itemsList) { |     for (let item of itemsList) { | ||||||
|       await sourceActor.deleteOwnedItem(item.id); |       await sourceActor.deleteEmbeddedDocuments('Item', [item.id]); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -1076,7 +1085,7 @@ export class RdDActor extends Actor { | |||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   async ajouterQueue(options = { chat: false }) { |   async ajouterQueue(options = { chat: false }) { | ||||||
|     let queue; |     let queue; | ||||||
|     if (Misc.templateData(this).reve.reve.thanatosused) { |     if (Misc.data(this).data.reve.reve.thanatosused) { | ||||||
|       queue = await RdDRollTables.getOmbre(); |       queue = await RdDRollTables.getOmbre(); | ||||||
|       await this.update({ "data.reve.reve.thanatosused": false }); |       await this.update({ "data.reve.reve.thanatosused": false }); | ||||||
|     } |     } | ||||||
| @@ -1743,15 +1752,16 @@ export class RdDActor extends Actor { | |||||||
|     let draconicList = this.getDraconicList(); |     let draconicList = this.getDraconicList(); | ||||||
|     let bestDraconic = this.getBestDraconic(); |     let bestDraconic = this.getBestDraconic(); | ||||||
|     for (let sort of sortList) { |     for (let sort of sortList) { | ||||||
|       let voie = sort.data.draconic.toLowerCase(); |       let voie = sort.data.draconic; | ||||||
|       let draconic = draconicList.find(it => it.data.data.categorie == 'draconic' && it.data.name.toLowerCase().includes(voie)); |       let draconic = RdDItemCompetence.getVoieDraconic(draconicList, voie); | ||||||
|       //console.log(draconicList, bestDraconic, draconic, voie); |       //console.log(draconicList, bestDraconic, draconic, voie); | ||||||
|       if (sort.name.toLowerCase().includes('aura')) { |       if (sort.name.toLowerCase().includes('aura')) { | ||||||
|         draconic = bestDraconic; |         draconic = bestDraconic; | ||||||
|       } |       } | ||||||
|       draconic = duplicate(draconic); |       // TODO: duplicate sur Misc.data? | ||||||
|  |       draconic = duplicate(Misc.data(draconic)); | ||||||
|       if (draconicDone[draconic.name] == undefined) { |       if (draconicDone[draconic.name] == undefined) { | ||||||
|         draconic.data.data.defaut_carac = 'reve'; |         draconic.data.defaut_carac = 'reve'; | ||||||
|         newDraconicList.push(draconic); |         newDraconicList.push(draconic); | ||||||
|         draconicDone[draconic.name] = newDraconicList.length - 1; // Patch local pour relier facilement voie/compétence |         draconicDone[draconic.name] = newDraconicList.length - 1; // Patch local pour relier facilement voie/compétence | ||||||
|       } |       } | ||||||
| @@ -1788,7 +1798,7 @@ export class RdDActor extends Actor { | |||||||
|       competence: draconicList[0], |       competence: draconicList[0], | ||||||
|       selectedSort: sortList[0], |       selectedSort: sortList[0], | ||||||
|       tmr: TMRUtility.getTMR(coord), |       tmr: TMRUtility.getTMR(coord), | ||||||
|       diffLibre: sortList[0].data.difficulte, // Per default at startup |       diffLibre: RdDItemSort.getDifficulte(sortList[0], -7), // Per default at startup | ||||||
|       coutreve: Array(30).fill().map((item, index) => 1 + index), |       coutreve: Array(30).fill().map((item, index) => 1 + index), | ||||||
|       carac: { 'reve': duplicate(actorData.data.carac.reve) } |       carac: { 'reve': duplicate(actorData.data.carac.reve) } | ||||||
|     } |     } | ||||||
| @@ -1826,7 +1836,7 @@ export class RdDActor extends Actor { | |||||||
|     if (rencSpecial) { |     if (rencSpecial) { | ||||||
|       rencSpecial = duplicate(rencSpecial); // To keep it |       rencSpecial = duplicate(rencSpecial); // To keep it | ||||||
|       if (rencSpecial.type != 'souffle') { |       if (rencSpecial.type != 'souffle') { | ||||||
|         this.deleteOwnedItem(rencSpecial._id); // Suppression dans la liste des queues |         this.deleteEmbeddedDocuments('Item', [rencSpecial._id]); // Suppression dans la liste des queues | ||||||
|         addMsg = " La queue a été supprimée de votre fiche automatiquement"; |         addMsg = " La queue a été supprimée de votre fiche automatiquement"; | ||||||
|       } else { |       } else { | ||||||
|         addMsg = " Vous devez gérer manuellement le décompte de mauvaises rencontres manuellement."; |         addMsg = " Vous devez gérer manuellement le décompte de mauvaises rencontres manuellement."; | ||||||
| @@ -2031,23 +2041,25 @@ export class RdDActor extends Actor { | |||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   async rollTache(id) { |   async rollTache(id) { | ||||||
|     let tache = duplicate(this.getTache(id)); |     const actorData = Misc.data(this); | ||||||
|     let competence = this.getCompetence(tache.data.competence); |     const tacheData = Misc.data(this.getTache(id)); | ||||||
|     competence.data.data.defaut_carac = tache.data.carac; // Patch ! |     const compData = duplicate(Misc.data(this.getCompetence(tacheData.data.competence))); | ||||||
|  |     compData.data.defaut_carac = tacheData.data.carac; // Patch ! | ||||||
|  |  | ||||||
|     let rollData = { |     let rollData = { | ||||||
|       competence: competence, |       competence: compData, | ||||||
|       tache: tache, |       tache: tacheData, | ||||||
|       diffConditions: tache.data.difficulte, |       diffConditions: tacheData.data.difficulte, | ||||||
|       use: { libre: false, conditions: false }, |       use: { libre: false, conditions: false }, | ||||||
|       carac: {} |       carac: {} | ||||||
|     }; |     }; | ||||||
|     rollData.carac[tache.data.carac] = duplicate(Misc.templateData(this).carac[tache.data.carac]); // Single carac |     rollData.carac[tacheData.data.carac] = duplicate(actorData.data.carac[tacheData.data.carac]); // Single carac | ||||||
|  |  | ||||||
|     console.log("rollTache !!!", rollData); |     console.log("rollTache !!!", rollData); | ||||||
|  |  | ||||||
|     const dialog = await RdDRoll.create(this, rollData, { html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-competence.html' }, { |     const dialog = await RdDRoll.create(this, rollData, { html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-competence.html' }, { | ||||||
|       name: 'jet-competence', |       name: 'jet-competence', | ||||||
|       label: 'Jet de Tâche ' + tache.name, |       label: 'Jet de Tâche ' + tacheData.name, | ||||||
|       callbacks: [ |       callbacks: [ | ||||||
|         this.createCallbackExperience(), |         this.createCallbackExperience(), | ||||||
|         this.createCallbackAppelAuMoral(), |         this.createCallbackAppelAuMoral(), | ||||||
| @@ -2062,7 +2074,7 @@ export class RdDActor extends Actor { | |||||||
|   async _tacheResult(rollData) { |   async _tacheResult(rollData) { | ||||||
|     // Mise à jour de la tache |     // Mise à jour de la tache | ||||||
|     rollData.tache.data.points_de_tache_courant += rollData.rolled.ptTache; |     rollData.tache.data.points_de_tache_courant += rollData.rolled.ptTache; | ||||||
|     this.updateEmbeddedEntity("OwnedItem", rollData.tache); |     this.updateEmbeddedDocuments('Item', [rollData.tache]); | ||||||
|     this.santeIncDec("fatigue", rollData.tache.data.fatigue); |     this.santeIncDec("fatigue", rollData.tache.data.fatigue); | ||||||
|  |  | ||||||
|     RdDResolutionTable.displayRollData(rollData, this, 'chat-resultat-tache.html'); |     RdDResolutionTable.displayRollData(rollData, this, 'chat-resultat-tache.html'); | ||||||
| @@ -2071,7 +2083,7 @@ export class RdDActor extends Actor { | |||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   _tacheETotal(rollData) { |   _tacheETotal(rollData) { | ||||||
|     rollData.tache.data.difficulte--; |     rollData.tache.data.difficulte--; | ||||||
|     this.updateEmbeddedEntity("OwnedItem", rollData.tache); |     this.updateEmbeddedDocuments('Item', [rollData.tache]); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
| @@ -2127,7 +2139,7 @@ export class RdDActor extends Actor { | |||||||
|   async rollDanse(id) { |   async rollDanse(id) { | ||||||
|     const actorData = Misc.data(this); |     const actorData = Misc.data(this); | ||||||
|     const artData = { art: 'danse', verbe: 'Danser', forceCarac: {} }; |     const artData = { art: 'danse', verbe: 'Danser', forceCarac: {} }; | ||||||
|     const oeuvre = duplicate(this.getOeuvre(id, artData.art)); |     const oeuvre = duplicate(this.getItemOfType(id, artData.art)); | ||||||
|     const selectedCarac = this._getCaracDanse(oeuvre); |     const selectedCarac = this._getCaracDanse(oeuvre); | ||||||
|     if (oeuvre.data.agilite) { |     if (oeuvre.data.agilite) { | ||||||
|       artData.forceCarac['agilite'] = duplicate(actorData.data.carac.agilite); |       artData.forceCarac['agilite'] = duplicate(actorData.data.carac.agilite); | ||||||
| @@ -2149,7 +2161,7 @@ export class RdDActor extends Actor { | |||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   async rollMusique(id) { |   async rollMusique(id) { | ||||||
|     const artData = { art: 'musique', verbe: 'Jouer' }; |     const artData = { art: 'musique', verbe: 'Jouer' }; | ||||||
|     const oeuvre = duplicate(this.getOeuvre(id, artData.art)); |     const oeuvre = duplicate(this.getItemOfType(id, artData.art)); | ||||||
|     await this._rollArt(artData, "ouie", oeuvre); |     await this._rollArt(artData, "ouie", oeuvre); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -2181,7 +2193,7 @@ export class RdDActor extends Actor { | |||||||
|  |  | ||||||
|   async rollOeuvre(id) { |   async rollOeuvre(id) { | ||||||
|     const artData = { art: 'oeuvre', verbe: 'Interpréter' }; |     const artData = { art: 'oeuvre', verbe: 'Interpréter' }; | ||||||
|     const oeuvre = duplicate(this.getOeuvre(id)); |     const oeuvre = duplicate(this.getItemOfType(id, artData.art)); | ||||||
|     await this._rollArt(artData, oeuvre.data.default_carac, oeuvre); |     await this._rollArt(artData, oeuvre.data.default_carac, oeuvre); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -2236,7 +2248,7 @@ export class RdDActor extends Actor { | |||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   _meditationETotal(meditationData) { |   _meditationETotal(meditationData) { | ||||||
|     meditationData.meditation.data.malus--; |     meditationData.meditation.data.malus--; | ||||||
|     this.updateEmbeddedEntity("OwnedItem", meditationData.meditation); |     this.updateEmbeddedDocuments('Item', [meditationData.meditation]); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
| @@ -2339,7 +2351,7 @@ export class RdDActor extends Actor { | |||||||
|         xpComp = xp - xpCarac; |         xpComp = xp - xpCarac; | ||||||
|         competence = duplicate(competence); |         competence = duplicate(competence); | ||||||
|         competence.data.xp = Misc.toInt(competence.data.xp) + xpComp; |         competence.data.xp = Misc.toInt(competence.data.xp) + xpComp; | ||||||
|         await this.updateEmbeddedEntity("OwnedItem", competence); |         await this.updateEmbeddedDocuments('Item', [competence]); | ||||||
|       } else { |       } else { | ||||||
|         xpCarac = Math.max(xpCarac, 1); |         xpCarac = Math.max(xpCarac, 1); | ||||||
|       } |       } | ||||||
| @@ -2373,12 +2385,12 @@ export class RdDActor extends Actor { | |||||||
|       name: "Nombre Astral", type: "nombreastral", data: |       name: "Nombre Astral", type: "nombreastral", data: | ||||||
|         { value: data.nbAstral, istrue: data.isvalid, jourindex: Number(data.date), jourlabel: game.system.rdd.calendrier.getDateFromIndex(Number(data.date)) } |         { value: data.nbAstral, istrue: data.isvalid, jourindex: Number(data.date), jourlabel: game.system.rdd.calendrier.getDateFromIndex(Number(data.date)) } | ||||||
|     }; |     }; | ||||||
|     await this.createEmbeddedEntity("OwnedItem", item); |     await this.createEmbeddedDocuments("Item", [item]); | ||||||
|  |  | ||||||
|     // Suppression des anciens nombres astraux |     // Suppression des anciens nombres astraux | ||||||
|     let toDelete = this.data.items.filter(it => it.data.jourindex < game.system.rdd.calendrier.getCurrentDayIndex()); |     let toDelete = this.data.items.filter(it => it.data.jourindex < game.system.rdd.calendrier.getCurrentDayIndex()); | ||||||
|     const deletions = toDelete.map(it => it._id); |     const deletions = toDelete.map(it => it._id); | ||||||
|     await this.deleteEmbeddedEntity("OwnedItem", deletions); |     await this.deleteEmbeddedDocuments("Item", deletions); | ||||||
|  |  | ||||||
|     // Affichage Dialog |     // Affichage Dialog | ||||||
|     this.astrologieNombresAstraux(); |     this.astrologieNombresAstraux(); | ||||||
| @@ -2442,11 +2454,6 @@ export class RdDActor extends Actor { | |||||||
|     return this.data.items.filter(it => it.data.type == "sort"); |     return this.data.items.filter(it => it.data.type == "sort"); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |  | ||||||
|   getDraconicList() { |  | ||||||
|     return this.data.items.filter(it => it.data.data.categorie == 'draconic') |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   countMonteeLaborieuse() { // Return +1 par queue/ombre/souffle Montée Laborieuse présente |   countMonteeLaborieuse() { // Return +1 par queue/ombre/souffle Montée Laborieuse présente | ||||||
|     let countMonteeLaborieuse = this.data.items.filter(it => EffetsDraconiques.isMonteeLaborieuse(it)).length; |     let countMonteeLaborieuse = this.data.items.filter(it => EffetsDraconiques.isMonteeLaborieuse(it)).length; | ||||||
| @@ -2525,7 +2532,7 @@ export class RdDActor extends Actor { | |||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   getArmeParade(armeParadeId) { |   getArmeParade(armeParadeId) { | ||||||
|     const item = armeParadeId ? this.getOwnedItem(armeParadeId) : undefined; |     const item = armeParadeId ? this.getEmbeddedDocuments('Item', armeParadeId) : undefined; | ||||||
|     return RdDItemArme.getArmeData(item); |     return RdDItemArme.getArmeData(item); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -2542,12 +2549,12 @@ export class RdDActor extends Actor { | |||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   async equiperObjet(itemID) { |   async equiperObjet(itemID) { | ||||||
|     let item = this.getOwnedItem(itemID); |     let item = this.getEmbeddedDocuments('Item', itemID); | ||||||
|     if (item?.data?.data) { |     if (item?.data?.data) { | ||||||
|       let itemData = Misc.itemData(item); |       let itemData = Misc.itemData(item); | ||||||
|       const isEquipe = !itemData.data.equipe; |       const isEquipe = !itemData.data.equipe; | ||||||
|       let update = { _id: item._id, "data.equipe": isEquipe }; |       let update = { _id: item._id, "data.equipe": isEquipe }; | ||||||
|       await this.updateEmbeddedEntity("OwnedItem", update); |       await this.updateEmbeddedDocuments('Item', [update]); | ||||||
|       this.computeEncombrementTotalEtMalusArmure(); // Mise à jour encombrement |       this.computeEncombrementTotalEtMalusArmure(); // Mise à jour encombrement | ||||||
|       this.computePrixTotalEquipement(); // Mis à jour du prix total de l'équipement |       this.computePrixTotalEquipement(); // Mis à jour du prix total de l'équipement | ||||||
|       if (isEquipe) |       if (isEquipe) | ||||||
| @@ -2587,7 +2594,7 @@ export class RdDActor extends Actor { | |||||||
|     if (!ReglesOptionelles.isUsing('deteriorationArmure')) { |     if (!ReglesOptionelles.isUsing('deteriorationArmure')) { | ||||||
|       return; |       return; | ||||||
|     } |     } | ||||||
|     let itemData = duplicate(Misc.itemData(item)); |     let itemData = duplicate(Misc.data(item)); | ||||||
|     itemData.data.deterioration = (itemData.data.deterioration ?? 0) + dmg; |     itemData.data.deterioration = (itemData.data.deterioration ?? 0) + dmg; | ||||||
|     if (itemData.data.deterioration >= 10) { |     if (itemData.data.deterioration >= 10) { | ||||||
|       itemData.data.deterioration = 0; |       itemData.data.deterioration = 0; | ||||||
| @@ -2604,7 +2611,7 @@ export class RdDActor extends Actor { | |||||||
|       } |       } | ||||||
|       ChatMessage.create({ content: "Votre armure s'est détériorée, elle protège maintenant de " + itemData.data.protection }); |       ChatMessage.create({ content: "Votre armure s'est détériorée, elle protège maintenant de " + itemData.data.protection }); | ||||||
|     } |     } | ||||||
|     this.updateEmbeddedEntity("OwnedItem", itemData); |     this.updateEmbeddedDocuments('Item', [itemData]); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
| @@ -2799,14 +2806,13 @@ export class RdDActor extends Actor { | |||||||
|       || entite.isEntiteCauchemarAccordee(this)) { |       || entite.isEntiteCauchemarAccordee(this)) { | ||||||
|       return true; |       return true; | ||||||
|     } |     } | ||||||
|  |     const tplData = Misc.templateData(this); | ||||||
|     let rolled = await RdDResolutionTable.roll(this.getReveActuel(), - Number(entite.data.data.carac.niveau.value)); |     let rolled = await RdDResolutionTable.roll(this.getReveActuel(), - Number(tplData.carac.niveau.value)); | ||||||
|     const actorData = Misc.data(this); |  | ||||||
|     const rollData = { |     const rollData = { | ||||||
|       alias: this.name, |       alias: this.name, | ||||||
|       rolled: rolled, |       rolled: rolled, | ||||||
|       entite: entite.name, |       entite: entite.name, | ||||||
|       selectedCarac: actorData.data.carac.reve |       selectedCarac: tplData.carac.reve | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     if (rolled.isSuccess) { |     if (rolled.isSuccess) { | ||||||
| @@ -2850,17 +2856,18 @@ export class RdDActor extends Actor { | |||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   async optimizeArgent(sumDenier, monnaies) { |   async optimizeArgent(sumDenier, monnaies) { | ||||||
|  |  | ||||||
|     let parValeur = Misc.classifyFirst(monnaies, it => it.data.valeur_deniers); |     let parValeur = Misc.classifyFirst(monnaies, it => Misc.templateData(it).valeur_deniers); | ||||||
|     let fortune = { |     let fortune = { | ||||||
|       1000: Math.floor(sumDenier / 1000), // or |       1000: Math.floor(sumDenier / 1000), // or | ||||||
|       100: Math.floor(sumDenier / 100) % 10, // argent |       100: Math.floor(sumDenier / 100) % 10, // argent | ||||||
|       10: Math.floor(sumDenier / 10) % 10, // bronze |       10: Math.floor(sumDenier / 10) % 10, // bronze | ||||||
|       1: sumDenier % 10 // étain |       1: sumDenier % 10 // étain | ||||||
|     } |     } | ||||||
|  |     let updates = [] | ||||||
|     for (const [valeur, nombre] of Object.entries(fortune)) { |     for (const [valeur, nombre] of Object.entries(fortune)) { | ||||||
|       let piece = parValeur[valeur]; |       updates.push( { _id: parValeur[valeur]._id, 'data.quantite': nombre }); | ||||||
|       await this.updateEmbeddedEntity("OwnedItem", { _id: piece._id, 'data.quantite': nombre }); |  | ||||||
|     } |     } | ||||||
|  |     await this.updateEmbeddedDocuments('Item', updates); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
| @@ -2874,8 +2881,8 @@ export class RdDActor extends Actor { | |||||||
|     sumDenier = Number(sumDenier); |     sumDenier = Number(sumDenier); | ||||||
|     let denierDisponible = 0; |     let denierDisponible = 0; | ||||||
|  |  | ||||||
|     for (let piece of monnaies) { |     for (let pieceData of monnaies.map(m => Misc.data(m))) { | ||||||
|       denierDisponible += piece.data.valeur_deniers * Number(piece.data.quantite); |       denierDisponible += pieceData.data.valeur_deniers * Number(pieceData.data.quantite); | ||||||
|     } |     } | ||||||
|     console.log("DENIER", game.user.character, sumDenier, denierDisponible); |     console.log("DENIER", game.user.character, sumDenier, denierDisponible); | ||||||
|  |  | ||||||
| @@ -2906,10 +2913,10 @@ export class RdDActor extends Actor { | |||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   async monnaieIncDec(id, value) { |   async monnaieIncDec(id, value) { | ||||||
|     let monnaie = this.data.items.find(item => item.type == 'monnaie' && item.id == id); |     let monnaie = this.getMonnaie(id); | ||||||
|     if (monnaie) { |     if (monnaie) { | ||||||
|       const quantite = Math.max(0, monnaie.data.data.quantite + value); |       const quantite = Math.max(0, Misc.templateData(monnaie).quantite + value); | ||||||
|       await this.updateEmbeddedEntity("OwnedItem", { _id: monnaie.id, 'data.quantite': quantite }); |       await this.updateEmbeddedDocuments('Item', [{ _id: monnaie.id, 'data.quantite': quantite }]); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -2958,15 +2965,8 @@ export class RdDActor extends Actor { | |||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   listeVehicules() { |   listeVehicules() { | ||||||
|     const actorData = Misc.data(this); |     const listeVehichules = Misc.templateData(this).subacteurs?.vehicules ?? []; | ||||||
|     return this._buildActorLinksList( |     return this._buildActorLinksList(listeVehichules, vehicle => RdDActor._vehicleData(vehicle)); | ||||||
|       actorData.data.subacteurs?.vehicules ?? [], |  | ||||||
|       vehicle => { |  | ||||||
|         return { |  | ||||||
|           id: vehicle.id, name: vehicle.data.name, categorie: vehicle.data.data.categorie, |  | ||||||
|           structure: vehicle.data.data.structure, img: vehicle.data.img |  | ||||||
|         }; |  | ||||||
|       }); |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
| @@ -2979,12 +2979,27 @@ export class RdDActor extends Actor { | |||||||
|     return this._buildActorLinksList(Misc.templateData(this).subacteurs?.montures ?? []); |     return this._buildActorLinksList(Misc.templateData(this).subacteurs?.montures ?? []); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   _buildActorLinksList(links, actorTransformation = it => { return { id: it.id, name: it.data.name, img: it.data.img }; }) { |   _buildActorLinksList(links, actorTransformation = it => RdDActor._buildActorData(it)) { | ||||||
|     return links.map(link => game.actors.get(link.id)) |     return links.map(link => game.actors.get(link.id)) | ||||||
|       .filter(it => it != null) |       .filter(it => it != null) | ||||||
|       .map(actorTransformation); |       .map(actorTransformation); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   static _vehicleData(vehicle) { | ||||||
|  |     const vehicleData = Misc.data(vehicle); | ||||||
|  |     return { | ||||||
|  |       id: vehicle.id, | ||||||
|  |       name: vehicleData.name, | ||||||
|  |       img: vehicleData.img, | ||||||
|  |       categorie: vehicleData.data.categorie, | ||||||
|  |       structure: vehicleData.data.structure, | ||||||
|  |     }; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   static _buildActorData(it) { | ||||||
|  |     return { id: it.id, name: it.data.name, img: it.data.img }; | ||||||
|  |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   async pushSubacteur(actor, dataArray, dataPath, dataName) { |   async pushSubacteur(actor, dataArray, dataPath, dataName) { | ||||||
|     let alreadyPresent = dataArray.find(attached => attached.id == actor.data._id); |     let alreadyPresent = dataArray.find(attached => attached.id == actor.data._id); | ||||||
| @@ -3052,7 +3067,8 @@ export class RdDActor extends Actor { | |||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   enleverTousLesEffets() { |   enleverTousLesEffets() { | ||||||
|     this.deleteEmbeddedEntity('ActiveEffect', Array.from(this.effects?.keys() ?? [])); |     const ids = Array.from(this.effects?.keys() ?? []); | ||||||
|  |     this.deleteEmbeddedDocuments('ActiveEffect', ids); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
| @@ -3064,11 +3080,12 @@ export class RdDActor extends Actor { | |||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   async setStatusDemiReve(status) { |   async setStatusDemiReve(status) { | ||||||
|  |     const demiReve = StatusEffects.demiReve(); | ||||||
|     if (status) { |     if (status) { | ||||||
|       await this.addStatusEffect(StatusEffects.demiReve()) |       await this.addStatusEffect(demiReve) | ||||||
|     } |     } | ||||||
|     else { |     else { | ||||||
|       this.deleteStatusEffect(StatusEffects.demiReve()) |       this.deleteStatusEffect(demiReve) | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -3081,8 +3098,8 @@ export class RdDActor extends Actor { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   async forceStatusEffectId(statusId, sonne) { |   async forceStatusEffectId(statusId, isSet) { | ||||||
|     if (sonne) { |     if (isSet) { | ||||||
|       await this.addStatusEffectById(statusId); |       await this.addStatusEffectById(statusId); | ||||||
|     } |     } | ||||||
|     else { |     else { | ||||||
| @@ -3091,53 +3108,37 @@ export class RdDActor extends Actor { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   deleteStatusEffectById(id, options = { renderSheet: true }) { |   deleteStatusEffectById(id) { | ||||||
|     const effects = Array.from(this.effects?.values()) |     const ids = Array.from(this.effects?.values()) | ||||||
|       .filter(it => it.data.flags.core?.statusId == id); |       .filter(it => it.data.flags.core?.statusId == id) | ||||||
|     this._deleteStatusEffects(effects, options); |       .map(it => it.id); | ||||||
|  |     this.deleteEmbeddedDocuments('ActiveEffect', ids); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   deleteStatusEffect(effect, options = { renderSheet: true }) { |   deleteStatusEffect(effect) { | ||||||
|     const toDelete = Array.from(this.effects?.values()) |     const ids = Array.from(this.effects?.values()) | ||||||
|       .filter(it => StatusEffects.statusId(it.data) == StatusEffects.statusId(effect)); |       .filter(it => StatusEffects.statusId(it.data) == StatusEffects.statusId(effect)) | ||||||
|     this._deleteStatusEffects(toDelete, options); |       .map(it => it.id); | ||||||
|  |     this.deleteEmbeddedDocuments('ActiveEffect', ids); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   _deleteStatusEffects(effects, options) { |   async addStatusEffectById(id) { | ||||||
|     this._deleteStatusEffectsByIds(effects.map(it => it.id), options); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |  | ||||||
|   _deleteStatusEffectsByIds(effectIds, options) { |  | ||||||
|     this.deleteEmbeddedDocuments('ActiveEffect', [effectIds], options); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |  | ||||||
|   async addStatusEffectById(id, options = { renderSheet: false }) { |  | ||||||
|     const statusEffect = CONFIG.statusEffects.find(it => it.id == id); |     const statusEffect = CONFIG.statusEffects.find(it => it.id == id); | ||||||
|     await this.addStatusEffect(statusEffect, options); |     await this.addStatusEffect(statusEffect); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   async addStatusEffect(statusEffect, options = { renderSheet: false }) { |   async addStatusEffect(statusEffect) { | ||||||
|     this.deleteStatusEffectById(statusEffect.id, options); |  | ||||||
|     const effet = duplicate(statusEffect); |     const effet = duplicate(statusEffect); | ||||||
|     effet["flags.core.statusId"] = effet.id; |     this.deleteStatusEffectById(effet.id); | ||||||
|     await this.createEmbeddedEntity('ActiveEffect', effet, options); |     effet.flags.core.statusId = effet.id; | ||||||
|  |     await this.createEmbeddedDocuments('ActiveEffect', [effet]); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   async updateEmbeddedEntity(embeddedName, data, options) { |   async onCreateItem(item, options, id) { | ||||||
|     if (data && data['data.defaut_carac'] && data['data.xp']) { // C'est une compétence |  | ||||||
|       this.checkCompetenceXP(data['name'], data['data.xp']); |  | ||||||
|     } |  | ||||||
|     return super.updateEmbeddedDocuments("Item", [data], options); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |  | ||||||
|   async onCreateOwnedItem(item, options, id) { |  | ||||||
|     switch (item.type) { |     switch (item.type) { | ||||||
|       case 'tete': |       case 'tete': | ||||||
|       case 'queue': |       case 'queue': | ||||||
| @@ -3148,7 +3149,14 @@ export class RdDActor extends Actor { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   async onDeleteOwnedItem(item, options, id) { |   async onPreUpdateItem(item, change, options, id)  { | ||||||
|  |     const itemData = Misc.data(item); | ||||||
|  |     if (itemData.type == 'competence' && itemData.data.defaut_carac && itemData.data.xp) { | ||||||
|  |       await this.checkCompetenceXP(itemData.name, itemData.data.xp); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   async onDeleteItem(item, options, id) { | ||||||
|     switch (item.type) { |     switch (item.type) { | ||||||
|       case 'tete': |       case 'tete': | ||||||
|       case 'queue': |       case 'queue': | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ import { RdDUtility } from "./rdd-utility.js"; | |||||||
|  |  | ||||||
| /* -------------------------------------------- */ | /* -------------------------------------------- */ | ||||||
| // Activate chat listeners defined  | // Activate chat listeners defined  | ||||||
| Hooks.on('renderChatLog', (log, html, data) => { | // Hooks.on('renderChatLog', (log, html, data) => { | ||||||
|   RdDUtility.chatListeners(html); | //   RdDUtility.chatListeners(html); | ||||||
| }); | // }); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,10 +1,11 @@ | |||||||
| import { Grammar } from "./grammar.js"; | import { Grammar } from "./grammar.js"; | ||||||
|  | import { Misc } from "./misc.js"; | ||||||
|  |  | ||||||
| const competenceTroncs = [["Esquive", "Dague", "Corps à corps"], | const competenceTroncs = [["Esquive", "Dague", "Corps à corps"], | ||||||
| ["Epée à 1 main", "Epée à 2 mains", "Hache à 1 main", "Hache à 2 mains", "Lance", "Masse à 1 main", "Masse à 2 mains"]]; | ["Epée à 1 main", "Epée à 2 mains", "Hache à 1 main", "Hache à 2 mains", "Lance", "Masse à 1 main", "Masse à 2 mains"]]; | ||||||
|  |  | ||||||
| const competence_xp_par_niveau = [5, 5, 5, 10, 10, 10, 10, 15, 15, 15, 15, 20, 20, 20, 20, 30, 30, 40, 40, 60, 60, 100, 100, 100, 100, 100, 100, 100, 100, 100]; | const xp_par_niveau = [5, 5, 5, 10, 10, 10, 10, 15, 15, 15, 15, 20, 20, 20, 20, 30, 30, 40, 40, 60, 60, 100, 100, 100, 100, 100, 100, 100, 100, 100]; | ||||||
| const competence_niveau_max = competence_xp_par_niveau.length - 10; | const niveau_max = xp_par_niveau.length - 10; | ||||||
| /* -------------------------------------------- */ | /* -------------------------------------------- */ | ||||||
| const limitesArchetypes = [ | const limitesArchetypes = [ | ||||||
|   { "niveau": 0, "nombreMax": 100, "nombre": 0 }, |   { "niveau": 0, "nombreMax": 100, "nombre": 0 }, | ||||||
| @@ -23,14 +24,14 @@ const limitesArchetypes = [ | |||||||
|  |  | ||||||
| /* -------------------------------------------- */ | /* -------------------------------------------- */ | ||||||
| const categorieCompetences = { | const categorieCompetences = { | ||||||
|   "generale": { level: "-4", label: "Générales" }, |   "generale": { base: -4, label: "Générales" }, | ||||||
|   "particuliere": { level: "-8", label: "Particulières" }, |   "particuliere": { base: -8, label: "Particulières" }, | ||||||
|   "specialisee": { level: "-11", label: "Spécialisées" }, |   "specialisee": { base: -11, label: "Spécialisées" }, | ||||||
|   "connaissance": { level: "-11", label: "Connaissances" }, |   "connaissance": { base: -11, label: "Connaissances" }, | ||||||
|   "draconic": { level: "-11", label: "Draconics" }, |   "draconic": { base: -11, label: "Draconics" }, | ||||||
|   "melee": { level: "-6", label: "Mêlée" }, |   "melee": { base: -6, label: "Mêlée" }, | ||||||
|   "tir": { level: "-8", label: "Tir" }, |   "tir": { base: -8, label: "Tir" }, | ||||||
|   "lancer": { level: "-8", label: "Lancer" } |   "lancer": { base: -8, label: "Lancer" } | ||||||
| } | } | ||||||
|  |  | ||||||
| const compendiumCompetences = { | const compendiumCompetences = { | ||||||
| @@ -43,9 +44,9 @@ const compendiumCompetences = { | |||||||
| function _buildCumulXP() { | function _buildCumulXP() { | ||||||
|   let cumulXP = { "-11": 0 }; |   let cumulXP = { "-11": 0 }; | ||||||
|   let cumul = 0; |   let cumul = 0; | ||||||
|   for (let i = 0; i <= competence_xp_par_niveau.length; i++) { |   for (let i = 0; i <= xp_par_niveau.length; i++) { | ||||||
|     let level = i - 10; |     let level = i - 10; | ||||||
|     cumul += competence_xp_par_niveau[i]; |     cumul += xp_par_niveau[i]; | ||||||
|     cumulXP[level] = cumul; |     cumulXP[level] = cumul; | ||||||
|   } |   } | ||||||
|   return cumulXP; |   return cumulXP; | ||||||
| @@ -73,6 +74,20 @@ export class RdDItemCompetence extends Item { | |||||||
|     return categorieCompetences[category].label; |     return categorieCompetences[category].label; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   static getCategorie(competence) { | ||||||
|  |     return Misc.data(competence)?.data.categorie; | ||||||
|  |   } | ||||||
|  |   static isDraconic(competence) { | ||||||
|  |     return Misc.data(competence).data.categorie == 'draconic'; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   static getVoieDraconic(competences, voie) { | ||||||
|  |     voie = Grammar.toLowerCaseNoAccent(voie); | ||||||
|  |     return competences.find(it => RdDItemCompetence.isDraconic(it) && Grammar.toLowerCaseNoAccent(Misc.data(it).name).includes(voie)); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static getEsquive(competences) { |   static getEsquive(competences) { | ||||||
|     return { name: 'Esquive', niveau: RdDItemCompetence.findCompetence(competences, 'Esquive')?.data.niveau ?? -6 }; |     return { name: 'Esquive', niveau: RdDItemCompetence.findCompetence(competences, 'Esquive')?.data.niveau ?? -6 }; | ||||||
| @@ -80,9 +95,9 @@ export class RdDItemCompetence extends Item { | |||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static isCompetenceArme(competence) { |   static isCompetenceArme(competence) { | ||||||
|     switch (competence.data.data.categorie) { |     switch (Misc.templateData(competence).categorie) { | ||||||
|       case 'melee': |       case 'melee': | ||||||
|         return competence.data.name != 'Esquive'; |         return Misc.data(competence).name != 'Esquive'; | ||||||
|       case 'tir': |       case 'tir': | ||||||
|       case 'lancer': |       case 'lancer': | ||||||
|         return true; |         return true; | ||||||
| @@ -92,15 +107,15 @@ export class RdDItemCompetence extends Item { | |||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static isArmeUneMain(competence) { |   static isArmeUneMain(competence) { | ||||||
|     return competence?.name.toLowerCase().includes("1 main"); |     return Misc.data(competence)?.name.toLowerCase().includes("1 main"); | ||||||
|   } |   } | ||||||
|   static isArme2Main(competence) { |   static isArme2Main(competence) { | ||||||
|     return competence?.name.toLowerCase().includes("2 main"); |     return Misc.data(competence)?.name.toLowerCase().includes("2 main"); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static isMalusEncombrementTotal(competence) { |   static isMalusEncombrementTotal(competence) { | ||||||
|     return competence?.name.toLowerCase().match(/(natation|acrobatie)/); |     return Misc.data(competence)?.name.toLowerCase().match(/(natation|acrobatie)/); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
| @@ -117,17 +132,18 @@ export class RdDItemCompetence extends Item { | |||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static computeTotalXP(competences) { |   static computeTotalXP(competences) { | ||||||
|     const total = competences.map(c => RdDItemCompetence.computeXP(c)) |     const total = competences.map(c => RdDItemCompetence.computeXP(c)) | ||||||
|       .reduce((a, b) => a + b, 0); |       .reduce(Misc.sum(), 0); | ||||||
|     const economieTronc = RdDItemCompetence.computeEconomieXPTronc(competences); |     const economieTronc = RdDItemCompetence.computeEconomieXPTronc(competences); | ||||||
|     return total - economieTronc; |     return total - economieTronc; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static computeXP(competence) { |   static computeXP(competence) { | ||||||
|     const factor = competence.name.includes('Thanatos') ? 2 : 1; // Thanatos compte double ! |     const itemData = Misc.data(competence); | ||||||
|     const xpNiveau = RdDItemCompetence.computeDeltaXP(competence.data.base, competence.data.niveau ?? competence.data.base); |     const factor = itemData.name.includes('Thanatos') ? 2 : 1; // Thanatos compte double ! | ||||||
|     const xp = competence.data.xp ?? 0; |     const xpNiveau = RdDItemCompetence.computeDeltaXP(itemData.data.base, itemData.data.niveau ?? itemData.data.base); | ||||||
|     const xpSort = competence.data.xp_sort ?? 0; |     const xp = itemData.data.xp ?? 0; | ||||||
|  |     const xpSort = itemData.data.xp_sort ?? 0; | ||||||
|     return factor * (xpNiveau + xp) + xpSort; |     return factor * (xpNiveau + xp) + xpSort; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -137,10 +153,10 @@ export class RdDItemCompetence extends Item { | |||||||
|       list => list.map(name => RdDItemCompetence.findCompetence(competences, name)) |       list => list.map(name => RdDItemCompetence.findCompetence(competences, name)) | ||||||
|         // calcul du coût xp jusqu'au niveau 0 maximum |         // calcul du coût xp jusqu'au niveau 0 maximum | ||||||
|         .map(it => RdDItemCompetence.computeDeltaXP(it?.data.base ?? -11, Math.min(it?.data.niveau ?? -11, 0))) |         .map(it => RdDItemCompetence.computeDeltaXP(it?.data.base ?? -11, Math.min(it?.data.niveau ?? -11, 0))) | ||||||
|         .sort((a, b) => b - a) // tri descendant |         .sort(Misc.descending(x => x)) | ||||||
|         .splice(0, 1) // ignorer le coût xp le plus élevé |         .splice(0, 1) // ignorer le coût xp le plus élevé | ||||||
|         .reduce((a, b) => a + b, 0) |         .reduce(Misc.sum(), 0) | ||||||
|     ).reduce((a, b) => a + b, 0); |     ).reduce(Misc.sum(), 0); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
| @@ -153,10 +169,11 @@ export class RdDItemCompetence extends Item { | |||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static computeCompetenceXPCost(competence) { |   static computeCompetenceXPCost(competence) { | ||||||
|     let xp = RdDItemCompetence.getDeltaXp(competence.data.base, competence.data.niveau ?? competence.data.base); |     const compData = Misc.data(competence); | ||||||
|     xp += competence.data.xp ?? 0; |     let xp = RdDItemCompetence.getDeltaXp(compData.data.base, compData.data.niveau ?? compData.data.base); | ||||||
|     if (competence.name.includes('Thanatos')) xp *= 2; /// Thanatos compte double ! |     xp += compData.data.xp ?? 0; | ||||||
|     xp += competence.data.xp_sort ?? 0; |     if (compData.name.includes('Thanatos')) xp *= 2; /// Thanatos compte double ! | ||||||
|  |     xp += compData.data.xp_sort ?? 0; | ||||||
|     return xp; |     return xp; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -165,10 +182,10 @@ export class RdDItemCompetence extends Item { | |||||||
|     let economie = 0; |     let economie = 0; | ||||||
|     for (let troncList of competenceTroncs) { |     for (let troncList of competenceTroncs) { | ||||||
|       let list = troncList.map(name => RdDItemCompetence.findCompetence(competences, name)) |       let list = troncList.map(name => RdDItemCompetence.findCompetence(competences, name)) | ||||||
|         .sort((c1, c2) => c2.data.niveau - c1.data.niveau); // tri du plus haut au plus bas |         .sort(Misc.descending(c => Misc.templateData(c).niveau)); // tri du plus haut au plus bas | ||||||
|       list.splice(0, 1); // ignorer la plus élevée |       list.splice(0, 1); // ignorer la plus élevée | ||||||
|       list.forEach(c => { |       list.map(c => Misc.templateData(c)).forEach(tplData => { | ||||||
|         economie += RdDItemCompetence.getDeltaXp(c.data.base, Math.min(c.data.niveau, 0)); |         economie += RdDItemCompetence.getDeltaXp(tplData.base, Math.min(tplData.niveau, 0)); | ||||||
|       }); |       }); | ||||||
|     } |     } | ||||||
|     return economie; |     return economie; | ||||||
| @@ -216,7 +233,7 @@ export class RdDItemCompetence extends Item { | |||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static getCompetenceXp(niveau) { |   static getCompetenceXp(niveau) { | ||||||
|     RdDItemCompetence._valideNiveau(niveau); |     RdDItemCompetence._valideNiveau(niveau); | ||||||
|     return niveau < -10 ? 0 : competence_xp_par_niveau[niveau + 10]; |     return niveau < -10 ? 0 : xp_par_niveau[niveau + 10]; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
| @@ -228,16 +245,16 @@ export class RdDItemCompetence extends Item { | |||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static _valideNiveau(niveau) { |   static _valideNiveau(niveau) { | ||||||
|     if (niveau < -11 || niveau > competence_niveau_max) { |     if (niveau < -11 || niveau > niveau_max) { | ||||||
|       console.warn(`Niveau ${niveau} en dehors des niveaux de compétences: [-11, ${competence_niveau_max} ]`); |       console.warn(`Niveau ${niveau} en dehors des niveaux de compétences: [-11, ${niveau_max} ]`); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static computeResumeArchetype(competences) { |   static computeResumeArchetype(competences) { | ||||||
|     const archetype = RdDItemCompetence.getLimitesArchetypes(); |     const archetype = RdDItemCompetence.getLimitesArchetypes(); | ||||||
|     competences.forEach(it => { |     competences.map(it => Math.max(0, Misc.templateData(it).niveau_archetype)) | ||||||
|       let niveau = Math.max(0, it.data.niveau_archetype); |       .forEach(niveau => { | ||||||
|         archetype[niveau] = archetype[niveau] ?? { "niveau": niveau, "nombreMax": 0, "nombre": 0 }; |         archetype[niveau] = archetype[niveau] ?? { "niveau": niveau, "nombreMax": 0, "nombre": 0 }; | ||||||
|         archetype[niveau].nombre = (archetype[niveau]?.nombre ?? 0) + 1; |         archetype[niveau].nombre = (archetype[niveau]?.nombre ?? 0) + 1; | ||||||
|       }); |       }); | ||||||
|   | |||||||
| @@ -52,13 +52,16 @@ export class RdDItemSheet extends ItemSheet { | |||||||
|     console.log("3", objectData); |     console.log("3", objectData); | ||||||
|  |  | ||||||
|     let formData ={ |     let formData ={ | ||||||
|       title: this.title, |       title: objectData.name, | ||||||
|       id: objectData.id, |       id: objectData.id, | ||||||
|       type: objectData.type, |       type: objectData.type, | ||||||
|       img: objectData.img, |       img: objectData.img, | ||||||
|       name: objectData.name, |       name: objectData.name, | ||||||
|       data: objectData.data, |       data: objectData.data, | ||||||
|       isGM: game.user.isGM |       isGM: game.user.isGM, | ||||||
|  |       owner: this.document.isOwner, | ||||||
|  |       editable: this.isEditable, | ||||||
|  |       cssClass: this.isEditable ? "editable" : "locked", | ||||||
|     } |     } | ||||||
|     formData.categorieCompetences = RdDItemCompetence.getCategorieCompetences(); |     formData.categorieCompetences = RdDItemCompetence.getCategorieCompetences(); | ||||||
|     if ( formData.type == 'tache' || formData.type == 'livre' || formData.type == 'meditation' || formData.type == 'oeuvre') { |     if ( formData.type == 'tache' || formData.type == 'livre' || formData.type == 'meditation' || formData.type == 'oeuvre') { | ||||||
| @@ -90,15 +93,15 @@ export class RdDItemSheet extends ItemSheet { | |||||||
|     if (!this.options.editable) return; |     if (!this.options.editable) return; | ||||||
|      |      | ||||||
|     // Select competence categorie |     // Select competence categorie | ||||||
|     html.find("#categorie").on("click", this._onClickSelectCategorie.bind(this) ); |     html.find(".categorie").on("click", this._onClickSelectCategorie.bind(this) ); | ||||||
|  |  | ||||||
|     html.find('#sheet-competence-xp').change((event) => { |     html.find('.sheet-competence-xp').change((event) => { | ||||||
|       if ( this.object.data.type == 'competence') {  |       if ( this.object.data.type == 'competence') {  | ||||||
|         RdDUtility.checkThanatosXP( this.object.data.name ); |         RdDUtility.checkThanatosXP( this.object.data.name ); | ||||||
|       } |       } | ||||||
|     } ); |     } ); | ||||||
|  |  | ||||||
|     html.find('#creer-tache-livre').click((event) => { |     html.find('.creer-tache-livre').click((event) => { | ||||||
|       let actorId = event.currentTarget.attributes['data-actor-id'].value; |       let actorId = event.currentTarget.attributes['data-actor-id'].value; | ||||||
|       let actor = game.actors.get( actorId ); |       let actor = game.actors.get( actorId ); | ||||||
|       actor.creerTacheDepuisLivre( this.item ); |       actor.creerTacheDepuisLivre( this.item ); | ||||||
| @@ -124,7 +127,7 @@ export class RdDItemSheet extends ItemSheet { | |||||||
|     event.preventDefault(); |     event.preventDefault(); | ||||||
|      |      | ||||||
|     let level = RdDItemCompetence.getNiveauBase(event.currentTarget.value);     |     let level = RdDItemCompetence.getNiveauBase(event.currentTarget.value);     | ||||||
|     this.object.data.data.base = level; |     Misc.templateData(this.object).base = level; | ||||||
|     $("#base").val( level );  |     $("#base").val( level );  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -106,7 +106,7 @@ export class RdDItemSort extends Item { | |||||||
|       // Sauvegarde/update |       // Sauvegarde/update | ||||||
|       let bonuscase = StringList.toString(); |       let bonuscase = StringList.toString(); | ||||||
|       //console.log("Bonus cae :", bonuscase); |       //console.log("Bonus cae :", bonuscase); | ||||||
|       actor.updateEmbeddedEntity("OwnedItem", { _id: sort._id, 'data.bonuscase': bonuscase } ); |       actor.updateEmbeddedDocuments('Item', [{ _id: sort._id, 'data.bonuscase': bonuscase }] ); | ||||||
|   } |   } | ||||||
|    |    | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   | |||||||
| @@ -18,6 +18,24 @@ export class Misc { | |||||||
|     return isPositiveNumber ? "+" + number : number |     return isPositiveNumber ? "+" + number : number | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   static sum() { | ||||||
|  |     return (a, b) => a + b; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   static ascending(orderFunction) { | ||||||
|  |     return (a, b) => Misc.sortingBy(orderFunction(a), orderFunction(b)); | ||||||
|  |   }   | ||||||
|  |  | ||||||
|  |   static descending(orderFunction) { | ||||||
|  |     return (a, b) => Misc.sortingBy(orderFunction(b), orderFunction(a)); | ||||||
|  |   }   | ||||||
|  |  | ||||||
|  |   static sortingBy(a, b) { | ||||||
|  |     if (a > b) return 1; | ||||||
|  |     if (a < b) return -1; | ||||||
|  |     return 0; | ||||||
|  |   } | ||||||
|  |  | ||||||
|   /** |   /** | ||||||
|    * Converts the value to an integer, or to 0 if undefined/null/not representing integer |    * Converts the value to an integer, or to 0 if undefined/null/not representing integer | ||||||
|    * @param {*} value value to convert to an integer using parseInt |    * @param {*} value value to convert to an integer using parseInt | ||||||
|   | |||||||
| @@ -1,4 +1,5 @@ | |||||||
| import { Grammar } from "./grammar.js"; | import { Grammar } from "./grammar.js"; | ||||||
|  | import { Misc } from "./misc.js"; | ||||||
|  |  | ||||||
| const tableCaracDerivee = { | const tableCaracDerivee = { | ||||||
|   // xp: coût pour passer du niveau inférieur à ce niveau |   // xp: coût pour passer du niveau inférieur à ce niveau | ||||||
| @@ -61,7 +62,7 @@ export class RdDCarac { | |||||||
|   static computeTotal(carac, beaute = undefined) { |   static computeTotal(carac, beaute = undefined) { | ||||||
|     const total = Object.values(carac).filter(c => !c.derivee) |     const total = Object.values(carac).filter(c => !c.derivee) | ||||||
|       .map(it => parseInt(it.value)) |       .map(it => parseInt(it.value)) | ||||||
|       .reduce((a, b) => a + b, 0); |       .reduce(Misc.sum(), 0); | ||||||
|     const beauteSuperieur10 = Math.max((beaute ?? 10) - 10, 0); |     const beauteSuperieur10 = Math.max((beaute ?? 10) - 10, 0); | ||||||
|     return total + beauteSuperieur10; |     return total + beauteSuperieur10; | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -104,7 +104,7 @@ export class RdDCombatManager extends Combat { | |||||||
|       const roll = super._getInitiativeRoll(c, rollFormula); |       const roll = super._getInitiativeRoll(c, rollFormula); | ||||||
|       if (roll.total <= 0) roll.total = 0.00; |       if (roll.total <= 0) roll.total = 0.00; | ||||||
|       console.log("Compute init for", rollFormula, roll.total); |       console.log("Compute init for", rollFormula, roll.total); | ||||||
|       await this.updateEmbeddedEntity("Combatant", { _id: c._id, initiative: roll.total }); |       await this.updateEmbeddedDocuments("Combatant", [{ _id: c._id, initiative: roll.total }]); | ||||||
|  |  | ||||||
|       // Send a chat message |       // Send a chat message | ||||||
|       let rollMode = messageOptions.rollMode || game.settings.get("core", "rollMode"); |       let rollMode = messageOptions.rollMode || game.settings.get("core", "rollMode"); | ||||||
| @@ -165,13 +165,7 @@ export class RdDCombatManager extends Combat { | |||||||
|         } |         } | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|     return armesEquipe.sort((a, b) => { |     return armesEquipe.sort(Misc.ascending(armeData => armeData.name + (armeData.data.mainInfo ?? ''))); | ||||||
|       const nameA = a.name + (a.data.mainInfo ?? ''); |  | ||||||
|       const nameB = b.name + (b.data.mainInfo ?? ''); |  | ||||||
|       if (nameA > nameB) return 1; |  | ||||||
|       if (nameA < nameB) return -1; |  | ||||||
|       return 0; |  | ||||||
|     }); |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
| @@ -340,8 +334,8 @@ export class RdDCombat { | |||||||
|  |  | ||||||
|   static init() { |   static init() { | ||||||
|     this.initStorePasseArmes(); |     this.initStorePasseArmes(); | ||||||
|     Hooks.on("updateCombat", (combat, data) => { RdDCombat.onUpdateCombat(combat, data) }); |     Hooks.on("updateCombat", (combat, change, options, userId) => { RdDCombat.onUpdateCombat(combat, change, options, userId) }); | ||||||
|     Hooks.on("preDeleteCombat", (combat, options) => { RdDCombat.onPreDeleteCombat(combat, options); }); |     Hooks.on("preDeleteCombat", (combat, options, userId) => { RdDCombat.onPreDeleteCombat(combat, options, userId); }); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
| @@ -363,14 +357,14 @@ export class RdDCombat { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static onUpdateCombat(combat, data) { |   static onUpdateCombat(combat, change, options, userId) { | ||||||
|     if (combat.data.round != 0 && combat.turns && combat.data.active) { |     if (combat.data.round != 0 && combat.turns && combat.data.active) { | ||||||
|       RdDCombat.combatNouveauTour(combat); |       RdDCombat.combatNouveauTour(combat); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static onPreDeleteCombat(combat, options) { |   static onPreDeleteCombat(combat, options, userId) { | ||||||
|     if (game.user.isGM) { |     if (game.user.isGM) { | ||||||
|       combat.cleanItemUse(); |       combat.cleanItemUse(); | ||||||
|       ChatUtility.removeChatMessageContaining(`<div data-combatid="${combat.id}" data-combatmessage="actor-turn-summary">`) |       ChatUtility.removeChatMessageContaining(`<div data-combatid="${combat.id}" data-combatmessage="actor-turn-summary">`) | ||||||
| @@ -808,8 +802,8 @@ export class RdDCombat { | |||||||
|     const paramChatDefense = { |     const paramChatDefense = { | ||||||
|       passeArme: attackerRoll.passeArme, |       passeArme: attackerRoll.passeArme, | ||||||
|       essais: attackerRoll.essais, |       essais: attackerRoll.essais, | ||||||
|       defender: this.defender, |       defender: Misc.data(this.defender), | ||||||
|       attacker: this.attacker, |       attacker: Misc.data(this.attacker), | ||||||
|       attackerId: this.attackerId, |       attackerId: this.attackerId, | ||||||
|       esquiveUsage: esquiveUsage, |       esquiveUsage: esquiveUsage, | ||||||
|       defenderTokenId: this.defenderTokenId, |       defenderTokenId: this.defenderTokenId, | ||||||
| @@ -851,7 +845,7 @@ export class RdDCombat { | |||||||
|         attackerId: this.attacker?.data._id, |         attackerId: this.attacker?.data._id, | ||||||
|         defenderId: this.defender?.data._id, |         defenderId: this.defender?.data._id, | ||||||
|         defenderTokenId: this.defenderTokenId, |         defenderTokenId: this.defenderTokenId, | ||||||
|         defenderRoll: duplicate(defenderRoll), |         defenderRoll: defenderRoll, | ||||||
|         paramChatDefense: paramChatDefense, |         paramChatDefense: paramChatDefense, | ||||||
|         rollMode: true |         rollMode: true | ||||||
|       } |       } | ||||||
| @@ -887,7 +881,7 @@ export class RdDCombat { | |||||||
|       whisper: ChatUtility.getWhisperRecipientsAndGMs(this.attacker.name), |       whisper: ChatUtility.getWhisperRecipientsAndGMs(this.attacker.name), | ||||||
|       content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-demande-attaque-etotal.html', { |       content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-demande-attaque-etotal.html', { | ||||||
|         attackerId: this.attackerId, |         attackerId: this.attackerId, | ||||||
|         attacker: this.attacker, |         attacker: Misc.data(this.attacker), | ||||||
|         defenderTokenId: this.defenderTokenId, |         defenderTokenId: this.defenderTokenId, | ||||||
|         essais: attackerRoll.essais |         essais: attackerRoll.essais | ||||||
|       }) |       }) | ||||||
| @@ -968,7 +962,7 @@ export class RdDCombat { | |||||||
|       surprise: this.defender.getSurprise(true), |       surprise: this.defender.getSurprise(true), | ||||||
|       needParadeSignificative: ReglesOptionelles.isUsing('categorieParade') && RdDItemArme.needParadeSignificative(armeAttaque, armeParade), |       needParadeSignificative: ReglesOptionelles.isUsing('categorieParade') && RdDItemArme.needParadeSignificative(armeAttaque, armeParade), | ||||||
|       needResist: RdDItemArme.needArmeResist(armeAttaque, armeParade), |       needResist: RdDItemArme.needArmeResist(armeAttaque, armeParade), | ||||||
|       carac: this.defender.data.data.carac, |       carac: Misc.templateData(this.defender).carac, | ||||||
|       show: {} |       show: {} | ||||||
|     }; |     }; | ||||||
|     defenderRoll.diviseurSignificative = this._getDiviseurSignificative(defenderRoll); |     defenderRoll.diviseurSignificative = this._getDiviseurSignificative(defenderRoll); | ||||||
| @@ -1067,7 +1061,7 @@ export class RdDCombat { | |||||||
|       competence: competence, |       competence: competence, | ||||||
|       surprise: this.defender.getSurprise(true), |       surprise: this.defender.getSurprise(true), | ||||||
|       surpriseDefenseur: this.defender.getSurprise(true), |       surpriseDefenseur: this.defender.getSurprise(true), | ||||||
|       carac: this.defender.data.data.carac, |       carac: Misc.templateData(this.defender).carac, | ||||||
|       show: {} |       show: {} | ||||||
|     }; |     }; | ||||||
|     rollData.diviseurSignificative = this._getDiviseurSignificative(rollData); |     rollData.diviseurSignificative = this._getDiviseurSignificative(rollData); | ||||||
| @@ -1136,7 +1130,7 @@ export class RdDCombat { | |||||||
|               resistance -= perteResistance; |               resistance -= perteResistance; | ||||||
|               defenderRoll.show.deteriorationArme = resistance <= 0 ? 'brise' : 'perte'; |               defenderRoll.show.deteriorationArme = resistance <= 0 ? 'brise' : 'perte'; | ||||||
|               defenderRoll.show.perteResistance = perteResistance; |               defenderRoll.show.perteResistance = perteResistance; | ||||||
|               this.defender.updateEmbeddedEntity("OwnedItem", { _id: defenderRoll.arme._id, 'data.resistance': resistance }); |               this.defender.updateEmbeddedDocuments('Item', [{ _id: defenderRoll.arme._id, 'data.resistance': resistance }]); | ||||||
|             } |             } | ||||||
|           } |           } | ||||||
|         } else { |         } else { | ||||||
| @@ -1153,7 +1147,7 @@ export class RdDCombat { | |||||||
|             resistance -= dmg; |             resistance -= dmg; | ||||||
|             defenderRoll.show.deteriorationArme = resistance <= 0 ? 'brise' : 'perte'; |             defenderRoll.show.deteriorationArme = resistance <= 0 ? 'brise' : 'perte'; | ||||||
|             defenderRoll.show.perteResistance = dmg; |             defenderRoll.show.perteResistance = dmg; | ||||||
|             this.defender.updateEmbeddedEntity("OwnedItem", { _id: defenderRoll.arme._id, 'data.resistance': resistance }); |             this.defender.updateEmbeddedDocuments('Item', [{ _id: defenderRoll.arme._id, 'data.resistance': resistance }]); | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
|         // Si l'arme de parade n'est pas un bouclier, jet de désarmement (p.132) |         // Si l'arme de parade n'est pas un bouclier, jet de désarmement (p.132) | ||||||
| @@ -1252,7 +1246,7 @@ export class RdDCombat { | |||||||
|       return true; |       return true; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     let rolled = await RdDResolutionTable.roll(this.attacker.getReveActuel(), - Number(this.defender.data.data.carac.niveau.value)); |     let rolled = await RdDResolutionTable.roll(this.attacker.getReveActuel(), - Number(Misc.templateData(this.defender).carac.niveau.value)); | ||||||
|  |  | ||||||
|     let message = { |     let message = { | ||||||
|       content: "Jet de points actuels de rêve à " + rolled.finalLevel + RdDResolutionTable.explain(rolled) + "<br>", |       content: "Jet de points actuels de rêve à " + rolled.finalLevel + RdDResolutionTable.explain(rolled) + "<br>", | ||||||
|   | |||||||
| @@ -153,6 +153,7 @@ Hooks.once("init", async function () { | |||||||
|   CONFIG.Combat.documentClass = RdDCombatManager; |   CONFIG.Combat.documentClass = RdDCombatManager; | ||||||
|  |  | ||||||
|   // préparation des différents modules |   // préparation des différents modules | ||||||
|  |   RdDUtility.init(); | ||||||
|   RdDCommands.init(); |   RdDCommands.init(); | ||||||
|   RdDCombat.init(); |   RdDCombat.init(); | ||||||
|   RdDCombatManager.init(), |   RdDCombatManager.init(), | ||||||
| @@ -224,8 +225,3 @@ Hooks.on("chatMessage", (html, content, msg) => { | |||||||
|   return true; |   return true; | ||||||
| }); | }); | ||||||
|  |  | ||||||
|  |  | ||||||
| /* -------------------------------------------- */ |  | ||||||
| Hooks.on("renderChatMessage", async (app, html, msg) => { |  | ||||||
|   RdDUtility.onRenderChatMessage(app, html, msg); |  | ||||||
| }); |  | ||||||
|   | |||||||
| @@ -144,10 +144,10 @@ export class RdDRoll extends Dialog { | |||||||
|       console.log(rollData); |       console.log(rollData); | ||||||
|       // Update html, according to data |       // Update html, according to data | ||||||
|       if (rollData.competence) { |       if (rollData.competence) { | ||||||
|         let compData = rollData.competence.data.data || rollData.competence.data; |         const defaut_carac = Misc.templateData(rollData.competence).defaut_carac; | ||||||
|         // Set the default carac from the competence item |         // Set the default carac from the competence item | ||||||
|         rollData.selectedCarac = rollData.carac[compData.defaut_carac]; |         rollData.selectedCarac = rollData.carac[defaut_carac]; | ||||||
|         $("#carac").val(compData.defaut_carac); |         $("#carac").val(defaut_carac); | ||||||
|       } |       } | ||||||
|       if (rollData.selectedSort) { |       if (rollData.selectedSort) { | ||||||
|         $("#draconic").val(rollData.selectedSort.data.listIndex); // Uniquement a la selection du sort, pour permettre de changer  |         $("#draconic").val(rollData.selectedSort.data.listIndex); // Uniquement a la selection du sort, pour permettre de changer  | ||||||
| @@ -184,8 +184,10 @@ export class RdDRoll extends Dialog { | |||||||
|       let sortKey = Misc.toInt(event.currentTarget.value); |       let sortKey = Misc.toInt(event.currentTarget.value); | ||||||
|       this.rollData.selectedSort = this.rollData.sortList[sortKey]; // Update the selectedCarac |       this.rollData.selectedSort = this.rollData.sortList[sortKey]; // Update the selectedCarac | ||||||
|       this.rollData.bonus = RdDItemSort.getCaseBonus(this.rollData.selectedSort, this.rollData.tmr.coord); |       this.rollData.bonus = RdDItemSort.getCaseBonus(this.rollData.selectedSort, this.rollData.tmr.coord); | ||||||
|  |       this.rollData.diffLibre = RdDItemSort.getDifficulte(this.rollData.selectedSort, -7) | ||||||
|       RdDItemSort.setCoutReveReel(this.rollData.selectedSort); |       RdDItemSort.setCoutReveReel(this.rollData.selectedSort); | ||||||
|       $("#draconic").val(this.rollData.selectedSort.data.listIndex); // Uniquement a la selection du sort, pour permettre de changer  |       $("#draconic").val(this.rollData.selectedSort.data.listIndex); // Uniquement a la selection du sort, pour permettre de changer  | ||||||
|  |       $("#diffLibre").val(this.rollData.diffLibre); | ||||||
|       this.updateRollResult(); |       this.updateRollResult(); | ||||||
|     }); |     }); | ||||||
|     html.find('#ptreve-variable').change((event) => { |     html.find('#ptreve-variable').change((event) => { | ||||||
|   | |||||||
| @@ -130,14 +130,16 @@ export class RdDTMRDialog extends Dialog { | |||||||
|     return EffetsDraconiques.rencontre.token(this.pixiTMR, rencontre, () => rencontre.coord); |     return EffetsDraconiques.rencontre.token(this.pixiTMR, rencontre, () => rencontre.coord); | ||||||
|   } |   } | ||||||
|   _tokenCaseSpeciale(casetmr) { |   _tokenCaseSpeciale(casetmr) { | ||||||
|     const draconique = Draconique.get(casetmr.data.specific); |     const caseData = Misc.data(casetmr); | ||||||
|     return draconique?.token(this.pixiTMR, casetmr, () => casetmr.data.coord); |     const draconique = Draconique.get(caseData.data.specific); | ||||||
|  |     return draconique?.token(this.pixiTMR, caseData, () => caseData.data.coord); | ||||||
|   } |   } | ||||||
|   _tokenSortEnReserve(sortEnReserve) { |   _tokenSortEnReserve(sortEnReserve) { | ||||||
|     return EffetsDraconiques.sortReserve.token(this.pixiTMR, sortEnReserve.sort, () => sortEnReserve.coord); |     return EffetsDraconiques.sortReserve.token(this.pixiTMR, sortEnReserve.sort, () => sortEnReserve.coord); | ||||||
|   } |   } | ||||||
|   _tokenDemiReve() { |   _tokenDemiReve() { | ||||||
|     return EffetsDraconiques.demiReve.token(this.pixiTMR, this.actor, () => Misc.data(this.actor).data.reve.tmrpos.coord); |     const actorData = Misc.data(this.actor); | ||||||
|  |     return EffetsDraconiques.demiReve.token(this.pixiTMR, actorData, () => actorData.data.reve.tmrpos.coord); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   _updateDemiReve() { |   _updateDemiReve() { | ||||||
| @@ -319,28 +321,28 @@ export class RdDTMRDialog extends Dialog { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   async _tentativeMaitrise(rencontreData, presentCite) { |   async _tentativeMaitrise(rencData, presentCite) { | ||||||
|     console.log("-> matriser", rencontreData); |     console.log("-> matriser", rencData); | ||||||
|  |  | ||||||
|     rencontreData.reve = this.actor.getReveActuel(); |     rencData.reve = this.actor.getReveActuel(); | ||||||
|     rencontreData.etat = this.actor.getEtatGeneral(); |     rencData.etat = this.actor.getEtatGeneral(); | ||||||
|  |  | ||||||
|     RollDataAjustements.calcul(rencontreData, this.actor); |     RollDataAjustements.calcul(rencData, this.actor); | ||||||
|  |  | ||||||
|     rencontreData.rolled = rencontreData.presentCite |     rencData.rolled = rencData.presentCite | ||||||
|       ? this._rollPresentCite(rencontreData) |       ? this._rollPresentCite(rencData) | ||||||
|       : await RdDResolutionTable.roll(rencontreData.reve, RollDataAjustements.sum(rencontreData.ajustements)); |       : await RdDResolutionTable.roll(rencData.reve, RollDataAjustements.sum(rencData.ajustements)); | ||||||
|  |  | ||||||
|     let postProcess = await TMRRencontres.gererRencontre(this, rencontreData); |     let postProcess = await TMRRencontres.gererRencontre(this, rencData); | ||||||
|  |  | ||||||
|     ChatMessage.create({ |     ChatMessage.create({ | ||||||
|       whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), |       whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), | ||||||
|       content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-rencontre-tmr.html`, rencontreData) |       content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-rencontre-tmr.html`, rencData) | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     if (postProcess) { |     if (postProcess) { | ||||||
|       /** Gère les rencontres avec du post-processing (passeur, messagers, tourbillons, ...) */ |       /** Gère les rencontres avec du post-processing (passeur, messagers, tourbillons, ...) */ | ||||||
|       await postProcess(this, rencontreData); |       await postProcess(this, rencData); | ||||||
|     } |     } | ||||||
|     else { |     else { | ||||||
|       this.currentRencontre = undefined; |       this.currentRencontre = undefined; | ||||||
| @@ -350,12 +352,12 @@ export class RdDTMRDialog extends Dialog { | |||||||
|     if (this.checkQuitterTMR()) { |     if (this.checkQuitterTMR()) { | ||||||
|       return; |       return; | ||||||
|     } |     } | ||||||
|     else if (rencontreData.rolled.isEchec && rencontreData.rencontre.isPersistant) { |     else if (rencData.rolled.isEchec && rencData.rencontre.isPersistant) { | ||||||
|       setTimeout(() => { |       setTimeout(() => { | ||||||
|         rencontreData.nbRounds++; |         rencData.nbRounds++; | ||||||
|         this.cumulFatigue += this.fatigueParCase; |         this.cumulFatigue += this.fatigueParCase; | ||||||
|         this._tentativeMaitrise(rencontreData); |         this._tentativeMaitrise(rencData); | ||||||
|         this._deleteTmrMessages(rencontreData.actor, rencontreData.nbRounds); |         this._deleteTmrMessages(rencData.actor, rencData.nbRounds); | ||||||
|       }, 2000); |       }, 2000); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -92,6 +92,13 @@ const definitionsEncaissement = { | |||||||
|  |  | ||||||
| /* -------------------------------------------- */ | /* -------------------------------------------- */ | ||||||
| export class RdDUtility { | export class RdDUtility { | ||||||
|  |  | ||||||
|  |   /* -------------------------------------------- */ | ||||||
|  |   static async init() { | ||||||
|  |     Hooks.on("renderChatMessage", async (app, html, msg) => RdDUtility.onRenderChatMessage(app, html, msg)); | ||||||
|  |     Hooks.on('renderChatLog', (log, html, data) => RdDUtility.chatListeners(html)); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static async preloadHandlebarsTemplates() { |   static async preloadHandlebarsTemplates() { | ||||||
|     const templatePaths = [ |     const templatePaths = [ | ||||||
| @@ -263,23 +270,30 @@ export class RdDUtility { | |||||||
|   static async processItemDropEvent(actorSheet, event) { |   static async processItemDropEvent(actorSheet, event) { | ||||||
|     let dragData = JSON.parse(event.dataTransfer.getData("text/plain")); |     let dragData = JSON.parse(event.dataTransfer.getData("text/plain")); | ||||||
|     console.log(dragData, actorSheet.actor.id); |     console.log(dragData, actorSheet.actor.id); | ||||||
|     let dropID = $(event.target).parents(".item").attr("data-item-id"); // Only relevant if container drop |  | ||||||
|     let objetId = dragData.id || dragData.data._id; |     let objetId = dragData.id || dragData.data._id; | ||||||
|     console.log("DRAG", dragData); |     console.log("DRAG", dragData); | ||||||
|     if (dragData.type == 'Item') { |     if (dragData.type == 'Item') { | ||||||
|       if (dropID) { // Dropped over an item !!! |       if (dragData.actorId) { | ||||||
|         if (actorSheet.objetVersConteneur[objetId] != dropID && objetId != dropID) { |         if (dragData.actorId != actorSheet.actor.id) { | ||||||
|           if (actorSheet.actor.validateConteneur(objetId, dropID) && actorSheet.actor.testConteneurCapacite(objetId, dropID)) { |           console.log("Moving objects", dragData); | ||||||
|             await actorSheet.actor.enleverDeConteneur(objetId, actorSheet.objetVersConteneur[objetId]); |  | ||||||
|             await actorSheet.actor.ajouterAConteneur(objetId, dropID); |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|       if (dragData.actorId && dragData.actorId != actorSheet.actor.id) { // Un acteur est à l'origine de l'item -> deplacement |  | ||||||
|         console.log("Moving objects"); |  | ||||||
|           actorSheet.actor.moveItemsBetweenActors(objetId, dragData.actorId); |           actorSheet.actor.moveItemsBetweenActors(objetId, dragData.actorId); | ||||||
|           return false; |           return false; | ||||||
|         } |         } | ||||||
|  |         else { | ||||||
|  |           // rangement | ||||||
|  |           const destId = $(event.target).parents(".item").attr("data-item-id"); | ||||||
|  |           const srcId = actorSheet.objetVersConteneur[objetId]; | ||||||
|  |  | ||||||
|  |           if (srcId != destId && objetId != destId && actorSheet.actor.isConteneurSuffisant(objetId, destId)) { | ||||||
|  |             if (srcId) { | ||||||
|  |               await actorSheet.actor.enleverDeConteneur(objetId, srcId); | ||||||
|  |             } | ||||||
|  |             if (destId) { // Dropped over an item !!! | ||||||
|  |               await actorSheet.actor.ajouterAConteneur(objetId, destId); | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } | ||||||
|       actorSheet.actor.computeEncombrementTotalEtMalusArmure(); |       actorSheet.actor.computeEncombrementTotalEtMalusArmure(); | ||||||
|     } else if (dragData.type == "Actor") { |     } else if (dragData.type == "Actor") { | ||||||
|       actorSheet.actor.addSubacteur(objetId); |       actorSheet.actor.addSubacteur(objetId); | ||||||
| @@ -537,7 +551,7 @@ export class RdDUtility { | |||||||
|       actor.tmrApp.lancerSortEnReserve(coord, sortId); |       actor.tmrApp.lancerSortEnReserve(coord, sortId); | ||||||
|     }); |     }); | ||||||
|     // Gestion du bouton payer |     // Gestion du bouton payer | ||||||
|     html.on("click", '#payer-button', event => { |     html.on("click", '.payer-button', event => { | ||||||
|       let sumdenier = event.currentTarget.attributes['data-somme-denier'].value; |       let sumdenier = event.currentTarget.attributes['data-somme-denier'].value; | ||||||
|       let quantite = 1; |       let quantite = 1; | ||||||
|       if (event.currentTarget.attributes['data-quantite']) { |       if (event.currentTarget.attributes['data-quantite']) { | ||||||
| @@ -588,7 +602,7 @@ export class RdDUtility { | |||||||
|  |  | ||||||
|     let sumtotald = sumd + (sums * 100); |     let sumtotald = sumd + (sums * 100); | ||||||
|     let msgPayer = "La somme de " + sums + " Sols et " + sumd + " Deniers est à payer, cliquer sur le lien ci-dessous si besoin.<br>"; |     let msgPayer = "La somme de " + sums + " Sols et " + sumd + " Deniers est à payer, cliquer sur le lien ci-dessous si besoin.<br>"; | ||||||
|     msgPayer += "<a id='payer-button' class='chat-card-button' data-somme-denier='" + sumtotald + "'>Payer</a>" |     msgPayer += "<a class='payer-button chat-card-button' data-somme-denier='" + sumtotald + "'>Payer</a>" | ||||||
|     ChatMessage.create({ content: msgPayer }); |     ChatMessage.create({ content: msgPayer }); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -643,7 +657,7 @@ export class RdDUtility { | |||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static async confirmerSuppression(actorSheet, li) { |   static async confirmerSuppression(actorSheet, li) { | ||||||
|     let itemId = li.data("item-id"); |     let itemId = li.data("item-id"); | ||||||
|     let objet = actorSheet.actor.items.find(item => item._id == itemId); |     let objet = actorSheet.actor.getObjet(itemId); | ||||||
|     let msgTxt = "<p>Etes vous certain de vouloir supprimer cet objet ?"; |     let msgTxt = "<p>Etes vous certain de vouloir supprimer cet objet ?"; | ||||||
|     let buttons = { |     let buttons = { | ||||||
|       delete: { |       delete: { | ||||||
| @@ -651,7 +665,7 @@ export class RdDUtility { | |||||||
|         label: "Supprimer l'objet", |         label: "Supprimer l'objet", | ||||||
|         callback: () => { |         callback: () => { | ||||||
|           console.log("Delete : ", itemId); |           console.log("Delete : ", itemId); | ||||||
|           actorSheet.actor.deleteOwnedItem(itemId); |           actorSheet.actor.deleteEmbeddedDocuments('Item', [itemId]); | ||||||
|           li.slideUp(200, () => actorSheet.render(false)); |           li.slideUp(200, () => actorSheet.render(false)); | ||||||
|         } |         } | ||||||
|       }, |       }, | ||||||
| @@ -660,8 +674,9 @@ export class RdDUtility { | |||||||
|         label: "Annuler" |         label: "Annuler" | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|     if (objet.data.type == 'conteneur' && objet.data.data.contenu.length > 0) { |     const docData = Misc.data(objet); | ||||||
|       msgTxt += "<br>Cet objet est aussi un conteneur avec du contenu : choisissez l'option de suppression"; |     if (docData.type == 'conteneur' && docData.data.contenu.length > 0) { | ||||||
|  |       msgTxt += "<br>Ce conteneur n'est pas vide. Choisissez l'option de suppression"; | ||||||
|       buttons['deleteall'] = { |       buttons['deleteall'] = { | ||||||
|         icon: '<i class="fas fa-check"></i>', |         icon: '<i class="fas fa-check"></i>', | ||||||
|         label: "Supprimer le conteneur et tout son contenu", |         label: "Supprimer le conteneur et tout son contenu", | ||||||
|   | |||||||
| @@ -8,11 +8,11 @@ import { TMRType } from "./tmr-utility.js"; | |||||||
| const typeRencontres = { | const typeRencontres = { | ||||||
|  |  | ||||||
|   messager: { |   messager: { | ||||||
|     msgSucces: (data) => `Le ${data.rencontre.name} vous propose d'emmener le message de votre un sort à ${data.rencontre.force} cases ${data.tmr.label}.`, |     msgSucces: (rencData) => `Le ${rencData.rencontre.name} vous propose d'emmener le message de votre un sort à ${rencData.rencontre.force} cases ${rencData.tmr.label}.`, | ||||||
|     msgEchec: (data) => `Le ${data.rencontre.name} est pressé et continue son chemin d'une traite sans vous accorder un regard.`, |     msgEchec: (rencData) => `Le ${rencData.rencontre.name} est pressé et continue son chemin d'une traite sans vous accorder un regard.`, | ||||||
|     postSucces: (tmrDialog, data) => { |     postSucces: (tmrDialog, rencData) => { | ||||||
|       tmrDialog.setStateRencontre(data.rencontre.type); |       tmrDialog.setStateRencontre(rencData.rencontre.type); | ||||||
|       tmrDialog.choisirCasePortee(data.tmr.coord, data.rencontre.force); |       tmrDialog.choisirCasePortee(rencData.tmr.coord, rencData.rencontre.force); | ||||||
|     }, |     }, | ||||||
|     poesieSucces: { |     poesieSucces: { | ||||||
|       reference: "La chevelure, Charles Baudelaire", |       reference: "La chevelure, Charles Baudelaire", | ||||||
| @@ -28,11 +28,11 @@ const typeRencontres = { | |||||||
|   }, |   }, | ||||||
|  |  | ||||||
|   passeur: { |   passeur: { | ||||||
|     msgSucces: (data) => `Le ${data.rencontre.name} vous propose de vous transporter à ${data.rencontre.force} cases des ${data.tmr.label}.`, |     msgSucces: (rencData) => `Le ${rencData.rencontre.name} vous propose de vous transporter à ${rencData.rencontre.force} cases des ${rencData.tmr.label}.`, | ||||||
|     msgEchec: (data) => `Le prix que demande le ${data.rencontre.name} est trop élevé, vous êtes réduit à poursuivre votre chemin par vos propres moyens.`, |     msgEchec: (rencData) => `Le prix que demande le ${rencData.rencontre.name} est trop élevé, vous êtes réduit à poursuivre votre chemin par vos propres moyens.`, | ||||||
|     postSucces: (tmrDialog, data) => { |     postSucces: (tmrDialog, rencData) => { | ||||||
|       tmrDialog.setStateRencontre(data.rencontre.type); |       tmrDialog.setStateRencontre(rencData.rencontre.type); | ||||||
|       tmrDialog.choisirCasePortee(data.tmr.coord, data.rencontre.force); |       tmrDialog.choisirCasePortee(rencData.tmr.coord, rencData.rencontre.force); | ||||||
|     }, |     }, | ||||||
|     poesieSucces: { |     poesieSucces: { | ||||||
|       reference: "Femmes damnées (2), Charles Baudelaire", |       reference: "Femmes damnées (2), Charles Baudelaire", | ||||||
| @@ -49,9 +49,9 @@ const typeRencontres = { | |||||||
|   }, |   }, | ||||||
|  |  | ||||||
|   fleur: { |   fleur: { | ||||||
|     msgSucces: (data) => `Vous cueillez la ${data.rencontre.name}, son parfum vous apporte ${data.rencontre.force} points de Rêve.`, |     msgSucces: (rencData) => `Vous cueillez la ${rencData.rencontre.name}, son parfum vous apporte ${rencData.rencontre.force} points de Rêve.`, | ||||||
|     msgEchec: (data) => `La ${data.rencontre.name} se fâne et disparaît entre vos doigts.`, |     msgEchec: (rencData) => `La ${rencData.rencontre.name} se fâne et disparaît entre vos doigts.`, | ||||||
|     postSucces: (tmrDialog, data) => tmrDialog.actor.reveActuelIncDec(data.rencontre.force), |     postSucces: (tmrDialog, rencData) => tmrDialog.actor.reveActuelIncDec(rencData.rencontre.force), | ||||||
|     poesieSucces: { |     poesieSucces: { | ||||||
|       reference: "L'Ennemi, Charles Baudelaire", |       reference: "L'Ennemi, Charles Baudelaire", | ||||||
|       extrait: `Et qui sait si les fleurs nouvelles que je rêve |       extrait: `Et qui sait si les fleurs nouvelles que je rêve | ||||||
| @@ -66,9 +66,9 @@ const typeRencontres = { | |||||||
|   }, |   }, | ||||||
|  |  | ||||||
|   mangeur: { |   mangeur: { | ||||||
|     msgSucces: (data) => `Le ${data.rencontre.name} claque de sa machoire dans le vide avant de fuir.`, |     msgSucces: (rencData) => `Le ${rencData.rencontre.name} claque de sa machoire dans le vide avant de fuir.`, | ||||||
|     msgEchec: (data) => `Le ${data.rencontre.name} croque votre Rêve ! Il emporte ${data.rencontre.force} de vos points de rêve actuels`, |     msgEchec: (rencData) => `Le ${rencData.rencontre.name} croque votre Rêve ! Il emporte ${rencData.rencontre.force} de vos points de rêve actuels`, | ||||||
|     postEchec: (tmrDialog, data) => tmrDialog.actor.reveActuelIncDec(-data.rencontre.force), |     postEchec: (tmrDialog, rencData) => tmrDialog.actor.reveActuelIncDec(-rencData.rencontre.force), | ||||||
|     poesieSucces: { |     poesieSucces: { | ||||||
|       reference: "Conseil, Victor Hugo", |       reference: "Conseil, Victor Hugo", | ||||||
|       extrait: `Rois ! la bure est souvent jalouse du velours. |       extrait: `Rois ! la bure est souvent jalouse du velours. | ||||||
| @@ -85,16 +85,16 @@ const typeRencontres = { | |||||||
|   }, |   }, | ||||||
|  |  | ||||||
|   changeur: { |   changeur: { | ||||||
|     msgSucces: (data) => `Le ${data.rencontre.name} vaincu accepte de vous déplacer sur une autre ${TMRType[data.tmr.type].name} de votre choix en échange de sa liberté.`, |     msgSucces: (rencData) => `Le ${rencData.rencontre.name} vaincu accepte de vous déplacer sur une autre ${TMRType[rencData.tmr.type].name} de votre choix en échange de sa liberté.`, | ||||||
|     msgEchec: (data) => { |     msgEchec: (rencData) => { | ||||||
|       data.newTMR = TMRUtility.getTMRAleatoire(it => it.type = data.tmr.type); |       rencData.newTMR = TMRUtility.getTMRAleatoire(it => it.type = rencData.tmr.type); | ||||||
|       return `Le ${data.rencontre.name} vous embobine avec des promesses, et vous transporte en ${data.newTMR.label} sans attendre votre avis.`; |       return `Le ${rencData.rencontre.name} vous embobine avec des promesses, et vous transporte en ${rencData.newTMR.label} sans attendre votre avis.`; | ||||||
|     }, |     }, | ||||||
|     postSucces: (tmrDialog, data) => { |     postSucces: (tmrDialog, rencData) => { | ||||||
|       tmrDialog.setStateRencontre(data.rencontre.type); |       tmrDialog.setStateRencontre(rencData.rencontre.type); | ||||||
|       tmrDialog.choisirCaseType(data.tmr.type); |       tmrDialog.choisirCaseType(rencData.tmr.type); | ||||||
|     }, |     }, | ||||||
|     postEchec: (tmrDialog, data) => tmrDialog.forceDemiRevePosition(data.newTMR.coord), |     postEchec: (tmrDialog, rencData) => tmrDialog.forceDemiRevePosition(rencData.newTMR.coord), | ||||||
|     poesieSucces: { |     poesieSucces: { | ||||||
|       reference: "Caligula - IIIème chant, Gérard de Nerval", |       reference: "Caligula - IIIème chant, Gérard de Nerval", | ||||||
|       extrait: `Allez, que le caprice emporte |       extrait: `Allez, que le caprice emporte | ||||||
| @@ -111,9 +111,9 @@ const typeRencontres = { | |||||||
|   }, |   }, | ||||||
|  |  | ||||||
|   briseur: { |   briseur: { | ||||||
|     msgSucces: (data) => `Le ${data.rencontre.name} tente vainement de vous déconcentrer, avant de fuir sans demander son reste.`, |     msgSucces: (rencData) => `Le ${rencData.rencontre.name} tente vainement de vous déconcentrer, avant de fuir sans demander son reste.`, | ||||||
|     msgEchec: (data) => `Le ${data.rencontre.name} vous déconcentre au point de briser votre demi-rêve.`, |     msgEchec: (rencData) => `Le ${rencData.rencontre.name} vous déconcentre au point de briser votre demi-rêve.`, | ||||||
|     postEchec: (tmrDialog, data) => tmrDialog.close(), |     postEchec: (tmrDialog, rencData) => tmrDialog.close(), | ||||||
|     poesieSucces: { |     poesieSucces: { | ||||||
|       reference: "Rêve de Dragon, Denis Gerfaud", |       reference: "Rêve de Dragon, Denis Gerfaud", | ||||||
|       extrait: `La légende affirme que ce sont les Gnomes qui furent |       extrait: `La légende affirme que ce sont les Gnomes qui furent | ||||||
| @@ -134,8 +134,8 @@ const typeRencontres = { | |||||||
|   }, |   }, | ||||||
|  |  | ||||||
|   reflet: { |   reflet: { | ||||||
|     msgSucces: (data) => `Le ${data.rencontre.name} s'estompe dans l'oubli.`, |     msgSucces: (rencData) => `Le ${rencData.rencontre.name} s'estompe dans l'oubli.`, | ||||||
|     msgEchec: (data) => `Vous êtes submergé par un ${data.rencontre.name}, les souvenirs vous retiennent tant qu'il ne sera pas vaincu!`, |     msgEchec: (rencData) => `Vous êtes submergé par un ${rencData.rencontre.name}, les souvenirs vous retiennent tant qu'il ne sera pas vaincu!`, | ||||||
|     poesieSucces: { |     poesieSucces: { | ||||||
|       reference: "Une charogne, Charles Baudelaire", |       reference: "Une charogne, Charles Baudelaire", | ||||||
|       extrait: `Les formes s'effaçaient et n'étaient plus qu'un rêve, |       extrait: `Les formes s'effaçaient et n'étaient plus qu'un rêve, | ||||||
| @@ -152,9 +152,9 @@ const typeRencontres = { | |||||||
|   }, |   }, | ||||||
|  |  | ||||||
|   passeurfou: { |   passeurfou: { | ||||||
|     msgSucces: (data) => `Le ${data.rencontre.name} tente vainement de découvrir où vous avez caché vos réserves. Vous le chassez, et en déroute il part harceler un autre voyageur du rêve.`, |     msgSucces: (rencData) => `Le ${rencData.rencontre.name} tente vainement de découvrir où vous avez caché vos réserves. Vous le chassez, et en déroute il part harceler un autre voyageur du rêve.`, | ||||||
|     msgEchec: (data) => TMRRencontres.msgEchecPasseurFou(data), |     msgEchec: (rencData) => TMRRencontres.msgEchecPasseurFou(rencData), | ||||||
|     postEchec: (tmrDialog, data) => TMRRencontres.postEchecPasseurFou(tmrDialog, data), |     postEchec: (tmrDialog, rencData) => TMRRencontres.postEchecPasseurFou(tmrDialog, rencData), | ||||||
|     poesieSucces: { |     poesieSucces: { | ||||||
|       reference: "Un Fou et un Sage, Jean de La Fontaine", |       reference: "Un Fou et un Sage, Jean de La Fontaine", | ||||||
|       extrait: `Certain Fou poursuivait à coups de pierre un Sage. |       extrait: `Certain Fou poursuivait à coups de pierre un Sage. | ||||||
| @@ -174,9 +174,9 @@ const typeRencontres = { | |||||||
|   }, |   }, | ||||||
|  |  | ||||||
|   tbblanc: { |   tbblanc: { | ||||||
|     msgSucces: (data) => `Le ${data.rencontre.name} souleve une poussière blanche, vous tenez bon, et il tourbillonne en s'éloignant.`, |     msgSucces: (rencData) => `Le ${rencData.rencontre.name} souleve une poussière blanche, vous tenez bon, et il tourbillonne en s'éloignant.`, | ||||||
|     msgEchec: (data) => `Le souffle du ${data.rencontre.name} vous déstabilise et vous emmène dans un nuage de poussière.`, |     msgEchec: (rencData) => `Le souffle du ${rencData.rencontre.name} vous déstabilise et vous emmène dans un nuage de poussière.`, | ||||||
|     postEchec: (tmrDialog, data) => TMRRencontres.onPostEchecTourbillon(tmrDialog, data, 1), |     postEchec: (tmrDialog, rencData) => TMRRencontres.onPostEchecTourbillon(tmrDialog, rencData, 1), | ||||||
|     poesieSucces: { |     poesieSucces: { | ||||||
|       reference: "Rêve de Dragon, Denis Gerfaud", |       reference: "Rêve de Dragon, Denis Gerfaud", | ||||||
|       extrait: `Le Premier Âge fut appelé l'Âge des Dragons. Ce fut le commencement |       extrait: `Le Premier Âge fut appelé l'Âge des Dragons. Ce fut le commencement | ||||||
| @@ -191,9 +191,9 @@ const typeRencontres = { | |||||||
|   }, |   }, | ||||||
|  |  | ||||||
|   tbnoir: { |   tbnoir: { | ||||||
|     msgSucces: (data) => `Le ${data.rencontre.name} orageux vous enveloppe de fureur et d'éclairs, vous tenez bon face à la tempête qui s'éloigne sans vous éloigner de votre chemin.`, |     msgSucces: (rencData) => `Le ${rencData.rencontre.name} orageux vous enveloppe de fureur et d'éclairs, vous tenez bon face à la tempête qui s'éloigne sans vous éloigner de votre chemin.`, | ||||||
|     msgEchec: (data) => `Le ${data.rencontre.name} furieux vous secoue tel un fichu de paille malmené par les vents, et vous emporte dans la tourmente.`, |     msgEchec: (rencData) => `Le ${rencData.rencontre.name} furieux vous secoue tel un fichu de paille malmené par les vents, et vous emporte dans la tourmente.`, | ||||||
|     postEchec: (tmrDialog, data) => TMRRencontres.onPostEchecTourbillon(tmrDialog, data, 2), |     postEchec: (tmrDialog, rencData) => TMRRencontres.onPostEchecTourbillon(tmrDialog, rencData, 2), | ||||||
|     poesieSucces: { |     poesieSucces: { | ||||||
|       reference: "Rêve de Dragon, Denis Gerfaud", |       reference: "Rêve de Dragon, Denis Gerfaud", | ||||||
|       extrait: `Car le Second Âge fut bel et bien celui des Magiciens. Durant cette période, les |       extrait: `Car le Second Âge fut bel et bien celui des Magiciens. Durant cette période, les | ||||||
| @@ -207,9 +207,9 @@ const typeRencontres = { | |||||||
|   }, |   }, | ||||||
|  |  | ||||||
|   tbrouge: { |   tbrouge: { | ||||||
|     msgSucces: (data) => `Le ${data.rencontre.name} s'abat avec violence mais vous êtes plus rapide et parvenez à lui échapper.`, |     msgSucces: (rencData) => `Le ${rencData.rencontre.name} s'abat avec violence mais vous êtes plus rapide et parvenez à lui échapper.`, | ||||||
|     msgEchec: (data) => `Le ${data.rencontre.name} vous frappe de milliers de morsure et vous malmène à travers les terres médianes.`, |     msgEchec: (rencData) => `Le ${rencData.rencontre.name} vous frappe de milliers de morsure et vous malmène à travers les terres médianes.`, | ||||||
|     postEchec: (tmrDialog, data) => TMRRencontres.onPostEchecTourbillonRouge(tmrDialog, data), |     postEchec: (tmrDialog, rencData) => TMRRencontres.onPostEchecTourbillonRouge(tmrDialog, rencData), | ||||||
|     poesieSucces: { |     poesieSucces: { | ||||||
|       reference: "Qu'est-ce de votre vie ? une bouteille molle, Jean-Baptiste Chassignet", |       reference: "Qu'est-ce de votre vie ? une bouteille molle, Jean-Baptiste Chassignet", | ||||||
|       extrait: `Qu'est-ce de votre vie ? un tourbillon rouant |       extrait: `Qu'est-ce de votre vie ? un tourbillon rouant | ||||||
| @@ -228,10 +228,10 @@ const typeRencontres = { | |||||||
|   }, |   }, | ||||||
|  |  | ||||||
|   rdd: { |   rdd: { | ||||||
|     msgSucces: (data) => `A tout seigneur, tout honneur, vous faites face à un ${data.rencontre.name}. Vous le maîtrisez et récupérez ses rêves. Vous gagnez ses ${data.rencontre.force} points de rêve`, |     msgSucces: (rencData) => `A tout seigneur, tout honneur, vous faites face à un ${rencData.rencontre.name}. Vous le maîtrisez et récupérez ses rêves. Vous gagnez ses ${rencData.rencontre.force} points de rêve`, | ||||||
|     msgEchec: (data) => `A tout seigneur, tout honneur, vous faites face à un ${data.rencontre.name}. La rencontre tourne au cauchemar, dans la lutte épique, vous subissez ${data.rolled.isETotal ? 'deux queues' : 'une queue'} de dragon!`, |     msgEchec: (rencData) => `A tout seigneur, tout honneur, vous faites face à un ${rencData.rencontre.name}. La rencontre tourne au cauchemar, dans la lutte épique, vous subissez ${rencData.rolled.isETotal ? 'deux queues' : 'une queue'} de dragon!`, | ||||||
|     postSucces: (tmrDialog, data) => TMRRencontres.onPostSuccessReveDeDragon(tmrDialog, data), |     postSucces: (tmrDialog, rencData) => TMRRencontres.onPostSuccessReveDeDragon(tmrDialog, rencData), | ||||||
|     postEchec: (tmrDialog, data) => TMRRencontres.onPostEchecReveDeDragon(tmrDialog, data), |     postEchec: (tmrDialog, rencData) => TMRRencontres.onPostEchecReveDeDragon(tmrDialog, rencData), | ||||||
|     poesieSucces: { |     poesieSucces: { | ||||||
|       reference: "Rêve de Dragon, Denis Gerfaud", |       reference: "Rêve de Dragon, Denis Gerfaud", | ||||||
|       extrait: `Le monde est Rêve de Dragons, mais nous ne savons |       extrait: `Le monde est Rêve de Dragons, mais nous ne savons | ||||||
| @@ -407,58 +407,58 @@ export class TMRRencontres { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static async gererRencontre(tmrDialog, data) { |   static async gererRencontre(tmrDialog, rencData) { | ||||||
|     let gestion = TMRRencontres.getGestionRencontre(data.rencontre.type); |     let gestion = TMRRencontres.getGestionRencontre(rencData.rencontre.type); | ||||||
|     if (data.rolled.isSuccess) { |     if (rencData.rolled.isSuccess) { | ||||||
|       data.message = gestion.msgSucces(data); |       rencData.message = gestion.msgSucces(rencData); | ||||||
|       if (data.nbRounds > 1) { |       if (rencData.nbRounds > 1) { | ||||||
|         data.message += ` Au total, vous avez passé ${data.nbRounds} rounds à vous battre!`; |         rencData.message += ` Au total, vous avez passé ${rencData.nbRounds} rounds à vous battre!`; | ||||||
|       } |       } | ||||||
|       data.poesie = gestion.poesieSucces; |       rencData.poesie = gestion.poesieSucces; | ||||||
|       return gestion.postSucces; |       return gestion.postSucces; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     data.message = gestion.msgEchec(data); |     rencData.message = gestion.msgEchec(rencData); | ||||||
|     if (data.nbRounds > 1) { |     if (rencData.nbRounds > 1) { | ||||||
|       data.message += ` Vous avez passé ${data.nbRounds} rounds à lutter!`; |       rencData.message += ` Vous avez passé ${rencData.nbRounds} rounds à lutter!`; | ||||||
|     } |     } | ||||||
|     data.poesie = gestion.poesieEchec; |     rencData.poesie = gestion.poesieEchec; | ||||||
|     return gestion.postEchec; |     return gestion.postEchec; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static msgEchecPasseurFou(data) { |   static msgEchecPasseurFou(tmrData) { | ||||||
|     data.sortReserve = data.actor.data.data.reve.reserve.list[0]; |     tmrData.sortReserve = Misc.templateData(tmrData.actor).reve.reserve.list[0]; | ||||||
|     if (data.sortReserve) { |     if (tmrData.sortReserve) { | ||||||
|       // Passeur fou positionne sur la case d'un ort en réserve // TODO : Choisir le sort le plus loin ou au hasard |       // Passeur fou positionne sur la case d'un ort en réserve // TODO : Choisir le sort le plus loin ou au hasard | ||||||
|       data.newTMR = TMRUtility.getTMR(data.sortReserve.coord); |       tmrData.newTMR = TMRUtility.getTMR(tmrData.sortReserve.coord); | ||||||
|     } else { |     } else { | ||||||
|       // Déplacement aléatoire de la force du Passeur Fou |       // Déplacement aléatoire de la force du Passeur Fou | ||||||
|       const newCoord = Misc.rollOneOf(TMRUtility.getTMRPortee(data.tmr.coord, data.rencontre.force)); |       const newCoord = Misc.rollOneOf(TMRUtility.getTMRPortee(tmrData.tmr.coord, tmrData.rencontre.force)); | ||||||
|       data.newTMR = TMRUtility.getTMR(newCoord); |       tmrData.newTMR = TMRUtility.getTMR(newCoord); | ||||||
|     } |     } | ||||||
|     if (data.sortReserve) { |     if (tmrData.sortReserve) { | ||||||
|       return `Le ${data.rencontre.name} vous dérobe la clé de vos sorts. Vous vous saisissez de lui, mais dans un nuage violet, il vous emporte en ${data.newTMR.label} déclencher votre sort en réserve de ${data.sortReserve.name}.`; |       return `Le ${tmrData.rencontre.name} vous dérobe la clé de vos sorts. Vous vous saisissez de lui, mais dans un nuage violet, il vous emporte en ${tmrData.newTMR.label} déclencher votre sort en réserve de ${tmrData.sortReserve.name}.`; | ||||||
|     } |     } | ||||||
|     else { |     else { | ||||||
|       return `Le ${data.rencontre.name} tente de vous dérober la clé de vos sorts. Ne la trouvant pas, il déclenche un nuage violet et vous emporte en ${data.newTMR.label}`; |       return `Le ${tmrData.rencontre.name} tente de vous dérober la clé de vos sorts. Ne la trouvant pas, il déclenche un nuage violet et vous emporte en ${tmrData.newTMR.label}`; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   static async postEchecPasseurFou(tmrDialog, data) { |   static async postEchecPasseurFou(tmrDialog, tmrData) { | ||||||
|     if (data.sortReserve) { |     if (tmrData.sortReserve) { | ||||||
|       await tmrDialog.processSortReserve(data.sortReserve); |       await tmrDialog.processSortReserve(tmrData.sortReserve); | ||||||
|     } |     } | ||||||
|     await tmrDialog.forceDemiRevePosition(data.newTMR.coord); |     await tmrDialog.forceDemiRevePosition(tmrData.newTMR.coord); | ||||||
|     if (data.sortReserve) { |     if (tmrData.sortReserve) { | ||||||
|       tmrDialog.close(); |       tmrDialog.close(); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   static async onPostEchecTourbillon(tmrDialog, data, cases) { |   static async onPostEchecTourbillon(tmrDialog, tmrData, cases) { | ||||||
|     await data.actor.reveActuelIncDec(-cases); |     await tmrData.actor.reveActuelIncDec(-cases); | ||||||
|     await TMRRencontres._toubillonner(tmrDialog, data.actor, cases); |     await TMRRencontres._toubillonner(tmrDialog, tmrData.actor, cases); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
| @@ -469,22 +469,22 @@ export class TMRRencontres { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   static async _toubillonner(tmrDialog, actor, cases) { |   static async _toubillonner(tmrDialog, actor, cases) { | ||||||
|     let coord = actor.data.data.reve.tmrpos.coord; |     let coord = Misc.templateData(actor).reve.tmrpos.coord; | ||||||
|     for (let i = 0; i < cases; i++) { |     for (let i = 0; i < cases; i++) { | ||||||
|       coord = TMRUtility.deplaceTMRAleatoire(actor, coord).coord; |       coord = TMRUtility.deplaceTMRAleatoire(actor, coord).coord; | ||||||
|     } |     } | ||||||
|     await tmrDialog.forceDemiRevePosition(coord) |     await tmrDialog.forceDemiRevePosition(coord) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   static async onPostSuccessReveDeDragon(tmrDialog, data) { |   static async onPostSuccessReveDeDragon(tmrDialog, tmrData) { | ||||||
|     if (data.rolled.isPart) { |     if (tmrData.rolled.isPart) { | ||||||
|       await data.actor.appliquerExperience(data.rolled, 'reve', data.competence); |       await tmrData.actor.appliquerExperience(tmrData.rolled, 'reve', tmrData.competence); | ||||||
|     } |     } | ||||||
|     await data.actor.resultCombatReveDeDragon(data); |     await tmrData.actor.resultCombatReveDeDragon(tmrData); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   static async onPostEchecReveDeDragon(tmrDialog, data) { |   static async onPostEchecReveDeDragon(tmrDialog, tmrData) { | ||||||
|     await data.actor.resultCombatReveDeDragon(data); |     await tmrData.actor.resultCombatReveDeDragon(tmrData); | ||||||
|     tmrDialog.close(); |     tmrDialog.close(); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -29,14 +29,14 @@ export class Conquete extends Draconique { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   async _creerConquete(actor, queue) { |   async _creerConquete(actor, queue) { | ||||||
|     let existants = actor.data.items.filter(it => this.isCase(it)).map(it => it.data.coord); |     let existants = actor.data.items.filter(it => this.isCase(it)).map(it => Misc.data(it).data.coord); | ||||||
|     let possibles = TMRUtility.filterTMR(tmr => !TMRUtility.isCaseHumide(tmr) && !existants.includes(tmr.coord)); |     let possibles = TMRUtility.filterTMR(tmr => !TMRUtility.isCaseHumide(tmr) && !existants.includes(tmr.coord)); | ||||||
|     let conquete = Misc.rollOneOf(possibles); |     let conquete = Misc.rollOneOf(possibles); | ||||||
|     await this.createCaseTmr(actor, 'Conquête: ' + conquete.label, conquete, queue._id); |     await this.createCaseTmr(actor, 'Conquête: ' + conquete.label, conquete, queue.id); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   async onActorDeleteCaseTmr(actor, casetmr) { |   async onActorDeleteCaseTmr(actor, casetmr) { | ||||||
|     await actor.deleteOwnedItem(casetmr.data.sourceid); |     await actor.deleteEmbeddedDocuments('Item', [casetmr.data.sourceid]); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -14,7 +14,7 @@ export class Debordement extends Draconique { | |||||||
|   async onActorCreateOwned(actor, souffle) { |   async onActorCreateOwned(actor, souffle) { | ||||||
|     const existants = actor.data.items.filter(it => this.isCase(it)).map(it => it.data.coord); |     const existants = actor.data.items.filter(it => this.isCase(it)).map(it => it.data.coord); | ||||||
|     const tmr = TMRUtility.getTMRAleatoire(it => !(TMRUtility.isCaseHumide(it) || existants.includes(it.coord))); |     const tmr = TMRUtility.getTMRAleatoire(it => !(TMRUtility.isCaseHumide(it) || existants.includes(it.coord))); | ||||||
|     await this.createCaseTmr(actor, 'Debordement: ' + tmr.label, tmr, souffle._id); |     await this.createCaseTmr(actor, 'Debordement: ' + tmr.label, tmr, souffle.id); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   code() { return 'debordement' } |   code() { return 'debordement' } | ||||||
|   | |||||||
| @@ -43,7 +43,7 @@ export class Desorientation extends Draconique { | |||||||
|     const existants = actor.data.items.filter(it => this.isCase(it)).map(it => it.data.coord); |     const existants = actor.data.items.filter(it => this.isCase(it)).map(it => it.data.coord); | ||||||
|     let tmrs = TMRUtility.filterTMR(it => it.type == type && !existants.includes(it.coord)); |     let tmrs = TMRUtility.filterTMR(it => it.type == type && !existants.includes(it.coord)); | ||||||
|     for (let tmr of tmrs) { |     for (let tmr of tmrs) { | ||||||
|       await this.createCaseTmr(actor, 'Désorientation: ' + tmr.label, tmr, souffle._id); |       await this.createCaseTmr(actor, 'Désorientation: ' + tmr.label, tmr, souffle.id); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,3 +1,4 @@ | |||||||
|  | import { Misc } from "../misc.js"; | ||||||
| import { TMRUtility } from "../tmr-utility.js"; | import { TMRUtility } from "../tmr-utility.js"; | ||||||
| import { PixiTMR } from "./pixi-tmr.js"; | import { PixiTMR } from "./pixi-tmr.js"; | ||||||
|  |  | ||||||
| @@ -8,11 +9,11 @@ const registeredEffects = [ | |||||||
|  * Définition des informations d'une "draconique" (queue, ombre, tête, souffle) qui influence les TMR |  * Définition des informations d'une "draconique" (queue, ombre, tête, souffle) qui influence les TMR | ||||||
|  */ |  */ | ||||||
| export class Draconique { | export class Draconique { | ||||||
|   static isCaseTMR(element) { return element.type == 'casetmr'; } |   static isCaseTMR(itemData) { return itemData.type == 'casetmr'; } | ||||||
|   static isQueueDragon(element) { return element.type == 'queue' || element.type == 'ombre'; } |   static isQueueDragon(itemData) { return itemData.type == 'queue' || itemData.type == 'ombre'; } | ||||||
|   static isSouffleDragon(element) { return element.type == 'souffle'; } |   static isSouffleDragon(itemData) { return itemData.type == 'souffle'; } | ||||||
|   static isTeteDragon(element) { return element.type == 'tete'; } |   static isTeteDragon(itemData) { return itemData.type == 'tete'; } | ||||||
|   static isQueueSouffle(it) { return Draconique.isQueueDragon(it) || Draconique.isSouffleDragon(it); } |   static isQueueSouffle(itemData) { return Draconique.isQueueDragon(itemData) || Draconique.isSouffleDragon(itemData); } | ||||||
|  |  | ||||||
|   tmrLabel(linkData) { return TMRUtility.getTMRLabel(linkData.data.coord); } |   tmrLabel(linkData) { return TMRUtility.getTMRLabel(linkData.data.coord); } | ||||||
|  |  | ||||||
| @@ -37,7 +38,8 @@ export class Draconique { | |||||||
|    * @returns true si l'item correspond |    * @returns true si l'item correspond | ||||||
|    */ |    */ | ||||||
|   match(item) { |   match(item) { | ||||||
|     return Draconique.isQueueDragon(item) || Draconique.isSouffleDragon(item) || Draconique.isTeteDragon(item); |     const itemData = Misc.data(item); | ||||||
|  |     return Draconique.isQueueDragon(itemData) || Draconique.isSouffleDragon(itemData) || Draconique.isTeteDragon(itemData); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /** |   /** | ||||||
| @@ -110,35 +112,40 @@ export class Draconique { | |||||||
|  |  | ||||||
|   /** |   /** | ||||||
|    *  |    *  | ||||||
|    * @param {*} it un item à tester |    * @param {*} item un item à tester | ||||||
|    * @param {*} coord les coordonnées d'une case. Si undefined toute case du type correspondra,  |    * @param {*} coord les coordonnées d'une case. Si undefined toute case du type correspondra,  | ||||||
|    */ |    */ | ||||||
|   isCase(it, coord = undefined) { |   isCase(item, coord = undefined) { | ||||||
|     return Draconique.isCaseTMR(it) && it.data.specific == this.code() && (coord ? it.data.coord == coord : true); |     const itemData = Misc.data(item); | ||||||
|  |     return Draconique.isCaseTMR(itemData) && itemData.data.specific == this.code() && (coord ? itemData.data.coord == coord : true); | ||||||
|   } |   } | ||||||
|    |    | ||||||
|   find(list, coord = undefined) { |   find(list, coord = undefined) { | ||||||
|     return list.find(c => this.isCase(c, coord)); |     return list.find(c => this.isCase(Misc.data(c), coord)); | ||||||
|   } |   } | ||||||
|    |    | ||||||
|   async createCaseTmr(actor, label, tmr, sourceId = undefined) { |   async createCaseTmr(actor, label, tmr, sourceId = undefined) { | ||||||
|     await actor.createEmbeddedDocuments('Item',[{ |     const casetmrData = { | ||||||
|       name: label, type: 'casetmr', img: this.img(), _id: randomID(16), |       name: label, type: 'casetmr', img: this.img(), | ||||||
|       data: { coord: tmr.coord, specific: this.code(), sourceid: sourceId } |       data: { coord: tmr.coord, specific: this.code(), sourceid: sourceId } | ||||||
|     }]); |     }; | ||||||
|  |     await actor.createEmbeddedDocuments('Item', [casetmrData]); | ||||||
|   } |   } | ||||||
|    |    | ||||||
|   async deleteCasesTmr(actor, draconique) { |   async deleteCasesTmr(actor, draconique) { | ||||||
|     let caseTmrs = actor.data.items.filter(it => this.isCase(it) && it.data.sourceid == draconique._id); |     let caseTmrs = actor.data.items.filter(it => this.isCaseForSource(it, draconique)); | ||||||
|     for (let casetmr of caseTmrs) { |     await actor.deleteEmbeddedDocuments('Item', caseTmrs.map(it => it.id)); | ||||||
|       await actor.deleteOwnedItem(casetmr._id); |  | ||||||
|   } |   } | ||||||
|  |    | ||||||
|  |   isCaseForSource(item, draconique) { | ||||||
|  |     const itemData = Misc.data(item); | ||||||
|  |     return Draconique.isCaseTMR(itemData) && itemData.data.specific == this.code() && itemData.data.sourceid == draconique.id; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   async onVisiteSupprimer(actor, tmr, onRemoveToken) { |   async onVisiteSupprimer(actor, tmr, onRemoveToken) { | ||||||
|     let existants = actor.data.items.filter(it => this.isCase(it, tmr.coord)); |     let existants = actor.data.items.filter(it => this.isCase(it, tmr.coord)); | ||||||
|  |     await actor.deleteEmbeddedDocuments('Item', existants.map(it => it.id)); | ||||||
|     for (let casetmr of existants) { |     for (let casetmr of existants) { | ||||||
|       await actor.deleteOwnedItem(casetmr._id); |  | ||||||
|       onRemoveToken(tmr, casetmr); |       onRemoveToken(tmr, casetmr); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -32,7 +32,7 @@ export class FermetureCites extends Draconique { | |||||||
|     let existants = actor.data.items.filter(it => this.isCase(it)).map(it => it.data.coord); |     let existants = actor.data.items.filter(it => this.isCase(it)).map(it => it.data.coord); | ||||||
|     let ouvertes = TMRUtility.filterTMR(it => it.type == 'cite' && !existants.includes(it.coord)); |     let ouvertes = TMRUtility.filterTMR(it => it.type == 'cite' && !existants.includes(it.coord)); | ||||||
|     for (let tmr of ouvertes) { |     for (let tmr of ouvertes) { | ||||||
|       await this.createCaseTmr(actor, 'Fermeture: ' + tmr.label, tmr, souffle._id); |       await this.createCaseTmr(actor, 'Fermeture: ' + tmr.label, tmr, souffle.id); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -14,7 +14,7 @@ export class Pelerinage extends Draconique { | |||||||
|  |  | ||||||
|   async onActorCreateOwned(actor, queue) {  |   async onActorCreateOwned(actor, queue) {  | ||||||
|     let tmr = TMRUtility.getTMRAleatoire(); |     let tmr = TMRUtility.getTMRAleatoire(); | ||||||
|     await this.createCaseTmr(actor, 'Pèlerinage: ' + tmr.label, tmr, queue._id); |     await this.createCaseTmr(actor, 'Pèlerinage: ' + tmr.label, tmr, queue.id); | ||||||
|   } |   } | ||||||
|    |    | ||||||
|    |    | ||||||
| @@ -32,7 +32,7 @@ export class Pelerinage extends Draconique { | |||||||
|   } |   } | ||||||
|    |    | ||||||
|   async onActorDeleteCaseTmr(actor, casetmr) { |   async onActorDeleteCaseTmr(actor, casetmr) { | ||||||
|     await actor.deleteOwnedItem(casetmr.data.sourceid); |     await actor.deleteEmbeddedDocuments('Item', [casetmr.data.sourceid]); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -16,13 +16,13 @@ export class Periple extends Draconique { | |||||||
|     let terrain = new Roll("1d2").evaluate().total == 1 ? 'sanctuaire' : 'necropole'; |     let terrain = new Roll("1d2").evaluate().total == 1 ? 'sanctuaire' : 'necropole'; | ||||||
|     let tmrs = TMRUtility.getListTMR(terrain); |     let tmrs = TMRUtility.getListTMR(terrain); | ||||||
|     for (let tmr of tmrs) { |     for (let tmr of tmrs) { | ||||||
|       await this.createCaseTmr(actor, 'Périple: ' + tmr.label, tmr, souffle._id); |       await this.createCaseTmr(actor, 'Périple: ' + tmr.label, tmr, souffle.id); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |  | ||||||
|   code() { return 'periple' } |   code() { return 'periple' } | ||||||
|   tooltip(linkData) { return `Votre Périple passe par ${this.tmrDescr(linkData)}` } |   tooltip(linkData) { return `Votre Périple passe par ${this.tmrLabel(linkData)}` } | ||||||
|   img() { return 'icons/svg/acid.svg' } |   img() { return 'icons/svg/acid.svg' } | ||||||
|  |  | ||||||
|   createSprite(pixiTMR) { |   createSprite(pixiTMR) { | ||||||
|   | |||||||
| @@ -14,7 +14,7 @@ export class PontImpraticable extends Draconique { | |||||||
|   async onActorCreateOwned(actor, souffle) { |   async onActorCreateOwned(actor, souffle) { | ||||||
|     const ponts = TMRUtility.getListTMR('pont'); |     const ponts = TMRUtility.getListTMR('pont'); | ||||||
|     for (let tmr of ponts) { |     for (let tmr of ponts) { | ||||||
|       await this.createCaseTmr(actor, 'Pont impraticable: ' + tmr.label, tmr, souffle._id); |       await this.createCaseTmr(actor, 'Pont impraticable: ' + tmr.label, tmr, souffle.id); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -40,7 +40,7 @@ export class PresentCites extends Draconique { | |||||||
|     else { |     else { | ||||||
|       let cites = TMRUtility.filterTMR(it => it.type == 'cite'); |       let cites = TMRUtility.filterTMR(it => it.type == 'cite'); | ||||||
|       for (let tmr of cites) { |       for (let tmr of cites) { | ||||||
|         await this.createCaseTmr(actor, 'Présent: ' + tmr.label, tmr, tete._id); |         await this.createCaseTmr(actor, 'Présent: ' + tmr.label, tmr, tete.id); | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| @@ -60,6 +60,6 @@ export class PresentCites extends Draconique { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   async ouvrirLePresent(actor, casetmr) { |   async ouvrirLePresent(actor, casetmr) { | ||||||
|     await actor.deleteOwnedItem(casetmr._id); |     await actor.deleteEmbeddedDocuments('Item', [casetmr.id]); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ export class QueteEaux extends Draconique { | |||||||
|   match(item) { return Draconique.isTeteDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes("quete des eaux"); } |   match(item) { return Draconique.isTeteDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes("quete des eaux"); } | ||||||
|   manualMessage() { return "Vous devrez re-configurer votre Quête des Eaux une fois un lac ou marais vaincu" } |   manualMessage() { return "Vous devrez re-configurer votre Quête des Eaux une fois un lac ou marais vaincu" } | ||||||
|   async onActorCreateOwned(actor, tete) { |   async onActorCreateOwned(actor, tete) { | ||||||
|     await this.createCaseTmr(actor, "Quête des eaux à déterminer", { coord: 'A0' }, tete._id); |     await this.createCaseTmr(actor, "Quête des eaux à déterminer", { coord: 'A0' }, tete.id); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   code() { return 'maitrisee' } |   code() { return 'maitrisee' } | ||||||
|   | |||||||
| @@ -13,7 +13,7 @@ export class ReserveExtensible extends Draconique { | |||||||
|   async onActorCreateOwned(actor, tete) { |   async onActorCreateOwned(actor, tete) { | ||||||
|     const existants = actor.data.items.filter(it => this.isCase(it)).map(it => it.data.coord); |     const existants = actor.data.items.filter(it => this.isCase(it)).map(it => it.data.coord); | ||||||
|     const tmr = TMRUtility.getTMRAleatoire(it => !(it.type == 'fleuve' || existants.includes(it.coord))); |     const tmr = TMRUtility.getTMRAleatoire(it => !(it.type == 'fleuve' || existants.includes(it.coord))); | ||||||
|     await this.createCaseTmr(actor, "Nouvelle Réserve extensible", tmr, tete._id); |     await this.createCaseTmr(actor, "Nouvelle Réserve extensible", tmr, tete.id); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   code() { return 'reserve_extensible' } |   code() { return 'reserve_extensible' } | ||||||
|   | |||||||
| @@ -12,7 +12,7 @@ export class TerreAttache extends Draconique { | |||||||
|   manualMessage() { return "Vous pouvez re-configurer votre Terre d'Attache" } |   manualMessage() { return "Vous pouvez re-configurer votre Terre d'Attache" } | ||||||
|  |  | ||||||
|   async onActorCreateOwned(actor, tete) { |   async onActorCreateOwned(actor, tete) { | ||||||
|     await this.createCaseTmr(actor, "Terre d'attache à déterminer", { coord: 'A0' }, tete._id); |     await this.createCaseTmr(actor, "Terre d'attache à déterminer", { coord: 'A0' }, tete.id); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   code() { return 'attache' } |   code() { return 'attache' } | ||||||
|   | |||||||
| @@ -14,7 +14,7 @@ export class TrouNoir extends Draconique { | |||||||
|   async onActorCreateOwned(actor, souffle) { |   async onActorCreateOwned(actor, souffle) { | ||||||
|     const existants = actor.data.items.filter(it => this.isCase(it)).map(it => it.data.coord); |     const existants = actor.data.items.filter(it => this.isCase(it)).map(it => it.data.coord); | ||||||
|     const tmr = TMRUtility.getTMRAleatoire(it => !(TMRUtility.isCaseHumide(it) || existants.includes(it.coord))); |     const tmr = TMRUtility.getTMRAleatoire(it => !(TMRUtility.isCaseHumide(it) || existants.includes(it.coord))); | ||||||
|     await this.createCaseTmr(actor, 'Trou noir: ' + tmr.label, tmr, souffle._id); |     await this.createCaseTmr(actor, 'Trou noir: ' + tmr.label, tmr, souffle.id); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   code() { return 'trounoir' } |   code() { return 'trounoir' } | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| import { ChatUtility } from "../chat-utility.js"; | import { ChatUtility } from "../chat-utility.js"; | ||||||
| import { Grammar } from "../grammar.js"; | import { Grammar } from "../grammar.js"; | ||||||
|  | import { Misc } from "../misc.js"; | ||||||
| import { RdDRollTables } from "../rdd-rolltables.js"; | import { RdDRollTables } from "../rdd-rolltables.js"; | ||||||
| import { tmrColors, tmrConstants, tmrTokenZIndex, TMRUtility } from "../tmr-utility.js"; | import { tmrColors, tmrConstants, tmrTokenZIndex, TMRUtility } from "../tmr-utility.js"; | ||||||
| import { Draconique } from "./draconique.js"; | import { Draconique } from "./draconique.js"; | ||||||
| @@ -14,28 +15,28 @@ export class UrgenceDraconique extends Draconique { | |||||||
|   match(item) { return Draconique.isQueueDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes('urgence draconique'); } |   match(item) { return Draconique.isQueueDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes('urgence draconique'); } | ||||||
|   manualMessage() { return false } |   manualMessage() { return false } | ||||||
|   async onActorCreateOwned(actor, queue) { |   async onActorCreateOwned(actor, queue) { | ||||||
|     let coordSortsReserve = (actor.data.data.reve.reserve?.list.map(it => it.coord)) ?? []; |     const coordSortsReserve = (Misc.templateData(actor).reve.reserve?.list.map(it => it.coord)) ?? []; | ||||||
|     if (coordSortsReserve.length == 0) { |     if (coordSortsReserve.length == 0) { | ||||||
|       // La queue se transforme en idée fixe |       // La queue se transforme en idée fixe | ||||||
|       let ideeFixe = await RdDRollTables.getIdeeFixe(); |       const ideeFixe = await RdDRollTables.getIdeeFixe(); | ||||||
|       ChatMessage.create({ |       ChatMessage.create({ | ||||||
|         whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), |         whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), | ||||||
|         content: `En l'absence de sorts en réserve, l'urgence draconique de ${actor.name} se transforme en ${queue.name}` |         content: `En l'absence de sorts en réserve, l'urgence draconique de ${actor.name} se transforme en ${ideeFixe.name}` | ||||||
|       }); |       }); | ||||||
|       await actor.createEmbeddedDocuments('Item', [ideeFixe]); |       await actor.createEmbeddedDocuments('Item', [ideeFixe]); | ||||||
|       await actor.deleteOwnedItem(queue._id); |       await actor.deleteEmbeddedDocuments('Item', [queue.id]); | ||||||
|       return; |       return; | ||||||
|     } |     } | ||||||
|     else { |     else { | ||||||
|       let demiReve = actor.getDemiReve(); |       const demiReve = actor.getDemiReve(); | ||||||
|       coordSortsReserve.sort((a, b) => TMRUtility.distanceTMR(a, demiReve) - TMRUtility.distanceTMR(b, demiReve)); |       coordSortsReserve.sort(Misc.ascending(t => TMRUtility.distanceTMR(t, demiReve))); | ||||||
|       let tmr = TMRUtility.getTMR(coordSortsReserve[0]); |       const tmr = TMRUtility.getTMR(coordSortsReserve[0]); | ||||||
|       await this.createCaseTmr(actor, 'Urgence draconique: ' + tmr.label, tmr, queue._id); |       await this.createCaseTmr(actor, 'Urgence draconique: ' + tmr.label, tmr, queue.id); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   async onActorDeleteCaseTmr(actor, casetmr) { |   async onActorDeleteCaseTmr(actor, casetmr) { | ||||||
|     await actor.deleteOwnedItem(casetmr.data.sourceid); |     await actor.deleteEmbeddedDocuments('Item', [casetmr.data.sourceid]); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   code() { return 'urgence' } |   code() { return 'urgence' } | ||||||
|   | |||||||
| @@ -31,7 +31,7 @@ | |||||||
|       "name": "Fab" |       "name": "Fab" | ||||||
|     } |     } | ||||||
|   ], |   ], | ||||||
|   "esmodules": [ "module/rdd-main.js", "module/hook-renderChatLog.js" ], |   "esmodules": [ "module/rdd-main.js"], | ||||||
|   "styles": ["styles/simple.css"], |   "styles": ["styles/simple.css"], | ||||||
|   "media": [ |   "media": [ | ||||||
|     { |     { | ||||||
|   | |||||||
| @@ -863,7 +863,6 @@ | |||||||
|         <article class="flexcol"> |         <article class="flexcol"> | ||||||
|           <h3>Biographie : </h3> |           <h3>Biographie : </h3> | ||||||
|           <div class="form-group editor"> |           <div class="form-group editor"> | ||||||
|             {{log 'biographie' data.biographie}} |  | ||||||
|             {{editor content=data.biographie target="data.biographie" button=true owner=owner editable=editable}} |             {{editor content=data.biographie target="data.biographie" button=true owner=owner editable=editable}} | ||||||
|           </div> |           </div> | ||||||
|           <h3>Notes : </h3> |           <h3>Notes : </h3> | ||||||
|   | |||||||
| @@ -27,7 +27,7 @@ | |||||||
|           <ol class="carac-list alterne-list"> |           <ol class="carac-list alterne-list"> | ||||||
|             <li class="competence flexrow list-item" data-attribute="{{key}}"> |             <li class="competence flexrow list-item" data-attribute="{{key}}"> | ||||||
|               <span class="carac-label flexrow" name="categorie">Catégorie</span> |               <span class="carac-label flexrow" name="categorie">Catégorie</span> | ||||||
|               <select name="data.categorie" id="categorie" data-dtype="String"> |               <select name="data.categorie" class="categorie" data-dtype="String"> | ||||||
|                 {{#select data.categorie}} |                 {{#select data.categorie}} | ||||||
|                 {{>"systems/foundryvtt-reve-de-dragon/templates/enum-categorie-vehicule.html"}} |                 {{>"systems/foundryvtt-reve-de-dragon/templates/enum-categorie-vehicule.html"}} | ||||||
|                 {{/select}} |                 {{/select}} | ||||||
|   | |||||||
| @@ -1,14 +1,14 @@ | |||||||
| <div data-passearme="{{passeArme}}"> | <div data-passearme="{{passeArme}}"> | ||||||
|   <h4 class="rdd-roll-etotal"><strong>Echec total en attaque</strong></h4> |   <h4 class="rdd-roll-etotal"><strong>Echec total en attaque</strong></h4> | ||||||
|   <br> |   <br> | ||||||
|   {{#if (eq attacker.data.type 'personnage')}} |   {{#if (eq attacker.type 'personnage')}} | ||||||
|     {{#unless essais.attaqueChance}} |     {{#unless essais.attaqueChance}} | ||||||
|       <a class='chat-card-button' id='appel-chance-attaque' data-attackerId='{{attackerId}}' |       <a class='chat-card-button' id='appel-chance-attaque' data-attackerId='{{attackerId}}' | ||||||
|         data-defenderTokenId='{{defenderTokenId}}'>Faire appel à la chance</a> |         data-defenderTokenId='{{defenderTokenId}}'>Faire appel à la chance</a> | ||||||
|       </a> |       </a> | ||||||
|       <br> |       <br> | ||||||
|     {{/unless}} |     {{/unless}} | ||||||
|     {{#if (gt attacker.data.data.compteurs.destinee.value 0)}} |     {{#if (gt attacker.data.compteurs.destinee.value 0)}} | ||||||
|       <a class='chat-card-button' id='appel-destinee-attaque' data-attackerId='{{attackerId}}' |       <a class='chat-card-button' id='appel-destinee-attaque' data-attackerId='{{attackerId}}' | ||||||
|         data-defenderTokenId='{{defenderTokenId}}'>Utiliser la destinée</a> |         data-defenderTokenId='{{defenderTokenId}}'>Utiliser la destinée</a> | ||||||
|       </a> |       </a> | ||||||
|   | |||||||
| @@ -19,14 +19,14 @@ | |||||||
|       {{#unless (eq surprise 'totale')}} |       {{#unless (eq surprise 'totale')}} | ||||||
|         {{#if essais.defense}} |         {{#if essais.defense}} | ||||||
|           {{#unless essais.defenseChance}} |           {{#unless essais.defenseChance}} | ||||||
|             {{#if (eq defender.data.type 'personnage')}} |             {{#if (eq defender.type 'personnage')}} | ||||||
|             <a class='chat-card-button' id='appel-chance-defense' data-attackerId='{{attackerId}}' |             <a class='chat-card-button' id='appel-chance-defense' data-attackerId='{{attackerId}}' | ||||||
|               data-defenderTokenId='{{defenderTokenId}}'>Faire appel à la chance</a> |               data-defenderTokenId='{{defenderTokenId}}'>Faire appel à la chance</a> | ||||||
|             </a> |             </a> | ||||||
|             <br> |             <br> | ||||||
|             {{/if}} |             {{/if}} | ||||||
|             {{#if (eq defender.data.type 'personnage')}} |             {{#if (eq defender.type 'personnage')}} | ||||||
|             {{#if (gt defender.data.data.compteurs.destinee.value 0)}} |             {{#if (gt defender.data.compteurs.destinee.value 0)}} | ||||||
|               <a class='chat-card-button' id='appel-destinee-defense' data-attackerId='{{attackerId}}' |               <a class='chat-card-button' id='appel-destinee-defense' data-attackerId='{{attackerId}}' | ||||||
|                 data-defenderTokenId='{{defenderTokenId}}'>Utiliser la destinée</a> |                 data-defenderTokenId='{{defenderTokenId}}'>Utiliser la destinée</a> | ||||||
|               </a> |               </a> | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ | |||||||
|   Vous ne parvenez pas à vaincre le Rêve de Dragon, et prennez un violent coup de queue. |   Vous ne parvenez pas à vaincre le Rêve de Dragon, et prennez un violent coup de queue. | ||||||
|   Vous subissez {{#if rolled.isETotal}}deux queues{{else}}une queue{{/if}} de dragon! |   Vous subissez {{#if rolled.isETotal}}deux queues{{else}}une queue{{/if}} de dragon! | ||||||
|   {{#each queues as | queue key|}} |   {{#each queues as | queue key|}} | ||||||
|   <br>{{queue.name}}: {{{queue.data.data.description}}} |   <br>{{queue.name}}: {{{queue.data.description}}} | ||||||
|   {{/each}} |   {{/each}} | ||||||
| {{/if}} | {{/if}} | ||||||
| </span> | </span> | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ | |||||||
|       <div class="form-group"> |       <div class="form-group"> | ||||||
|         <label for="niveau">Mode spécifique</label> |         <label for="niveau">Mode spécifique</label> | ||||||
|         <select name="data.specific" id="specific" data-dtype="String"> |         <select name="data.specific" id="specific" data-dtype="String"> | ||||||
|           {{#select item.data.specific}} |           {{#select data.specific}} | ||||||
|           {{>"systems/foundryvtt-reve-de-dragon/templates/casetmr-specific-list.html"}} |           {{>"systems/foundryvtt-reve-de-dragon/templates/casetmr-specific-list.html"}} | ||||||
|           {{/select}} |           {{/select}} | ||||||
|       </select> |       </select> | ||||||
|   | |||||||
| @@ -16,7 +16,7 @@ | |||||||
|     <section class="sheet-body"> |     <section class="sheet-body"> | ||||||
|       <div class="form-group"> |       <div class="form-group"> | ||||||
|         <label>Catégorie </label> |         <label>Catégorie </label> | ||||||
|         <select name="data.categorie" id="categorie" data-dtype="String"> |         <select name="data.categorie" class="categorie" data-dtype="String"> | ||||||
|               {{#select data.categorie}} |               {{#select data.categorie}} | ||||||
|               {{>"systems/foundryvtt-reve-de-dragon/templates/enum-categorie-competence.html"}} |               {{>"systems/foundryvtt-reve-de-dragon/templates/enum-categorie-competence.html"}} | ||||||
|               {{/select}} |               {{/select}} | ||||||
| @@ -28,7 +28,7 @@ | |||||||
|       </div> |       </div> | ||||||
|       <div class="form-group"> |       <div class="form-group"> | ||||||
|         <label for="xp">XP </label> |         <label for="xp">XP </label> | ||||||
|         <input class="attribute-value" id="sheet-competence-xp" type="text" name="data.xp" value="{{data.xp}}" data-dtype="Number"/> |         <input class="attribute-value sheet-competence-xp" type="text" name="data.xp" value="{{data.xp}}" data-dtype="Number"/> | ||||||
|       </div> |       </div> | ||||||
|       <div class="form-group"> |       <div class="form-group"> | ||||||
|         <label for="base">Niveau de base </label> |         <label for="base">Niveau de base </label> | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ | |||||||
|       <div class="form-group"> |       <div class="form-group"> | ||||||
|         <label class="alchimie-title" for="xp">Type</label> |         <label class="alchimie-title" for="xp">Type</label> | ||||||
|         <select name="data.type" data-dtype="String"> |         <select name="data.type" data-dtype="String"> | ||||||
|           {{#select item.data.type}} |           {{#select data.type}} | ||||||
|           <option value="recreative">Récréative</option> |           <option value="recreative">Récréative</option> | ||||||
|           <option value="soliste">Soliste</option> |           <option value="soliste">Soliste</option> | ||||||
|           {{/select}}     |           {{/select}}     | ||||||
|   | |||||||
| @@ -27,7 +27,7 @@ | |||||||
|       </div> |       </div> | ||||||
|       <div class="form-group"> |       <div class="form-group"> | ||||||
|         <label>Fréquence</label> |         <label>Fréquence</label> | ||||||
|         <select name="data.rarete" id="rarete" data-dtype="String"> |         <select name="data.rarete" class="rarete" data-dtype="String"> | ||||||
|           {{#select data.rarete}} |           {{#select data.rarete}} | ||||||
|           {{>"systems/foundryvtt-reve-de-dragon/templates/enum-rarete.html"}} |           {{>"systems/foundryvtt-reve-de-dragon/templates/enum-rarete.html"}} | ||||||
|           {{/select}} |           {{/select}} | ||||||
| @@ -35,7 +35,7 @@ | |||||||
|       </div> |       </div> | ||||||
|       <div class="form-group"> |       <div class="form-group"> | ||||||
|         <label>Catégorie</label> |         <label>Catégorie</label> | ||||||
|         <select name="data.categorie" id="categorie" data-dtype="String"> |         <select name="data.categorie" class="categorie" data-dtype="String"> | ||||||
|           {{#select data.categorie}} |           {{#select data.categorie}} | ||||||
|           {{>"systems/foundryvtt-reve-de-dragon/templates/enum-categorie-ingredient.html"}} |           {{>"systems/foundryvtt-reve-de-dragon/templates/enum-categorie-ingredient.html"}} | ||||||
|           {{/select}} |           {{/select}} | ||||||
|   | |||||||
| @@ -32,7 +32,7 @@ | |||||||
|     </div> |     </div> | ||||||
|     <div class="form-group"> |     <div class="form-group"> | ||||||
|       <label>Fréquence</label> |       <label>Fréquence</label> | ||||||
|       <select name="data.rarete" id="rarete" data-dtype="String"> |       <select name="data.rarete" class="rarete" data-dtype="String"> | ||||||
|         {{#select data.rarete}} |         {{#select data.rarete}} | ||||||
|         {{>"systems/foundryvtt-reve-de-dragon/templates/enum-rarete.html"}} |         {{>"systems/foundryvtt-reve-de-dragon/templates/enum-rarete.html"}} | ||||||
|         {{/select}} |         {{/select}} | ||||||
| @@ -40,7 +40,7 @@ | |||||||
|     </div> |     </div> | ||||||
|     <div class="form-group"> |     <div class="form-group"> | ||||||
|       <label>Catégorie</label> |       <label>Catégorie</label> | ||||||
|       <select name="data.categorie" id="categorie" data-dtype="String"> |       <select name="data.categorie" class="categorie" data-dtype="String"> | ||||||
|         {{#select data.categorie}} |         {{#select data.categorie}} | ||||||
|         {{>"systems/foundryvtt-reve-de-dragon/templates/enum-categorie-ingredient.html"}} |         {{>"systems/foundryvtt-reve-de-dragon/templates/enum-categorie-ingredient.html"}} | ||||||
|         {{/select}} |         {{/select}} | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ | |||||||
|       <div class="form-group"> |       <div class="form-group"> | ||||||
|         <label class="alchimie-title" for="xp">Type</label> |         <label class="alchimie-title" for="xp">Type</label> | ||||||
|         <select name="data.type" data-dtype="String"> |         <select name="data.type" data-dtype="String"> | ||||||
|           {{#select item.data.type}} |           {{#select data.type}} | ||||||
|           <option value="adressehasard">Adresse/Hasard</option> |           <option value="adressehasard">Adresse/Hasard</option> | ||||||
|           <option value="de">Dés</option> |           <option value="de">Dés</option> | ||||||
|           <option value="carte">Cartes</option> |           <option value="carte">Cartes</option> | ||||||
|   | |||||||
| @@ -56,7 +56,7 @@ | |||||||
|       </div> |       </div> | ||||||
|       {{#if isOwned}} |       {{#if isOwned}} | ||||||
|       <div class="form-group"> |       <div class="form-group"> | ||||||
|         <span for="xp"><a id="creer-tache-livre" data-actor-id="{{actorId}}">Créer une tâche de lecture</a></span> |         <span for="xp"><a class="creer-tache-livre" data-actor-id="{{actorId}}">Créer une tâche de lecture</a></span> | ||||||
|       </div> |       </div> | ||||||
|       {{/if}} |       {{/if}} | ||||||
|       <div class="flexcol"> |       <div class="flexcol"> | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ | |||||||
|       <div class="form-group"> |       <div class="form-group"> | ||||||
|         <label for="xp">Compétence</label> |         <label for="xp">Compétence</label> | ||||||
|         <select name="data.competence" id="competenceselect" data-dtype="String"> |         <select name="data.competence" id="competenceselect" data-dtype="String"> | ||||||
|           {{#select item.data.competence}} |           {{#select data.competence}} | ||||||
|           {{#each competences as |competence key|}} |           {{#each competences as |competence key|}} | ||||||
|           <option value="{{competence.name}}">{{competence.name}}</option> |           <option value="{{competence.name}}">{{competence.name}}</option> | ||||||
|           {{/each}} |           {{/each}} | ||||||
| @@ -29,7 +29,7 @@ | |||||||
|       <div class="form-group"> |       <div class="form-group"> | ||||||
|         <label for="xp">Heure</label> |         <label for="xp">Heure</label> | ||||||
|         <select name="data.heure" id="heure" data-dtype="String"> |         <select name="data.heure" id="heure" data-dtype="String"> | ||||||
|           {{#select item.data.heure}} |           {{#select data.heure}} | ||||||
|           {{>"systems/foundryvtt-reve-de-dragon/templates/heures-select-option.html"}} |           {{>"systems/foundryvtt-reve-de-dragon/templates/heures-select-option.html"}} | ||||||
|           {{/select}} |           {{/select}} | ||||||
|         </select>         |         </select>         | ||||||
| @@ -49,7 +49,7 @@ | |||||||
|       <div class="form-group"> |       <div class="form-group"> | ||||||
|         <label for="xp">Case TMR</label> |         <label for="xp">Case TMR</label> | ||||||
|         <select name="data.tmr" id="tmr" data-dtype="String"> |         <select name="data.tmr" id="tmr" data-dtype="String"> | ||||||
|           {{#select item.data.tmr}} |           {{#select data.tmr}} | ||||||
|           {{>"systems/foundryvtt-reve-de-dragon/templates/sort-tmr.html"}} |           {{>"systems/foundryvtt-reve-de-dragon/templates/sort-tmr.html"}} | ||||||
|           {{/select}} |           {{/select}} | ||||||
|         </select> |         </select> | ||||||
| @@ -58,7 +58,7 @@ | |||||||
|         <label for="xp">Malus</label> |         <label for="xp">Malus</label> | ||||||
|         {{#if isGM}} |         {{#if isGM}} | ||||||
|         <select name="data.malus" id="malus" data-dtype="Number"> |         <select name="data.malus" id="malus" data-dtype="Number"> | ||||||
|           {{#select item.data.malus}} |           {{#select data.malus}} | ||||||
|           <option value="0">0</option> |           <option value="0">0</option> | ||||||
|           <option value="-1">-1</option> |           <option value="-1">-1</option> | ||||||
|           <option value="-2">-2</option> |           <option value="-2">-2</option> | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ | |||||||
|       <div class="form-group"> |       <div class="form-group"> | ||||||
|         <label>Caractéristique</label> |         <label>Caractéristique</label> | ||||||
|         <select name="data.default_carac" id="default_carac" data-dtype="String"> |         <select name="data.default_carac" id="default_carac" data-dtype="String"> | ||||||
|           {{#select item.data.default_carac}} |           {{#select data.default_carac}} | ||||||
|           {{>"systems/foundryvtt-reve-de-dragon/templates/competence-carac-defaut.html"}} |           {{>"systems/foundryvtt-reve-de-dragon/templates/competence-carac-defaut.html"}} | ||||||
|           {{/select}} |           {{/select}} | ||||||
|         </select> |         </select> | ||||||
| @@ -19,7 +19,7 @@ | |||||||
|       <div class="form-group"> |       <div class="form-group"> | ||||||
|         <label>Compétence</label> |         <label>Compétence</label> | ||||||
|         <select name="data.competence" id="competenceselect" data-dtype="String"> |         <select name="data.competence" id="competenceselect" data-dtype="String"> | ||||||
|           {{#select item.data.competence}} |           {{#select data.competence}} | ||||||
|           {{#each competences as |competence key|}} |           {{#each competences as |competence key|}} | ||||||
|           <option value="{{competence.name}}">{{competence.name}}</option> |           <option value="{{competence.name}}">{{competence.name}}</option> | ||||||
|           {{/each}} |           {{/each}} | ||||||
|   | |||||||
| @@ -22,7 +22,7 @@ | |||||||
|     </div> |     </div> | ||||||
|     <div class="form-group"> |     <div class="form-group"> | ||||||
|       <label>Fréquence</label> |       <label>Fréquence</label> | ||||||
|       <select name="data.rarete" id="rarete" data-dtype="String"> |       <select name="data.rarete" class="rarete" data-dtype="String"> | ||||||
|         {{#select data.rarete}} |         {{#select data.rarete}} | ||||||
|         {{>"systems/foundryvtt-reve-de-dragon/templates/enum-rarete.html"}} |         {{>"systems/foundryvtt-reve-de-dragon/templates/enum-rarete.html"}} | ||||||
|         {{/select}} |         {{/select}} | ||||||
| @@ -30,7 +30,7 @@ | |||||||
|     </div> |     </div> | ||||||
|     <div class="form-group"> |     <div class="form-group"> | ||||||
|       <label>Catégorie</label> |       <label>Catégorie</label> | ||||||
|       <select name="data.categorie" id="categorie" data-dtype="String"> |       <select name="data.categorie" class="categorie" data-dtype="String"> | ||||||
|         {{#select data.categorie}} |         {{#select data.categorie}} | ||||||
|         {{>"systems/foundryvtt-reve-de-dragon/templates/enum-categorie-ingredient.html"}} |         {{>"systems/foundryvtt-reve-de-dragon/templates/enum-categorie-ingredient.html"}} | ||||||
|         {{/select}} |         {{/select}} | ||||||
|   | |||||||
| @@ -26,7 +26,7 @@ | |||||||
|  |  | ||||||
|   {{#if hasPrice}} |   {{#if hasPrice}} | ||||||
|   <span class="chat-card-button-area"> |   <span class="chat-card-button-area"> | ||||||
|       <a id='payer-button' class='chat-card-button market-button' data-jsondata='{{jsondata}}'  |       <a class='payer-button chat-card-button market-button' data-jsondata='{{jsondata}}'  | ||||||
|       data-somme-denier="{{data.cout_deniers_total}}" data-quantite="{{data.quantite}}">Payer</a> |       data-somme-denier="{{data.cout_deniers_total}}" data-quantite="{{data.quantite}}">Payer</a> | ||||||
|   </span> |   </span> | ||||||
|   {{/if}} |   {{/if}} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user