Éditeur de quêtes : titre/objectif/récompense/statut/résultat + dialogue à 3 colonnes
Build and deploy / test-python (push) Successful in 6m14s
Build and deploy / test-js (push) Successful in 51s
Build and deploy / build-and-push (push) Skipped
Build and deploy / deploy (push) Skipped

Nouvel espace "🗺️ Quêtes" (game-wide, comme les événements
personnalisés) : liste de cartes + "+ Nouvelle quête", chaque carte
ouvrant une modale d'arbre de dialogue en bulles de théâtre
("speaker: texte"), une colonne par statut de quête (nouvelle/en
cours/terminée) puisque le dialogue joué dépend de l'état de la
quête au moment où le joueur parle au PNJ. Bulles alternées
joueur/PNJ, couleur différente selon qui parle.

L'action "Déclencher une quête" de l'éditeur de collision n'est plus
un champ texte libre : elle ouvre directement CETTE MÊME modale
(picker de quêtes existantes + création à la volée), et finalise la
règle avec l'id numérique de la quête choisie — collision_rules.py
migré en conséquence (quete_id devient un entier, comme evenement_id).

Corrige aussi la miniature d'objet de la carte "🧩 Collision", 3× plus
grande (120px) comme demandé.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
william
2026-09-02 20:24:57 +02:00
co-authored by Claude Sonnet 5
parent 4391b36d45
commit 51427b5297
28 changed files with 881 additions and 29 deletions
+11 -16
View File
@@ -29,7 +29,10 @@ function collisionRuleTriggerSummary(rule) {
}
function collisionRuleActionSummary(action) {
if (action.type === 'quete') return COLLISION_ACTION_LABELS.quete + ' « ' + action.quete_id + ' »';
if (action.type === 'quete') {
var quest = (typeof questById === 'function') ? questById(action.quete_id) : null;
return COLLISION_ACTION_LABELS.quete + ' « ' + (quest ? quest.title : '#' + action.quete_id) + ' »';
}
if (action.type === 'evenement') {
var ev = CUSTOM_EVENTS_MAP[action.evenement_id];
return COLLISION_ACTION_LABELS.evenement + ' « ' + (ev ? ev.name : '?') + ' »';
@@ -227,20 +230,19 @@ function collisionWizardSaveRule(action) {
}
// Chaque type d'action demande éventuellement une précision avant de
// pouvoir se finaliser (quête -> son id ; événement -> lequel) — "attaque"
// n'a besoin de rien de plus, se finalise directement.
// pouvoir se finaliser ("quête" ouvre l'éditeur de quête lui-même — voir
// static/js/quests/quest-editor.js::renderQuestPickerStep, pas un simple
// champ texte ; événement -> lequel) — "attaque" n'a besoin de rien de
// plus, se finalise directement.
function collisionWizardChooseAction(type, nested) {
if (type === 'attaque' || type === 'interagir') {
collisionWizardFinalizeAction({ type: type }, nested);
return;
}
if (type === 'quete') {
collisionWizardBodyEl().innerHTML =
'<p class="hint mb-2">Identifiant de la quête (l\'éditeur de quête reste à construire — cette règle ne fait que mémoriser la référence pour l\'instant) :</p>' +
'<div class="field is-grouped">' +
'<div class="control is-expanded"><input type="text" id="collisionWizardQueteId" class="input" placeholder="ex. quete-001"></div>' +
'<div class="control"><button type="button" class="button primary" onclick="collisionWizardSubmitQuete(' + (nested ? 'true' : 'false') + ')">Valider</button></div>' +
'</div>';
renderQuestPickerStep(function (quest) {
collisionWizardFinalizeAction({ type: 'quete', quete_id: quest.id }, nested);
});
return;
}
if (type === 'evenement') {
@@ -258,13 +260,6 @@ function collisionWizardChooseAction(type, nested) {
}
}
function collisionWizardSubmitQuete(nested) {
var input = document.getElementById('collisionWizardQueteId');
var queteId = input && input.value.trim();
if (!queteId) { input.focus(); return; }
collisionWizardFinalizeAction({ type: 'quete', quete_id: queteId }, nested);
}
document.addEventListener('DOMContentLoaded', function () {
if (typeof COLLISION_RULE_OBJECTS !== 'undefined') renderCollisionRuleCards();
});