2023-10-20 22:25:59 +02:00
import { SWDELUXStatBlockParser } from "./sw-statblock-parser.js" ;
2021-03-15 09:22:27 +01:00
2023-04-04 07:48:22 +02:00
const _ _compFolderTranslation = [
{
2022-02-05 00:23:39 +01:00
compendium : 'swade-core-rules.swade-vehicles' ,
2023-04-04 07:48:22 +02:00
words : [
{ source : 'Vehicles' , translation : 'Véhicules' } ,
{ source : 'Aircraft' , translation : 'Avions' } ,
{ source : 'Civilian' , translation : 'Civils' } ,
{ source : 'Modern Military Aircraft' , translation : 'Avions Militaires Modernes' } ,
{ source : 'World War II Military Aircraft' , translation : 'Avions Seconde Guerre Mondiale' } ,
2022-02-05 00:23:39 +01:00
]
}
]
class FolderTranslate {
2023-04-04 07:48:22 +02:00
2022-02-05 00:23:39 +01:00
static async translateFolders ( ) {
2023-04-04 07:48:22 +02:00
for ( let tData of _ _compFolderTranslation ) {
2022-02-05 00:23:39 +01:00
let pack = game . packs . get ( tData . compendium ) ;
let wasLocked = false ;
2023-04-04 07:48:22 +02:00
if ( pack . locked ) {
await pack . configure ( { locked : false } )
2022-02-05 00:23:39 +01:00
wasLocked = true ;
}
let folders = await game . CF . FICFolderAPI . loadFolders ( tData . compendium ) ;
for ( let trans of tData . words ) {
2023-04-04 07:48:22 +02:00
let folderToChange = folders . contents . find ( f => f . name === trans . source ) ;
if ( folderToChange ) {
2022-02-05 00:23:39 +01:00
await game . CF . FICFolderAPI . renameFolder ( folderToChange , trans . translation ) ;
}
}
2023-04-04 07:48:22 +02:00
if ( wasLocked ) {
await pack . configure ( { locked : true } )
2022-02-05 00:23:39 +01:00
}
}
2023-04-04 07:48:22 +02:00
}
2022-02-05 00:23:39 +01:00
}
/************************************************************************************/
Hooks . once ( 'translateCompendiumFolders' , ( ) => {
console . log ( "LOADED !!!!!!" )
} ) ;
2022-07-05 20:45:50 +02:00
/************************************************************************************/
class swadeFrTranslator {
2023-04-04 07:48:22 +02:00
static getRank ( rank ) {
if ( rank == 'Novice' ) return 'Novice' ;
if ( rank == 'Seasoned' ) return 'Aguerri' ;
if ( rank == 'Veteran' ) return 'Vétéran' ;
if ( rank == 'Heroic' ) return 'Héroïque' ;
if ( rank == 'Legendary' ) return 'Légendaire' ;
2022-07-05 20:45:50 +02:00
return false
}
2023-04-04 07:48:22 +02:00
static getAttribute ( attr ) {
2022-07-05 20:45:50 +02:00
console . log ( "Attr is" , attr )
2023-04-04 07:48:22 +02:00
if ( attr == "Agility" ) return 'Agilité' ;
if ( attr == "Smarts" ) return 'Intellect' ;
if ( attr == "Spirit" ) return 'Ame' ;
if ( attr == "Strength" ) return 'Force' ;
if ( attr == "Vigor" ) return 'Vigueur' ;
2022-07-05 20:45:50 +02:00
return false
}
}
2021-03-15 09:22:27 +01:00
/************************************************************************************/
Hooks . once ( 'init' , ( ) => {
2021-03-28 18:33:31 +02:00
2023-10-20 22:25:59 +02:00
console . log ( "INIT !!!!!!" )
2023-04-04 07:48:22 +02:00
if ( typeof Babele !== 'undefined' ) {
2021-04-10 17:26:50 +02:00
2021-03-15 09:22:27 +01:00
console . log ( "BABELE LOADED !!!" ) ;
2023-04-04 07:48:22 +02:00
Babele . get ( ) . register ( {
module : 'swade-fr-content' ,
lang : 'fr' ,
dir : 'compendiums'
} ) ;
2021-03-28 18:33:31 +02:00
Babele . get ( ) . registerConverters ( {
2021-11-16 14:53:31 +01:00
"gear_skill" : ( skill ) => {
2022-07-05 20:45:50 +02:00
let transl = skill
2023-10-20 22:25:59 +02:00
//console.log("Testing", skill)
2021-11-16 14:53:31 +01:00
if ( skill ) {
2023-04-04 07:48:22 +02:00
let translated = game . babele . translate ( "swade-core-rules.swade-skills" , { name : skill . trim ( ) } , true )
transl = translated . name || skill . trim ( )
2022-07-05 20:45:50 +02:00
}
return transl
} ,
2023-10-20 22:25:59 +02:00
"skill_swid" : ( swid ) => {
if ( swid == "fighting" ) return "combat" ;
if ( swid == "shooting" ) return "tir" ;
return swid
} ,
2023-05-02 21:25:23 +02:00
"category_converter" : ( category ) => {
return game . i18n . localize ( category )
} ,
2022-07-05 20:45:50 +02:00
"edge_requirements" : ( req ) => {
let reqTab = req . split ( "," )
let results = [ ]
for ( let item of reqTab ) {
let keyName = item . match ( /([\w\s\(\)]+) (d[\w\+]*)/ )
//console.log("Keyword", item, keyName)
if ( keyName && keyName [ 2 ] ) { // This is a skill or attribute
let toTranslate = keyName [ 1 ] . trim ( )
2023-04-04 07:48:22 +02:00
let attr = swadeFrTranslator . getAttribute ( toTranslate )
if ( attr ) { // Test if attribute
results . push ( attr + " " + keyName [ 2 ] . trim ( ) )
2022-07-05 20:45:50 +02:00
} else { // Test if skill
2023-04-04 07:48:22 +02:00
let translated = game . babele . translate ( "swade-core-rules.swade-skills" , { name : toTranslate } , true )
if ( ! translated . name ) {
translated = game . babele . translate ( "deadlands-core-rules.deadlands-skills" , { name : toTranslate } , true )
2022-07-05 20:45:50 +02:00
}
let transResult = translated . name || toTranslate
2023-04-04 07:48:22 +02:00
results . push ( transResult + " " + keyName [ 2 ] . trim ( ) )
2022-07-05 20:45:50 +02:00
}
} else { // Rank or edge
let itemName = item . trim ( )
let rank = swadeFrTranslator . getRank ( itemName )
if ( rank ) {
2023-04-04 07:48:22 +02:00
results . push ( rank )
2022-07-05 20:45:50 +02:00
} else {
2023-04-04 07:48:22 +02:00
let translated = game . babele . translate ( "swade-core-rules.swade-edges" , { name : itemName } , true )
if ( ! translated . name ) {
translated = game . babele . translate ( "deadlands-core-rules.deadlands-edges" , { name : itemName } , true )
2022-07-05 20:45:50 +02:00
}
let transResult = translated . name || itemName
2023-04-04 07:48:22 +02:00
results . push ( transResult )
2022-07-05 20:45:50 +02:00
}
2023-04-04 07:48:22 +02:00
}
2021-11-16 14:53:31 +01:00
}
2023-05-02 21:25:23 +02:00
//console.log(">>>>>>>>>>>>>>>>>>>>>>>>><REQ !!!!", req, results)
2022-07-05 20:45:50 +02:00
return results . join ( ", " )
2021-11-16 14:53:31 +01:00
} ,
"gear_range" : ( range ) => {
if ( range ) {
2023-04-04 07:48:22 +02:00
if ( range == 'Cone Template' ) return 'Gabarit de cone' ;
2021-11-16 14:53:31 +01:00
}
return range ;
} ,
"gear_ammo" : ( ammo ) => {
if ( ammo ) {
2023-04-04 07:48:22 +02:00
if ( ammo == 'Arrows/Bolts' ) return 'Flèches/Carreaux' ;
if ( ammo == 'Canister Shot (Cannon)' ) return 'Cartouches (Canon)' ;
if ( ammo == 'Shrapnel Shot (Cannon)' ) return 'Shrapnel (Canon)' ;
if ( ammo == 'Solid Shot (Cannon)' ) return 'Solide (Canon)' ;
if ( ammo == 'Bullets, Medium' ) return 'Balles, Moyenne' ;
if ( ammo == 'Shotgun Shells' ) return 'Cartouche de Shotgun' ;
if ( ammo == 'Laser Battery, Pistol' ) return 'Batterie pour laser, Pistolet' ;
if ( ammo == 'Laser Battery, Rifle / SMG' ) return 'Batterie pour laser, Fusil' ;
2021-11-16 14:53:31 +01:00
}
return ammo ;
2023-04-04 07:48:22 +02:00
} ,
2021-03-28 18:33:31 +02:00
"powers_duration" : ( duration ) => {
2023-04-04 07:48:22 +02:00
if ( duration == 'One hour' ) return '1 heure' ;
if ( duration == 'Instant (slot); 5 (speed)' ) return 'Instantanée (apathie), 5 (vitesse)' ;
if ( duration == '(boost); Instant (lower)' ) return '5 (augmentation), Instantanée (diminution)' ;
if ( duration == 'Instant' ) return 'Instantannée' ;
if ( duration == 'Until the end of the victim\'s next turn' ) return 'Jusqu’ à la fin du prochain tour de la victime' ;
if ( duration == 'A brief conversation of about five minutes' ) return 'Une brève conversation d\'environ 5 minutes' ;
if ( duration == '5 (detect), one hour (conceal)' ) return '5 (détection), 1 heure (dissimulation)' ;
if ( duration == 'Instant (Sound); 5 (Silence)' ) return 'Instantanée (son), 5 (silence)' ;
2021-03-28 18:33:31 +02:00
return duration ;
} ,
"powers_range" : ( range ) => {
2023-04-04 07:48:22 +02:00
if ( range == 'Smarts x5 (Sound); Smarts (Silence)' )
2021-04-10 17:26:50 +02:00
return 'Intellect × 5 (son), Intellect (silence)' ;
2023-04-04 07:48:22 +02:00
if ( range == "Cone Template" )
2021-04-10 17:26:50 +02:00
return "Gabarit de cône"
2023-04-04 07:48:22 +02:00
if ( range == "Touch" )
2021-03-28 18:33:31 +02:00
return "Toucher"
2023-04-04 07:48:22 +02:00
if ( range == "Sm" )
2021-04-10 17:26:50 +02:00
return "Intellect"
2023-04-04 07:48:22 +02:00
if ( range == "Sm x 2" || range == "Sm x2" )
2021-04-10 17:26:50 +02:00
return "Intellect x2"
2023-04-04 07:48:22 +02:00
if ( range == "Self" )
2021-04-10 17:26:50 +02:00
return "Personnel"
2021-03-28 18:33:31 +02:00
return range ;
} ,
"powers_rank" : ( rank ) => {
2023-04-04 07:48:22 +02:00
return swadeFrTranslator . getRank ( rank )
2021-04-10 17:26:50 +02:00
}
2023-04-04 07:48:22 +02:00
} ) ;
2021-03-15 09:22:27 +01:00
}
2021-03-26 12:04:57 +01:00
} ) ;
2023-04-04 07:48:22 +02:00
/* -------------------------------------------- */
export class SwadeFRContentCommands {
static init ( ) {
2023-10-20 22:25:59 +02:00
2023-04-04 07:48:22 +02:00
if ( ! game . swadeFRContent ) {
const swadeFRCommands = new SwadeFRContentCommands ( )
swadeFRCommands . registerCommand ( { path : [ "/montremonsecret" ] , func : ( content , msg , params ) => SwadeFRContentCommands . enableSecret ( ) , descr : "Affiche les compendiums secrets" } ) ;
swadeFRCommands . registerCommand ( { path : [ "/cachemonsecret" ] , func : ( content , msg , params ) => SwadeFRContentCommands . disableSecret ( ) , descr : "Cache les compendiums secrets" } ) ;
2023-10-20 22:25:59 +02:00
swadeFRCommands . registerCommand ( { path : [ "/statparser" ] , func : ( content , msg , params ) => SwadeFRContentCommands . statParser ( ) , descr : "Parse SW Delux stat block" } ) ;
2023-04-04 07:48:22 +02:00
game . swadeFRContent = { commands : swadeFRCommands }
}
Hooks . on ( "chatMessage" , ( html , content , msg ) => {
2023-10-20 22:25:59 +02:00
console . log ( "CHAT PARSER!!!" )
2023-04-04 07:48:22 +02:00
if ( content [ 0 ] == '/' ) {
let regExp = /(\S+)/g ;
let commands = content . match ( regExp ) ;
if ( game . swadeFRContent . commands . processChatCommand ( commands , content , msg ) ) {
return false ;
}
}
return true
} )
}
constructor ( ) {
this . commandsTable = { }
}
/* -------------------------------------------- */
registerCommand ( command ) {
this . _addCommand ( this . commandsTable , command . path , '' , command ) ;
}
/* -------------------------------------------- */
_addCommand ( targetTable , path , fullPath , command ) {
if ( ! this . _validateCommand ( targetTable , path , command ) ) {
return ;
}
const term = path [ 0 ] ;
fullPath = fullPath + term + ' '
if ( path . length == 1 ) {
command . descr = ` <strong> ${ fullPath } </strong>: ${ command . descr } ` ;
targetTable [ term ] = command ;
}
else {
if ( ! targetTable [ term ] ) {
targetTable [ term ] = { subTable : { } } ;
}
this . _addCommand ( targetTable [ term ] . subTable , path . slice ( 1 ) , fullPath , command )
}
}
/* -------------------------------------------- */
_validateCommand ( targetTable , path , command ) {
if ( path . length > 0 && path [ 0 ] && command . descr && ( path . length != 1 || targetTable [ path [ 0 ] ] == undefined ) ) {
return true ;
}
console . warn ( "Commande invalide" , 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 ] . toLowerCase ( ) ;
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 ) ;
}
/* -------------------------------------------- */
static enableSecret ( ) {
game . settings . set ( "world" , "swade-fr-content-hidden-compendiums" , true )
}
/* -------------------------------------------- */
static disableSecret ( ) {
game . settings . set ( "world" , "swade-fr-content-hidden-compendiums" , false )
}
2023-10-20 22:25:59 +02:00
/* -------------------------------------------- */
static statParser ( ) {
let dialogue = new Dialog ( {
title : ` Import ` ,
content : ` <p>Stab block: <textarea id="swdelux-stat-parser" rows="20" cols="40"></textarea></p> ` ,
buttons : {
one : {
icon : '' ,
label : 'Parser !' ,
callback : ( html ) => {
let text = html . find ( '#swdelux-stat-parser' ) . val ( ) ;
let parser = new SWDELUXStatBlockParser ( text ) ;
parser . parse ( text ) ;
}
}
}
} )
dialogue . render ( true )
}
2023-04-04 07:48:22 +02:00
/* -------------------------------------------- */
_processCommand ( commandsTable , name , params , content = '' , msg = { } , path = "" ) {
console . log ( "===> Processing command" )
let command = commandsTable [ name ] ;
path = path + name + " " ;
2023-10-20 22:25:59 +02:00
if ( command ? . subTable ) {
2023-04-04 07:48:22 +02:00
if ( params [ 0 ] ) {
return this . _processCommand ( command . subTable , params [ 0 ] , params . slice ( 1 ) , content , msg , path )
}
else {
this . help ( msg , command . subTable ) ;
return true ;
}
}
2023-10-20 22:25:59 +02:00
if ( command ? . func ) {
2023-04-04 07:48:22 +02:00
const result = command . func ( content , msg , params ) ;
if ( result == false ) {
BoLCommands . _chatAnswer ( msg , command . descr ) ;
}
return true ;
}
return false ;
}
}
2021-03-26 12:04:57 +01:00
/************************************************************************************/
2023-04-04 07:48:22 +02:00
const transFolder = { "Actor" : "Acteur" , "Edges" : "Atouts" }
const subFolder = {
'Social Edges' : 'Atouts sociaux' , 'Background Edges' : 'Atouts de Background' , 'Combat Edges' : 'Atouts de combat' ,
'Leadership Edges' : 'Atouts de commandement' , 'Legendary Edges' : 'Atouts légendaires' , 'Power Edges' : 'Atouts de pouvoir' ,
'Professional Edges' : 'Atouts professionnels' , 'Weird Edges' : 'Atouts étranges' , 'Edges' : 'Atouts' , 'Hindrances' : 'Handicaps' , 'Skills' : 'Compétences' ,
'Equipment' : 'Equipement' , 'Ammo' : 'Munitions' , 'Armor' : 'Armure' , 'Common Gear' : 'Matériel commun' , 'Modern Firearms' : 'Armes à feu modernes' ,
'Personal Weapons' : 'Armes' , 'Special Weapons' : 'Armes spéciales' , 'Bullet' : 'Balles' , 'Cannon' : 'Canon' , 'Laser Battery' : 'Batterie Laser' ,
'Adventuring Gear' : 'Matériel d\'aventure' , 'Animals and Tack' : 'Animaux' , 'Clothing' : 'Vêtements' , 'Computers & Electronics' : 'Ordinateurs et Electroniques' ,
'Firearms Accessories' : 'Accessoires armes à feu' , 'Food' : 'Nourriture' , 'Personal Defense' : 'Auto-défense' , 'Futuristic' : 'Futuriste' ,
'Medieval & Ancient' : 'Médiévale et Antiquité' , 'Modern' : 'Moderne' , 'Shields' : 'Boucliers' , 'Laser (Futuristic)' : 'Laser (Fururiste)' ,
'Machine Guns' : 'Mitraillettes' , 'Pistols' : 'Pistolets' , 'Rifles' : 'Fusils' , 'Submachine Guns' : 'Semi-automatiques' , 'Cannons' : 'Canons' ,
'Catapults' : 'Catapultes' , 'Flamethrowers' : 'Lance-flammes' , 'Rocket Launchers & Torpedoes' : 'Lance roquettes et torpilles' ,
'Vehicular Weapons' : 'Armes de véhicules'
}
2021-03-28 18:58:41 +02:00
2023-04-04 07:48:22 +02:00
/************************************************************************************/
2022-02-06 19:07:10 +01:00
// Register world usage statistics
2023-04-04 07:48:22 +02:00
function registerUsageCount ( registerKey ) {
if ( game . user . isGM ) {
2022-02-06 19:07:10 +01:00
game . settings . register ( registerKey , "world-key" , {
name : "Unique world key" ,
scope : "world" ,
config : false ,
2022-07-05 20:45:50 +02:00
default : "" ,
2022-02-06 19:07:10 +01:00
type : String
} ) ;
let worldKey = game . settings . get ( registerKey , "world-key" )
2023-04-04 07:48:22 +02:00
if ( worldKey == undefined || worldKey == "" ) {
2022-02-06 19:07:10 +01:00
worldKey = randomID ( 32 )
2023-04-04 07:48:22 +02:00
game . settings . set ( registerKey , "world-key" , worldKey )
2022-02-06 19:07:10 +01:00
}
// Simple API counter
2022-10-09 21:54:52 +02:00
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 } " `
2022-02-19 09:30:35 +01:00
$ . ajax ( regURL )
2022-02-06 19:07:10 +01:00
/* -------------------------------------------- */
}
}
2023-04-04 07:48:22 +02:00
/************************************************************************************/
async function loadSecretCompendiums ( ) {
if ( game . settings . get ( "world" , "swade-fr-content-hidden-compendiums" ) ) {
console . log ( ">>>>> Load hidden compendiums!" )
/* Load rules */
let urls = [ "modules/swade-fr-content/compendiums/swade-core-rules.swade-rules-secret.json" ]
const [ translations ] = await Promise . all (
[ Promise . all ( urls . map ( ( url ) => fetch ( url ) . then ( ( r ) => r . json ( ) ) . catch ( e => { } ) ) ) ] ) ;
let metadata = game . data . packs . find ( p => p . name == "swade-rules" )
if ( metadata ) {
let translation ;
translations . forEach ( t => {
if ( t ) {
translation = t ; // the last valid
}
} ) ;
if ( translation ) {
let babele = Babele . get ( )
let entry = mergeObject ( translation , { collection : metadata . id } )
babele . translations . push ( entry )
console . log ( ">>>>" , babele . translations )
babele . packs . set ( metadata . id , new TranslatedCompendium ( metadata , entry ) )
}
}
}
}
2021-03-26 12:04:57 +01:00
/************************************************************************************/
Hooks . once ( 'ready' , ( ) => {
2023-10-20 22:25:59 +02:00
console . log ( ">>>>>>>>>>" )
2022-02-05 00:23:39 +01:00
2023-04-04 07:48:22 +02:00
// add hidden register
game . settings . register ( "world" , "swade-fr-content-hidden-compendiums" , {
name : "Montrer les compendiums cachés" ,
scope : "world" ,
config : false ,
default : false ,
type : Boolean ,
onChange : lang => window . location . reload ( )
} )
2023-10-20 22:25:59 +02:00
2023-04-04 07:48:22 +02:00
SwadeFRContentCommands . init ( )
2022-02-06 17:48:39 +01:00
//FolderTranslate.translateFolders()
2022-04-29 15:30:12 +02:00
registerUsageCount ( "swade-fr-content" )
2021-03-26 12:04:57 +01:00
2021-03-17 18:10:14 +01:00
} ) ;
2022-02-06 19:07:10 +01:00
2023-04-04 07:48:22 +02:00
/************************************************************************************/
Hooks . once ( 'babele.ready' , ( ) => {
2023-10-20 22:25:59 +02:00
console . log ( ">>>>>>>>>> BABELE READY" )
2023-04-04 07:48:22 +02:00
loadSecretCompendiums ( )
} ) ;
2023-10-20 22:25:59 +02:00
console . log ( ">>>>>>>>>>>> LOADED" )