Ceci est la traduction française, faite pour ce site, du guide livré dans le produit : le fichier INSTALL.md de votre archive, en anglais. L’anglais fait référence : en cas de doute, c’est lui qui compte. Lire l’original en anglais
1. Les outils (environ 5 minutes la première fois)
- Installez Rokit (<https://github.com/rojo-rbx/rokit>), puis, dans le dossier :
rokit install. Il récupère Rojo, Lune, StyLua, Selene, luau-lsp et uv aux versions de uv synccrée l’environnement Python qu’utilisent les outils (.venv) à partir deuv.lock(Python 3.14, numpy, scipy, Pillow, soundfile, requests). 0,4 s avec les- Vérifiez le paquet sur votre machine :
bash tools/check.sh. Il formate, analyse, vérifie les types, exécute chaque suite de tests et les simulations d’équilibrage
rokit.toml. 0,1 s quand les outils sont déjà là ; la première fois, il télécharge six programmes : NON MESURÉ.
paquets déjà téléchargés ; la première fois, il les télécharge : NON MESURÉ.
(les cinq prennent l’essentiel du temps : bash tools/check.sh --fast les saute, ainsi que la construction du place) et construit le place ; il doit se terminer par GATE GREEN (full). 17 minutes 22 secondes.
2. Le faire vôtre
Modifiez project.json : mettez votre identifiant d’utilisateur Roblox dans creatorUserId (le nombre dans l’adresse de votre profil), ou celui d’un groupe dans creatorGroupId si l’expérience appartient à un groupe. Laissez universe et place à 0 jusqu’à l’étape 8.
Écrivez ensuite le secret du spectacle du soir, une valeur que seuls vos serveurs connaissent (la graine du spectacle de chaque soir y est mêlée) : uv run python tools/setup_ids.py --secret écrit src/server/DailySecret.luau. Gardez ce fichier hors de tout dépôt public. Laissé vide, le jeu tourne quand même, mais quiconque lit le code source peut calculer le spectacle d’un soir, et le serveur le signale une fois au démarrage.
3. Y jouer tout de suite, sans rien dessiner à partir de l’art (environ 2 minutes)
Le fichier src/shared/Data/Ids.luau du paquet est vide : chacun de vos assets vaut donc 0 et est dessiné comme rien ; il n’y a pas de boutique à masquer (le jeu ne vend rien). Cela suffit pour construire, tester et modifier le jeu avant d’avoir fabriqué quoi que ce soit.
bash tools/build_place.shécritCutstring.rbxl(1,0 Mo). 0,14 s.- Ouvrez-le dans Roblox Studio et appuyez sur Play (onglet Home, « Play »). Vous arrivez dans une loge toute simple (un sol et huit dalles de laiton là où les stations se
dresseront, devant une maison sombre) ; l’avis de l’ascenseur se tient au bas de l’écran, avec des boîtes de papier uni et de laiton là où viendra l’art, et une partie commence et se termine : la scène n’a encore ni décors ni marionnettes, les cartes sont en papier uni, les mots sont tous là, en anglais et en français. La fenêtre Output de Studio contient un avertissement pour chaque modèle pas encore construit (« a plain floor stands in until you build it », « no model Guard ») et rien d’autre.
4. Une clé d’API Open Cloud
Les outils d’envoi et de publication parlent à Roblox avec votre propre clé d’API. Créez-en une sur <https://create.roblox.com/dashboard/credentials> (« Create API Key ») : permissions Assets (lecture et écriture) avec votre compte ou votre groupe comme propriétaire ; ajoutez Universe Places (écriture) et Luau Execution Sessions (écriture) seulement si vous utiliserez tools/publish.py et tools/cloud_run.py. Donnez la clé aux outils par la variable d’environnement ROBLOX_OPEN_CLOUD_KEY (dans PowerShell : $env:ROBLOX_OPEN_CLOUD_KEY = "<la clé>"), ou gardez-la dans un fichier hors du dossier et passez --key-file <fichier> (ou mettez son chemin dans project.json sous keyFile). Les outils ne l’impriment jamais, et elle n’est jamais écrite dans le projet : gardez-la hors de tout dépôt que vous feriez du paquet. Un envoi va au créateur de project.json (creatorUserId, ou creatorGroupId), ou à --creator user:<id> / --creator group:<id>.
5. Fabriquer l’art et l’envoyer (l’étape longue)
Chaque modèle, texture, atlas, flipbook et glyphe est fabriqué par un script de blender/scripts (Blender 5.2 LTS, lancé sans fenêtre) ou de tools/, envoyé sur votre compte par tools/upload_assets.py (son registre est blender/uploaded.json) et les sons par tools/upload_audio.py (assets/audio_uploaded.json). Ensuite uv run python tools/setup_ids.py écrit les identifiants dans src/shared/Data/Ids.luau, où le jeu les lit par nom (les modules de données générés demandent chaque asset à Ids par son nom, ils n’ont donc pas besoin d’être changés après un envoi).
Avec BLENDER le chemin de votre exécutable Blender (les commandes sont celles qu’a utilisées le développeur ; un script qui prend des noms ne fabrique que ceux-là). La bibliothèque de textures CC0 passe en premier : uv run python tools/fetch_textures.py (ses sources et licences sont dans THIRD_PARTY.md).
| Partie | Commandes, dans l’ordre |
|---|---|
| Les surfaces | uv run python tools/fetch_textures.py, uv run python tools/material_variants.py build, envoyez blender/manifest_textures.json (ci-dessous), puis uv run python tools/material_variants.py gen |
| Les modèles : la scène, les décors, la maison, la loge, les marionnettes et les ennemis, les accessoires | "$BLENDER" -b --factory-startup --python blender/scripts/<script>.py pour chacun de stage_blockout, stage_kit, stage_curtain, set_act1, set_act1_cloud, set_act2, house, dressing_room, bouquet, hp_plaque, puppet_guard, puppet_trickster, puppet_mender et chaque script enemy_*, puis uv run python tools/check_texture_palette.py, envoyez les maps (uv run python tools/upload_assets.py --manifest blender/manifest_textures.json) et les modèles (uv run python tools/upload_assets.py) |
| L’interface : cartes, HUD, accessoires, scènes, image de chargement | "$BLENDER" -b --factory-startup --python blender/scripts/ui_art.py, ui_objects.py, card_illustrations.py, card_illustrations.py -- --portraits, card_illustrations.py -- --demos, loading_curtain.py ; puis uv run python tools/make_ui_atlas.py build et envoyez blender/manifest_textures.json |
| Les glyphes de manette | "$BLENDER" -b --factory-startup --python blender/scripts/ui_glyphs.py, uv run python tools/make_glyphs.py build, envoyez uv run python tools/upload_assets.py --manifest blender/manifest_glyphs.json |
| Les effets | "$BLENDER" -b --factory-startup --python blender/scripts/fx_flipbooks.py, uv run python tools/make_fx_textures.py build, envoyez blender/manifest_textures.json |
| Les sons propres du jeu | uv run python tools/make_sounds.py (écrit build/sounds/*.wav ; les recettes du bruitage sont dans tools/foley.py), puis uv run python tools/upload_audio.py NOM=build/sounds/NOM.wav ... pour chacun |
| Les identifiants | uv run python tools/setup_ids.py |
uv run python tools/upload_assets.py saute ce qui est déjà envoyé (même empreinte de fichier), vous pouvez donc vous arrêter et reprendre ; un asset encore en modération chez Roblox donne son état avec uv run python tools/upload_assets.py --status <Nom>.
NON MESURÉ et NON EXÉCUTÉ en une seule session sur une autre machine que celle du développeur : le développeur a fabriqué cet art sur des semaines, script après script, et n’a pas chronométré une reconstruction de tout. Les envois sont limités par Roblox (la modération prend des minutes par lot). Le seul script chronométré, hp_plaque.py (un petit modèle), a pris 16,6 s sans fenêtre sur la machine du développeur ; les décors cuits, le kit de scène et les marionnettes prennent des minutes chacun : NON MESURÉ.
6. Construire les modèles dans Studio
Les maillages envoyés deviennent les modèles du jeu dans Studio (ils sont remis à leurs tailles exactes, équipés d’un squelette et habillés des matériaux). Ouvrez Cutstring.rbxl (reconstruisez-le après l’étape 5 : bash tools/build_place.sh), puis, dans la barre de commande de Studio :
require(game.ServerStorage.Tools.AssetBuilder).build()
Il rapporte une ligne par modèle (ok, ou pourquoi pas : un modèle dont l’identifiant vaut encore 0 dit qu’il faut l’envoyer). Clic droit sur ReplicatedStorage.Assets dans l’Explorer, « Save to File... », et enregistrez par-dessus assets/Assets.rbxm ; reconstruisez le place. Les matériaux viennent de assets/materials/*.model.json, que tools/material_variants.py gen a écrits à l’étape 5. Regardez ensuite la scène dans Studio avant de publier : un jeu publié ne dessine les maps d’un matériau qu’à partir de son pack de textures, et Studio fabrique ce paquet quand il dessine le matériau. NON MESURÉ, et NON EXÉCUTÉ sur un compte de créateur autre que celui du développeur.
7. Produits et passes (facultatif)
Le jeu ne vend rien et n’a pas de boutique. Si vous ajoutez une offre, mettez l’identifiant de son produit développeur ou de sa passe dans sale/products.json, sous une clé que vous listez dans PRODUCTS de tools/setup_ids.py, et lisez-le avec Ids.product(key) : une clé à 0 veut dire « pas en vente », et le code ne doit pas l’afficher.
8. Publier
Créez une expérience dans le Creator Hub, mettez ses identifiants universe et place dans project.json, ouvrez le place dans Studio et utilisez File, « Publish to Roblox » (ou tools/publish.py si vous gardez le projet dans git et voulez le chemin de publication testé qu’il documente). Réglez les langues prises en charge de l’expérience sur l’anglais et le français et désactivez Automatic Text Capture et le contenu traduit (le jeu se traduit lui-même, depuis src/shared/Strings.csv ; les textes de votre page de boutique sont à vous, dans les deux langues).
9. Régler l’équilibrage
Chaque nombre qui décide de la difficulté et de la générosité du jeu vit dans src/shared/Balance.luau : l’énergie et la pioche du combat, les applaudissements, le chronomètre du tour, la taille de la carte, l’or et les probabilités des récompenses, les prix de la salle des accessoires, les niveaux des Critiques, le score du spectacle du soir, l’échelle des PV et des dégâts d’un ennemi selon la taille du groupe, les chronomètres d’une partie, les soins et les PV de départ, et les bandes auxquelles les simulations d’équilibrage tiennent le jeu. Le contenu (les effets et le coût de chaque carte dans src/shared/Data/Cards.luau, les PV, les actions et les dégâts de chaque ennemi dans Data/Enemies.luau, les effets des accessoires et des tours) reste dans ses modules de données.
Changez un nombre, puis lancez les simulations : lune run tests/run_sim (une partie entière, par taille de groupe et par niveau), lune run tests/combat_sim (chaque rencontre), lune run tests/hook_sim, lune run tests/engine_sim, lune run tests/builds_sim, ou toutes avec bash tools/check.sh ; chacune prend des minutes et imprime ce qu’elle a mesuré et la bande qu’elle a ratée. lune run tools/balance_bench (voir son en-tête) essaie un changement sans toucher aux fichiers. Une bande est un verdict que vous pouvez déplacer exprès (elle est dans Balance.BANDS), jamais en silence.
Si une étape échoue
Envoyez sur la page de la ressource, dans la conversation, le numéro de l’étape et sa sortie (jamais une clé). Causes courantes : un outil à la mauvaise version (relancez rokit install), la clé à laquelle il manque une permission (l’outil dit quelle requête a échoué), un asset encore en modération.
Assistance : Botera Studio, sur Discord (https://discord.gg/enaYMavQbW).