2022-12-28 23:36:48 +01:00
import { SYSTEM _SOCKET _ID } from "../constants.js" ;
import { Monnaie } from "../item-monnaie.js" ;
import { Misc } from "../misc.js" ;
2022-12-29 02:25:45 +01:00
import { RdDUtility } from "../rdd-utility.js" ;
2022-12-28 23:36:48 +01:00
import { SystemCompendiums } from "../settings/system-compendiums.js" ;
export class RdDBaseActor extends Actor {
static getDefaultImg ( itemType ) {
return game . system . rdd . actorClasses [ itemType ] ? . defaultIcon ? ? defaultItemImg [ itemType ] ;
}
/* -------------------------------------------- */
static init ( ) {
Hooks . on ( "preUpdateItem" , ( item , change , options , id ) => RdDBaseActor . getParentActor ( item ) ? . onPreUpdateItem ( item , change , options , id ) ) ;
Hooks . on ( "createItem" , ( item , options , id ) => RdDBaseActor . getParentActor ( item ) ? . onCreateItem ( item , options , id ) ) ;
Hooks . on ( "deleteItem" , ( item , options , id ) => RdDBaseActor . getParentActor ( item ) ? . onDeleteItem ( item , options , id ) ) ;
Hooks . on ( "updateActor" , ( actor , change , options , actorId ) => actor . onUpdateActor ( change , options , actorId ) ) ;
}
static onSocketMessage ( sockmsg ) {
switch ( sockmsg . msg ) {
case "msg_remote_actor_call" :
return RdDBaseActor . onRemoteActorCall ( sockmsg . data , sockmsg . userId ) ;
case "msg_reset_nombre_astral" :
console . log ( "RESET ASTRAL" , game . user . character ) ;
game . user . character . resetNombreAstral ( ) ;
return ;
}
}
static remoteActorCall ( callData , userId = undefined ) {
userId = userId ? ? Misc . firstConnectedGMId ( ) ;
if ( userId == game . user . id ) {
RdDBaseActor . onRemoteActorCall ( callData , userId ) ;
return false ;
}
else {
game . socket . emit ( SYSTEM _SOCKET _ID , { msg : "msg_remote_actor_call" , data : callData , userId : userId } ) ;
return true ;
}
}
static onRemoteActorCall ( callData , userId ) {
if ( userId == game . user . id ) {
const actor = game . actors . get ( callData ? . actorId ) ;
if ( Misc . isOwnerPlayerOrUniqueConnectedGM ( actor ) ) { // Seul le joueur choisi effectue l'appel: le joueur courant si propriétaire de l'actor, ou le MJ sinon
const args = callData . args ;
console . info ( ` RdDBaseActor.onRemoteActorCall: pour l'Actor ${ callData . actorId } , appel de RdDBaseActor. ${ callData . method } ( ` , ... args , ')' ) ;
actor [ callData . method ] ( ... args ) ;
}
}
}
static getParentActor ( document ) {
return document ? . parent instanceof Actor ? document . parent : undefined
}
/ * *
* Cet methode surcharge Actor . create ( ) pour ajouter si besoin des Items par défaut :
* compétences et monnaies .
*
* @ param { Object } actorData template d ' acteur auquel ajouter des informations .
* @ param { Object } options optionspour customiser la création
* /
static async create ( actorData , options ) {
// import depuis un compendium
if ( actorData instanceof Array ) {
return super . create ( actorData , options ) ;
}
// Création d'un acteur avec des items (uniquement en cas de duplication): pas besoin d'ajouter d'items
if ( actorData . items ) {
return await super . create ( actorData , options ) ;
}
if ( actorData . type == "personnage" ) {
const competences = await SystemCompendiums . getCompetences ( actorData . type ) ;
actorData . items = competences . map ( i => i . toObject ( ) )
. concat ( Monnaie . monnaiesStandard ( ) ) ;
}
else {
actorData . items = [ ] ;
}
return super . create ( actorData , options ) ;
}
constructor ( docData , context = { } ) {
if ( ! context . rdd ? . ready ) {
mergeObject ( context , { rdd : { ready : true } } ) ;
const ActorConstructor = game . system . rdd . actorClasses [ docData . type ] ;
if ( ActorConstructor ) {
if ( ! docData . img ) {
docData . img = ActorConstructor . defaultIcon ;
}
return new ActorConstructor ( docData , context ) ;
}
}
super ( docData , context ) ;
}
isCreatureEntite ( ) { return this . type == 'creature' || this . type == 'entite' ; }
isCreature ( ) { return this . type == 'creature' ; }
isEntite ( ) { return this . type == 'entite' ; }
isPersonnage ( ) { return this . type == 'personnage' ; }
isVehicule ( ) { return this . type == 'vehicule' ; }
getItem ( id , type = undefined ) {
const item = this . items . get ( id ) ;
if ( type == undefined || ( item ? . type == type ) ) {
return item ;
}
return undefined ;
}
listItems ( type = undefined ) { return ( type ? this . itemTypes [ type ] : this . items ) ; }
filterItems ( filter , type = undefined ) { return this . listItems ( type ) ? . filter ( filter ) ? ? [ ] ; }
findItemLike ( idOrName , type ) {
return this . getItem ( idOrName , type )
? ? Misc . findFirstLike ( idOrName , this . listItems ( type ) , { description : Misc . typeName ( 'Item' , type ) } ) ;
}
recompute ( ) { }
/* -------------------------------------------- */
async onPreUpdateItem ( item , change , options , id ) { }
async onCreateItem ( item , options , id ) { }
async onDeleteItem ( item , options , id ) { }
async onUpdateActor ( update , options , actorId ) { }
getFortune ( ) {
return Monnaie . getFortune ( this . itemTypes [ 'monnaie' ] ) ;
}
async createItem ( type , name = undefined ) {
if ( ! name ) {
name = 'Nouveau ' + Misc . typeName ( 'Item' , type ) ;
}
await this . createEmbeddedDocuments ( 'Item' , [ { name : name , type : type } ] , { renderSheet : true } ) ;
}
canReceive ( item ) {
return false ;
}
2022-12-29 02:25:45 +01:00
/* -------------------------------------------- */
async postActorToChat ( modeOverride ) {
let chatData = {
doctype : 'Actor' ,
id : this . id ,
type : this . type ,
img : this . img ,
pack : this . pack ,
name : this . name ,
system : { description : this . system . description }
}
renderTemplate ( 'systems/foundryvtt-reve-de-dragon/templates/post-actor.html' , chatData )
. then ( html => ChatMessage . create ( RdDUtility . chatDataSetup ( html , modeOverride ) ) ) ;
}
2022-12-28 23:36:48 +01:00
}