Files
mgt2-compendium-amiral-denisov/scripts/NpcDialog.js

137 lines
4.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { formatCredits } from './tradeHelper.js';
import { createNpcActor, generateClientMission, generateEncounter, generateQuickNpc } from './npcHelper.js';
import { NPC_RELATIONS } from './data/npcTables.js';
const MODULE_ID = 'mgt2-compendium-amiral-denisov';
export class NpcDialog extends FormApplication {
constructor(options = {}) {
super({}, options);
this._formData = {
npc: {
relation: options.relation ?? 'contact',
experienceBias: 'random',
createActor: false,
actorName: '',
openCreatedActor: true,
},
encounter: {
context: options.context ?? 'starport',
includeFollowUp: true,
},
};
}
static get defaultOptions() {
return foundry.utils.mergeObject(super.defaultOptions, {
id: 'mgt2-npc',
title: 'PNJ & Rencontres MGT2',
template: `modules/${MODULE_ID}/templates/npc-dialog.hbs`,
width: 720,
height: 'auto',
resizable: true,
tabs: [{
navSelector: '.tabs',
contentSelector: '.tab-content',
initial: 'npc',
}],
classes: ['mgt2-npc-dialog'],
});
}
getData() {
registerHandlebarsHelpers();
return foundry.utils.mergeObject(super.getData(), {
...this._formData,
relations: Object.entries(NPC_RELATIONS).map(([key, value]) => ({ key, label: value.label })),
});
}
activateListeners(html) {
super.activateListeners(html);
html.find('[data-action="generate-npc"]').on('click', async (event) => {
event.preventDefault();
this._readForm(html);
await this._handleNpc();
});
html.find('[data-action="generate-encounter"]').on('click', async (event) => {
event.preventDefault();
this._readForm(html);
await this._handleEncounter();
});
html.find('[data-action="generate-mission"]').on('click', async (event) => {
event.preventDefault();
await this._handleMission();
});
if (this.options.initialTab) {
this._tabs?.[0]?.activate(this.options.initialTab);
}
}
_readForm(html) {
this._formData.npc.relation = html.find('[name="npc.relation"]').val();
this._formData.npc.experienceBias = html.find('[name="npc.experienceBias"]').val();
this._formData.npc.createActor = html.find('[name="npc.createActor"]').is(':checked');
this._formData.npc.actorName = html.find('[name="npc.actorName"]').val();
this._formData.npc.openCreatedActor = html.find('[name="npc.openCreatedActor"]').is(':checked');
this._formData.encounter.context = html.find('[name="encounter.context"]').val();
this._formData.encounter.includeFollowUp = html.find('[name="encounter.includeFollowUp"]').is(':checked');
}
async _handleNpc() {
const result = await generateQuickNpc(this._formData.npc);
if (this._formData.npc.createActor) {
const actor = await createNpcActor(result, {
name: this._formData.npc.actorName,
openSheet: this._formData.npc.openCreatedActor,
});
result.createdActor = {
id: actor.id,
name: actor.name,
};
ui.notifications.info(`Fiche PNJ créée : ${actor.name}`);
}
await this._postToChatResult(result);
}
async _handleEncounter() {
const result = await generateEncounter(this._formData.encounter);
await this._postToChatResult(result);
}
async _handleMission() {
const result = await generateClientMission();
await this._postToChatResult(result);
}
async _postToChatResult(data) {
registerHandlebarsHelpers();
const renderHbs = foundry.applications?.handlebars?.renderTemplate ?? renderTemplate;
const html = await renderHbs(`modules/${MODULE_ID}/templates/npc-result.hbs`, data);
await ChatMessage.create({
content: html,
speaker: ChatMessage.getSpeaker(),
flags: { [MODULE_ID]: { type: 'npc-result' } },
});
}
async _updateObject(_event, _formData) {}
}
let helpersRegistered = false;
function registerHandlebarsHelpers() {
if (helpersRegistered) return;
helpersRegistered = true;
Handlebars.registerHelper('eq', (a, b) => a === b);
Handlebars.registerHelper('join', (arr, sep) => (Array.isArray(arr) ? arr.join(sep) : ''));
Handlebars.registerHelper('formatCredits', (amount) => formatCredits(amount));
Handlebars.registerHelper('contains', (text, search) => String(text ?? '').includes(search));
}