Remplace le système de quêtes par des déclencheurs, ajoute l'action variable et le chaînage
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>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
c504ace167
commit
d664ed5637
@@ -1,9 +1,12 @@
|
||||
"""Liste "🧩 Collision" à jour en AJAX (voir routes/scenes/
|
||||
scene_collision_rule_objects.py, refreshCollisionRuleObjects() dans
|
||||
static/js/scenes/scene-editor.js) : appelée après ajout/suppression d'un
|
||||
objet de scène ou changement de rôle/nom, pour ne jamais recharger la page
|
||||
alors que cette liste doit refléter le changement (un objet apparaît/
|
||||
disparaît selon son rôle, ou change de libellé affiché)."""
|
||||
"""screens.build_collision_rule_objects (voir screens/scenes/
|
||||
build_collision_rule_objects.py) : la liste d'objets éligibles à un
|
||||
déclencheur de collision, réutilisée par le listage de TOUS les
|
||||
déclencheurs du jeu (screens/rendering/trigger_graph.py, voir
|
||||
tests/test_triggers.py) — un objet apparaît/disparaît selon son
|
||||
rôle, ou change de libellé affiché selon son nom. L'ancien endpoint AJAX
|
||||
dédié (routes/scenes/scene_collision_rule_objects.py) a été retiré avec
|
||||
l'onglet "🧩 Collision" séparé — ce fichier teste directement les
|
||||
fonctions Python plutôt qu'une route HTTP désormais inexistante."""
|
||||
import screens
|
||||
|
||||
|
||||
@@ -21,16 +24,17 @@ def _add_ajax(client, slug, screen_id, **data):
|
||||
).get_json()
|
||||
|
||||
|
||||
def _list(client, slug, screen_id):
|
||||
resp = client.get(f"/game/{slug}/screens/{screen_id}/collision-rule-objects")
|
||||
assert resp.status_code == 200
|
||||
return resp.get_json()
|
||||
def _list(slug, screen_id):
|
||||
objects = screens.list_scene_objects(slug, screen_id)
|
||||
for o in objects:
|
||||
o["rendered_html"] = screens.render_scene_object(o)
|
||||
return screens.build_collision_rule_objects(objects)
|
||||
|
||||
|
||||
def test_freshly_added_personnage_is_pnj_in_the_list(client, tmp_game_slug_cleanup):
|
||||
slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup)
|
||||
obj_id = _add_ajax(client, slug, screen_id, kind="personnage")["id"]
|
||||
entries = _list(client, slug, screen_id)
|
||||
entries = _list(slug, screen_id)
|
||||
assert len(entries) == 1
|
||||
assert entries[0]["id"] == obj_id
|
||||
assert entries[0]["role"] == "pnj"
|
||||
@@ -40,7 +44,7 @@ def test_role_change_to_joueur_removes_it_from_the_list(client, tmp_game_slug_cl
|
||||
slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup)
|
||||
obj_id = _add_ajax(client, slug, screen_id, kind="personnage")["id"]
|
||||
client.post(f"/game/{slug}/scene-objects/{obj_id}/role", data='{"role": "joueur"}', content_type="application/json")
|
||||
assert _list(client, slug, screen_id) == []
|
||||
assert _list(slug, screen_id) == []
|
||||
|
||||
|
||||
def test_role_change_back_to_pnj_readds_it_to_the_list(client, tmp_game_slug_cleanup):
|
||||
@@ -48,7 +52,7 @@ def test_role_change_back_to_pnj_readds_it_to_the_list(client, tmp_game_slug_cle
|
||||
obj_id = _add_ajax(client, slug, screen_id, kind="personnage")["id"]
|
||||
client.post(f"/game/{slug}/scene-objects/{obj_id}/role", data='{"role": "joueur"}', content_type="application/json")
|
||||
client.post(f"/game/{slug}/scene-objects/{obj_id}/role", data='{"role": "ennemie"}', content_type="application/json")
|
||||
entries = _list(client, slug, screen_id)
|
||||
entries = _list(slug, screen_id)
|
||||
assert len(entries) == 1
|
||||
assert entries[0]["role"] == "ennemie"
|
||||
|
||||
@@ -57,7 +61,7 @@ def test_name_change_is_reflected_in_the_list(client, tmp_game_slug_cleanup):
|
||||
slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup)
|
||||
obj_id = _add_ajax(client, slug, screen_id, kind="personnage")["id"]
|
||||
client.post(f"/game/{slug}/scene-objects/{obj_id}/name", data='{"name": "Le Sorcier"}', content_type="application/json")
|
||||
entries = _list(client, slug, screen_id)
|
||||
entries = _list(slug, screen_id)
|
||||
assert entries[0]["name"] == "Le Sorcier"
|
||||
|
||||
|
||||
@@ -65,11 +69,11 @@ def test_deleted_object_is_removed_from_the_list(client, tmp_game_slug_cleanup):
|
||||
slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup)
|
||||
obj_id = _add_ajax(client, slug, screen_id, kind="personnage")["id"]
|
||||
client.post(f"/game/{slug}/scene-objects/{obj_id}/delete", headers={"X-Requested-With": "fetch"})
|
||||
assert _list(client, slug, screen_id) == []
|
||||
assert _list(slug, screen_id) == []
|
||||
|
||||
|
||||
def test_decor_has_no_role(client, tmp_game_slug_cleanup):
|
||||
slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup)
|
||||
_add_ajax(client, slug, screen_id, kind="decor")
|
||||
entries = _list(client, slug, screen_id)
|
||||
entries = _list(slug, screen_id)
|
||||
assert entries[0]["role"] is None
|
||||
|
||||
Reference in New Issue
Block a user