Dialogues de quête : bulles illimitées, n'importe quel objet, timeline reliée
- "qui parle" n'est plus réservé au personnage : N'IMPORTE QUEL objet de scène nommé (personnage, décor, fond — voir "ℹ️ Informations", screens/rendering/scene_object_names.py, ex-personnage_names.py) peut parler dans un dialogue. - Confirmé/documenté : aucune limite au nombre de répliques par colonne (bouton "+ Réplique" reste toujours disponible). - Bulle = header (menu déroulant du "qui parle") + body (le texte), centrée dans sa colonne à 70% de largeur, alignée verticalement et reliée à la suivante par un trait — remplace l'ancien alignement gauche/droite façon chat. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
2347a70c45
commit
521792fe00
@@ -27,14 +27,15 @@ var QUEST_STATUS_ORDER = ['nouvelle', 'en_cours', 'terminee'];
|
||||
// besoin (collisionRuleActionSummary).
|
||||
var QUESTS = (typeof QUESTS_JSON !== 'undefined') ? QUESTS_JSON : [];
|
||||
|
||||
// Noms de personnages nommés (voir "ℹ️ Informations", templates/
|
||||
// scene_edit.html) — proposés comme "qui parle" pour une réplique, en
|
||||
// plus de "Joueur" (toujours disponible, jamais un objet de scène).
|
||||
var PERSONNAGE_NAMES = (typeof PERSONNAGE_NAMES_JSON !== 'undefined') ? PERSONNAGE_NAMES_JSON : [];
|
||||
// Noms d'objets de scène nommés (voir "ℹ️ Informations", templates/
|
||||
// scene_edit.html) — N'IMPORTE QUEL objet (personnage, décor, fond), pas
|
||||
// seulement un personnage — proposés comme "qui parle" pour une réplique,
|
||||
// en plus de "Joueur" (toujours disponible, jamais un objet de scène).
|
||||
var SCENE_OBJECT_NAMES = (typeof SCENE_OBJECT_NAMES_JSON !== 'undefined') ? SCENE_OBJECT_NAMES_JSON : [];
|
||||
|
||||
// Une réplique n'a que deux COULEURS possibles (voir .questBubble-joueur/
|
||||
// .questBubble-pnj, static/style.css) même si le nom affiché est
|
||||
// n'importe quel personnage nommé — "Joueur" à droite en vert, n'importe
|
||||
// n'importe quel objet nommé — "Joueur" en vert, n'importe
|
||||
// quel autre nom à gauche en bleu (voir demande utilisateur : "les bulles
|
||||
// du pnj et du joueur sont d'une couleur différente").
|
||||
function questBubbleKind(speaker) {
|
||||
@@ -198,24 +199,33 @@ function renderQuestFieldsModalBody(questId) {
|
||||
// renommé/supprimé depuis) pour ne jamais perdre silencieusement la
|
||||
// valeur déjà enregistrée.
|
||||
function questSpeakerOptions(currentSpeaker) {
|
||||
var options = ['Joueur'].concat(PERSONNAGE_NAMES);
|
||||
var options = ['Joueur'].concat(SCENE_OBJECT_NAMES);
|
||||
if (currentSpeaker && options.indexOf(currentSpeaker) === -1) options.push(currentSpeaker);
|
||||
return options;
|
||||
}
|
||||
|
||||
// Une bulle = header (qui parle, menu déroulant des objets de scène
|
||||
// nommés — voir "ℹ️ Informations") + body (le texte) — deux zones
|
||||
// distinctes demandées explicitement, pas un seul bloc. Toujours centrée
|
||||
// dans sa colonne, 70% de la largeur (voir .questBubble, static/style.css) —
|
||||
// aucune limite au nombre de bulles par colonne (voir questAddBubble).
|
||||
function questDialogueBubbleHtml(line, status, index) {
|
||||
var kind = questBubbleKind(line.speaker);
|
||||
var speakerSelect = questSpeakerOptions(line.speaker).map(function (name) {
|
||||
return '<option value="' + name.replace(/"/g, '"') + '"' + (name === line.speaker ? ' selected' : '') + '>' + (name === 'Joueur' ? '🧑 Joueur' : '🗨️ ' + name) + '</option>';
|
||||
}).join('');
|
||||
return (
|
||||
'<div class="questBubbleRow questBubbleRow-' + kind + '">' +
|
||||
'<div class="questBubbleRow">' +
|
||||
'<div class="questBubble questBubble-' + kind + '">' +
|
||||
'<select class="questBubbleSpeaker" title="Qui parle" onchange="questSetBubbleSpeaker(\'' + status + '\', ' + index + ', this.value)">' + speakerSelect + '</select>' +
|
||||
'<textarea class="questBubbleText" rows="1" placeholder="Réplique..." ' +
|
||||
'oninput="this.style.height=\'auto\'; this.style.height=this.scrollHeight+\'px\';" ' +
|
||||
'onchange="questUpdateBubbleText(\'' + status + '\', ' + index + ', this.value)">' + line.text.replace(/</g, '<') + '</textarea>' +
|
||||
'<button type="button" class="questBubbleDelete" title="Supprimer" onclick="questDeleteBubble(\'' + status + '\', ' + index + ')">✕</button>' +
|
||||
'<div class="questBubbleHeader">' +
|
||||
'<select class="questBubbleSpeaker" title="Qui parle" onchange="questSetBubbleSpeaker(\'' + status + '\', ' + index + ', this.value)">' + speakerSelect + '</select>' +
|
||||
'<button type="button" class="questBubbleDelete" title="Supprimer" onclick="questDeleteBubble(\'' + status + '\', ' + index + ')">✕</button>' +
|
||||
'</div>' +
|
||||
'<div class="questBubbleBody">' +
|
||||
'<textarea class="questBubbleText" rows="1" placeholder="Réplique..." ' +
|
||||
'oninput="this.style.height=\'auto\'; this.style.height=this.scrollHeight+\'px\';" ' +
|
||||
'onchange="questUpdateBubbleText(\'' + status + '\', ' + index + ', this.value)">' + line.text.replace(/</g, '<') + '</textarea>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</div>'
|
||||
);
|
||||
@@ -324,7 +334,7 @@ function questSaveDialogues(quest) {
|
||||
// — juste un défaut de départ, l'auteur choisit ensuite librement dans
|
||||
// le menu déroulant de la réplique.
|
||||
function questNextDefaultSpeaker(lastSpeaker) {
|
||||
if (lastSpeaker === 'Joueur') return PERSONNAGE_NAMES[0] || 'PNJ';
|
||||
if (lastSpeaker === 'Joueur') return SCENE_OBJECT_NAMES[0] || 'PNJ';
|
||||
return 'Joueur';
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user