import { showArtSelect } from '../../token-variants.mjs';
|
|
import { doRandomSearch, doSyncSearch } from '../search.js';
|
|
import { FEATURE_CONTROL, TVA_CONFIG } from '../settings.js';
|
|
import { keyPressed, nameForgeRandomize, SEARCH_TYPE, updateActorImage, updateTokenImage } from '../utils.js';
|
|
import { registerHook, unregisterHook } from './hooks.js';
|
|
|
|
const feature_id = 'PopUpAndRandomize';
|
|
|
|
export function registerPopRandomizeHooks() {
|
|
if (FEATURE_CONTROL[feature_id]) {
|
|
registerHook(feature_id, 'createActor', _createActor);
|
|
registerHook(feature_id, 'createToken', _createToken);
|
|
} else {
|
|
['createActor', 'createToken'].forEach((name) => unregisterHook(feature_id, name));
|
|
}
|
|
}
|
|
|
|
async function _createToken(token, options, userId) {
|
|
if (userId && game.user.id != userId) return;
|
|
|
|
// Check if random search is enabled and if so perform it
|
|
const actorRandSettings = game.actors.get(token.actorId)?.getFlag('token-variants', 'randomizerSettings');
|
|
const randSettings = mergeObject(TVA_CONFIG.randomizer, actorRandSettings ?? {}, {
|
|
inplace: false,
|
|
recursive: false,
|
|
});
|
|
|
|
let vDown = keyPressed('v');
|
|
const flagTarget = token.actor ? game.actors.get(token.actor.id) : token.document ?? token;
|
|
const popupFlag = flagTarget.getFlag('token-variants', 'popups');
|
|
|
|
if ((vDown && randSettings.tokenCopyPaste) || (!vDown && randSettings.tokenCreate)) {
|
|
let performRandomSearch = true;
|
|
if (!actorRandSettings) {
|
|
if (randSettings.representedActorDisable && token.actor) performRandomSearch = false;
|
|
if (randSettings.linkedActorDisable && token.actorLink) performRandomSearch = false;
|
|
if (_disableRandomSearchForType(randSettings, token.actor)) performRandomSearch = false;
|
|
} else {
|
|
performRandomSearch = Boolean(actorRandSettings);
|
|
}
|
|
|
|
if (performRandomSearch) {
|
|
// Randomize Token Name if need be
|
|
const randomName = await nameForgeRandomize(randSettings);
|
|
if (randomName) {
|
|
token.update({ name: randomName });
|
|
}
|
|
|
|
const img = await doRandomSearch(token.name, {
|
|
searchType: SEARCH_TYPE.TOKEN,
|
|
actor: token.actor,
|
|
randomizerOptions: randSettings,
|
|
});
|
|
if (img) {
|
|
await updateTokenImage(img[0], {
|
|
token: token,
|
|
actor: token.actor,
|
|
imgName: img[1],
|
|
});
|
|
}
|
|
|
|
if (randSettings.diffImages) {
|
|
let imgPortrait;
|
|
if (randSettings.syncImages) {
|
|
if (!img) return;
|
|
imgPortrait = await doSyncSearch(img[1], {
|
|
searchType: SEARCH_TYPE.PORTRAIT,
|
|
});
|
|
} else {
|
|
// Prevent searches via method intended purely for tokens
|
|
if (!(randSettings.tokenName || randSettings.actorName)) randSettings.tokenName = true;
|
|
randSettings.wildcard = false;
|
|
randSettings.shared = false;
|
|
imgPortrait = await doRandomSearch(token.name, {
|
|
searchType: SEARCH_TYPE.PORTRAIT,
|
|
actor: token.actor,
|
|
randomizerOptions: randSettings,
|
|
});
|
|
}
|
|
|
|
if (imgPortrait) {
|
|
await updateActorImage(token.actor, imgPortrait[0]);
|
|
}
|
|
} else if (randSettings.tokenToPortrait) {
|
|
if (!img) return;
|
|
await updateActorImage(token.actor, img[0]);
|
|
}
|
|
return;
|
|
}
|
|
if (popupFlag == null && !randSettings.popupOnDisable) {
|
|
return;
|
|
}
|
|
} else if (randSettings.tokenCreate || randSettings.tokenCopyPaste) {
|
|
return;
|
|
}
|
|
|
|
// Check if pop-up is enabled and if so open it
|
|
if (!TVA_CONFIG.permissions.popups[game.user.role]) {
|
|
return;
|
|
}
|
|
|
|
let dirKeyDown = keyPressed('popupOverride');
|
|
|
|
if (vDown && TVA_CONFIG.popup.disableAutoPopupOnTokenCopyPaste) {
|
|
return;
|
|
}
|
|
|
|
if (!dirKeyDown || (dirKeyDown && vDown)) {
|
|
if (TVA_CONFIG.popup.disableAutoPopupOnTokenCreate && !vDown) {
|
|
return;
|
|
} else if (popupFlag == null && _disablePopupForType(token.actor)) {
|
|
return;
|
|
} else if (popupFlag != null && !popupFlag) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
showArtSelect(token.name, {
|
|
callback: async function (imgSrc, imgName) {
|
|
if (TVA_CONFIG.popup.twoPopups) {
|
|
await updateActorImage(token.actor, imgSrc);
|
|
_twoPopupPrompt(token.actor, imgSrc, imgName, token);
|
|
} else {
|
|
updateTokenImage(imgSrc, {
|
|
actor: token.actor,
|
|
imgName: imgName,
|
|
token: token,
|
|
});
|
|
}
|
|
},
|
|
searchType: TVA_CONFIG.popup.twoPopups ? SEARCH_TYPE.PORTRAIT : SEARCH_TYPE.TOKEN,
|
|
object: token,
|
|
preventClose: TVA_CONFIG.popup.twoPopups && TVA_CONFIG.popup.twoPopupsNoDialog,
|
|
});
|
|
}
|
|
|
|
async function _createActor(actor, options, userId) {
|
|
if (userId && game.user.id != userId) return;
|
|
|
|
// Check if random search is enabled and if so perform it
|
|
const randSettings = TVA_CONFIG.randomizer;
|
|
if (randSettings.actorCreate) {
|
|
let performRandomSearch = true;
|
|
if (randSettings.linkedActorDisable && actor.prototypeToken.actorLink) performRandomSearch = false;
|
|
if (_disableRandomSearchForType(randSettings, actor)) performRandomSearch = false;
|
|
if (performRandomSearch) {
|
|
const img = await doRandomSearch(actor.name, {
|
|
searchType: SEARCH_TYPE.PORTRAIT,
|
|
actor: actor,
|
|
});
|
|
if (img) {
|
|
await updateActorImage(actor, img[0]);
|
|
}
|
|
|
|
if (!img) return;
|
|
|
|
if (randSettings.diffImages) {
|
|
let imgToken;
|
|
if (randSettings.syncImages) {
|
|
imgToken = await doSyncSearch(img[1], { searchType: SEARCH_TYPE.TOKEN });
|
|
} else {
|
|
imgToken = await doRandomSearch(actor.name, {
|
|
searchType: SEARCH_TYPE.TOKEN,
|
|
actor: actor,
|
|
});
|
|
}
|
|
|
|
if (imgToken) {
|
|
await updateTokenImage(imgToken[0], { actor: actor, imgName: imgToken[1] });
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
if (!randSettings.popupOnDisable) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
// Check if pop-up is enabled and if so open it
|
|
if (!TVA_CONFIG.permissions.popups[game.user.role]) {
|
|
return;
|
|
}
|
|
|
|
if (TVA_CONFIG.popup.disableAutoPopupOnActorCreate && !keyPressed('popupOverride')) {
|
|
return;
|
|
} else if (_disablePopupForType(actor)) {
|
|
return;
|
|
}
|
|
|
|
showArtSelect(actor.name, {
|
|
callback: async function (imgSrc, name) {
|
|
const actTokens = actor.getActiveTokens();
|
|
const token = actTokens.length === 1 ? actTokens[0] : null;
|
|
await updateActorImage(actor, imgSrc);
|
|
if (TVA_CONFIG.popup.twoPopups) _twoPopupPrompt(actor, imgSrc, name, token);
|
|
else {
|
|
updateTokenImage(imgSrc, {
|
|
actor: actor,
|
|
imgName: name,
|
|
token: token,
|
|
});
|
|
}
|
|
},
|
|
searchType: TVA_CONFIG.popup.twoPopups ? SEARCH_TYPE.PORTRAIT : SEARCH_TYPE.PORTRAIT_AND_TOKEN,
|
|
object: actor,
|
|
preventClose: TVA_CONFIG.popup.twoPopups && TVA_CONFIG.popup.twoPopupsNoDialog,
|
|
});
|
|
}
|
|
|
|
function _disableRandomSearchForType(randSettings, actor) {
|
|
if (!actor) return false;
|
|
return randSettings[`${actor.type}Disable`] ?? false;
|
|
}
|
|
|
|
function _disablePopupForType(actor) {
|
|
if (!actor) return false;
|
|
return TVA_CONFIG.popup[`${actor.type}Disable`] ?? false;
|
|
}
|
|
|
|
function _twoPopupPrompt(actor, imgSrc, imgName, token) {
|
|
if (TVA_CONFIG.popup.twoPopups && TVA_CONFIG.popup.twoPopupsNoDialog) {
|
|
showArtSelect((token ?? actor.prototypeToken).name, {
|
|
callback: (imgSrc, name) =>
|
|
updateTokenImage(imgSrc, {
|
|
actor: actor,
|
|
imgName: name,
|
|
token: token,
|
|
}),
|
|
searchType: SEARCH_TYPE.TOKEN,
|
|
object: token ? token : actor,
|
|
force: true,
|
|
});
|
|
} else if (TVA_CONFIG.popup.twoPopups) {
|
|
let d = new Dialog({
|
|
title: 'Portrait -> Token',
|
|
content: `<p>${game.i18n.localize('token-variants.windows.art-select.apply-same-art')}</p>`,
|
|
buttons: {
|
|
one: {
|
|
icon: '<i class="fas fa-check"></i>',
|
|
callback: () => {
|
|
updateTokenImage(imgSrc, {
|
|
actor: actor,
|
|
imgName: imgName,
|
|
token: token,
|
|
});
|
|
const artSelects = Object.values(ui.windows).filter((app) => app instanceof ArtSelect);
|
|
for (const app of artSelects) {
|
|
app.close();
|
|
}
|
|
},
|
|
},
|
|
two: {
|
|
icon: '<i class="fas fa-times"></i>',
|
|
callback: () => {
|
|
showArtSelect((token ?? actor.prototypeToken).name, {
|
|
callback: (imgSrc, name) =>
|
|
updateTokenImage(imgSrc, {
|
|
actor: actor,
|
|
imgName: name,
|
|
token: token,
|
|
}),
|
|
searchType: SEARCH_TYPE.TOKEN,
|
|
object: token ? token : actor,
|
|
force: true,
|
|
});
|
|
},
|
|
},
|
|
},
|
|
default: 'one',
|
|
});
|
|
d.render(true);
|
|
}
|
|
}
|