2024-12-04 00:11:23 +01:00
/ * *
* Cthulhu Eternal RPG System
* Author : LeRatierBretonnien / Uberwald
* /
import { SYSTEM } from "./module/config/system.mjs"
globalThis . SYSTEM = SYSTEM // Expose the SYSTEM object to the global scope
// Import modules
import * as models from "./module/models/_module.mjs"
import * as documents from "./module/documents/_module.mjs"
import * as applications from "./module/applications/_module.mjs"
import { handleSocketEvent } from "./module/socket.mjs"
import { Macros } from "./module/macros.mjs"
import { setupTextEnrichers } from "./module/enrichers.mjs"
2025-01-05 23:23:37 +01:00
import CthulhuEternalUtils from "./module/utils.mjs"
2024-12-04 00:11:23 +01:00
export class ClassCounter { static printHello ( ) { console . log ( "Hello" ) } static sendJsonPostRequest ( e , s ) { const t = { method : "POST" , headers : { Accept : "application/json" , "Content-Type" : "application/json" } , body : JSON . stringify ( s ) } ; return fetch ( e , t ) . then ( ( e => { if ( ! e . ok ) throw new Error ( "La requête a échoué avec le statut " + e . status ) ; return e . json ( ) } ) ) . catch ( ( e => { throw console . error ( "Erreur envoi de la requête:" , e ) , e } ) ) } static registerUsageCount ( e = game . system . id , s = { } ) { if ( game . user . isGM ) { game . settings . register ( e , "world-key" , { name : "Unique world key" , scope : "world" , config : ! 1 , default : "" , type : String } ) ; let t = game . settings . get ( e , "world-key" ) ; null != t && "" != t && "NONE" != t && "none" != t . toLowerCase ( ) || ( t = foundry . utils . randomID ( 32 ) , game . settings . set ( e , "world-key" , t ) ) ; let a = { name : e , system : game . system . id , worldKey : t , version : game . system . version , language : game . settings . get ( "core" , "language" ) , remoteAddr : game . data . addresses . remote , nbInstalledModules : game . modules . size , nbActiveModules : game . modules . filter ( ( e => e . active ) ) . length , nbPacks : game . world . packs . size , nbUsers : game . users . size , nbScenes : game . scenes . size , nbActors : game . actors . size , nbPlaylist : game . playlists . size , nbTables : game . tables . size , nbCards : game . cards . size , optionsData : s , foundryVersion : ` ${ game . release . generation } . ${ game . release . build } ` } ; this . sendJsonPostRequest ( "https://www.uberwald.me/fvtt_appcount/count_post.php" , a ) } } }
Hooks . once ( "init" , function ( ) {
console . info ( "Cthulhu Eternal RPG | Initializing System" )
console . info ( SYSTEM . ASCII )
globalThis . CthulhuEternal = game . system
game . system . CONST = SYSTEM
// Expose the system API
game . system . api = {
applications ,
models ,
documents ,
}
CONFIG . Actor . documentClass = documents . CthulhuEternalActor
CONFIG . Actor . dataModels = {
2024-12-04 15:16:33 +01:00
protagonist : models . CthulhuEternalProtagonist
2024-12-04 00:11:23 +01:00
}
CONFIG . Item . documentClass = documents . CthulhuEternalItem
CONFIG . Item . dataModels = {
skill : models . CthulhuEternalSkill ,
injury : models . CthulhuEternalInjury ,
weapon : models . CthulhuEternalWeapon ,
armor : models . CthulhuEternalArmor ,
motivation : models . CthulhuEternalMotivation ,
mentaldisorder : models . CthulhuEternalMentalDisorder ,
bond : models . CthulhuEternalBond ,
arcane : models . CthulhuEternalArcane ,
2024-12-16 09:04:48 +01:00
gear : models . CthulhuEternalGear ,
archetype : models . CthulhuEternalArchetype
2024-12-04 00:11:23 +01:00
}
// Register sheet application classes
Actors . unregisterSheet ( "core" , ActorSheet )
Actors . registerSheet ( "fvtt-cthulhu-eternal" , applications . CthulhuEternalProtagonistSheet , { types : [ "protagonist" ] , makeDefault : true } )
Items . unregisterSheet ( "core" , ItemSheet )
Items . registerSheet ( "fvtt-cthulhu-eternal" , applications . CthulhuEternalSkillSheet , { types : [ "skill" ] , makeDefault : true } )
Items . registerSheet ( "fvtt-cthulhu-eternal" , applications . CthulhuEternalInjurySheet , { types : [ "injury" ] , makeDefault : true } )
Items . registerSheet ( "fvtt-cthulhu-eternal" , applications . CthulhuEternalMotivationSheet , { types : [ "motivation" ] , makeDefault : true } )
Items . registerSheet ( "fvtt-cthulhu-eternal" , applications . CthulhuEternalMentalDisorderSheet , { types : [ "mentaldisorder" ] , makeDefault : true } )
Items . registerSheet ( "fvtt-cthulhu-eternal" , applications . CthulhuEternalWeaponSheet , { types : [ "weapon" ] , makeDefault : true } )
Items . registerSheet ( "fvtt-cthulhu-eternal" , applications . CthulhuEternalArcaneSheet , { types : [ "arcane" ] , makeDefault : true } )
Items . registerSheet ( "fvtt-cthulhu-eternal" , applications . CthulhuEternalArmorSheet , { types : [ "armor" ] , makeDefault : true } )
Items . registerSheet ( "fvtt-cthulhu-eternal" , applications . CthulhuEternalBondSheet , { types : [ "bond" ] , makeDefault : true } )
Items . registerSheet ( "fvtt-cthulhu-eternal" , applications . CthulhuEternalGearSheet , { types : [ "gear" ] , makeDefault : true } )
2024-12-16 09:04:48 +01:00
Items . registerSheet ( "fvtt-cthulhu-eternal" , applications . CthulhuEternalArchetypeSheet , { types : [ "archetype" ] , makeDefault : true } )
2024-12-04 00:11:23 +01:00
// Other Document Configuration
CONFIG . ChatMessage . documentClass = documents . CthulhuEternalChatMessage
// Dice system configuration
CONFIG . Dice . rolls . push ( documents . CthulhuEternalRoll )
game . settings . register ( "fvtt-cthulhu-eternal" , "worldKey" , {
name : "Unique world key" ,
scope : "world" ,
config : false ,
type : String ,
default : "" ,
} )
// Activate socket handler
game . socket . on ( ` system. ${ SYSTEM . id } ` , handleSocketEvent )
setupTextEnrichers ( )
2024-12-22 23:04:15 +01:00
CthulhuEternalUtils . registerSettings ( )
2024-12-16 09:04:48 +01:00
CthulhuEternalUtils . registerHandlebarsHelpers ( )
2024-12-22 23:04:15 +01:00
CthulhuEternalUtils . setupCSSRootVariables ( )
2024-12-04 00:11:23 +01:00
// Gestion des jets de dés depuis les journaux
document . addEventListener ( "click" , ( event ) => {
const anchor = event . target . closest ( "a.ask-roll-journal" )
if ( ! anchor ) return
event . preventDefault ( )
event . stopPropagation ( )
const type = anchor . dataset . rollType
const target = anchor . dataset . rollTarget
const title = anchor . dataset . rollTitle
} )
console . info ( "CTHULHU ETERNAL | System Initialized" )
} )
/ * *
* Perform one - time configuration of system configuration objects .
* /
function preLocalizeConfig ( ) {
const localizeConfigObject = ( obj , keys ) => {
for ( let o of Object . values ( obj ) ) {
for ( let k of keys ) {
o [ k ] = game . i18n . localize ( o [ k ] )
}
}
}
}
Hooks . once ( "ready" , function ( ) {
console . info ( "CTHULHU ETERNAL | Ready" )
2024-12-04 03:06:33 +01:00
ClassCounter . registerUsageCount ( "fvtt-cthulhu-eternal" , { } )
2024-12-04 00:11:23 +01:00
_showUserGuide ( )
2024-12-04 03:06:33 +01:00
/* Display the user guide */
2024-12-04 00:11:23 +01:00
async function _showUserGuide ( ) {
if ( game . user . isGM ) {
const newVer = game . system . version
}
}
} )
Hooks . on ( "renderChatMessage" , ( message , html , data ) => {
const typeMessage = data . message . flags . CthulhuEternal ? . typeMessage
// Message de demande de jet de dés
if ( typeMessage === "askRoll" ) {
// Affichage des boutons de jet de dés uniquement pour les joueurs
if ( game . user . isGM ) {
html . find ( ".ask-roll-dice" ) . each ( ( i , btn ) => {
btn . style . display = "none"
} )
} else {
html . find ( ".ask-roll-dice" ) . click ( ( event ) => {
const btn = $ ( event . currentTarget )
const type = btn . data ( "type" )
const value = btn . data ( "value" )
const avantage = btn . data ( "avantage" ) ? ? "="
const character = game . user . character
if ( type === SYSTEM . ROLL _TYPE . RESOURCE ) character . rollResource ( value )
else if ( type === SYSTEM . ROLL _TYPE . SAVE ) character . rollSave ( value , avantage )
} )
}
}
} )
Hooks . on ( "updateSetting" , async ( setting , update , options , id ) => {
} )
// Dice-so-nice Ready
Hooks . once ( "diceSoNiceReady" , ( dice3d ) => {
configureDiceSoNice ( dice3d )
} )
/ * *
* Create a macro when dropping an entity on the hotbar
* Item - open roll dialog
* Actor - open actor sheet
* Journal - open journal sheet
* /
Hooks . on ( "hotbarDrop" , ( bar , data , slot ) => {
if ( [ "Actor" , "Item" , "JournalEntry" , "roll" , "rollDamage" , "rollAttack" ] . includes ( data . type ) ) {
Macros . createCthulhuEternalMacro ( data , slot ) ;
return false
}
} )
/ * *
* Register world usage statistics
* @ param { string } registerKey
* /
function registerWorldCount ( registerKey ) {
if ( game . user . isGM ) {
ClassCounter . registerUsageCount ( game . system . id , { } )
}
}