';
document.body.appendChild(modal);
return modal;
@@ -105,25 +113,32 @@ function ensureQuestDialogueModal() {
// `onUse(quest)` optionnel : posé par collisionWizardChooseAction('quete', ...)
// pour finaliser la règle de collision avec cette quête, affiche alors un
-// bouton "✓ Utiliser cette quête" épinglé en haut de la modale.
-function openQuestDialogueModal(questId, onUse) {
+// bouton "✓ Utiliser cette quête" dans les deux modales.
+function openQuestFieldsModal(questId, onUse) {
_questModalOnUse = onUse || null;
- var modal = ensureQuestDialogueModal();
+ _questModalCurrentId = questId;
+ var modal = ensureQuestFieldsModal();
modal.classList.add('is-active');
- renderQuestDialogueModalBody(questId);
+ renderQuestFieldsModalBody(questId);
}
-function closeQuestDialogueModal() {
- var modal = document.getElementById('questDialogueModal');
+// _questModalOnUse/_questModalCurrentId ne sont PAS remis à null ici :
+// openQuestDialogueModal() ferme cette modale en s'ouvrant (voir plus
+// bas) et a besoin de les garder pour son propre bouton "✓ Utiliser
+// cette quête" — chaque point d'entrée (openQuestFieldsModal) les fixe
+// de toute façon fraîchement à chaque ouverture.
+function closeQuestFieldsModal() {
+ var modal = document.getElementById('questFieldsModal');
if (modal) modal.classList.remove('is-active');
- _questModalOnUse = null;
- _questModalCurrentId = null;
}
function questUseThisQuest(questId) {
var quest = questById(questId);
if (_questModalOnUse && quest) _questModalOnUse(quest);
closeQuestDialogueModal();
+ closeQuestFieldsModal();
+ _questModalOnUse = null;
+ _questModalCurrentId = null;
}
function questFieldRowHtml(quest) {
@@ -144,6 +159,25 @@ function questFieldRowHtml(quest) {
);
}
+function renderQuestFieldsModalBody(questId) {
+ var quest = questById(questId);
+ var body = document.getElementById('questFieldsModalBody');
+ if (!quest || !body) return;
+ var useBtn = _questModalOnUse
+ ? '
'
+ : '';
+ body.innerHTML =
+ '' +
+ questFieldRowHtml(quest) +
+ '
';
+}
+
function questDialogueBubbleHtml(line, status, index) {
return (
'
' +
@@ -172,7 +206,42 @@ function questDialogueColumnHtml(quest, status) {
);
}
-var _questModalCurrentId = null;
+// Modale de dialogue — PLEIN ÉCRAN (voir .questDialogueModal en CSS),
+// ouverte DEPUIS la modale de fiche (bouton "💬 Ajouter les dialogues"),
+// jamais les deux à la fois : referme la fiche en s'ouvrant plutôt que de
+// les empiler, "← Fiche de la quête" y ramène.
+function ensureQuestDialogueModal() {
+ var modal = document.getElementById('questDialogueModal');
+ if (modal) return modal;
+ modal = document.createElement('div');
+ modal.className = 'modal questDialogueModal';
+ modal.id = 'questDialogueModal';
+ modal.innerHTML =
+ '
' +
+ '
';
+ document.body.appendChild(modal);
+ return modal;
+}
+
+function openQuestDialogueModal(questId) {
+ _questModalCurrentId = questId;
+ closeQuestFieldsModal();
+ var modal = ensureQuestDialogueModal();
+ modal.classList.add('is-active');
+ renderQuestDialogueModalBody(questId);
+}
+
+function closeQuestDialogueModal() {
+ var modal = document.getElementById('questDialogueModal');
+ if (modal) modal.classList.remove('is-active');
+}
+
+function questBackToFieldsModal(questId) {
+ closeQuestDialogueModal();
+ openQuestFieldsModal(questId, _questModalOnUse);
+}
function renderQuestDialogueModalBody(questId) {
var quest = questById(questId);
@@ -184,12 +253,14 @@ function renderQuestDialogueModalBody(questId) {
: '';
body.innerHTML =
'' +
- questFieldRowHtml(quest) +
'
Dialogue joué selon l\'état de la quête au moment où le joueur parle au PNJ :
' +
'
' + QUEST_STATUS_ORDER.map(function (s) { return questDialogueColumnHtml(quest, s); }).join('') + '
';
}
@@ -207,9 +278,7 @@ function questUpdateField(questId, field, value) {
if (!json.quest) return;
Object.assign(quest, json.quest);
renderQuestListPage();
- if (document.getElementById('questDialogueModal') && document.getElementById('questDialogueModal').classList.contains('is-active')) {
- renderQuestDialogueModalBody(questId);
- }
+ renderQuestFieldsModalBody(questId); // seule modale à porter des champs éditables
});
}
@@ -263,14 +332,13 @@ function _currentQuestModalId() {
}
// ---------- Sélecteur de quête (assistant "+ Action" de l'éditeur de collision) ----------
-// Récupère la liste à jour (jamais présente d'avance dans scene_edit.html,
-// contrairement à quests.html) puis affiche des cartes + "+ Nouvelle
-// quête" DANS la modale de collision déjà ouverte (voir
-// renderCollisionWizardActionStep) ; choisir/créer une quête ouvre
-// ENSUITE la modale de dialogue (celle-ci empilée par-dessus), avec un
-// bouton "✓ Utiliser cette quête" qui referme les deux et finalise la
-// règle — exactement le comportement demandé : cliquer "Déclencher une
-// quête" ouvre l'éditeur de quête, pas un simple champ texte.
+// Affiche des cartes + "+ Nouvelle quête" DANS la modale de collision
+// déjà ouverte (voir renderCollisionWizardActionStep) ; choisir/créer une
+// quête ouvre ENSUITE la modale de FICHE (celle-ci par-dessus), avec un
+// bouton "✓ Utiliser cette quête" (disponible aussi depuis la modale de
+// dialogue) qui referme tout et finalise la règle — exactement le
+// comportement demandé : cliquer "Déclencher une quête" ouvre l'éditeur
+// de quête, pas un simple champ texte.
function questPickerHtml(quests) {
if (!quests.length) {
return '
Aucune quête pour l\'instant.
';
@@ -299,7 +367,7 @@ function renderQuestPickerStep(onUse) {
}
function questPickerChoose(questId) {
- openQuestDialogueModal(questId, _questPickerOnUse);
+ openQuestFieldsModal(questId, _questPickerOnUse);
}
function questPickerCreate() {
@@ -309,7 +377,7 @@ function questPickerCreate() {
.then(function (r) { return r.json(); })
.then(function (json) {
QUESTS.unshift(json.quest);
- openQuestDialogueModal(json.quest.id, _questPickerOnUse);
+ openQuestFieldsModal(json.quest.id, _questPickerOnUse);
});
}
diff --git a/static/style.css b/static/style.css
index 63fb727d..1c7c6838 100644
--- a/static/style.css
+++ b/static/style.css
@@ -773,7 +773,15 @@ body.builderBody > main.content{ flex:1 1 auto; min-height:0; overflow:hidden; d
.questPill-status-en_cours{ background:rgba(242,153,74,.18); color:#f2994a; border-color:transparent; }
.questPill-status-terminee{ background:rgba(46,204,113,.18); color:#2ecc71; border-color:transparent; }
-.questDialogueModalContent{ max-width:min(92vw, 1080px); }
+.questFieldsModalContent{ max-width:min(92vw, 640px); }
+
+/* Modale "j'ajoute les dialogues" — PLEIN ÉCRAN, demandé explicitement
+ (distincte de la modale de fiche ci-dessus) : couvre tout le viewport
+ plutôt qu'une boîte centrée, pour laisser toute la place aux 3
+ colonnes de répliques. */
+.questDialogueModal .modal-content{ width:100vw; height:100vh; max-width:100vw; max-height:100vh; margin:0; }
+.questDialogueModal .box{ width:100%; height:100%; border-radius:0; overflow-y:auto; }
+.questDialogueModalContent{ width:100%; height:100%; max-width:100%; }
.questDialogueModalHeader{ margin-bottom:10px; }
.questFieldsGrid{ display:grid; grid-template-columns:repeat(auto-fill, minmax(160px, 1fr)); gap:10px; margin-bottom:14px; }
.questField{ display:flex; flex-direction:column; gap:4px; font-size:12px; font-weight:600; }