forked from public/foundryvtt-reve-de-dragon
		
	Tirer dans les compendiums selon les fréquences
This commit is contained in:
		| @@ -1,88 +1,73 @@ | ||||
| import { Grammar } from "./grammar.js"; | ||||
| import { Misc } from "./misc.js"; | ||||
| import { RdDDice } from "./rdd-dice.js"; | ||||
| import { SystemCompendiums } from "./settings/system-compendiums.js"; | ||||
| import { SystemCompendiums, SystemCompendiumTable } from "./settings/system-compendiums.js"; | ||||
| import { TMRUtility } from "./tmr-utility.js"; | ||||
|  | ||||
|  | ||||
| /* -------------------------------------------- */ | ||||
| export class TMRRencontres { | ||||
|  | ||||
|   static init() { | ||||
|     const tmrRencontre = new TMRRencontres(); | ||||
|     game.system.rencontresTMR = tmrRencontre; | ||||
|      | ||||
|   } | ||||
|  | ||||
|   constructor(){ | ||||
|     this.table = new SystemCompendiumTable('rencontres', 'Item', 'rencontre', Misc.ascending(it => it.system.ordreTri)); | ||||
|   } | ||||
|  | ||||
|   /* -------------------------------------------- */ | ||||
|   /** | ||||
|    * Retourne une recontre en fonction de la case et du tirage | ||||
|    * @param {*} terrain  | ||||
|    * @param {*} forcedRoll  | ||||
|    */ | ||||
|   static async rollRencontre(terrain, forcedRoll) { | ||||
|   async rollRencontre(terrain, forcedRoll) { | ||||
|     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); | ||||
|     TMRRencontres.$chatRolledRencontre(rencontre, terrain, table, roll, true); | ||||
|     return false; | ||||
|   } | ||||
|    | ||||
|   /* -------------------------------------------- */ | ||||
|   static async $buildTableRencontre(codeTerrain) { | ||||
|     let max = 0; | ||||
|     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) | ||||
|       .filter(it => it.system.frequence[codeTerrain] > 0) | ||||
|       .sort(Misc.ascending(it => it.system.ordreTri)) | ||||
|       .map(it => { | ||||
|         const frequence = it.system.frequence[codeTerrain]; | ||||
|         max += frequence; | ||||
|         return { rencontre: it, min: max - frequence + 1, max: max,frequence: frequence }; | ||||
|       }); | ||||
|     return rencontres; | ||||
|     const frequence = it => it.system.frequence[codeTerrain]; | ||||
|     const random = await this.table.getRandom(true, frequence, filtreMauvaise, forcedRoll); | ||||
|  | ||||
|     return random?.document; | ||||
|   } | ||||
|    | ||||
|   /* -------------------------------------------- */ | ||||
|   static async $selectRencontre(terrain, table, roll = undefined) { | ||||
|     const total = table.map(it => it.frequence).reduce(Misc.sum(), 0); | ||||
|     if (total == 0){ | ||||
|       ui.notifications.warn(`Pas de rencontres définies pour ${terrain}`); | ||||
|       return undefined; | ||||
|     } | ||||
|     if (roll != undefined && (roll > total || roll <= 0)) { | ||||
|       ui.notifications.warn(`Jet de rencontre ${roll} en dehors de la table [1..${total}], le jet est relancé`); | ||||
|       roll = undefined; | ||||
|     } | ||||
|     if (!roll) { | ||||
|       roll = await RdDDice.rollTotal(`1d${total}`); | ||||
|     } | ||||
|     return [table.find(it => it.min <= roll && roll <= it.max), roll]; | ||||
|  | ||||
|   async chatTable(terrain) { | ||||
|     const codeTerrain = Grammar.toLowerCaseNoAccent(terrain) | ||||
|     const isMauvaise = codeTerrain == 'mauvaise'; | ||||
|     const filtreMauvaise = isMauvaise ? it => it.system.mauvaiseRencontre : it => !it.system.mauvaiseRencontre; | ||||
|     const frequence = it => it.system.frequence[codeTerrain]; | ||||
|     const typeName = isMauvaise ? 'Mauvaises rencontres' : `Rencontres en ${Misc.upperFirst(terrain)}`; | ||||
|     await this.table.chatTable(frequence, filtreMauvaise, typeName); | ||||
|     return true | ||||
|   } | ||||
|    | ||||
|   /* -------------------------------------------- */ | ||||
|   static async createRencontre(rencontre, tmr = undefined) { | ||||
|   async createRencontre(rencontre, tmr = undefined) { | ||||
|     return rencontre.clone({ | ||||
|       'system.force': await RdDDice.rollTotal(rencontre.system.formule), | ||||
|       'system.coord': tmr?.coord, | ||||
|       'system.date': game.system.rdd.calendrier.getDateFromIndex(), | ||||
|       'system.heure': game.system.rdd.calendrier.getCurrentHeure() | ||||
|     }, {save: false}); | ||||
|     }, { save: false }); | ||||
|   } | ||||
|  | ||||
|   static async calculRencontre(rencontre, tmr = undefined) { | ||||
|     if (rencontre.system.coord == ""){ | ||||
|   async calculRencontre(rencontre, tmr = undefined) { | ||||
|     if (rencontre.system.coord == "") { | ||||
|       rencontre.system.coord = tmr?.coord; | ||||
|     } | ||||
|     if (rencontre.system.force == 0){ | ||||
|     if (rencontre.system.force == 0) { | ||||
|       rencontre.system.force = await RdDDice.rollTotal(rencontre.system.formule); | ||||
|     } | ||||
|     if (rencontre.system.date == "" ) { | ||||
|     if (rencontre.system.date == "") { | ||||
|       rencontre.system.date = game.system.rdd.calendrier.getDateFromIndex(); | ||||
|     } | ||||
|     if (rencontre.system.heure == "") { | ||||
| @@ -91,46 +76,51 @@ export class TMRRencontres { | ||||
|     return rencontre; | ||||
|   } | ||||
|  | ||||
|   /* -------------------------------------------- */ | ||||
|   static $chatRolledRencontre(rencontre, terrain, table, roll = 0, displayTable=false){ | ||||
|     const total = table.map(it => it.frequence).reduce(Misc.sum(), 0); | ||||
|     const namesPercent = displayTable ? | ||||
|       table.map(it => `<br>${it.rencontre.name} : ${it.frequence}${total == 100 ? '%' : ''} (${it.min} - ${it.max})`).reduce((a, b) => a + b, '<hr>') | ||||
|       : ''; | ||||
|     const chances = game.user.isGM | ||||
|       ? (roll ? `Jet: ${roll} / ${total}` : `Valeurs: [1..${total}]`) | ||||
|       : (roll ? `Jet: ${Math.ceil(roll*100/total)} / 100` : ''); | ||||
|     ChatMessage.create({ | ||||
|       user: game.user.id, | ||||
|       whisper: [game.user.id], | ||||
|       content: `Compendium: ${SystemCompendiums.getCompendium('rencontres')} | ||||
|       <br>Rencontre en ${terrain}: | ||||
|       ${namesPercent}<hr> | ||||
|       <br>${chances} | ||||
|       <br>Rencontre: ${rencontre.name} ${rencontre.system.force} (${rencontre.system.formule})` | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   static async getPresentsCite() { | ||||
|   async getPresentsCite() { | ||||
|     const rencontres = await SystemCompendiums.getDefaultItems('rencontres'); | ||||
|     return rencontres.filter(it => !it.system.mauvaiseRencontre && it.system.presentCite).map(it =>  | ||||
|       it.clone({ 'system.formule': "2d6" }, {save: false})); | ||||
|     return rencontres.filter(it => !it.system.mauvaiseRencontre && it.system.presentCite).map(it => | ||||
|       it.clone({ 'system.formule': "2d6" }, { save: false })); | ||||
|   } | ||||
|  | ||||
|   static async getReveDeDragon(force) { | ||||
|   async getReveDeDragon(force) { | ||||
|     const rencontres = await SystemCompendiums.getDefaultItems('rencontres'); | ||||
|     const reveDeDragon = rencontres.find(it => Grammar.equalsInsensitive(it.name, 'Rêve de Dragon')); | ||||
|     return reveDeDragon?.clone({ 'system.force': force }, {save: false}); | ||||
|     return reveDeDragon?.clone({ 'system.force': force }, { save: false }); | ||||
|   } | ||||
|  | ||||
|   /* -------------------------------------------- */ | ||||
|   static async getRencontreAleatoire(tmr, mauvaise) { | ||||
|   async getRencontreAleatoire(tmr, mauvaise) { | ||||
|     const codeTerrain = mauvaise ? 'mauvaise' : tmr.type; | ||||
|     const table = await TMRRencontres.$buildTableRencontre(codeTerrain); | ||||
|     const [selected, roll] = await TMRRencontres.$selectRencontre(codeTerrain, table); | ||||
|     const rencontre = await TMRRencontres.createRencontre(selected.rencontre, tmr); | ||||
|     TMRRencontres.$chatRolledRencontre(rencontre, TMRUtility.getTMRType(tmr.coord), table, roll); | ||||
|     return rencontre; | ||||
|     const filtreMauvaise = codeTerrain == 'mauvaise' ? it => it.system.mauvaiseRencontre : it => !it.system.mauvaiseRencontre; | ||||
|     const frequence = it => it.system.frequence[codeTerrain]; | ||||
|  | ||||
|     const row = await this.table.getRandom(false, frequence, filtreMauvaise); | ||||
|     if (row) { | ||||
|       row.document = this.createRencontre(row.document, tmr); | ||||
|       await this.$chatRolledRencontre(row, tmr); | ||||
|     } | ||||
|     return row?.document; | ||||
|   } | ||||
|  | ||||
|  | ||||
|   /* -------------------------------------------- */ | ||||
|   async $chatRolledRencontre(row, tmr) { | ||||
|     const flavorContent = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-compendium-table-roll-rencontre.html', | ||||
|       { | ||||
|         roll: row.roll, | ||||
|         rencontre: row?.document, | ||||
|         percentages: (row.total == 100) ? '%' : '', | ||||
|         tmr, | ||||
|         isGM: game.user.isGM, | ||||
|       }); | ||||
|     const messageData = { | ||||
|       user: game.user.id, | ||||
|       type: CONST.CHAT_MESSAGE_TYPES.ROLL, | ||||
|       roll: row.roll, | ||||
|       sound: CONFIG.sounds.dice, | ||||
|       content: flavorContent | ||||
|     }; | ||||
|     ChatMessage.create(messageData, { rollMode: "gmroll" }); | ||||
|   } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user