foundryvtt-reve-de-dragon/module/tmr/draconique.js

163 lines
4.9 KiB
JavaScript
Raw Permalink Normal View History

import { ITEM_TYPES } from "../item.js";
import { TMRUtility } from "../tmr-utility.js";
import { PixiTMR } from "./pixi-tmr.js";
const registeredEffects = [
]
/**
* Définition des informations d'une "draconique" (queue, ombre, tête, souffle) qui influence les TMR
*/
export class Draconique {
2023-11-15 22:14:00 +01:00
static init() {
}
static isCaseTMR(item) { return item.type == ITEM_TYPES.casetmr; }
static isQueueDragon(item) { return item.isQueueDragon(); }
static isSouffleDragon(item) { return item.type == ITEM_TYPES.souffle; }
static isTeteDragon(item) { return item.type == ITEM_TYPES.tete; }
static isQueueSouffle(item) { return Draconique.isQueueDragon(item) || Draconique.isSouffleDragon(item); }
static register(draconique, code = undefined) {
registeredEffects[code ?? draconique.code()] = draconique;
if (draconique.img()) {
PixiTMR.register(draconique.code(), draconique.img())
}
return draconique;
}
static all() {
return Object.values(registeredEffects);
}
static get(code) {
return registeredEffects[code];
}
2023-11-15 22:14:00 +01:00
tmrLabel(linkData) { return TMRUtility.getTMRLabel(linkData.system.coord); }
/**
* @param item un Item quelconque
* @returns true si l'item correspond
*/
match(item) {
return Draconique.isQueueDragon(item) || Draconique.isSouffleDragon(item) || Draconique.isTeteDragon(item);
}
/**
* @returns un message à afficher si la draconique doit être gérée manuellement.
*/
manualMessage() {
return false;
}
/**
* Méthode responsable de gérer une draconique (par exemple, ajouter des casetmr pour la fermeture des cités).
* @param actor auquel la draconique est ajoutée
*/
async onActorCreateOwned(actor, item) {
return false;
}
async onActorDeleteOwned(actor, item) {
this.deleteCasesTmr(actor, item);
return false;
}
async onActorDeleteCaseTmr(actor, casetmr) {
return false;
}
/**
* @return le code interne utilisé pour les casetmr correpondant
*/
code() { return undefined }
/**
* @param {*} linkData données associées au token pixi (une casetmr, un sort en réserve, une rencontre en attente)
* @returns un tooltip à afficher au dessus du token
*/
tooltip(linkData) { return undefined }
/**
* @param {*} img l'url du fichier image à utiliser pour le token. Si indéfini (et si createSprite n'est pas surchargé),
* un disque est utilisé.
2023-10-20 22:18:37 +02:00
*/
img() { return undefined }
/**
2023-10-20 22:18:37 +02:00
* factory d'élément graphique PIXI correspondant à l'objet draconique
* @param {*} pixiTMR instance de PixiTMR qui gère les tooltips, les méthodes de création de sprite standard, les clicks.
2023-10-20 22:18:37 +02:00
*/
token(pixiTMR, linkData, coordTMR, type = undefined) {
2023-11-10 03:39:35 +01:00
const tooltip = this.tooltip(linkData);
return this._createToken(pixiTMR, linkData, coordTMR, type, tooltip);
}
tokens(pixiTMR, linkData, coordTMR, type = undefined) {
const tooltip = this.tooltip(linkData);
return [this._createToken(pixiTMR, linkData, coordTMR, type, tooltip)];
}
_createToken(pixiTMR, linkData, coordTMR, type, tooltip) {
const token = {
sprite: this.createSprite(pixiTMR),
2023-11-10 03:39:35 +01:00
coordTMR: coordTMR,
tooltip: tooltip
};
token[type ?? this.code()] = linkData;
return token;
}
/**
* factory d'élément graphique PIXI correpsondant à l'objet draconique
* @param {*} pixiTMR instance de PixiTMR qui gère les tooltips, les méthodes de création de sprite standard, les clicks.
*/
createSprite(pixiTMR) {
if (this.img()) {
2023-11-15 22:14:00 +01:00
return pixiTMR.sprite(this.code())
}
else {
return pixiTMR.circle()
}
}
/**
*
* @param {*} item un item à tester
* @param {*} coord les coordonnées d'une case. Si undefined toute case du type correspondra,
*/
isCase(item, coord = undefined) {
2022-06-12 12:14:55 +02:00
return Draconique.isCaseTMR(item) && item.system.specific == this.code() && (coord ? item.system.coord == coord : true);
}
2023-10-20 22:18:37 +02:00
find(list, coord = undefined) {
2022-06-12 12:14:55 +02:00
return list.find(c => this.isCase(c, coord));
}
2023-10-20 22:18:37 +02:00
async createCaseTmr(actor, label, tmr, sourceId = undefined) {
const casetmrData = {
2023-11-15 22:14:00 +01:00
name: label,
type: 'casetmr',
img: this.img(),
2022-06-12 12:14:55 +02:00
system: { coord: tmr.coord, specific: this.code(), sourceid: sourceId }
};
await actor.createEmbeddedDocuments('Item', [casetmrData]);
}
2023-10-20 22:18:37 +02:00
async deleteCasesTmr(actor, draconique) {
2022-06-12 12:14:55 +02:00
let caseTmrs = actor.items.filter(it => this.isCaseForSource(it, draconique));
await actor.deleteEmbeddedDocuments('Item', caseTmrs.map(it => it.id));
}
2023-10-20 22:18:37 +02:00
isCaseForSource(item, draconique) {
2022-06-12 12:14:55 +02:00
return Draconique.isCaseTMR(item) && item.system.specific == this.code() && item.system.sourceid == draconique.id;
}
async onVisiteSupprimer(actor, tmr, onRemoveToken) {
2022-06-12 12:14:55 +02:00
let existants = actor.items.filter(it => this.isCase(it, tmr.coord));
await actor.deleteEmbeddedDocuments('Item', existants.map(it => it.id));
for (let casetmr of existants) {
onRemoveToken(tmr, casetmr);
}
}
}