import json import db from .ensure_scene_schema import ensure_scene_schema _DEFAULT_PERSONNAGE_DATA = {"source": "forge", "forge_character": "male-adventurer"} _KINDS = {"personnage", "decor"} def add_scene_object(slug, scene_id, kind="personnage", forge_character=None): """Pose un nouvel objet sur une scène (voir ensure_scene_schema.py). kind="personnage" : attributes._personnage_data, MÊME structure/mêmes fonctions resolve_personnage_* que le widget "personnage" de l'éditeur document (screens/rendering/personnage_data.py) — un objet de scène "personnage" partage donc directement la bibliothèque Forge et le système d'animation déjà écrits. kind="decor" : une simple image fixe (attributes.src), pas d'animation.""" ensure_scene_schema(slug) kind = kind if kind in _KINDS else "personnage" attributes = {} if kind == "personnage": data = dict(_DEFAULT_PERSONNAGE_DATA) if forge_character: from ..labels.sprite_library import SPRITE_LIBRARY if forge_character in SPRITE_LIBRARY: data["forge_character"] = forge_character attributes["_personnage_data"] = json.dumps(data) conn = db.connect(slug) max_z = conn.execute( "SELECT MAX(z_index) AS m FROM _scene_objects WHERE scene_id = ?", (scene_id,) ).fetchone()["m"] conn.execute( """INSERT INTO _scene_objects (scene_id, kind, attributes, z_index) VALUES (?, ?, ?, ?)""", (scene_id, kind, json.dumps(attributes), (max_z or 0) + 1), ) object_id = conn.execute("SELECT last_insert_rowid() AS id").fetchone()["id"] conn.commit() conn.close() return object_id