diff --git a/lang/fr.json b/lang/fr.json index 6ba5504e..76a10929 100644 --- a/lang/fr.json +++ b/lang/fr.json @@ -16,7 +16,6 @@ "TypeTarot": "Carte de tarot", "TypeCasetmr": "TMR spéciale", "TypeRencontre": "Rencontre TMR", - "TypeRencontrestmr": "Rencontre TMR (ancien)", "TypeMunition": "Munition", "TypeMonnaie": "Monnaie", "TypeHerbe": "Herbe ou plante", diff --git a/module/actor.js b/module/actor.js index bb462a4b..165c61da 100644 --- a/module/actor.js +++ b/module/actor.js @@ -29,7 +29,6 @@ import { Monnaie } from "./item-monnaie.js"; import { DialogConsommer } from "./dialog-item-consommer.js"; import { DialogFabriquerPotion } from "./dialog-fabriquer-potion.js"; import { RollDataAjustements } from "./rolldata-ajustements.js"; -import { DialogItemAchat } from "./dialog-item-achat.js"; import { RdDItem } from "./item.js"; import { RdDPossession } from "./rdd-possession.js"; import { ENTITE_BLURETTE, ENTITE_INCARNE, ENTITE_NONINCARNE, HIDE_DICE, SHOW_DICE, SYSTEM_RDD, SYSTEM_SOCKET_ID } from "./constants.js"; @@ -3658,7 +3657,6 @@ export class RdDActor extends Actor { }); return; } - const acheteur = achat.acheteurId ? game.actors.get(achat.acheteurId) : undefined; const vendeur = achat.vendeurId ? game.actors.get(achat.vendeurId) : undefined; const vente = achat.vente; @@ -3724,6 +3722,7 @@ export class RdDActor extends Actor { vente["properties"] = new RdDItem(vente.item).getProprietes(); vente.quantiteNbLots -= achat.choix.nombreLots; vente.jsondata = JSON.stringify(vente.item); + const messageVente = game.messages.get(achat.chatMessageIdVente); messageVente.update({ content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-vente-item.html', vente) }); messageVente.render(true); } diff --git a/module/dialog-chronologie.js b/module/dialog-chronologie.js index d7ec467e..31dfe673 100644 --- a/module/dialog-chronologie.js +++ b/module/dialog-chronologie.js @@ -35,7 +35,7 @@ export class DialogChronologie extends Dialog { const options = { classes: ["DialogChronologie"], width: 500, - height: 350, + height: 'fit-content', 'z-index': 99999 }; const conf = { @@ -43,8 +43,7 @@ export class DialogChronologie extends Dialog { content: html, buttons: { ajout: { label: "Ajouter", callback: it => this.ajouter() }, - }, - default: "ajout" + } }; super(conf, options); } diff --git a/module/dialog-stress.js b/module/dialog-stress.js index 24928c01..6ec1efb5 100644 --- a/module/dialog-stress.js +++ b/module/dialog-stress.js @@ -31,8 +31,7 @@ export class DialogStress extends Dialog { content: html, buttons: { stress: { label: "Stress !", callback: it => { this.onStress(); } } - }, - default: "stress" + } }; super(conf, options); this.dialogData = dialogData; diff --git a/module/misc.js b/module/misc.js index aec166d4..e016508c 100644 --- a/module/misc.js +++ b/module/misc.js @@ -102,7 +102,7 @@ export class Misc { } static join(params, separator = '') { - return params.reduce((a, b) => a + separator + b); + return params?.reduce((a, b) => a + separator + b) ?? ''; } static connectedGMOrUser(ownerId = undefined) { @@ -195,4 +195,4 @@ export class Misc { } return subset; } -} \ No newline at end of file +} diff --git a/module/rdd-calendrier-editeur.js b/module/rdd-calendrier-editeur.js index 3d14ef5c..cceaa0d3 100644 --- a/module/rdd-calendrier-editeur.js +++ b/module/rdd-calendrier-editeur.js @@ -8,18 +8,19 @@ export class RdDCalendrierEditeur extends Dialog { /* -------------------------------------------- */ constructor(html, calendrier, calendrierData) { - - let myButtons = { - saveButton: { label: "Enregistrer", callback: html => this.fillData() } - }; - - // Common conf - let dialogConf = { content: html, title: "Editeur de date/heure", buttons: myButtons, default: "saveButton" }; - let dialogOptions = { classes: ["rdddialog"], width: 400, height: 300, 'z-index': 99999 } + let dialogConf = { + content: html, + title: "Editeur de date/heure", + buttons: { + save: { label: "Enregistrer", callback: html => this.fillData() } + }, + default: "save" + }; + let dialogOptions = { classes: ["rdddialog"], width: 400, height: 'fit-content', 'z-index': 99999 } super(dialogConf, dialogOptions) this.calendrier = calendrier; - this.calendrierData = calendrierData; //duplicate(calendrierData); + this.calendrierData = calendrierData; } /* -------------------------------------------- */ diff --git a/module/rdd-calendrier.js b/module/rdd-calendrier.js index b5221454..151cdfde 100644 --- a/module/rdd-calendrier.js +++ b/module/rdd-calendrier.js @@ -14,7 +14,7 @@ import { DialogChronologie } from "./dialog-chronologie.js"; const dossierIconesHeures = 'systems/foundryvtt-reve-de-dragon/icons/heures/' const heuresList = ["vaisseau", "sirene", "faucon", "couronne", "dragon", "epees", "lyre", "serpent", "poissonacrobate", "araignee", "roseau", "chateaudormant"]; const heuresDef = { - "vaisseau": {key:"vaisseau", label: "Vaisseau", lettreFont: 'v', saison: "printemps", heure: 0, icon: 'hd01.svg' }, + "vaisseau": {key: "vaisseau", label: "Vaisseau", lettreFont: 'v', saison: "printemps", heure: 0, icon: 'hd01.svg' }, "sirene": { key: "sirene", label: "Sirène", lettreFont: 'i', saison: "printemps", heure: 1, icon: 'hd02.svg' }, "faucon": { key: "faucon", label: "Faucon", lettreFont: 'f', saison: "printemps", heure: 2, icon: 'hd03.svg' }, "couronne": { key: "couronne", label: "Couronne", lettreFont: '', saison: "ete", heure: 3, icon: 'hd04.svg' }, @@ -92,7 +92,7 @@ export class RdDCalendrier extends Application { minutesRelative: 0, indexJour: index, annee: Math.floor(index / (RDD_JOUR_PAR_MOIS * RDD_MOIS_PAR_AN)), - moisRdD: RdDCalendrier.getDefSigne(mois), + moisRdD: RdDCalendrier.getDefSigne(mois).heure, moisLabel: RdDCalendrier.getDefSigne(mois).label, jour: (index % RDD_JOUR_PAR_MOIS) // Le calendrier stocke le jour en 0-27, mais en 1-28 à l'affichage } @@ -316,16 +316,12 @@ export class RdDCalendrier extends Application { /* -------------------------------------------- */ fillCalendrierData(formData = {}) { - console.log(this.calendrier); - let moisKey = heuresList[this.calendrier.moisRdD]; - let heureKey = heuresList[this.calendrier.heureRdD]; - console.log(moisKey, heureKey); + const mois = RdDCalendrier.getDefSigne(this.calendrier.moisRdD); + const heure = RdDCalendrier.getDefSigne(this.calendrier.heureRdD); + console.log('fillCalendrierData', this.calendrier, mois, heure); - const mois = heuresDef[moisKey]; - const heure = heuresDef[heureKey]; - - formData.heureKey = heureKey; - formData.moisKey = moisKey; + formData.heureKey = heure.key; + formData.moisKey = mois.key; formData.jourMois = this.calendrier.jour + 1; formData.nomMois = mois.label; // heures et mois nommés identiques formData.iconMois = dossierIconesHeures + mois.icon; diff --git a/module/rdd-commands.js b/module/rdd-commands.js index d124fedc..c9d8959d 100644 --- a/module/rdd-commands.js +++ b/module/rdd-commands.js @@ -39,21 +39,22 @@ export class RdDCommands { rddCommands.registerCommand({ path: ["/meteo"], func: (content, msg, params) => rddCommands.getMeteo(msg, params), descr: "Propose une météo marine" }); rddCommands.registerCommand({ path: ["/nom"], func: (content, msg, params) => RdDNameGen.getName(msg, params), descr: "Génère un nom aléatoire" }); + rddCommands.registerCommand({ + path: ["/tmr"], func: (content, msg, params) => rddCommands.findTMR(msg, params), + descr: `Cherche où se trouve une case des Terres médianes +
/tmr sord indique que la cité Sordide est en D13 +
/tmr foret donne la liste des TMR dont le nom contient "foret" (donc, toutes les forêts)` }); rddCommands.registerCommand({ path: ["/tmra"], func: (content, msg, params) => rddCommands.getTMRAleatoire(msg, params), descr: `Tire une case aléatoire des Terres médianes
/tmra forêt détermine une 'forêt' aléatoire
/tmra détermine une case aléatoire dans toutes les TMR` }); - rddCommands.registerCommand({ - path: ["/tmr"], func: (content, msg, params) => rddCommands.findTMR(msg, params), - descr: `Cherche où se trouve une case des Terres médianes -
/tmr? sordide indique que la cité Sordide est en D13 -
/tmr? foret donne la liste des TMR dont le nom contient "foret" (donc, toutes les forêts)` }); rddCommands.registerCommand({ path: ["/tmrr"], func: (content, msg, params) => rddCommands.getRencontreTMR(params), descr: `Détermine une rencontre dans un type de case -
/tmrr foret lance un d100 et détermine la rencontre correspondante en 'forêt' -
/tmrr forêt 47 détermine la rencontre en 'forêt' pour un jet de dé de 47` +
/tmrr forêt détermine une rencontre aléatoire en 'forêt' +
/tmrr mauvaise détermine une mauvaise rencontre aléatoire +
/tmrr for 47 détermine la rencontre en 'forêt' pour un jet de dé de 47` }); rddCommands.registerCommand({ @@ -84,7 +85,7 @@ export class RdDCommands { rddCommands.registerCommand({ path: ["/payer"], func: (content, msg, params) => RdDUtility.afficherDemandePayer(params[0], params[1]), - descr: `Permet de payer un montant. Exemples: + descr: `Demande aux joueurs de payer un montant. Exemples:
/payer 5s 10d permet d'envoyer un message pour payer 5 sols et 10 deniers
/payer 10d permet d'envoyer un message pour payer 10 deniers` }); @@ -180,7 +181,7 @@ export class RdDCommands { return this._processCommand(this.commandsTable, command, params, content, msg); } - _processCommand(commandsTable, name, params, content = '', msg = {}, path = "") { + async _processCommand(commandsTable, name, params, content = '', msg = {}, path = "") { let command = commandsTable[name]; path = path + name + " "; if (command && command.subTable) { @@ -193,7 +194,7 @@ export class RdDCommands { } } if (command && command.func) { - const result = command.func(content, msg, params); + const result = await command.func(content, msg, params); if (result == false) { RdDCommands._chatAnswer(msg, command.descr); } @@ -250,9 +251,7 @@ export class RdDCommands { if (params.length == 1 || params.length == 2) { return TMRRencontres.rollRencontre(params[0], params[1]) } - else { - return false; - } + return false; } /* -------------------------------------------- */ @@ -305,20 +304,20 @@ export class RdDCommands { show: { title: "Table de résolution" } }; await RdDResolutionTable.rollData(rollData); - RdDCommands._chatAnswer(msg, await RdDResolutionTable.buildRollDataHtml(rollData)); + return RdDCommands._chatAnswer(msg, await RdDResolutionTable.buildRollDataHtml(rollData)); } /* -------------------------------------------- */ async rollDeDraconique(msg) { let ddr = await RdDDice.rollTotal("1dr + 7"); - RdDCommands._chatAnswer(msg, `Lancer d'un Dé draconique: ${ddr}`); + return RdDCommands._chatAnswer(msg, `Lancer d'un Dé draconique: ${ddr}`); } async getTMRAleatoire(msg, params) { if (params.length < 2) { let type = params[0]; const tmr = await TMRUtility.getTMRAleatoire(type ? (it => it.type == type) : (it => true)); - RdDCommands._chatAnswer(msg, `Case aléatoire: ${tmr.coord} - ${tmr.label}`); + return RdDCommands._chatAnswer(msg, `Case aléatoire: ${tmr.coord} - ${tmr.label}`); } else { return false; @@ -326,12 +325,15 @@ export class RdDCommands { } async findTMR(msg, params) { - const search = Misc.join(params, ' '); - const found = TMRUtility.findTMR(search); - if (found?.length > 0) { - return RdDCommands._chatAnswer(msg, `Les TMRs correspondant à '${search}' sont:` + Misc.join(found.map(it => `
${it.coord}: ${it.label}`))); + if (params && params.length > 0) { + const search = Misc.join(params, ' '); + const found = TMRUtility.findTMR(search); + if (found?.length > 0) { + return RdDCommands._chatAnswer(msg, `Les TMRs correspondant à '${search}' sont:` + Misc.join(found.map(it => `
${it.coord}: ${it.label}`))); + } + return RdDCommands._chatAnswer(msg, 'Aucune TMR correspondant à ' + search); } - return RdDCommands._chatAnswer(msg, 'Aucune TMR correspondant à ' + search); + return false; } /* -------------------------------------------- */ @@ -339,7 +341,7 @@ export class RdDCommands { if (params && (params.length == 1 || params.length == 2)) { let to = params.length == 1 ? Number(params[0]) : Number(params[1]); let from = params.length == 1 ? to - 1 : Number(params[0]); - RdDCommands._chatAnswer(msg, `Coût pour passer une compétence de ${from} à ${to}: ${RdDItemCompetence.getDeltaXp(from, to)}`); + return RdDCommands._chatAnswer(msg, `Coût pour passer une compétence de ${from} à ${to}: ${RdDItemCompetence.getDeltaXp(from, to)}`); } else { return false; @@ -350,7 +352,7 @@ export class RdDCommands { getCoutXpCarac(msg, params) { if (params && params.length == 1) { let to = Number(params[0]); - RdDCommands._chatAnswer(msg, `Coût pour passer une caractéristique de ${to - 1} à ${to}: ${RdDCarac.getCaracXp(to)}`); + return RdDCommands._chatAnswer(msg, `Coût pour passer une caractéristique de ${to - 1} à ${to}: ${RdDCarac.getCaracXp(to)}`); } else { return false; diff --git a/module/rdd-main.js b/module/rdd-main.js index 9dd63aeb..527a874a 100644 --- a/module/rdd-main.js +++ b/module/rdd-main.js @@ -200,7 +200,7 @@ Hooks.once("init", async function () { "recettealchimique", "musique", "chant", "danse", "jeu", "recettecuisine", "oeuvre", "objet", "arme", "armure", "conteneur", "herbe", "ingredient", "livre", "potion", "munition", "monnaie", "nourritureboisson", "gemme", - "meditation", "rencontresTMR", "queue", "ombre", "souffle", "tete", "casetmr", "sort", "sortreserve", + "meditation", "queue", "ombre", "souffle", "tete", "casetmr", "sort", "sortreserve", "nombreastral", "tache", "maladie", "poison", "possession", "tarot", "extraitpoetique" ], makeDefault: true diff --git a/module/rdd-utility.js b/module/rdd-utility.js index aafce41a..7f99fc45 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -182,7 +182,6 @@ export class RdDUtility { 'systems/foundryvtt-reve-de-dragon/templates/item-tache-sheet.html', 'systems/foundryvtt-reve-de-dragon/templates/item-potion-sheet.html', 'systems/foundryvtt-reve-de-dragon/templates/item-rencontre-sheet.html', - 'systems/foundryvtt-reve-de-dragon/templates/item-rencontresTMR-sheet.html', 'systems/foundryvtt-reve-de-dragon/templates/item-queue-sheet.html', 'systems/foundryvtt-reve-de-dragon/templates/item-souffle-sheet.html', 'systems/foundryvtt-reve-de-dragon/templates/item-tarot-sheet.html', diff --git a/module/tmr-rencontres.js b/module/tmr-rencontres.js index 14f94dc2..5c2f069f 100644 --- a/module/tmr-rencontres.js +++ b/module/tmr-rencontres.js @@ -15,21 +15,15 @@ export class TMRRencontres { * @param {*} forcedRoll */ static async rollRencontre(terrain, forcedRoll) { - // TODO: recherche parmi les types de terrains + mauvaise, rejet si plusieurs choix - const codeTerrain = Grammar.toLowerCaseNoAccent(terrain); - if (!terrain) { - ChatMessage.create({ - user: game.user.id, - whisper: [game.user.id], - content: "Un type de case doit être indiqué (par exemple sanctuaire, desert ou cité)" - }); - return false; + terrain = TMRUtility.findTMRLike(terrain); + if (terrain == undefined) { + return undefined; } if (forcedRoll && (forcedRoll <= 0 || forcedRoll > 100)) { forcedRoll = undefined; } - + const codeTerrain = Grammar.toLowerCaseNoAccent(terrain) const table = await TMRRencontres.$buildTableRencontre(codeTerrain); const [selected, roll] = await TMRRencontres.$selectRencontre(codeTerrain, table, forcedRoll); const rencontre = await TMRRencontres.createRencontre(selected.rencontre); @@ -40,7 +34,7 @@ export class TMRRencontres { /* -------------------------------------------- */ static async $buildTableRencontre(codeTerrain) { let max = 0; - const items = await SystemCompendiums.getItems('rencontres'); + const items = await SystemCompendiums.getItems('rencontres', 'rencontre'); const filtreMauvaise = codeTerrain == 'mauvaise' ? it => it.system.mauvaiseRencontre : it => !it.system.mauvaiseRencontre; const rencontres = items.filter(it => it.type == 'rencontre') .filter(filtreMauvaise) diff --git a/module/tmr-utility.js b/module/tmr-utility.js index 3ec336df..66ab857b 100644 --- a/module/tmr-utility.js +++ b/module/tmr-utility.js @@ -1,4 +1,3 @@ -import { TMRRencontres } from "./tmr-rencontres.js"; import { Misc } from "./misc.js"; import { Grammar } from "./grammar.js"; import { RdDDice } from "./rdd-dice.js"; @@ -287,13 +286,30 @@ export class TMRUtility { const tmr = TMRMapping[coord]; return Grammar.articleDetermine(tmr.type) + ' ' + tmr.label; } + + static findTMRLike(type, options = {inclusMauvaise:true}) { + const choix = [...Object.values(TMRType)] + if (options.inclusMauvaise){ + choix.push({name: 'Mauvaise'}); + } + const selection = Misc.findAllLike(type, choix).map(it => it.name); + if (selection.length == 0) { + ui.notifications.warn(`Un type de TMR doit être indiqué, '${type}' n'est pas trouvé dans ${choix}`); + return undefined; + } + if (selection.length > 1) { + ui.notifications.warn(`Plusieurs types de TMR pourraient correspondre à '${type}': ${selection}`); + return undefined; + } + return selection[0]; + } static typeTmrName(type) { return Misc.upperFirst(TMRType[Grammar.toLowerCaseNoAccent(type)].name); } - + static buildSelectionTypesTMR(typesTMR) { - typesTMR= typesTMR?? []; + typesTMR = typesTMR?? []; return Object.values(TMRType).map(value => Misc.upperFirst(value.name)) .sort() .map(name => { return { name: name, selected: typesTMR.includes(name) } }); @@ -339,8 +355,7 @@ export class TMRUtility { } static findTMR(search) { - const labelSearch = Grammar.toLowerCaseNoAccent(search) - return TMRUtility.filterTMR(it => Grammar.toLowerCaseNoAccent(it.label).match(labelSearch) || it.coord == search); + return TMRUtility.filterTMR(it => Grammar.includesLowerCaseNoAccent(it.label, search) || it.coord == search); } static filterTMRCoord(filter) { diff --git a/template.json b/template.json index b72b6065..4095f5fe 100644 --- a/template.json +++ b/template.json @@ -586,7 +586,7 @@ "recettealchimique", "musique", "chant", "danse", "jeu", "recettecuisine", "oeuvre", "objet", "arme", "armure", "conteneur", "herbe", "ingredient", "livre", "potion", "munition", "monnaie", "nourritureboisson", "gemme", - "meditation", "rencontre", "rencontresTMR", "queue", "ombre", "souffle", "tete", "casetmr", "signedraconique", "sort", "sortreserve", + "meditation", "rencontre", "queue", "ombre", "souffle", "tete", "casetmr", "signedraconique", "sort", "sortreserve", "nombreastral", "tache", "maladie", "poison", "possession", "tarot", "extraitpoetique" ], @@ -827,10 +827,6 @@ }, "description": "" }, - "rencontresTMR": { - "description": "", - "descriptionmj": "" - }, "queue": { "description": "", "descriptionmj": "",