Quêtes : bulle "❓ Question" à choix multiples, à côté de "+ Réplique"
Build and deploy / test-python (push) Successful in 6m25s
Build and deploy / test-js (push) Successful in 58s
Build and deploy / build-and-push (push) Skipped
Build and deploy / deploy (push) Skipped

Nouveau type de ligne dans un dialogue de quête (voir
db/quests/sanitize_quest_dialogues.py) : une bulle JAUNE, dans la même
chaîne verticale que les répliques (même alignement, reliée par un
trait) — header : nombre de choix (2 à 8) + récompense (score, montant
en points) ; body : la question, ses choix et un bouton radio pour
désigner la bonne réponse. Aucune limite au nombre de questions par
colonne, comme pour une réplique.

Les lignes de dialogue portent maintenant explicitement
{"type": "dialogue", ...} (au lieu d'un objet sans type) pour
distinguer les deux formes — migration de forme, tests mis à jour.

Portée de ce commit : l'ÉDITEUR (créer/modifier une question). Le jeu
lui-même (afficher la question au joueur, vérifier la réponse,
attribuer la récompense) reste à construire — le widget "💬 Boîte de
dialogue" ne sait aujourd'hui afficher qu'une réplique.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
william
2026-09-03 14:48:14 +02:00
co-authored by Claude Sonnet 5
parent f2ed602459
commit e972acf9e6
5 changed files with 242 additions and 34 deletions
+28 -1
View File
@@ -854,7 +854,9 @@ body.builderBody > main.content{ flex:1 1 auto; min-height:0; overflow:hidden; d
CETTE zone défile (flex:1 + overflow-y:auto) — le titre de colonne et
le bouton "+ Réplique" restent fixes, en haut/en bas. */
.questDialogueColumnBubbles{ display:flex; flex-direction:column; align-items:center; flex:1; min-height:0; overflow-y:auto; padding-top:4px; }
.questDialogueAddBtn{ flex:0 0 auto; align-self:center; padding:6px 14px; font-size:12px; margin-top:4px; }
.questDialogueColumnButtons{ flex:0 0 auto; display:flex; gap:8px; justify-content:center; margin-top:4px; }
.questDialogueAddBtn{ align-self:center; padding:6px 14px; font-size:12px; }
.questQuestionAddBtn{ background:linear-gradient(135deg, #e0b93d, #b8890f); }
.questBubbleRow{ display:flex; justify-content:center; width:100%; position:relative; }
.questBubbleRow:not(:first-child)::before{
@@ -874,6 +876,31 @@ body.builderBody > main.content{ flex:1 1 auto; min-height:0; overflow:hidden; d
.questBubble-pnj .questBubbleBody{ background:rgba(47,111,237,.16); }
.questBubble-joueur .questBubbleHeader{ background:#1e9e57; }
.questBubble-joueur .questBubbleBody{ background:rgba(46,204,113,.16); }
/* "❓ Question" (voir questQuestionBubbleHtml, static/js/quests/
quest-editor.js) — bulle JAUNE distincte des répliques de dialogue,
même chaîne/alignement vertical (.questBubbleRow). */
.questBubble-question .questBubbleHeader{ background:#b8890f; flex-wrap:wrap; row-gap:4px; }
.questBubble-question .questBubbleBody{ background:rgba(224,185,61,.14); }
.questQuestionHeaderField{
display:inline-flex; align-items:center; gap:4px; font-size:11px; font-weight:700; color:#fff; white-space:nowrap;
}
.questQuestionHeaderField input{
width:44px; background:rgba(0,0,0,.25); border:1px solid rgba(255,255,255,.3); border-radius:4px;
color:#fff; font:inherit; font-size:11px; padding:2px 4px;
}
.questQuestionText{
width:100%; background:rgba(0,0,0,.2); border:1px solid var(--border); border-radius:6px;
color:#fff; font:inherit; font-size:13px; padding:6px 8px; margin-bottom:8px;
}
.questQuestionText::placeholder{ color:rgba(255,255,255,.5); }
.questChoicesList{ display:flex; flex-direction:column; gap:6px; }
.questChoiceRow{ display:flex; align-items:center; gap:6px; }
.questChoiceRadio{ accent-color:#e0b93d; flex-shrink:0; }
.questChoiceInput{
flex:1; background:rgba(0,0,0,.2); border:1px solid var(--border); border-radius:6px;
color:#fff; font:inherit; font-size:12.5px; padding:4px 8px;
}
.questChoiceInput::placeholder{ color:rgba(255,255,255,.5); }
.questBubbleSpeaker{
font-size:11px; font-weight:700; color:#fff; cursor:pointer;
background:transparent; border:none; padding:0; font-family:inherit; max-width:100%; flex:1;