import os from ..connection import connect from ..game_dir import game_dir from ..slugify import slugify from .get_game_type import DEFAULT_GAME_TYPE def create_game(name, slug_override=None, game_type=DEFAULT_GAME_TYPE): """Feature 1 : crée le dossier du jeu, ses fichiers index.html/css/js reliés entre eux, et sa base de données dédiée (nom du jeu en méta). slug_override : impose le nom du dossier au lieu de le dériver de `name` — utilisé par l'inscription (auth/) pour que le dossier d'un compte porte son adresse email (slugifiée), indépendamment du nom donné à son jeu. Toujours rendu unique de la même façon (suffixe -2/-3...) si, par un hasard extrême, le dossier existe déjà. game_type : "document" (défaut, éditeur générique actuel) ou "jeu_2d" (éditeur de scène — voir get_game_type.py) — choisi une fois pour toutes à la création, gate quel éditeur/quel rendu jouable ce jeu utilise (voir routes/screens/screen_edit.py).""" slug = slugify(slug_override) if slug_override else slugify(name) base = slug n = 2 while os.path.isdir(game_dir(base)): base = f"{slug}-{n}" n += 1 slug = base os.makedirs(game_dir(slug), exist_ok=True) index_html = f"""
Squelette généré par le moteur Forge — à remplir au fur et à mesure des fonctionnalités du jeu.
""" index_css = """body { font-family: system-ui, sans-serif; margin: 40px; color: #222; } """ index_js = """// index.js — point d'entrée du jeu, généré par le moteur Forge. console.log("Jeu chargé."); """ with open(os.path.join(game_dir(slug), "index.html"), "w", encoding="utf-8") as f: f.write(index_html) with open(os.path.join(game_dir(slug), "index.css"), "w", encoding="utf-8") as f: f.write(index_css) with open(os.path.join(game_dir(slug), "index.js"), "w", encoding="utf-8") as f: f.write(index_js) conn = connect(slug) conn.executescript( """ CREATE TABLE _meta (key TEXT PRIMARY KEY, value TEXT); CREATE TABLE _definitions ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL UNIQUE, table_name TEXT NOT NULL UNIQUE, created_at TEXT DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE _fields ( id INTEGER PRIMARY KEY AUTOINCREMENT, definition_id INTEGER NOT NULL REFERENCES _definitions(id) ON DELETE CASCADE, name TEXT NOT NULL, type TEXT NOT NULL, relation_definition_id INTEGER REFERENCES _definitions(id), required INTEGER NOT NULL DEFAULT 0, position INTEGER NOT NULL DEFAULT 0 ); """ ) conn.execute("INSERT INTO _meta (key, value) VALUES ('name', ?)", (name,)) conn.execute("INSERT INTO _meta (key, value) VALUES ('game_type', ?)", (game_type,)) conn.commit() conn.close() return slug