Files
Forge-Engine/game_engine/__init__.py
T
williamandClaude Sonnet 5 b2e933f322
Build and deploy / test-python (push) Successful in 11m12s
Build and deploy / test-js (push) Successful in 53s
Build and deploy / lint-python (push) Successful in 3m56s
Build and deploy / lint-js (push) Successful in 3m1s
Build and deploy / build-and-push (push) Skipped
Build and deploy / deploy (push) Skipped
Build and deploy / sonarqube (push) Failing after 3m58s
Reorganisation game/document : renommage screens->game_engine + sous-dossiers game/ dans routes, scripts, static, templates, tests
Prepare la scission a venir entre l'editeur Jeu 2D et le futur editeur
Support de formation (voir docs/plan/PLAN.md), sans toucher a
l'architecture en couches existante :

- screens/ renomme en game_engine/ (nom clair pour le moteur du jeu 2D,
  avant l'arrivee d'un second "moteur" cote document) : ~85 imports
  corriges, contrat import-linter mis a jour, meme forme de couches.
- routes/, scripts/, static/, templates/, tests/ : tout ce qui est
  propre au jeu 2D deplace dans un sous-dossier game/ de chacun
  (routes/game/, static/game/, templates/game/, tests/game/,
  scripts/game/) ; ce qui est partage par le site (auth, onboarding,
  dashboard, uploads, db/) reste a la racine de chaque dossier. Un
  sous-dossier document/ (vide) cree dans chacun pour le futur chantier.
- styles/ volontairement inchange : les 3 fichiers sources sont
  concatenes en un seul static/style.css charge par tout le site,
  scinder leur CONTENU (editeur vs partage) serait un refactor CSS
  distinct, pas un deplacement mecanique.
- Chaine d'export SCORM (publish/build_scorm_package.py) mise a jour en
  profondeur : copie des assets, URLs d'icones relatives a
  static/style.css (qui ne bouge pas), manifeste, wrapper SCORM.
- Deux regressions d'un sweep de renommage anterieur corrigees au passage
  (screens.js/screens/scene-objects incorrectement convertis en
  game_engine.js/game_engine/scene-objects dans des commentaires).
- Effet de bord Windows decouvert et corrige : git mv + Path.write_text
  convertissent des fichiers en CRLF (core.autocrlf=true) - ~189 fichiers
  normalises en LF.
- .eslintrc.json/package.json : uniquement les chemins de glob mis a jour
  (static/game/js/...) ; la preparation eslint-plugin-unicorn du lot 7
  reste volontairement non committee (package-lock.json restaure a la
  version precedente).

Verifications : ruff, mypy --strict (391 fichiers), vulture, bandit,
lint-imports tous verts ; 591/591 tests Python, 276/276 tests JS ;
demarrage serveur + requetes HTTP manuelles confirmant que les assets
deplaces repondent en 200 au nouvel emplacement et 404 a l'ancien.

SKIP=djlint : backlog H021 (styles inline) deja documente comme dette
assumee dans CODE_QUALITY.md section 6, aucun template touche par ce
commit au-dela d'un deplacement de fichier.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-19 12:27:53 +02:00

327 lines
13 KiB
Python

"""
game_engine — écrans de jeu : un seul moteur d'écran, la scène 2D "jeu_2d"
(voir game_engine/scenes/) — objets posés en pixels, enchaînement des écrans,
et logique déclenchée par clic/collision/clavier/minuteur (voir
game_engine/flow/).
Tout est stocké dans la même base SQLite que le reste du jeu
(projects/<slug>/game.db) :
- _screens : un écran du jeu (une scène...)
- _scene_objects : chaque objet posé sur une scène (personnage,
décor, fond, widgets d'interface...)
- _flow_nodes/_flow_edges : le graphe de logique de chaque écran
Ce fichier est désormais un package (voir les sous-dossiers) organisé
selon "un fichier = une fonction, un dossier = une responsabilité" ; ce
module se contente de ré-exporter l'intégralité de l'API publique
utilisée par app.py et les templates, afin que `import game_engine`
continue de fonctionner à l'identique.
"""
from .animations.add_animation_clip import add_animation_clip
from .animations.animate_css_catalog import ANIMATE_CSS_CATALOG, ANIMATE_CSS_LABELS
from .animations.delete_animation_clip import delete_animation_clip
from .animations.ensure_animation_schema import ensure_animation_schema
from .animations.get_animation_clip import get_animation_clip
from .animations.list_animation_clips import list_animation_clips
from .animations.update_animation_clip import update_animation_clip
from .custom_events.delete_custom_event import delete_custom_event
from .custom_events.list_custom_event_usages import list_custom_event_usages
from .data_actions.apply_add_row_action import apply_add_row_action
from .data_actions.apply_data_action import apply_data_action
from .data_actions.apply_score_action import apply_score_action
from .data_actions.apply_status_action import apply_status_action
from .data_actions.apply_variable_action import apply_variable_action
from .data_definitions.data_definition_options import data_definition_options
from .flow.add_flow_edge import add_flow_edge
from .flow.add_flow_node import add_flow_node
from .flow.blocks.blocks_view import blocks_view
from .flow.blocks.create_flow_block import create_flow_block
from .flow.blocks.delete_flow_block import delete_flow_block
from .flow.blocks.get_flow_block import get_flow_block
from .flow.blocks.list_flow_blocks import list_flow_blocks
from .flow.blocks.update_flow_block import update_flow_block
from .flow.constants import (
CLICKED_ROW_ID,
CONDITION_OPERATOR_LABELS,
CONDITION_OPERATORS,
LAST_INSERTED_ROW_ID,
TRIGGER_EVENTS,
)
from .flow.delete_flow_edge import delete_flow_edge
from .flow.delete_flow_node import delete_flow_node
from .flow.ensure_flow_schema import ensure_flow_schema
from .flow.get_flow_node import get_flow_node
from .flow.list_flow_edges import list_flow_edges
from .flow.list_flow_nodes import list_flow_nodes
from .flow.move_flow_node import move_flow_node
from .ia.add_ia_chat_message import add_ia_chat_message
from .ia.create_ia_conversation import create_ia_conversation
from .ia.delete_ia_conversation import delete_ia_conversation
from .ia.ensure_ia_chat_schema import ensure_ia_chat_schema
from .ia.get_ia_conversation import get_ia_conversation
from .ia.list_ia_chat_messages import list_ia_chat_messages
from .ia.list_ia_conversations import list_ia_conversations
from .labels.action_type_labels import ACTION_TYPE_LABELS
from .labels.animal_sprite_library import ADMIN_SPRITE_LIBRARY
from .labels.background_library import BACKGROUND_LIBRARY
from .labels.data_operations import DATA_OPERATION_LABELS, DATA_OPERATIONS
from .labels.element_action_properties import (
ELEMENT_ORIENTATION_LABELS,
ELEMENT_ORIENTATION_VALUES,
)
from .labels.element_visibility import ELEMENT_VISIBILITY_LABELS, ELEMENT_VISIBILITY_VALUES
from .labels.sprite_gallery import sprite_gallery_families
from .labels.sprite_library import PUBLIC_SPRITE_LIBRARY
from .labels.surbrillance_values import SURBRILLANCE_LABELS, SURBRILLANCE_VALUES
from .labels.video_modes import VIDEO_MODE_LABELS, VIDEO_MODES
from .payload.full_game_payload import full_game_payload
from .rendering.collision_rules import (
backfill_missing_leaf_ids,
move_action_in_rules,
remove_action_from_rules,
resolve_collision_rules,
sanitize_collision_rules,
set_dialogue_lines_in_rules,
set_then_action_in_rules,
)
from .rendering.collision_settings import COLLISION_SHAPES, DEFAULT_COLLISION_SETTINGS, resolve_collision_settings
from .rendering.dialogue_box_style import (
DEFAULT_DIALOGUE_BOX_STYLE,
FONT_WEIGHT_CHOICES,
resolve_dialogue_box_style,
sanitize_dialogue_box_style,
)
from .rendering.list_used_forge_characters import list_used_forge_characters
from .rendering.personnage_commands import (
DEFAULT_PERSONNAGE_COMMANDS,
resolve_personnage_commands,
sanitize_extra_commands,
)
from .rendering.personnage_data import (
resolve_personnage_animations,
resolve_personnage_data,
resolve_personnage_idle_frame,
)
from .rendering.personnage_role import (
DEFAULT_PERSONNAGE_ROLE,
PERSONNAGE_ROLE_LABELS,
PERSONNAGE_ROLES,
resolve_personnage_role,
)
from .rendering.quiz_box_config import (
DEFAULT_QUIZ_BOX_CONFIG,
QUIZ_BOX_DIALOG_TEMPLATE_LABELS,
QUIZ_BOX_DIALOG_TEMPLATES,
QUIZ_BOX_PAGE_TEMPLATE_LABELS,
QUIZ_BOX_PAGE_TEMPLATES,
TIMER_MODES,
resolve_quiz_box_config,
sanitize_quiz_box_config,
)
from .rendering.scene_object_names import list_named_scene_object_names
from .rendering.screen_triggers import TRIGGER_TYPES_SCREEN, resolve_screen_triggers, sanitize_screen_triggers
from .rendering.trigger_graph import (
collect_all_dialogue_lines,
list_all_collision_objects,
list_all_triggers,
list_completable_dialogue_ids,
)
from .scenes.add_scene_object import add_scene_object
from .scenes.append_action_to_trigger import append_action_to_trigger
from .scenes.build_collision_rule_objects import build_collision_rule_objects
from .scenes.delete_scene_object import delete_scene_object
from .scenes.ensure_scene_schema import ensure_scene_schema
from .scenes.flow_palette import ACTION_TYPE_LABELS_2D, OBJECT_ACTION_PROPERTIES, TRIGGER_EVENTS_2D
from .scenes.get_scene_object import get_scene_object
from .scenes.list_scene_objects import list_scene_objects
from .scenes.move_action_in_trigger import move_action_in_trigger
from .scenes.remove_action_from_trigger import remove_action_from_trigger
from .scenes.render_scene_object import render_scene_object
from .scenes.resolve_scene_world_size import resolve_scene_world_size
from .scenes.set_scene_object_collision import set_scene_object_collision
from .scenes.set_scene_object_collision_rules import set_scene_object_collision_rules
from .scenes.set_scene_object_commands import set_scene_object_commands
from .scenes.set_scene_object_dialogue_box_style import set_scene_object_dialogue_box_style
from .scenes.set_scene_object_name import set_scene_object_name
from .scenes.set_scene_object_personnage_data import set_scene_object_personnage_data
from .scenes.set_scene_object_quiz_config import set_scene_object_quiz_config
from .scenes.set_scene_object_role import set_scene_object_role
from .scenes.update_scene_object_geometry import update_scene_object_geometry
from .screens_repo.append_action_to_screen_trigger import append_action_to_screen_trigger
from .screens_repo.create_screen import create_screen
from .screens_repo.delete_screen import delete_screen
from .screens_repo.ensure_schema import ensure_schema
from .screens_repo.get_screen import get_screen
from .screens_repo.list_screens import list_screens
from .screens_repo.move_action_in_screen_trigger import move_action_in_screen_trigger
from .screens_repo.move_screen import move_screen
from .screens_repo.remove_action_from_screen_trigger import remove_action_from_screen_trigger
from .screens_repo.rename_screen import rename_screen
from .screens_repo.screens_referencing import screens_referencing
from .screens_repo.set_scene_size import set_scene_size
from .screens_repo.set_screen_background_music import set_screen_background_music
from .screens_repo.set_screen_triggers import set_screen_triggers
# SPRITE_LIBRARY (fusionné) : utilisé par resolve_personnage_animations
# pour la résolution RUNTIME (jeu jouable, tous rôles confondus — voir le
# plan "Bibliothèque de sprites animaux CraftPix" : aucun filtrage par
# rôle au runtime, seulement à la galerie/l'écriture). Les routes qui
# alimentent la galerie de l'éditeur doivent utiliser PUBLIC_SPRITE_LIBRARY
# ou ADMIN_SPRITE_LIBRARY selon le rôle, jamais SPRITE_LIBRARY directement.
SPRITE_LIBRARY = {**PUBLIC_SPRITE_LIBRARY, **ADMIN_SPRITE_LIBRARY}
ADMIN_ONLY_CHARACTER_SLUGS = set(ADMIN_SPRITE_LIBRARY)
# Un seul pack aujourd'hui, licence CraftPix — tout BACKGROUND_LIBRARY est
# admin-only (voir core/sprite_gate.py::forbid_admin_only_background),
# jamais de version "publique" comme pour les personnages Kenney.
ADMIN_ONLY_BACKGROUND_SLUGS = set(BACKGROUND_LIBRARY)
# Liste generee a partir des noms REELLEMENT importables depuis ce module
# (introspection de vars(screens) + parsing AST des imports de ce fichier,
# les deux methodes se recoupent exactement — voir discussion Phase 3) —
# jamais retapee a la main. `_trigger_for` (rendering/trigger_for.py) est
# volontairement exclu : prefixe underscore = prive par convention, et
# confirme inutilise en dehors de ce fichier (grep sur tout le depot).
__all__ = [
"data_definition_options",
"ACTION_TYPE_LABELS",
"ELEMENT_ORIENTATION_VALUES",
"ELEMENT_ORIENTATION_LABELS",
"ELEMENT_VISIBILITY_VALUES",
"ELEMENT_VISIBILITY_LABELS",
"DATA_OPERATIONS",
"DATA_OPERATION_LABELS",
"PUBLIC_SPRITE_LIBRARY",
"ADMIN_SPRITE_LIBRARY",
"SPRITE_LIBRARY",
"ADMIN_ONLY_CHARACTER_SLUGS",
"sprite_gallery_families",
"BACKGROUND_LIBRARY",
"ADMIN_ONLY_BACKGROUND_SLUGS",
"list_used_forge_characters",
"TRIGGER_EVENTS",
"CONDITION_OPERATORS",
"CONDITION_OPERATOR_LABELS",
"CLICKED_ROW_ID",
"LAST_INSERTED_ROW_ID",
"resolve_personnage_data",
"resolve_personnage_animations",
"resolve_personnage_idle_frame",
"resolve_personnage_role",
"PERSONNAGE_ROLES",
"PERSONNAGE_ROLE_LABELS",
"DEFAULT_PERSONNAGE_ROLE",
"resolve_collision_settings",
"DEFAULT_COLLISION_SETTINGS",
"COLLISION_SHAPES",
"resolve_collision_rules",
"sanitize_collision_rules",
"set_dialogue_lines_in_rules",
"set_then_action_in_rules",
"remove_action_from_rules",
"move_action_in_rules",
"backfill_missing_leaf_ids",
"resolve_screen_triggers",
"sanitize_screen_triggers",
"TRIGGER_TYPES_SCREEN",
"SURBRILLANCE_VALUES",
"SURBRILLANCE_LABELS",
"VIDEO_MODES",
"VIDEO_MODE_LABELS",
"resolve_personnage_commands",
"DEFAULT_PERSONNAGE_COMMANDS",
"sanitize_extra_commands",
"list_named_scene_object_names",
"resolve_dialogue_box_style",
"sanitize_dialogue_box_style",
"DEFAULT_DIALOGUE_BOX_STYLE",
"FONT_WEIGHT_CHOICES",
"resolve_quiz_box_config",
"sanitize_quiz_box_config",
"DEFAULT_QUIZ_BOX_CONFIG",
"TIMER_MODES",
"QUIZ_BOX_DIALOG_TEMPLATES",
"QUIZ_BOX_DIALOG_TEMPLATE_LABELS",
"QUIZ_BOX_PAGE_TEMPLATES",
"QUIZ_BOX_PAGE_TEMPLATE_LABELS",
"ensure_schema",
"list_screens",
"get_screen",
"create_screen",
"rename_screen",
"delete_screen",
"move_screen",
"screens_referencing",
"set_scene_size",
"set_screen_background_music",
"set_screen_triggers",
"append_action_to_screen_trigger",
"remove_action_from_screen_trigger",
"move_action_in_screen_trigger",
"ensure_scene_schema",
"add_scene_object",
"list_scene_objects",
"resolve_scene_world_size",
"get_scene_object",
"update_scene_object_geometry",
"delete_scene_object",
"set_scene_object_personnage_data",
"set_scene_object_commands",
"set_scene_object_role",
"set_scene_object_collision",
"set_scene_object_collision_rules",
"set_scene_object_name",
"set_scene_object_dialogue_box_style",
"set_scene_object_quiz_config",
"render_scene_object",
"build_collision_rule_objects",
"append_action_to_trigger",
"remove_action_from_trigger",
"move_action_in_trigger",
"list_all_triggers",
"list_all_collision_objects",
"collect_all_dialogue_lines",
"list_completable_dialogue_ids",
"TRIGGER_EVENTS_2D",
"ACTION_TYPE_LABELS_2D",
"OBJECT_ACTION_PROPERTIES",
"ensure_flow_schema",
"list_flow_nodes",
"list_flow_edges",
"get_flow_node",
"add_flow_node",
"move_flow_node",
"delete_flow_node",
"add_flow_edge",
"delete_flow_edge",
"list_flow_blocks",
"get_flow_block",
"create_flow_block",
"update_flow_block",
"delete_flow_block",
"blocks_view",
"apply_data_action",
"apply_variable_action",
"apply_score_action",
"apply_status_action",
"apply_add_row_action",
"ensure_animation_schema",
"list_animation_clips",
"get_animation_clip",
"add_animation_clip",
"update_animation_clip",
"delete_animation_clip",
"ANIMATE_CSS_CATALOG",
"ANIMATE_CSS_LABELS",
"list_custom_event_usages",
"delete_custom_event",
"full_game_payload",
"ensure_ia_chat_schema",
"list_ia_chat_messages",
"add_ia_chat_message",
"create_ia_conversation",
"list_ia_conversations",
"get_ia_conversation",
"delete_ia_conversation",
]