Ajoute l'assistant IA "Ruby" (Claude + Scenario) et corrige plusieurs bugs de la scène
Build and deploy / test-python (push) Successful in 12m24s
Build and deploy / test-js (push) Successful in 1m9s
Build and deploy / build-and-push (push) Skipped
Build and deploy / deploy (push) Skipped

Intègre un chat IA capable de manipuler la scène via les mêmes fonctions
que l'éditeur manuel (objets, variables, déclencheurs, images générées),
avec conversations multiples par écran façon Claude. Corrige au passage
le rafraîchissement pjax hors-ordre, l'onglet IA/déclencheurs vide après
sélection d'un objet, la comparaison de booléens dans les conditions, et
le blocage du glisser-déposer hors du cadre caméra après un redimensionnement
de fond par l'IA.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
william
2026-09-09 19:40:31 +02:00
co-authored by Claude Sonnet 5
parent ab6635eee0
commit b07b231a61
62 changed files with 2928 additions and 62 deletions
+13 -2
View File
@@ -1,4 +1,4 @@
from flask import request, redirect, url_for
from flask import request, redirect, render_template, url_for, jsonify
import db
@@ -9,7 +9,10 @@ from core.flask_app import app
def create_global_var(slug):
"""Depuis l'onglet "Variables" de l'éditeur de scène (screen_edit.html)
— idempotent par nom (voir db.create_global_variable), donc sans
risque en cas de double soumission."""
risque en cas de double soumission. Réponse AJAX (voir
static/js/scenes/global-variables.js) : renvoie le HTML de la LIGNE
créée (templates/_global_variable_row.html, partagé avec le rendu
initial de la page — jamais dupliqué), que le JS insère sans recharger."""
name = (request.form.get("name") or "").strip()
var_type = request.form.get("type") or "texte"
default_value = request.form.get("default_value") or ""
@@ -21,6 +24,14 @@ def create_global_var(slug):
per_player = request.form.get("per_player", "1") == "1"
if name:
db.create_global_variable(slug, name, var_type, default_value, per_player=per_player)
if request.headers.get("X-Requested-With") == "fetch":
row_html = ""
if name:
variable = db.get_global_variable(slug, name)
row_html = render_template(
"_global_variable_row.html", v=variable, global_variable_types=db.GLOBAL_VARIABLE_TYPES,
)
return jsonify({"ok": True, "row_html": row_html})
if screen_id:
return redirect(url_for("screen_edit", slug=slug, screen_id=screen_id, tab="variables"))
return redirect(url_for("game_dashboard", slug=slug))
+6 -1
View File
@@ -1,4 +1,4 @@
from flask import request, redirect, url_for
from flask import request, redirect, url_for, jsonify
import db
@@ -7,8 +7,13 @@ from core.flask_app import app
@app.route("/game/<slug>/variables/<int:var_id>/delete", methods=["POST"])
def global_var_delete(slug, var_id):
"""Suppression en AJAX (voir static/js/scenes/global-variables.js) —
même raison que global_var_edit.py. Redirection classique conservée
en secours pour tout appelant non-JS."""
screen_id = request.form.get("screen_id", type=int)
db.delete_global_variable_by_id(slug, var_id)
if request.headers.get("X-Requested-With") == "fetch":
return jsonify({"ok": True})
if screen_id:
return redirect(url_for("screen_edit", slug=slug, screen_id=screen_id, tab="variables"))
return redirect(url_for("game_dashboard", slug=slug))
+7 -1
View File
@@ -1,4 +1,4 @@
from flask import request, redirect, url_for
from flask import request, redirect, url_for, jsonify
import db
@@ -7,10 +7,16 @@ from core.flask_app import app
@app.route("/game/<slug>/variables/<int:var_id>/edit", methods=["POST"])
def global_var_edit(slug, var_id):
"""Enregistrement en AJAX (voir static/js/scenes/global-variables.js) —
demande explicite : modifier/supprimer une variable ne doit plus
recharger toute la page. Redirection classique conservée en secours
pour tout appelant non-JS (même patron que scene_object_add.py)."""
var_type = request.form.get("type") or "texte"
value = request.form.get("value") or ""
screen_id = request.form.get("screen_id", type=int)
db.update_global_variable(slug, var_id, var_type, value)
if request.headers.get("X-Requested-With") == "fetch":
return jsonify({"ok": True})
if screen_id:
return redirect(url_for("screen_edit", slug=slug, screen_id=screen_id, tab="variables"))
return redirect(url_for("game_dashboard", slug=slug))