Vincent Vandemeulebrouck
582df7e290
Les messages dans les TMRs sont envoyés au GM Simplification des messages de tchat liés à un actor: on peut utiliser les Owners (car les GMs sont owner). Au lieu de passer le name de l'Actor (qui peut être incorrect si deux actors ont le même, mais pas les mêmes propriétaires), on passe directement l'actor pour déterminer mles destinataires de messages
323 lines
12 KiB
JavaScript
323 lines
12 KiB
JavaScript
import { SYSTEM_RDD, SYSTEM_SOCKET_ID, RDD_CONFIG } from "./constants.js"
|
|
import { Migrations } from './migrations.js'
|
|
|
|
import { RdDUtility } from "./rdd-utility.js"
|
|
import { TMRUtility } from "./tmr-utility.js"
|
|
import { TMRRencontres } from "./tmr-rencontres.js"
|
|
import { RdDCalendrier } from "./time/rdd-calendrier.js"
|
|
import { RdDTimestamp } from "./time/rdd-timestamp.js"
|
|
import { DialogChronologie } from "./dialog-chronologie.js"
|
|
|
|
import { RdDResolutionTable } from "./rdd-resolution-table.js"
|
|
import { RdDTokenHud } from "./rdd-token-hud.js"
|
|
import { RdDCommands } from "./rdd-commands.js"
|
|
import { RdDCombatManager, RdDCombat } from "./rdd-combat.js"
|
|
import { ChatUtility } from "./chat-utility.js"
|
|
import { StatusEffects } from "./settings/status-effects.js"
|
|
import { RdDCompendiumOrganiser } from "./rdd-compendium-organiser.js"
|
|
import { ReglesOptionnelles } from "./settings/regles-optionnelles.js"
|
|
import { RdDHotbar } from "./rdd-hotbar-drop.js"
|
|
import { EffetsDraconiques } from "./tmr/effets-draconiques.js"
|
|
import { RdDHerbes } from "./rdd-herbes.js"
|
|
import { RdDDice } from "./rdd-dice.js"
|
|
import { RdDPossession } from "./rdd-possession.js"
|
|
import { Misc } from "./misc.js"
|
|
|
|
import { SystemCompendiums } from "./settings/system-compendiums.js"
|
|
import { Environnement } from "./environnement.js"
|
|
|
|
import { RdDActor } from "./actor.js"
|
|
import { RdDBaseActor } from "./actor/base-actor.js"
|
|
import { RdDCommerce } from "./actor/commerce.js"
|
|
import { RdDEntite } from "./actor/entite.js"
|
|
import { RdDVehicule } from "./actor/vehicule.js"
|
|
import { RdDActorSheet } from "./actor-sheet.js"
|
|
import { RdDCommerceSheet } from "./actor/commerce-sheet.js"
|
|
import { RdDCreatureSheet } from "./actor/creature-sheet.js"
|
|
import { RdDActorEntiteSheet } from "./actor/entite-sheet.js"
|
|
import { RdDActorVehiculeSheet } from "./actor/vehicule-sheet.js"
|
|
|
|
import { RdDItem } from "./item.js"
|
|
import { RdDItemBlessure } from "./item/blessure.js"
|
|
import { RdDItemService } from "./item/service.js"
|
|
import { RdDItemMaladie } from "./item/maladie.js"
|
|
import { RdDItemPoison } from "./item/poison.js"
|
|
import { RdDItemSigneDraconique } from "./item/signedraconique.js"
|
|
import { RdDItemQueue } from "./item/queue.js"
|
|
import { RdDItemOmbre } from "./item/ombre.js"
|
|
import { RdDItemSouffle } from "./item/souffle.js"
|
|
import { RdDRencontre } from "./item/rencontre.js"
|
|
|
|
import { RdDItemSheet } from "./item-sheet.js"
|
|
import { RdDBlessureItemSheet } from "./item/sheet-blessure.js"
|
|
import { RdDServiceItemSheet } from "./item/sheet-service.js"
|
|
import { RdDRencontreItemSheet } from "./item/sheet-rencontre.js"
|
|
import { RdDHerbeItemSheet } from "./item/sheet-herbe.js"
|
|
import { RdDPlanteItemSheet } from "./item/sheet-plante.js"
|
|
import { RdDIngredientItemSheet } from "./item/sheet-ingredient.js"
|
|
import { RdDFauneItemSheet } from "./item/sheet-faune.js"
|
|
import { RdDConteneurItemSheet } from "./item/sheet-conteneur.js"
|
|
import { RdDSigneDraconiqueItemSheet } from "./item/sheet-signedraconique.js"
|
|
import { RdDItemInventaireSheet } from "./item/sheet-base-inventaire.js"
|
|
import { AppAstrologie } from "./sommeil/app-astrologie.js"
|
|
import { RdDItemArmure } from "./item/armure.js"
|
|
import { AutoAdjustDarkness } from "./time/auto-adjust-darkness.js"
|
|
import { RdDCreature } from "./actor/creature.js"
|
|
import { RdDTMRDialog } from "./rdd-tmr-dialog.js"
|
|
import { OptionsAvancees } from "./settings/options-avancees.js"
|
|
import { ExportScriptarium } from "./actor/export-scriptarium/export-scriptarium.js"
|
|
import { AppPersonnageAleatoire } from "./actor/random/app-personnage-aleatoire.js"
|
|
import { RdDActorExportSheet } from "./actor/export-scriptarium/actor-encart-sheet.js"
|
|
|
|
/**
|
|
* RdD system
|
|
* Author: LeRatierBretonnien
|
|
* Software License: GNU GPLv3
|
|
*/
|
|
export class SystemReveDeDragon {
|
|
|
|
static start() {
|
|
const system = new SystemReveDeDragon()
|
|
Hooks.once('init', async () => await system.onInit())
|
|
Hooks.once('diceSoNiceReady', (dice3d) => RdDDice.diceSoNiceReady(dice3d))
|
|
Hooks.once('ready', async () => await system.onReady())
|
|
}
|
|
|
|
constructor() {
|
|
this.config = RDD_CONFIG
|
|
this.RdDUtility = RdDUtility
|
|
this.RdDHotbar = RdDHotbar
|
|
this.itemClasses = {
|
|
armure: RdDItemArmure,
|
|
blessure: RdDItemBlessure,
|
|
maladie: RdDItemMaladie,
|
|
ombre: RdDItemOmbre,
|
|
poison: RdDItemPoison,
|
|
queue: RdDItemQueue,
|
|
rencontre: RdDRencontre,
|
|
service: RdDItemService,
|
|
signedraconique: RdDItemSigneDraconique,
|
|
souffle: RdDItemSouffle,
|
|
}
|
|
this.actorClasses = {
|
|
commerce: RdDCommerce,
|
|
creature: RdDCreature,
|
|
entite: RdDEntite,
|
|
personnage: RdDActor,
|
|
vehicule: RdDVehicule,
|
|
}
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
/* Foundry VTT Initialization */
|
|
/* -------------------------------------------- */
|
|
async onInit() {
|
|
game.system.rdd = this
|
|
this.AppAstrologie = AppAstrologie
|
|
|
|
console.log(`Initializing Reve de Dragon System Settings`)
|
|
|
|
// preload handlebars templates
|
|
RdDUtility.preloadHandlebarsTemplates()
|
|
AppPersonnageAleatoire.preloadHandlebars()
|
|
|
|
/* -------------------------------------------- */
|
|
ReglesOptionnelles.initSettings()
|
|
OptionsAvancees.initSettings()
|
|
AutoAdjustDarkness.initSettings()
|
|
RdDTimestamp.initSettings()
|
|
RdDCalendrier.initSettings()
|
|
SystemCompendiums.initSettings()
|
|
DialogChronologie.initSettings()
|
|
RdDTMRDialog.initSettings()
|
|
Environnement.initSettings()
|
|
|
|
this.initSettings()
|
|
|
|
/* -------------------------------------------- */
|
|
// Set an initiative formula for the system
|
|
CONFIG.Combat.initiative = { formula: "1+(1d6/10)", decimals: 2 }
|
|
|
|
/* -------------------------------------------- */
|
|
console.log(`Initializing Reve de Dragon Socket handlers`)
|
|
game.socket.on(SYSTEM_SOCKET_ID, async (sockmsg) => {
|
|
console.log(">>>>> MSG RECV", sockmsg)
|
|
try {
|
|
RdDUtility.onSocketMessage(sockmsg)
|
|
RdDCombat.onSocketMessage(sockmsg)
|
|
ChatUtility.onSocketMessage(sockmsg)
|
|
RdDBaseActor.onSocketMessage(sockmsg)
|
|
} catch (e) {
|
|
console.error('game.socket.on(SYSTEM_SOCKET_ID) Exception: ', sockmsg, ' => ', e)
|
|
}
|
|
})
|
|
|
|
/* -------------------------------------------- */
|
|
// Define custom Entity classes
|
|
console.log(`Initializing Reve de Dragon Documents`)
|
|
CONFIG.Actor.documentClass = RdDBaseActor
|
|
CONFIG.Item.documentClass = RdDItem
|
|
CONFIG.RDD = {
|
|
resolutionTable: RdDResolutionTable.resolutionTable,
|
|
carac_array: RdDUtility.getCaracArray(),
|
|
ajustementsConditions: RdDUtility.getAjustementsConditions(),
|
|
difficultesLibres: RdDUtility.getDifficultesLibres()
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
// Register sheet application classes
|
|
Actors.unregisterSheet("core", ActorSheet)
|
|
Actors.registerSheet(SYSTEM_RDD, RdDCommerceSheet, { types: ["commerce"], makeDefault: true })
|
|
Actors.registerSheet(SYSTEM_RDD, RdDActorSheet, { types: ["personnage"], makeDefault: true })
|
|
Actors.registerSheet(SYSTEM_RDD, RdDCreatureSheet, { types: ["creature"], makeDefault: true })
|
|
Actors.registerSheet(SYSTEM_RDD, RdDActorVehiculeSheet, { types: ["vehicule"], makeDefault: true })
|
|
Actors.registerSheet(SYSTEM_RDD, RdDActorEntiteSheet, { types: ["entite"], makeDefault: true })
|
|
Items.unregisterSheet("core", ItemSheet)
|
|
await RdDActorExportSheet.init()
|
|
|
|
RdDItemSheet.register(RdDSigneDraconiqueItemSheet)
|
|
RdDItemSheet.register(RdDRencontreItemSheet)
|
|
RdDItemSheet.register(RdDConteneurItemSheet)
|
|
RdDItemSheet.register(RdDHerbeItemSheet)
|
|
RdDItemSheet.register(RdDFauneItemSheet)
|
|
RdDItemSheet.register(RdDPlanteItemSheet)
|
|
RdDItemSheet.register(RdDIngredientItemSheet)
|
|
RdDItemSheet.register(RdDServiceItemSheet)
|
|
RdDItemSheet.register(RdDBlessureItemSheet)
|
|
|
|
Items.registerSheet(SYSTEM_RDD, RdDItemInventaireSheet, {
|
|
types: [
|
|
"objet", "arme", "armure", "livre", "potion", "munition",
|
|
"monnaie", "nourritureboisson", "gemme",
|
|
], makeDefault: true
|
|
})
|
|
Items.registerSheet(SYSTEM_RDD, RdDItemSheet, {
|
|
types: [
|
|
"competence", "competencecreature",
|
|
"recettealchimique", "musique", "chant", "danse", "jeu", "recettecuisine", "oeuvre",
|
|
"meditation", "queue", "ombre", "souffle", "tete", "casetmr", "sort", "sortreserve",
|
|
"nombreastral", "tache", "maladie", "poison", "possession",
|
|
"tarot", "extraitpoetique", "empoignade"
|
|
], makeDefault: true
|
|
})
|
|
|
|
// préparation des différents modules
|
|
console.log(`Initializing Reve de Dragon Hooks and handlers`)
|
|
CONFIG.Combat.documentClass = RdDCombatManager
|
|
ChatUtility.init()
|
|
RdDUtility.initHooks()
|
|
RdDDice.init()
|
|
RdDCommands.init()
|
|
RdDCombatManager.init()
|
|
RdDTokenHud.init()
|
|
RdDBaseActor.init()
|
|
RdDCompendiumOrganiser.init()
|
|
EffetsDraconiques.init()
|
|
TMRUtility.init()
|
|
RdDHotbar.initHooks()
|
|
RdDPossession.init()
|
|
TMRRencontres.init()
|
|
ExportScriptarium.init()
|
|
}
|
|
|
|
initSettings() {
|
|
// TODO: déplacer vers les modules correspondants
|
|
game.settings.register(SYSTEM_RDD, "accorder-entite-cauchemar", {
|
|
name: "Accorder le rêve aux entités",
|
|
hint: "A quel moment les personnages doivent accorder leur rêve aux entités de cauchemar",
|
|
scope: "world",
|
|
config: true,
|
|
type: String,
|
|
choices: {
|
|
"avant-attaque": "Avant l'attaque",
|
|
"avant-defense": "Avant la défense",
|
|
"avant-encaissement": "Avant l'encaissement",
|
|
},
|
|
default: "avant-encaissement"
|
|
})
|
|
|
|
/* -------------------------------------------- */
|
|
game.settings.register(SYSTEM_RDD, "supprimer-dialogues-combat-chat", {
|
|
name: "Supprimer les dialogues de combat",
|
|
hint: "Si désactivée, tous les dialogues de combat sont conservés dans la conversation",
|
|
scope: "world",
|
|
config: true,
|
|
default: true,
|
|
type: Boolean
|
|
})
|
|
|
|
/* -------------------------------------------- */
|
|
game.settings.register(SYSTEM_RDD, "activer-sons-audio", {
|
|
name: "Activer les bruitages intégrés",
|
|
hint: "Si activé, certaines actions en jeu déclenchent un son d'ambiance",
|
|
scope: "world",
|
|
config: true,
|
|
default: true,
|
|
type: Boolean
|
|
})
|
|
|
|
/* -------------------------------------------- */
|
|
game.settings.register(SYSTEM_RDD, "appliquer-famine-soif", {
|
|
name: "Notifier de la famine et la soif pour",
|
|
hint: "Indique si les cas de famine et de soif seront indiqués durant Château Dormant",
|
|
scope: "world",
|
|
config: true,
|
|
type: String,
|
|
choices: {
|
|
"aucun": "ni la famine, ni la soif",
|
|
"famine": "seulement la famine",
|
|
"famine-soif": "la famine et la soif",
|
|
},
|
|
default: "aucun"
|
|
})
|
|
}
|
|
|
|
async onReady() {
|
|
|
|
/* -------------------------------------------- */
|
|
/* Foundry VTT Initialization */
|
|
/* -------------------------------------------- */
|
|
game.system.rdd.calendrier = new RdDCalendrier()
|
|
if (Misc.isUniqueConnectedGM()) {
|
|
new Migrations().migrate()
|
|
this.messageDeBienvenue()
|
|
import("https://www.uberwald.me/fvtt_appcount/count-class-ready.js").then(moduleCounter => {
|
|
console.log("ClassCounter loaded", moduleCounter)
|
|
moduleCounter.ClassCounter.registerUsageCount()
|
|
}).catch(err =>
|
|
console.log("No stats available, giving up.")
|
|
)
|
|
}
|
|
|
|
StatusEffects.onReady()
|
|
RdDHerbes.onReady()
|
|
RdDDice.onReady()
|
|
/* -------------------------------------------- */
|
|
/* Affiche/Init le calendrier */
|
|
game.system.rdd.calendrier.display()
|
|
// Avertissement si joueur sans personnage
|
|
if (!game.user.isGM && game.user.character == undefined) {
|
|
ui.notifications.info("Attention ! Vous n'êtes connecté à aucun personnage !")
|
|
ChatMessage.create({
|
|
content: "<b>ATTENTION</b> Le joueur " + game.user.name + " n'est connecté à aucun personnage !",
|
|
user: game.user.id
|
|
})
|
|
}
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
messageDeBienvenue() {
|
|
if (game.user.isGM) {
|
|
ChatUtility.removeChatMessageContaining('<div id="message-bienvenue-rdd">')
|
|
ChatMessage.create({
|
|
user: game.user.id,
|
|
content: `<div id="message-bienvenue-rdd"><span class="rdd-roll-part">Bienvenue dans le Rêve des Dragons !</span>
|
|
<br>Vous trouverez quelques informations pour démarrer dans ce document : @Compendium[foundryvtt-reve-de-dragon.rappel-des-regles.7uGrUHGdPu0EmIu2]{Documentation MJ/Joueurs}
|
|
<br>La commande <code>/aide</code> dans le chat permet de voir les commandes spécifiques à Rêve de Dragon.</div>
|
|
` })
|
|
}
|
|
}
|
|
}
|
|
|
|
SystemReveDeDragon.start()
|