2020-06-07 23:16:50 +02:00
/ * *
* RdD system
* Author : LeRatierBretonnien
* Software License : GNU GPLv3
* /
/* -------------------------------------------- */
/* -------------------------------------------- */
// Import Modules
import { RdDActor } from "./actor.js" ;
import { RdDItemSheet } from "./item-sheet.js" ;
import { RdDActorSheet } from "./actor-sheet.js" ;
2020-09-20 17:38:21 +02:00
import { RdDActorCreatureSheet } from "./actor-creature-sheet.js" ;
2020-11-04 16:29:10 +01:00
import { RdDActorHumanoideSheet } from "./actor-humanoide-sheet.js" ;
2020-11-14 23:24:01 +01:00
import { RdDActorEntiteSheet } from "./actor-entite-sheet.js" ;
2020-06-07 23:16:50 +02:00
import { RdDUtility } from "./rdd-utility.js" ;
2020-11-17 16:30:03 +01:00
import { TMRUtility } from "./tmr-utility.js" ;
2020-09-20 16:36:39 +02:00
import { RdDCalendrier } from "./rdd-calendrier.js" ;
2020-11-11 22:39:36 +01:00
import { RdDResolutionTable } from "./rdd-resolution-table.js" ;
2020-12-05 00:04:40 +01:00
import { RdDTokenHud } from "./rdd-token-hud.js" ;
2020-06-07 23:16:50 +02:00
/* -------------------------------------------- */
/* Foundry VTT Initialization */
/* -------------------------------------------- */
2020-09-02 22:00:35 +02:00
/************************************************************************************/
const _patch _initiative = ( ) => {
Combat . prototype . rollInitiative = async function (
ids ,
2020-11-24 17:41:14 +01:00
formula = undefined ,
2020-09-02 22:00:35 +02:00
messageOptions = { }
) {
console . log (
` ${ game . data . system . data . title } | Combat.rollInitiative() ` ,
ids ,
formula ,
messageOptions
) ;
// Structure input data
ids = typeof ids === "string" ? [ ids ] : ids ;
const currentId = this . combatant . _id ;
// calculate initiative
for ( let cId = 0 ; cId < ids . length ; cId ++ ) {
const c = this . getCombatant ( ids [ cId ] ) ;
//if (!c) return results;
2020-11-24 17:41:14 +01:00
let rollFormula = formula ; // Init per default
if ( ! rollFormula ) {
let armeCombat , competence ;
if ( c . actor . data . type == 'creature' || c . actor . data . type == 'entite' ) {
for ( const competenceItem of c . actor . data . items ) {
if ( competenceItem . data . iscombat ) {
competence = duplicate ( competenceItem ) ;
}
2020-11-16 21:18:18 +01:00
}
2020-12-09 00:36:38 +01:00
rollFormula = RdDUtility . calculInitiative ( competence . data . niveau , competence . data . carac _value ) ;
2020-11-24 17:41:14 +01:00
} else {
for ( const item of c . actor . data . items ) {
if ( item . type == "arme" && item . data . equipe ) {
armeCombat = duplicate ( item ) ;
}
2020-11-16 21:18:18 +01:00
}
2020-11-24 17:41:14 +01:00
let compName = ( armeCombat == undefined ) ? "Corps à corps" : armeCombat . data . competence ;
competence = RdDUtility . findCompetence ( c . actor . data . items , compName ) ;
2020-12-09 00:36:38 +01:00
rollFormula = RdDUtility . calculInitiative ( competence . data . niveau , c . actor . data . data . carac [ competence . data . defaut _carac ] . value ) ;
2020-11-16 21:18:18 +01:00
}
2020-09-02 22:00:35 +02:00
}
//console.log("Combatat", c);
const roll = this . _getInitiativeRoll ( c , rollFormula ) ;
2020-12-05 00:04:40 +01:00
if ( roll . total <= 0 ) roll . total = 1 ;
//console.log("Compute init for", armeCombat, competence, rollFormula, roll.total);
2020-09-02 22:00:35 +02:00
await this . updateEmbeddedEntity ( "Combatant" , { _id : c . _id , initiative : roll . total } ) ;
// Send a chat message
2020-12-05 00:04:40 +01:00
let rollMode = messageOptions . rollMode || game . settings . get ( "core" , "rollMode" ) ;
2020-09-02 22:00:35 +02:00
let messageData = mergeObject (
{
speaker : {
scene : canvas . scene . _id ,
actor : c . actor ? c . actor . _id : null ,
token : c . token . _id ,
alias : c . token . name ,
sound : CONFIG . sounds . dice ,
} ,
2020-11-24 17:41:14 +01:00
flavor : ` ${ c . token . name } a fait son jet d'Initiative ` ,
2020-09-02 22:00:35 +02:00
} ,
messageOptions
) ;
roll . toMessage ( messageData , { rollMode , create : true } ) ;
}
return this ;
} ;
}
/************************************************************************************/
2020-06-07 23:16:50 +02:00
Hooks . once ( "init" , async function ( ) {
console . log ( ` Initializing Reve de Dragon System ` ) ;
// preload handlebars templates
RdDUtility . preloadHandlebarsTemplates ( ) ;
2020-11-12 23:50:37 +01:00
// Create useful storage space
game . system . rdd = {
2020-11-17 16:30:03 +01:00
rollDataHandler : { } ,
TMRUtility : TMRUtility
2020-11-12 23:50:37 +01:00
}
2020-12-08 21:40:41 +01:00
/* -------------------------------------------- */
2020-12-01 17:36:13 +01:00
game . settings . register ( "foundryvtt-reve-de-dragon" , "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 : { // If choices are defined, the resulting setting will be a select menu
"avant-attaque" : "Avant l'attaque" ,
"avant-defense" : "Avant la défense" ,
"avant-encaissement" : "Avant l'encaissement" ,
} ,
default : "avant-encaissement"
} ) ;
2020-12-08 21:40:41 +01:00
/* -------------------------------------------- */
game . settings . register ( "foundryvtt-reve-de-dragon" , "calendrier" , {
2020-12-12 21:58:44 +01:00
name : "calendrier" ,
scope : "world" ,
config : false ,
type : Object
} ) ;
2020-12-08 21:40:41 +01:00
/* -------------------------------------------- */
2020-12-08 23:12:43 +01:00
game . settings . register ( "foundryvtt-reve-de-dragon" , "liste-nombre-astral" , {
name : "liste-nombre-astral" ,
scope : "world" ,
config : false ,
type : Object
2020-12-12 21:58:44 +01:00
} ) ;
2020-12-08 23:12:43 +01:00
/* -------------------------------------------- */
2020-12-08 21:40:41 +01:00
game . settings . register ( "foundryvtt-reve-de-dragon" , "calendrier-pos" , {
name : "calendrierPos" ,
scope : "world" ,
config : false ,
type : Object
2020-12-12 21:58:44 +01:00
} ) ;
/* -------------------------------------------- */
game . settings . register ( "foundryvtt-reve-de-dragon" , "moteur-combat" , {
name : "Utiliser le moteur de combat" ,
scope : "world" ,
config : true ,
type : String ,
choices : { // If choices are defined, the resulting setting will be a select menu
"standard" : "Standard" ,
"experimental" : "Expérimental"
} ,
2020-12-15 23:30:21 +01:00
default : "experimental"
2020-12-12 21:58:44 +01:00
} ) ;
2020-12-08 21:40:41 +01:00
/* -------------------------------------------- */
2020-11-17 11:35:05 +01:00
game . settings . register ( "foundryvtt-reve-de-dragon" , "dice-so-nice" , {
name : "Montrer les dés pour toutes les jets" ,
hint : "Utilise Dice So Nice pour tous les jets de dés possibles. Décocher pour limiter à la table de résolution" ,
scope : "client" ,
config : true ,
default : false ,
type : Boolean
2020-12-01 17:36:13 +01:00
} ) ;
2020-12-12 21:58:44 +01:00
2020-08-13 22:28:56 +02:00
//game.settings.get("<systemName>","<settingName>") to retrieve it and game.settings.set("<systemName>","<settingName>", <newValue>)
2020-12-08 21:40:41 +01:00
/* -------------------------------------------- */
// Set an initiative formula for the system
2020-06-07 23:16:50 +02:00
CONFIG . Combat . initiative = {
formula : "1d20" ,
decimals : 2
} ;
2020-06-17 20:31:43 +02:00
2020-12-08 21:40:41 +01:00
/* -------------------------------------------- */
2020-06-17 20:31:43 +02:00
game . socket . on ( "system.foundryvtt-reve-de-dragon" , data => {
RdDUtility . performSocketMesssage ( data ) ;
} ) ;
2020-06-07 23:16:50 +02:00
2020-12-08 21:40:41 +01:00
/* -------------------------------------------- */
2020-06-07 23:16:50 +02:00
// Define custom Entity classes
CONFIG . Actor . entityClass = RdDActor ;
2020-11-11 22:39:36 +01:00
CONFIG . RDD = {
2020-11-15 02:07:41 +01:00
resolutionTable : RdDResolutionTable . resolutionTable ,
level _category : RdDUtility . getLevelCategory ( ) ,
carac _array : RdDUtility . getCaracArray ( ) ,
ajustementsConditions : RdDUtility . getAjustementsConditions ( ) ,
difficultesLibres : RdDUtility . getDifficultesLibres ( )
2020-11-11 22:39:36 +01:00
}
2020-06-07 23:16:50 +02:00
2020-12-08 21:40:41 +01:00
/* -------------------------------------------- */
2020-06-07 23:16:50 +02:00
// Register sheet application classes
Actors . unregisterSheet ( "core" , ActorSheet ) ;
2020-09-20 17:38:21 +02:00
Actors . registerSheet ( "foundryvtt-reve-de-dragon" , RdDActorSheet , {
types : [ "personnage" ] ,
makeDefault : true }
) ;
2020-11-14 23:24:01 +01:00
Actors . registerSheet ( "foundryvtt-reve-de-dragon" , RdDActorCreatureSheet , {
2020-09-20 17:38:21 +02:00
types : [ "creature" ] ,
makeDefault : true
} ) ;
2020-11-14 23:24:01 +01:00
Actors . registerSheet ( "foundryvtt-reve-de-dragon" , RdDActorHumanoideSheet , {
2020-11-04 16:29:10 +01:00
types : [ "humanoide" ] ,
makeDefault : true
} ) ;
2020-11-14 23:24:01 +01:00
Actors . registerSheet ( "foundryvtt-reve-de-dragon" , RdDActorEntiteSheet , {
types : [ "entite" ] ,
makeDefault : true
} ) ;
2020-06-07 23:16:50 +02:00
Items . unregisterSheet ( "core" , ItemSheet ) ;
Items . registerSheet ( "foundryvtt-reve-de-dragon" , RdDItemSheet , { makeDefault : true } ) ;
2020-09-02 22:00:35 +02:00
2020-11-12 14:43:08 +01:00
// Handlebar function pour container
Handlebars . registerHelper ( 'buildConteneur' , ( objet ) => { return RdDUtility . buildConteneur ( objet ) ; } ) ;
2020-09-02 22:00:35 +02:00
// Patch the initiative formula
_patch _initiative ( ) ;
2020-07-21 23:51:24 +02:00
} ) ;
2020-12-04 10:15:55 +01:00
/* -------------------------------------------- */
2020-11-23 19:51:34 +01:00
function messageDeBienvenue ( ) {
2020-11-24 15:43:03 +01:00
game . messages
. filter ( it => it . user . _id == game . user . _id && it . data . content . match ( /^Bienvenu(e)? dans le Rêve des Dragons/ ) )
. forEach ( it => it . delete ( ) ) ;
2020-11-23 19:51:34 +01:00
ChatMessage . create ( {
2020-11-24 15:43:03 +01:00
user : game . user . _id ,
whisper : [ game . user . _id ] ,
2020-11-23 19:51:34 +01:00
content : "Bienvenue dans le Rêve des Dragons !<br> " +
"Vous trouverez quelques informations pour démarrer dans ce document : @Compendium[foundryvtt-reve-de-dragon.rappel-des-regles.7uGrUHGdPu0EmIu2]{Documentation MJ/Joueurs}" }
) ;
}
2020-12-05 00:04:40 +01:00
/* -------------------------------------------- */
Hooks . once ( "renderApplication" , ( ) => {
messageDeBienvenue ( ) ;
} ) ;
2020-07-24 10:51:11 +02:00
/* -------------------------------------------- */
/* Foundry VTT Initialization */
/* -------------------------------------------- */
Hooks . once ( "ready" , function ( ) {
2020-12-08 21:40:41 +01:00
/* -------------------------------------------- */
/* Affiche/Init le calendrier */
let calendrier = new RdDCalendrier ( ) ;
calendrier . initCalendrier ( ) ;
let templatePath = "systems/foundryvtt-reve-de-dragon/templates/calendar-template.html" ;
let templateData = { } ;
renderTemplate ( templatePath , templateData ) . then ( html => {
2020-09-20 16:36:39 +02:00
calendrier . render ( true ) ;
2020-12-08 21:40:41 +01:00
} ) ;
game . system . rdd . calendrier = calendrier ; // Reference;
2020-12-04 10:15:55 +01:00
// 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 } ) ;
//whisper: [ ChatMessage.getWhisperRecipients("GM") ] } );
}
2020-12-05 00:04:40 +01:00
// Integration du TokenHUD
Hooks . on ( 'renderTokenHUD' , ( app , html , data ) => { RdDTokenHud . addTokenHudExtensions ( app , html , data ) } ) ;
2020-09-20 16:36:39 +02:00
} ) ;
2020-07-24 10:51:11 +02:00
2020-12-04 10:15:55 +01:00
/* -------------------------------------------- */
/ * A b a n d o n n é p o u r l ' i n s t a n t
Hooks . on ( "preCreateToken" , ( scene , tokenData , options ) => {
let actor = game . actors . get ( tokenData . actorId )
if ( actor ) {
let tokenSize = actor . data . data . carac . taille . value / 10 ;
tokenData . width = tokenSize ;
tokenData . height = tokenSize ;
}
console . log ( "PRECREATE:" , scene , tokenData , options ) ;
} ) ; * /
2020-07-21 23:51:24 +02:00
/* -------------------------------------------- */
/* Foundry VTT Initialization */
/* -------------------------------------------- */
Hooks . on ( "chatMessage" , ( html , content , msg ) => {
2020-09-13 22:46:42 +02:00
let regExp ;
regExp = /(\S+)/g ;
let commands = content . match ( regExp ) ;
2020-06-07 23:16:50 +02:00
2020-09-13 22:46:42 +02:00
return RdDUtility . processChatCommand ( commands , content , msg ) ;
2020-07-21 23:51:24 +02:00
} ) ;
2020-11-24 16:41:15 +01:00
/* -------------------------------------------- */
Hooks . on ( "getCombatTrackerEntryContext" , ( html , options ) => {
RdDUtility . pushInitiativeOptions ( html , options ) ;
} )