Supprime le concept de "quête" au profit d'un onglet unique "Déclencheurs"
portant toute la logique (dialogue, condition, marquage terminé) directement
sur l'objet de scène. Ajoute une nouvelle action "Modifier une variable"
(réutilisant le vocabulaire du graphe de flow) utilisable après une
collision, une interaction ou une branche de condition, ainsi qu'un
chaînage d'actions ("then") permettant d'enchaîner plusieurs actions à la
suite et d'étendre un déclencheur déjà posé sans le recréer.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
64 lines
2.9 KiB
Python
64 lines
2.9 KiB
Python
import screens
|
|
|
|
_DEFAULT_OBJECT_LABELS = {"personnage": "Personnage", "fond": "Fond"}
|
|
_COLLISION_EXCLUDED_KINDS = ("fond", "dialogue_box", "quiz_box", "score_widget")
|
|
|
|
|
|
def build_collision_rule_objects(objects):
|
|
"""Une carte "🧩 Collision" (voir templates/scene_edit.html) par objet
|
|
ÉLIGIBLE (jamais un "fond", jamais le personnage "joueur" — ce sont
|
|
TOUJOURS les AUTRES objets qui réagissent à SA présence, voir
|
|
screens/rendering/collision_rules.py) — factorisé ici plutôt que
|
|
dupliqué : utilisé au premier rendu de la page (routes/scenes/
|
|
scene_edit_view.py), par l'endpoint AJAX scene_collision_rule_objects.py
|
|
(appelé après ajout/suppression/changement de rôle ou de nom, voir
|
|
static/js/scenes/scene-editor.js) ET par le listage de TOUS les
|
|
déclencheurs du jeu (screens/rendering/trigger_graph.py) — vit dans
|
|
screens/ (pas routes/) pour être appelable depuis les deux.
|
|
|
|
`objects` doit déjà porter "rendered_html" (voir
|
|
screens.render_scene_object) sur chaque élément.
|
|
|
|
resolve_personnage_role retombe sur "joueur" pour TOUT personnage sans
|
|
rôle explicitement enregistré (voir screens/rendering/
|
|
personnage_role.py — comportement voulu pour une scène à un seul
|
|
personnage, posé avant l'ajout de ce réglage). Appliqué tel quel,
|
|
ÇA CASSE dès qu'une scène a plusieurs personnages sans rôle explicite
|
|
(le cas de toute scène créée avant ce réglage — un personnage ajouté
|
|
depuis l'éditeur reçoit maintenant TOUJOURS un rôle "pnj" explicite,
|
|
voir add_scene_object.py) : ils retomberaient TOUS sur "joueur" et
|
|
disparaîtraient donc TOUS de cette liste. On ne considère donc comme
|
|
"joueur" implicite QUE LE PREMIER personnage sans rôle explicite (le
|
|
plus ancien, z_index croissant comme `objects`) — les suivants sans
|
|
rôle explicite sont traités comme "pnj" ici, sans rien réécrire en
|
|
base."""
|
|
implicit_joueur_claimed = any(
|
|
(o.get("attributes") or {}).get("_personnage_role") == "joueur"
|
|
for o in objects if o["kind"] == "personnage"
|
|
)
|
|
result = []
|
|
for o in objects:
|
|
if o["kind"] in _COLLISION_EXCLUDED_KINDS:
|
|
continue
|
|
role = None
|
|
if o["kind"] == "personnage":
|
|
explicit_role = (o.get("attributes") or {}).get("_personnage_role")
|
|
if explicit_role in screens.PERSONNAGE_ROLES:
|
|
role = explicit_role
|
|
elif not implicit_joueur_claimed:
|
|
role = "joueur"
|
|
implicit_joueur_claimed = True
|
|
else:
|
|
role = "pnj"
|
|
if role == "joueur":
|
|
continue
|
|
result.append({
|
|
"id": o["id"],
|
|
"name": o.get("name") or _DEFAULT_OBJECT_LABELS.get(o["kind"], "Décor"),
|
|
"kind": o["kind"],
|
|
"role": role,
|
|
"thumbnail_html": o["rendered_html"],
|
|
"rules": screens.resolve_collision_rules(o),
|
|
})
|
|
return result
|