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