foundryvtt-reve-de-dragon/module/targets.js

62 lines
1.8 KiB
JavaScript

import { ENTITE_NONINCARNE } from "./constants.js";
import { DialogSelect } from "./dialog-select.js";
export class Targets {
static listTargets() {
return Array.from(game.user.targets);
}
static hasTargets() {
return Targets.listTargets().length > 0;
}
static extractTokenData(target) {
return {
id: target?.id,
name: target?.document.name,
img: target?.document.texture.src ?? target?.actor.img ?? 'icons/svg/mystery-man.svg',
target
};
}
static buildActorTokenData(tokenId, actor) {
return { id: tokenId, name: actor.name, img: actor.img ?? 'icons/svg/mystery-man.svg' };
}
static isTargetEntite(target) {
return target?.actor.type == 'entite' && target?.actor.system.definition.typeentite == ENTITE_NONINCARNE;
}
static async selectOneTargetToken(onSelectTarget = target => { }) {
const targets = Targets.listTargets()
switch (targets.length) {
case 0:
return
case 1:
onSelectTarget(targets[0])
return
default:
{
const selectData = {
title: "Choisir une cible",
label: "Choisir une seule des cibles",
list: targets.map(it => Targets.extractTokenData(it))
};
DialogSelect.select(selectData, t => onSelectTarget(t.target))
}
}
}
static getTarget(options = { warn: true }) {
const targets = Targets.listTargets();
switch (targets.length) {
case 1:
return targets[0];
case 0:
if (options.warn) ui.notifications.warn("Vous devez choisir une cible à attaquer!");
break;
default:
if (options.warn) ui.notifications.warn("Vous devez choisir une cible (et <strong>une seule</strong>) à attaquer!");
}
return undefined;
}
}