Dialogues de quête : bulles illimitées, n'importe quel objet, timeline reliée
Build and deploy / test-python (push) Successful in 7m32s
Build and deploy / test-js (push) Successful in 1m2s
Build and deploy / build-and-push (push) Skipped
Build and deploy / deploy (push) Skipped

- "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:
william
2026-09-03 11:54:06 +02:00
co-authored by Claude Sonnet 5
parent 2347a70c45
commit 521792fe00
11 changed files with 105 additions and 67 deletions
-19
View File
@@ -1,19 +0,0 @@
from ..screens_repo.list_screens import list_screens
from ..scenes.list_scene_objects import list_scene_objects
def list_personnage_names(slug):
"""Noms distincts de tous les personnages nommés (voir "ℹ️
Informations", templates/scene_edit.html), toutes scènes 2D du jeu
confondues — une quête (voir db/quests/) est GAME-WIDE, son dialogue
peut donc mettre en scène un PNJ posé sur une autre scène que celle
où la règle de collision se déclenche. Ordre alphabétique, jamais de
doublon."""
names = set()
for s in list_screens(slug):
if s["kind"] != "jeu_2d":
continue
for o in list_scene_objects(slug, s["id"]):
if o["kind"] == "personnage" and o.get("name"):
names.add(o["name"])
return sorted(names)
+25
View File
@@ -0,0 +1,25 @@
from ..screens_repo.list_screens import list_screens
from ..scenes.list_scene_objects import list_scene_objects
# Le widget "💬 Boîte de dialogue" (kind="dialogue_box") n'est pas un
# acteur de la scène — il n'a pas de sens comme "qui parle" dans un
# dialogue de quête, contrairement à N'IMPORTE QUEL AUTRE objet
# (personnage, décor, fond).
_EXCLUDED_KINDS = {"dialogue_box"}
def list_named_scene_object_names(slug):
"""Noms distincts de tous les objets de scène nommés (voir "ℹ️
Informations", templates/scene_edit.html) — n'importe quel kind
(personnage, décor, fond), toutes scènes 2D du jeu confondues : une
quête (voir db/quests/) est GAME-WIDE, son dialogue peut donc mettre
en scène un objet posé sur une autre scène que celle où la règle de
collision se déclenche. Ordre alphabétique, jamais de doublon."""
names = set()
for s in list_screens(slug):
if s["kind"] != "jeu_2d":
continue
for o in list_scene_objects(slug, s["id"]):
if o["kind"] not in _EXCLUDED_KINDS and o.get("name"):
names.add(o["name"])
return sorted(names)