Vincent Vandemeulebrouck
bf2b387fc4
Sur Firefor, le onReady n'est jamais appelé, le système n'est alors pas totalement initialisé, toute la partie calendrier n'est pas prête, et donc les ajustement d'astrologie.
337 lines
13 KiB
JavaScript
337 lines
13 KiB
JavaScript
import { SYSTEM_RDD, SYSTEM_SOCKET_ID } 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 as AutoAdjustDarkness } from "./time/auto-adjust-darkness.js";
|
|
import { RdDCreature } from "./actor/creature.js";
|
|
import { RdDTMRDialog } from "./rdd-tmr-dialog.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', () => system.onReady())
|
|
}
|
|
|
|
constructor() {
|
|
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`);
|
|
|
|
// preload handlebars templates
|
|
RdDUtility.preloadHandlebarsTemplates();
|
|
|
|
/* -------------------------------------------- */
|
|
this.initSystemSettings();
|
|
|
|
/* -------------------------------------------- */
|
|
// Set an initiative formula for the system
|
|
CONFIG.Combat.initiative = {
|
|
formula: "1+(1d6/10)",
|
|
decimals: 2
|
|
};
|
|
|
|
/* -------------------------------------------- */
|
|
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
|
|
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);
|
|
|
|
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
|
|
});
|
|
CONFIG.Combat.documentClass = RdDCombatManager;
|
|
|
|
// préparation des différents modules
|
|
AutoAdjustDarkness.init();
|
|
RdDTimestamp.init();
|
|
RdDCalendrier.init();
|
|
SystemCompendiums.init();
|
|
DialogChronologie.init();
|
|
ReglesOptionnelles.init();
|
|
RdDUtility.init();
|
|
RdDDice.init();
|
|
RdDCommands.init();
|
|
RdDCombatManager.init();
|
|
RdDTokenHud.init();
|
|
RdDBaseActor.init();
|
|
RdDCompendiumOrganiser.init();
|
|
EffetsDraconiques.init()
|
|
TMRUtility.init();
|
|
await RdDTMRDialog.init()
|
|
RdDHotbar.initDropbar();
|
|
RdDPossession.init();
|
|
TMRRencontres.init();
|
|
Environnement.init();
|
|
|
|
}
|
|
|
|
initSystemSettings() {
|
|
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 */
|
|
/* -------------------------------------------- */
|
|
// CSS patch for v9
|
|
if (game.version) {
|
|
let sidebar = document.getElementById("sidebar");
|
|
sidebar.style.width = "min-content";
|
|
}
|
|
game.system.rdd.calendrier = new RdDCalendrier();
|
|
if (Misc.isUniqueConnectedGM()) {
|
|
new Migrations().migrate();
|
|
this.messageDeBienvenue();
|
|
this.registerUsageCount(SYSTEM_RDD);
|
|
}
|
|
|
|
StatusEffects.onReady();
|
|
RdDHerbes.initializeHerbes();
|
|
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>
|
|
` });
|
|
}
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
// Register world usage statistics
|
|
async registerUsageCount(registerKey) {
|
|
if (game.user.isGM) {
|
|
game.settings.register("world", "world-key", {
|
|
name: "Unique world key",
|
|
scope: "world",
|
|
config: false,
|
|
default: "NONE",
|
|
type: String
|
|
});
|
|
|
|
let worldKey = game.settings.get("world", "world-key")
|
|
if (worldKey == undefined || worldKey == "") {
|
|
worldKey = randomID(32)
|
|
game.settings.set("world", "world-key", worldKey)
|
|
}
|
|
let regURL = `https://www.uberwald.me/fvtt_appcount/count.php?name="${registerKey}"&worldKey="${worldKey}"&version="${game.release.generation}.${game.release.build}"&system="${game.system.id}"&systemversion="${game.system.version}"`
|
|
$.ajax(regURL)
|
|
/* -------------------------------------------- */
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
SystemReveDeDragon.start();
|
|
|