migration v14: - remplace CONFIG.Dice.rollModes → CONFIG.ChatMessage.modes - canvas optionnel (?.tokens) dans ~27 fichiers - async/await migrations, waitForRoll, effet draconique - supprime _warnedAppV1, data-message-id→data-document-id - corrige sheet registration Items.registerSheet tmr: - bouton Lancer un Sort visible en mode visu - _ensureTMRButtons() en fallback JS - await d'animation avant render - corrigé doublon carteTMR.js css: - scrollbar (.item-sheet-scrollable-body) sur les 44 fiches item - normalisation multiligne de tous les less/item/*.less - style du dialogue description aléatoire (app-personnage-aleatoire) - hr-sorts et sort réserves en flex-row dialogue description: - type=button sur les boutons (évite submit form → crash) - randomControl passe this.actor au lieu de this.current - DEFINITION_HEURES : ajout propriété manquante heure d意: - supprime 6 fichiers debug (phase*.txt/png, sheets-*.txt/png) - system.json nom anglais→français - token-hud : guard token undefined - item-sort.js : guard sort?.system dans helpers Handlebars
82 lines
2.3 KiB
JavaScript
82 lines
2.3 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 getTokenData( actor, tokenId, target = undefined) {
|
|
if ( target){
|
|
return Targets.extractTokenData(target)
|
|
}
|
|
const token = canvas?.tokens?.get(tokenId);
|
|
return token == undefined
|
|
? Targets.buildActorTokenData(tokenId, actor)
|
|
: Targets.extractTokenData(token);
|
|
}
|
|
|
|
static extractTokenData(target) {
|
|
return {
|
|
id: target?.id,
|
|
name: target?.document.name,
|
|
img: target?.document.texture.src ?? target?.actor.img ?? 'icons/svg/mystery-man.svg'
|
|
}
|
|
}
|
|
|
|
|
|
static extractActorData(actor) {
|
|
return {
|
|
id: actor.id,
|
|
name: actor.prototypeToken?.name ?? actor.name,
|
|
img: actor.prototypeToken?.texture.src ?? actor.img ?? 'icons/svg/mystery-man.svg'
|
|
}
|
|
}
|
|
|
|
static buildActorTokenData(tokenId, actor) {
|
|
return { id: tokenId, name: actor?.name?? "pas d'acteur", 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, target => onSelectTarget(targets.find(it => it.id == target.id)))
|
|
}
|
|
}
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
} |