Files
foundryvtt-reve-de-dragon/module/rdd-meteo.js
Vincent Vandemeulebrouck 7fb0ee1659 await ChatMessage.create
ChatMessage.create est async, il faut donc de préférence
l'appeler avec un await.

Des effets secondaires avaient lieu (ordre de messages, updates
ultérieurs parfois pas pris en compte)
2026-05-02 00:42:45 +02:00

136 lines
4.7 KiB
JavaScript

import { ChatUtility } from "./chat-utility.js"
import { renderTemplate } from "./constants.js"
const vents = [
{ min: 0, max: 0, valeur: 'Calme' },
{ min: 1, max: 1, valeur: 'Légère brise' },
{ min: 2, max: 2, valeur: 'Jolie brise' },
{ min: 3, max: 3, valeur: 'Bonne brise' },
{ min: 4, max: 4, valeur: 'Vent frais' },
{ min: 5, max: 5, valeur: 'Coup de vent' },
{ min: 6, max: 6, valeur: 'Fort coup de vent' },
{ min: 7, max: 9, valeur: 'Tempête' },
{ min: 10, max: 13, valeur: 'Violente tempête' },
{ min: 14, valeur: 'Ouragan' },
]
const mers = [
{ min: 0, max: 0, valeur: 'Calme' },
{ min: 1, max: 1, valeur: 'Belle' },
{ min: 2, max: 2, valeur: 'Peu agitée' },
{ min: 3, max: 3, valeur: 'Agitée' },
{ min: 4, max: 4, valeur: 'Forte' },
{ min: 5, max: 6, valeur: 'Très forte' },
{ min: 7, max: 9, valeur: 'Grosse' },
{ min: 10, max: 13, valeur: 'Très grosse' },
{ min: 14, valeur: 'Énorme' },
]
const nuages = [
{ min: 0, max: 3, valeur: 'dégagé' },
{ min: 4, max: 6, valeur: 'passages nuageux' },
{ min: 7, max: 9, valeur: 'nuageux', },
{ min: 10, max: 10, valeur: 'brouillard' },
{ min: 11, max: 12, valeur: 'bruine' },
{ min: 13, valeur: 'très nuageux' },
]
const pluies = [
{ min: 0, max: 4, valeur: 'aucune' },
{ min: 5, max: 5, valeur: 'bruine, crachin, éparse' },
{ min: 6, max: 7, valeur: 'averses' },
{ min: 8, max: 10, valeur: 'pluvieux', },
{ min: 11, max: 13, valeur: 'forte pluie' },
{ min: 14, valeur: 'déluge' },
]
const temperatures = [
{ max: -14, valeur: 'glaciale' },
{ min: -13, max: -10, valeur: 'Très froide' },
{ min: -9, max: -7, valeur: 'froide' },
{ min: -6, max: -4, valeur: 'fraîche' },
{ min: -3, max: 3, valeur: 'de saison' },
{ min: 4, max: 6, valeur: 'élevée' },
{ min: 7, max: 9, valeur: 'chaude' },
{ min: 10, max: 13, valeur: 'torride' },
{ min: 14, valeur: 'caniculaire' },
]
export class RdDMeteo {
static async getForce() {
const roll = new Roll(`1dr`);
await roll.evaluate();
return roll.total;
}
static async getPluie(nuage) {
return nuage <= 3 ? 0 : await RdDMeteo.getForce();
}
static async getTemperature() {
const degre = await RdDMeteo.getForce();
const rollChaudFroid = new Roll('1d2');
await rollChaudFroid.evaluate();
const chaudFroid = rollChaudFroid.total == 1;
return chaudFroid.total ? degre : -degre;
}
static async getDirection(direction) {
const roll = new Roll(`1d16`);
await roll.evaluate();
switch (roll.total % 16) {
case 0: return 'Nord';
case 1: return 'Nord Nord Est';
case 2: return 'Nord Est';
case 3: return 'Est Nord Est';
case 4: return 'Est';
case 5: return 'Est Sud Est';
case 6: return 'Sud Est';
case 7: return 'Sud Sud Est';
case 8: return 'Sud';
case 9: return 'Sud Sud Ouest';
case 10: return 'Sud Ouest';
case 11: return 'Ouest Sud Ouest';
case 12: return 'Ouest';
case 13: return 'Ouest Nord Ouest';
case 14: return 'Nord Ouest';
case 15: return 'Nord Nord Ouest';
}
return undefined;
}
static async getMeteo() {
const vent = await RdDMeteo.getForce();
const mer = await RdDMeteo.getForce();
const nuage = await RdDMeteo.getForce();
const pluie = await RdDMeteo.getPluie(nuage);
const temperature = await RdDMeteo.getTemperature();
const meteo = {
vent: { force: vent, direction: await RdDMeteo.getDirection(), },
mer: { force: mer, direction: await RdDMeteo.getDirection(), },
temperature: { force: temperature },
nuage: { force: nuage, },
pluie: { force: pluie },
}
meteo.vent.description = RdDMeteo.vent(meteo.vent.force);
meteo.mer.description = RdDMeteo.mer(meteo.mer.force),
meteo.temperature.description = RdDMeteo.temperature(meteo.temperature.force);
meteo.nuage.description = RdDMeteo.nuage(meteo.nuage.force);
meteo.pluie.description = RdDMeteo.pluie(meteo.pluie.force);
await ChatMessage.create({
content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-resultat-meteo.hbs', meteo),
whisper: ChatUtility.getGMs()
});
}
static description(liste, force, valeur = it => it.valeur) {
let select = liste.find(it => (it.min == undefined || it.min <= force) && (it.max == undefined || force <= it.max));
return valeur(select ?? liste[0]);
}
static vent(force) { return this.description(vents, force); }
static mer(force) { return this.description(mers, force); }
static nuage(force) { return this.description(nuages, force); }
static pluie(force) { return this.description(pluies, force); }
static temperature(force) { return this.description(temperatures, force); }
}