HOW TO CREATE A NEW SLOT — le guide pratique
De zéro à un zip prêt pour Stake Engine, sans toucher au moteur. Durée réaliste : 1 journée avec des assets prêts (hors production artistique et math finale).
0. Démarrer l'atelier
# terminal 1 — le moteur (preview live)
cd "SLOT FACTORY/engine" && npm run dev # → http://localhost:5177
# terminal 2 — le panneau Factory
node "SLOT FACTORY/factory/site/server.mjs" # → http://localhost:5178
Node vit dans
~/.local/node-v22.16.0-darwin-arm64/binsur cette machine — ajoutez-le au PATH si besoin.
1. Créer le jeu (30 secondes)
Dans le panneau (localhost:5178) : + Create New Game → id (snake_case), nom affiché, template de départ (_placeholder ou demo_frontier).
Ou en ligne de commande :
curl -X POST 'http://localhost:5178/api/create' \
-H 'Content-Type: application/json' \
-d '{"id":"space_raiders","name":"Space Raiders","from":"_placeholder"}'
Le jeu naît jouable immédiatement avec le thème du template. Il apparaît dans la sidebar et sur localhost:5177/?game=space_raiders.
2. Habiller le thème (le gros du travail)
Les images — onglet Assets
Glissez-déposez chaque fichier sur sa carte : il est renommé et installé automatiquement selon la nomenclature (<theme>_<categorie>_<element>[_<idx>][_<etat>].webp). L'ancien fichier part en .bak.
Ce qu'il faut produire (≈ 52 fichiers, voir SLOT_ASSET_MANIFEST) :
| Catégorie | Fichiers | Notes |
|---|---|---|
| Fonds | base + bonus × landscape + portrait | 1920×1080 / 1080×2340 |
| Symboles | 5 lows + 4 highs + wild + scatter, × idle + win | 512×512, PNG/WebP alpha |
| Cadre + plaque | 9-slice | les marges de slice sont dans theme/assets.json |
| Boutons | spin (rond), auto/turbo/info/sound, × default + pressed | |
| Panneau bonus | 1 | intro/récap free spins |
| Sons | spin, reelstop, click, win, bigwin, scatter, bonustrigger, rollup ×2, error, bgm | WAV/MP3/OGG |
Les couleurs — games/<id>/theme/tokens.json
primary, panel, text, win… deviennent les variables CSS --ck-* de toute l'UI (modales, plaques, toasts). Un thème western et un thème horreur n'ont aucun CSS à écrire.
Les textes — games/<id>/locales/en.json
en obligatoire (règle Stake). Ajoutez fr.json etc. et listez-les dans game.config.json > localization.supported.
Règle d'or : le moteur ne connaît que des clés logiques (
symbol.wild,ui.spin). Aucun nom de fichier, aucun nom de thème dans le code. Une clé manquante → warning dans l'onglet Validation + placeholder procédural — jamais de crash.
3. Régler le gameplay — game.config.json
layout.grid(5×3, 6×4…),winSystem(lines),paylineSetIdlayout.spin: durée, stagger, anticipation scatterfeatures: freeSpins (intro/récap/retrigger), bonusBuy, autoplay, turbowinTiers: seuils big/mega/epic (15/30/100× par convention Stake) et durées de rollupcompliance.malfunctionClause: doit restertrue(la validation bloque sinon)
4. La math — remplacer le mock
Le template embarque une math factice (math.meta.json marqué MOCK) qui alimente le RGS simulé en dev. Pour la vraie soumission :
- Produisez le package math (books
.jsonl.zst+ lookup CSV +index.json) avec math-tools. - Régénérez
math/math.meta.jsondepuisindex.json(modes, coûts, RTP, wincap, paytable) — jamais à la main : c'est la source de vérité des coûts affichés. - Le warning
MATH MOCKdisparaît de la validation.
5. Prévisualiser et tester
- Onglet Preview : le jeu dans un iframe aux tailles device (desktop / iPhone / Android).
- En dev uniquement, le panneau
DEV · FORCEforce lose / win / bigwin / freespins pour vérifier chaque présentation. Ce panneau et le mock n'existent pas dans le build de production (compilés hors du bundle). - La suite de tests :
node tests/run.mjs— boot, spin, free spins, portrait, fallback thème, export sans mock.
6. Valider puis exporter
Onglet Validation : erreurs bloquantes (config, clause malfunction, assets manquants, locale) et warnings (budgets de poids : initial ≤ 10 Mo, audio ≤ 4 Mo…).
Onglet Export : build de production + zip exports/<id>-v<version>-<date>.zip avec index.html à la racine (chemins relatifs, prêt pour {team}.cdn.stake-engine.com/{game}/{version}/).
Rien n'est jamais publié automatiquement. L'upload sur Stake Engine reste un acte manuel et volontaire, avec la STAKE_SUBMISSION_CHECKLIST sous les yeux.
6bis. Porte de contrôle soumission (OBLIGATOIRE)
Avant de proposer un DOWNLOAD, la machine doit passer la reproduction des conditions réelles de Stake Engine :
node factory/qa/submission-check.mjs <gameId>
Ce test exporte le build, retire le dossier math/ (comme Stake, qui le prend pour le package RGS), sert le tout derrière un RGS au vrai format Stake (config.betLevels imbriqué, balance.currency, round), et vérifie :
- boot en JPY/ja, EUR/fr, USD/en (0 erreur JS) — attrape le BOOT ERROR ;
- la devise suit le RGS (¥ pour JPY, pas $ figé) ;
- le mode Replay (?replay=true) rejoue sans crash, bet bar visible.
Règle d'or apprise en production :
math.meta.jsonvit à la RACINE du jeu (games/<id>/math.meta.json), jamais dansmath/. Le dossiermath/ne contient QUE le package RGS (publish_files/configs/forces), et Stake le retire du frontend. Le générateur math l'écrit déjà au bon endroit.
7. Checklist de sortie
- [ ]
node factory/qa/submission-check.mjs <gameId>→ 6/6 ✓ (bloquant) - [ ]
node tests/run.mjs→ tout vert - [ ] Validation : 0 erreur, warnings compris et assumés
- [ ] Math réelle (plus de warning MOCK),
math.meta.jsonrégénéré depuisindex.json - [ ] Testé en
?social=true(vocabulaire stake.us) et dans les deux orientations - [ ] STAKE_SUBMISSION_CHECKLIST.md parcourue en entier
- [ ] Zip uploadé manuellement sur le portail, testé en sandbox avant publication