Ajout de la commande /gennpc pour générer des PNJ Traveller

Implémentation complète du générateur de PNJ Traveller basé sur :
https://github.com/carloscasalar/traveller-npc-generator

Fonctionnalités :
- Génération de caractéristiques selon 4 catégories de citoyens
- Distribution des compétences selon 6 niveaux d'expérience
- 14 rôles différents avec priorités de caractéristiques spécifiques
- Génération de noms aléatoires (masculin/féminin/neutre)
- Création de fiche d'acteur mgt2e avec toutes les compétences
- Interface utilisateur avec dialogue Handlebars
- Commande /gennpc dans le chat

Fichiers ajoutés :
- scripts/data/travellerNpcGenerator.js (données et constantes)
- scripts/travellerNpcGenerator.js (logique métier)
- scripts/TravellerNpcDialog.js (interface utilisateur)
- templates/traveller-npc-dialog.hbs (template dialogue)
- templates/traveller-npc-result.hbs (template résultat)
- styles/traveller-npc.css (styles spécifiques)

Fichiers modifiés :
- scripts/npc.js (intégration de la commande)
- module.json (ajout des nouveaux scripts et styles)

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
This commit is contained in:
2026-05-27 23:09:43 +02:00
parent c3cf8f176d
commit 4f53d903eb
8 changed files with 2239 additions and 5 deletions
+41 -2
View File
@@ -1,4 +1,5 @@
import { NpcDialog } from './NpcDialog.js';
import { TravellerNpcDialog, openTravellerNpcDialog } from './TravellerNpcDialog.js';
import { syncNpcRollTables } from './npcRollTableSync.js';
import './mgt2eMigration.js';
@@ -9,6 +10,10 @@ function openNpcDialog(initialTab, options = {}) {
new NpcDialog({ initialTab, ...options }).render({ force: true });
}
function openTravellerNpcGenerator() {
openTravellerNpcDialog();
}
function registerNpcCommand(commandName, initialTab) {
if (!ChatLogV2?.CHAT_COMMANDS) {
console.warn(`${MODULE_ID} | ChatLog.CHAT_COMMANDS indisponible, commande /${commandName} non enregistrée`);
@@ -25,6 +30,22 @@ function registerNpcCommand(commandName, initialTab) {
console.log(`${MODULE_ID} | Commande /${commandName} enregistrée via ChatLog.CHAT_COMMANDS`);
}
function registerTravellerNpcCommand() {
if (!ChatLogV2?.CHAT_COMMANDS) {
console.warn(`${MODULE_ID} | ChatLog.CHAT_COMMANDS indisponible, commande /gennpc non enregistrée`);
return;
}
ChatLogV2.CHAT_COMMANDS.gennpc = {
rgx: new RegExp(`^\\/gennpc(?:\\s+(.*))?$`, 'i'),
fn: () => {
openTravellerNpcGenerator();
return false;
},
};
console.log(`${MODULE_ID} | Commande /gennpc enregistrée via ChatLog.CHAT_COMMANDS`);
}
Hooks.once('init', () => {
console.log(`${MODULE_ID} | Outils PNJ initialisés`);
@@ -35,17 +56,20 @@ Hooks.once('init', () => {
loadTemplatesFn([
`modules/${MODULE_ID}/templates/npc-dialog.hbs`,
`modules/${MODULE_ID}/templates/npc-result.hbs`,
`modules/${MODULE_ID}/templates/traveller-npc-dialog.hbs`,
`modules/${MODULE_ID}/templates/traveller-npc-result.hbs`,
]);
}
registerNpcCommand('pnj', 'npc');
registerNpcCommand('rencontre', 'encounter');
registerNpcCommand('mission', 'mission');
registerTravellerNpcCommand();
});
Hooks.once('ready', async () => {
await syncNpcRollTables();
console.log(`${MODULE_ID} | Outils PNJ prêts tapez /pnj, /rencontre ou /mission dans le chat`);
console.log(`${MODULE_ID} | Outils PNJ prêts tapez /pnj, /rencontre, /mission ou /gennpc dans le chat`);
});
/**
@@ -91,13 +115,18 @@ Hooks.on('renderChatInput', (app, html, data) => {
event.stopImmediatePropagation();
openNpcDialog('mission');
input.val('');
} else if (content?.startsWith('/gennpc')) {
event.preventDefault();
event.stopImmediatePropagation();
openTravellerNpcGenerator();
input.val('');
}
}
});
});
/**
* Intercepte les messages de chat pour /pnj, /rencontre, /mission
* Intercepte les messages de chat pour /pnj, /rencontre, /mission, /gennpc
* Utilise preCreateChatMessage pour Foundry v14+ (avant que le message ne soit validé)
* Compatible avec Foundry v13 et v14
*/
@@ -118,6 +147,11 @@ Hooks.on('preCreateChatMessage', (message, data, options) => {
openNpcDialog('mission');
return false; // Empêche la création du message
}
if (content === '/gennpc' || content?.startsWith('/gennpc ')) {
openTravellerNpcGenerator();
return false; // Empêche la création du message
}
});
// Gardé pour compatibilité v13
@@ -152,4 +186,9 @@ Hooks.on('chatMessage', (...args) => {
openNpcDialog('mission');
return false;
}
if (trimmed === '/gennpc' || trimmed?.startsWith('/gennpc ')) {
openTravellerNpcGenerator();
return false;
}
});