2020-12-29 00:11:58 +01:00
/* -------------------------------------------- */
import { ChatUtility } from "./chat-utility.js" ;
2020-12-31 11:53:41 +01:00
import { DeDraconique } from "./de-draconique.js" ;
2020-12-29 00:11:58 +01:00
import { Misc } from "./misc.js" ;
2020-12-31 11:53:41 +01:00
import { RdDDice } from "./rdd-dice.js" ;
2020-12-29 00:11:58 +01:00
import { RdDResolutionTable } from "./rdd-resolution-table.js" ;
import { RdDRollResolution } from "./rdd-roll-resolution.js" ;
import { RdDRollTables } from "./rdd-rolltables.js" ;
import { RdDUtility } from "./rdd-utility.js" ;
import { TMRUtility } from "./tmr-utility.js" ;
const rddRollNumeric = /(\d+)\s*([\+\-]?\d+)?\s*(s)?/ ;
/* -------------------------------------------- */
export class RdDCommands {
static init ( ) {
if ( ! game . system . rdd . commands ) {
const rddCommands = new RdDCommands ( ) ;
2020-12-31 11:53:41 +01:00
rddCommands . registerCommand ( { path : [ "/aide" ] , func : ( content , msg , params ) => rddCommands . help ( msg ) , descr : "Affiche l'aide pour toutes les commandes" } ) ;
rddCommands . registerCommand ( { path : [ "/help" ] , func : ( content , msg , params ) => rddCommands . help ( msg ) , descr : "Affiche l'aide pour toutes les commandes" } ) ;
rddCommands . registerCommand ( { path : [ "/table" , "queues" ] , func : ( content , msg , params ) => RdDRollTables . getQueue ( ) , descr : "Tire une Queue de Dragon" } ) ;
rddCommands . registerCommand ( { path : [ "/table" , "ombre" ] , func : ( content , msg , params ) => RdDRollTables . getOmbre ( ) , descr : "Tire une Ombre de Dragon" } ) ;
rddCommands . registerCommand ( { path : [ "/table" , "tetehr" ] , func : ( content , msg , params ) => RdDRollTables . getTeteHR ( ) , descr : "Tire une Tête de Dragon pour Hauts Revants" } ) ;
rddCommands . registerCommand ( { path : [ "/table" , "tete" ] , func : ( content , msg , params ) => RdDRollTables . getTete ( ) , descr : "Tire une Tête de Dragon" } ) ;
rddCommands . registerCommand ( { path : [ "/table" , "souffle" ] , func : ( content , msg , params ) => RdDRollTables . getSouffle ( ) , descr : " Tire un Souffle de Dragon" } ) ;
rddCommands . registerCommand ( { path : [ "/table" , "tarot" ] , func : ( content , msg , params ) => RdDRollTables . getTarot ( ) , descr : "Tire une carte du Tarot Draconique" } ) ;
rddCommands . registerCommand ( { path : [ "/table" , "tmr" ] , func : ( content , msg , params ) => TMRUtility . getTMRAleatoire ( ) , descr : "Tire une case aléatoire des Terre médiane" } ) ;
rddCommands . registerCommand ( { path : [ "/tmra" ] , func : ( content , msg , params ) => TMRUtility . getTMRAleatoire ( ) , descr : "Tire une case aléatoire des Terre médiane" } ) ;
2020-12-29 00:11:58 +01:00
rddCommands . registerCommand ( {
2020-12-31 11:53:41 +01:00
path : [ "/tmrr" ] , func : ( content , msg , params ) => rddCommands . getRencontreTMR ( params ) ,
descr : "Syntaxe: <strong>/tmrr case jet</strong><br>Détermine quelle est la rencontre dans la case pour le jet<br>Example: <strong>/tmrr forêt 50</strong>"
} ) ;
rddCommands . registerCommand ( {
path : [ "/rdd" ] , func : ( content , msg , params ) => rddCommands . rollRdd ( msg , params ) ,
descr : ` Effectue un jet de dés dans la table de résolution. Examples:
2020-12-29 00:11:58 +01:00
< br > < strong > / r d d < / s t r o n g > o u v r e l a t a b l e d e r é s o l u t i o n
< br > < strong > / r d d 1 0 3 < / s t r o n g > e f f e c t u e u n j e t 1 0 à + 3
< br > < strong > / r d d 1 0 + 2 < / s t r o n g > e f f e c t u e u n j e t 1 0 à + 2
< br > < strong > / r d d 1 5 - 2 < / s t r o n g > e f f e c t u e u n j e t 1 5 à - 2
< br > < strong > / r d d 1 5 0 s < / s t r o n g > e f f e c t u e u n j e t 1 5 à 0 , a v e c s i g n i f i c a t i v e r e q u i s e
2020-12-31 11:53:41 +01:00
`
2020-12-29 00:11:58 +01:00
} ) ;
2020-12-31 11:53:41 +01:00
rddCommands . registerCommand ( { path : [ "/ddr" ] , func : ( content , msg , params ) => rddCommands . rollDeDraconique ( msg ) , descr : "Lance un Dé Draconique" } ) ;
2020-12-29 00:11:58 +01:00
2020-12-31 11:53:41 +01:00
rddCommands . registerCommand ( {
path : [ "/payer" ] , func : ( content , msg , params ) => RdDUtility . afficherDemandePayer ( params [ 0 ] , params [ 1 ] ) ,
descr : ` Permet de payer un montant. Exemples:
2020-12-29 00:11:58 +01:00
< br > < strong > / p a y e r 5 s 1 0 d < / s t r o n g > p e r m e t d ' e n v o y e r u n m e s s a g e p o u r p a y e r 5 s o l s e t 1 0 d e n i e r s
< br > < strong > / p a y e r 1 0 d < / s t r o n g > p e r m e t d ' e n v o y e r u n m e s s a g e p o u r p a y e r 1 0 d e n i e r s
2020-12-31 11:53:41 +01:00
`
} ) ;
2020-12-29 00:11:58 +01:00
game . system . rdd . commands = rddCommands ;
}
}
constructor ( ) {
this . commandsTable = { } ;
}
registerCommand ( command ) {
2020-12-31 11:53:41 +01:00
this . _addCommand ( this . commandsTable , command . path , '' , command ) ;
2020-12-29 00:11:58 +01:00
}
2020-12-31 11:53:41 +01:00
_addCommand ( targetTable , path , fullPath , command ) {
2020-12-29 00:11:58 +01:00
if ( ! this . _validateCommand ( targetTable , path , command ) ) {
return ;
}
const term = path [ 0 ] ;
2020-12-31 11:53:41 +01:00
fullPath = fullPath + term + ' '
2020-12-29 00:11:58 +01:00
if ( path . length == 1 ) {
2020-12-31 11:53:41 +01:00
command . descr = ` <strong> ${ fullPath } </strong>: ${ command . descr } ` ;
2020-12-29 00:11:58 +01:00
targetTable [ term ] = command ;
}
else {
if ( ! targetTable [ term ] ) {
targetTable [ term ] = { subTable : { } } ;
}
2020-12-31 11:53:41 +01:00
this . _addCommand ( targetTable [ term ] . subTable , path . slice ( 1 ) , fullPath , command )
2020-12-29 00:11:58 +01:00
}
}
_validateCommand ( targetTable , path , command ) {
if ( path . length > 0 && path [ 0 ] && command . descr && ( path . length != 1 || targetTable [ path [ 0 ] ] == undefined ) ) {
return true ;
}
console . warn ( "RdDCommands._validateCommand failed " , targetTable , path , command ) ;
return false ;
}
/* -------------------------------------------- */
/* Manage chat commands */
processChatCommand ( commandLine , content , msg ) {
// Setup new message's visibility
let rollMode = game . settings . get ( "core" , "rollMode" ) ;
if ( [ "gmroll" , "blindroll" ] . includes ( rollMode ) ) msg [ "whisper" ] = ChatMessage . getWhisperRecipients ( "GM" ) ;
if ( rollMode === "blindroll" ) msg [ "blind" ] = true ;
msg [ "type" ] = 0 ;
let command = commandLine [ 0 ] ;
let params = commandLine . slice ( 1 ) ;
return this . process ( command , params , content , msg ) ;
}
process ( command , params , content , msg ) {
return this . _processCommand ( this . commandsTable , command , params , content , msg ) ;
}
_processCommand ( commandsTable , name , params , content = '' , msg = { } , path = "" ) {
let command = commandsTable [ name ] ;
path = path + name + " " ;
if ( command && command . subTable ) {
if ( params [ 0 ] ) {
return this . _processCommand ( command . subTable , params [ 0 ] , params . slice ( 1 ) , content , msg , path )
}
else {
this . help ( msg , command . subTable ) ;
return true ;
}
}
if ( command && command . func ) {
if ( command . func ( content , msg , params ) === false ) {
this . _displayHelp ( msg , ` ${ path } : ${ command . descr } ` ) ;
}
return true ;
}
return false ;
}
/* -------------------------------------------- */
help ( msg , table = undefined ) {
let list = [ ]
2020-12-31 11:53:41 +01:00
this . _buildSubTableHelp ( list , table || this . commandsTable ) ;
const messageAide = list . reduce ( ( a , b ) => a + '</li><li class="list-item">' + b ) ;
2020-12-29 00:11:58 +01:00
msg . whisper = [ game . user . _id ] ;
2020-12-31 11:53:41 +01:00
msg . content = ` Commandes disponibles<ul class="alterne-list"><li class="list-item"> ${ messageAide } </li></ul> ` ;
2020-12-29 00:11:58 +01:00
ChatMessage . create ( msg ) ;
}
/* -------------------------------------------- */
2020-12-31 11:53:41 +01:00
_buildSubTableHelp ( list , table ) {
2020-12-29 00:11:58 +01:00
for ( let [ name , command ] of Object . entries ( table ) ) {
if ( command ) {
if ( command . subTable ) {
2020-12-31 11:53:41 +01:00
this . _buildSubTableHelp ( list , command . subTable ) ;
2020-12-29 00:11:58 +01:00
} else {
2020-12-31 11:53:41 +01:00
list . push ( command . descr ) ;
2020-12-29 00:11:58 +01:00
}
}
}
2020-12-31 11:53:41 +01:00
return list . sort ( ) ;
2020-12-29 00:11:58 +01:00
}
getRencontreTMR ( params ) {
if ( params . length == 2 ) {
return TMRUtility . getRencontre ( params [ 0 ] , params [ 1 ] )
}
else {
return false ;
}
}
async rollRdd ( msg , params ) {
if ( params . length == 0 ) {
RdDRollResolution . open ( ) ;
}
else {
let flatParams = params . reduce ( ( a , b ) => ` ${ a } ${ b } ` ) ;
const numericParams = flatParams . match ( rddRollNumeric ) ;
if ( numericParams ) {
const carac = Misc . toInt ( numericParams [ 1 ] ) ;
const diff = Misc . toInt ( numericParams [ 2 ] || 0 ) ;
const significative = numericParams [ 3 ] == 's'
await this . rollRdDNumeric ( msg , carac , diff , significative ) ;
return ;
}
}
}
async rollRdDNumeric ( msg , carac , diff , significative = false ) {
let rollData = {
caracValue : carac ,
finalLevel : diff ,
showDice : true ,
needSignificative : significative ,
show : { title : "Table de résolution" , points : true }
} ;
await RdDResolutionTable . rollData ( rollData ) ;
msg . content = await RdDResolutionTable . explainRollDataV2 ( rollData ) ;
ChatUtility . chatWithRollMode ( msg , game . user . name ) ;
}
2020-12-31 11:53:41 +01:00
async rollDeDraconique ( msg ) {
let rollMode = game . settings . get ( "core" , "rollMode" ) ;
let ddr = new DeDraconique ( ) . evaluate ( ) ;
await RdDDice . show ( ddr , rollMode ) ;
msg . content = ` Lancer d'un Dé draconique: ${ ddr . total } ` ;
ChatUtility . createChatMessage ( msg , rollMode , game . user . name ) ;
}
2020-12-29 00:11:58 +01:00
}