diff --git a/module/rdd-commands.js b/module/rdd-commands.js index 8793f306..fdddcb05 100644 --- a/module/rdd-commands.js +++ b/module/rdd-commands.js @@ -7,6 +7,7 @@ import { RdDItemCompetence } from "./item-competence.js"; import { Misc } from "./misc.js"; import { RdDCarac } from "./rdd-carac.js"; import { RdDDice } from "./rdd-dice.js"; +import { RdDMeteo } from "./rdd-meteo.js"; import { RdDNameGen } from "./rdd-namegen.js"; import { RdDResolutionTable } from "./rdd-resolution-table.js"; import { RdDRollResolutionTable } from "./rdd-roll-resolution-table.js"; @@ -34,6 +35,7 @@ export class RdDCommands { rddCommands.registerCommand({ path: ["/table", "souffle"], func: (content, msg, params) => RdDRollTables.getSouffle(true), descr: " Tire un Souffle de Dragon" }); rddCommands.registerCommand({ path: ["/table", "comp"], func: (content, msg, params) => RdDRollTables.getCompetence(true), descr: "Tire une compétence au hasard" }); rddCommands.registerCommand({ path: ["/table", "tarot"], func: (content, msg, params) => RdDRollTables.getTarot(true), descr: "Tire une carte du Tarot Draconique" }); + 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({ @@ -398,5 +400,8 @@ export class RdDCommands { } return true; } + async getMeteo(msg, params) { + return await RdDMeteo.getMeteo(); + } } diff --git a/module/rdd-meteo.js b/module/rdd-meteo.js new file mode 100644 index 00000000..8dbff49c --- /dev/null +++ b/module/rdd-meteo.js @@ -0,0 +1,134 @@ + +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({ async: true }); + 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({ async: true }); + const chaudFroid = rollChaudFroid.total == 1; + return chaudFroid.total ? degre : -degre; + } + + static async getDirection(direction) { + const roll = new Roll(`1d16`); + await roll.evaluate({ async: true }); + 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); + + ChatMessage.create({ + content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-resultat-meteo.html', meteo), + whisper: ChatMessage.getWhisperRecipients('GM') + }); + } + + 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); } +} \ No newline at end of file diff --git a/module/rdd-utility.js b/module/rdd-utility.js index 786ad9b1..50865039 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -221,8 +221,10 @@ export class RdDUtility { ]; Handlebars.registerHelper('upperFirst', str => Misc.upperFirst(str ?? 'Null')); + Handlebars.registerHelper('lowerFirst', str => Misc.lowerFirst(str ?? 'Null')); Handlebars.registerHelper('upper', str => str?.toUpperCase() ?? 'NULL'); Handlebars.registerHelper('le', str => Grammar.articleDetermine(str)); + Handlebars.registerHelper('apostrophe', (article, str) => Grammar.apostrophe(article, str)); Handlebars.registerHelper('un', str => Grammar.articleIndetermine(str)); Handlebars.registerHelper('accord', (genre, ...args) => Grammar.accord(genre, args)); Handlebars.registerHelper('buildConteneur', (objet) => { return new Handlebars.SafeString(RdDUtility.buildConteneur(objet)); }); diff --git a/templates/chat-resultat-meteo.html b/templates/chat-resultat-meteo.html new file mode 100644 index 00000000..96d7e4b8 --- /dev/null +++ b/templates/chat-resultat-meteo.html @@ -0,0 +1,9 @@ + +