STAKE_SLOT_AUDIT.md
Audit des machines à sous publiables sur Stake / Stake Engine — structures fonctionnelles & standards de production. Sources : docs officielles (math-sdk, RGS, web-sdk), analyse d'archétypes du marché (fonctionnel uniquement, zéro IP), et notre expérience de review réelle (Tails Never Fails, approuvé juil. 2026).
1. La plateforme (le cadre dur)
- Modèle math pré-simulé, pas de RNG live : tous les outcomes possibles vivent dans des books (
.jsonl.zst) + lookup tables CSV (id → poids → payout). Au/play, le RGS tire une simulation pondérée et renvoie sesbookEvents.index.jsonobligatoire. → Conséquence factory : la « logique de jeu » front est une chorégraphie de présentation d'un résultat déjà connu. C'est le principe n°1 du moteur. - Frontend 100 % statique, servi depuis
https://{team}.cdn.stake-engine.com/{game}/{version}/index.html. Pas de réseau sortant hors RGS (CSP stricte —blob:bloqué, vécu sur TNF). - Contrat RGS (pass/fail à la publication) :
- Launch params :
sessionID,lang(16 langues),device(mobile/desktop),rgs_url(jamais en dur),currency,social. - Montants en micro-unités entières (1 000 000 = 1.00).
POST /wallet/authenticate→ balance,minBet/maxBet/stepBet/defaultBetLevel/betLevels[], flags juridictionsocialCasino,disabledTurbo,disabledFullscreen, round actif à reprendre.POST /wallet/play(mise × multiplicateur du bet mode, divisible par stepBet) ·POST /wallet/end-round(obligatoire pour créditer) ·POST /bet/event(checkpoints de reprise) ·POST /wallet/balance.- Codes d'erreur à gérer en UI :
ERR_IPB,ERR_IS,ERR_GLE,ERR_ATE,ERR_VAL,ERR_LOC,ERR_GEN,ERR_MAINTENANCE(+ erreurs dans un body 200 — vécu TNF). - 19 devises fiat + XGC/XSC (stake.us social).
- Web-sdk officiel (optionnel mais référence des reviewers) : Svelte 5 + PixiJS 8, XState (machine de mise), Howler (audio), 5 samples = les archétypes attendus :
lines,ways,cluster,scatter,price. Architecture à 2 niveaux :bookEventsserveur → décomposés enemitterEventsclient atomiques (ex. tumble → init/explode/remove/slideDown). Le factory adopte ce pattern (déjà le nôtre sur TNF :playBook+ handler map).
2. Structure générale (écran & responsive)
| Sujet | Standard observé | Choix factory |
|---|---|---|
| Format | Design 1920×1080, canvas scalé au viewport (pas d'art par device) | Stage fixe scalé (validé TNF landscape) |
| Orientations | Portrait-first sur mobile (device=mobile), les 2 orientations fonctionnelles, re-flow (pas de letterbox) |
Preset portrait « couches vw plein écran » (validé TNF v2) + preset landscape stage fixe |
| Organisation | Grille centrée, logo haut, contrôles dans le tiers bas « thumb zone » en portrait, gros SPIN rond bas-centre/droit | Identique |
| Cadre des rouleaux | Optionnel mais quasi systématique (9-slice ou pièces) | Module frame (2 modes, patterns TNF) |
| Fond | Statique (JPEG/WebP) par défaut ; parallax/vidéo = opt-in coûteux | Statique par défaut |
| UI intégrée vs séparée | Bet bar séparée de la scène, ancrée bas | Identique |
| Infos mise/gain | Balance + mise + gain toujours visibles, en devise réelle | Plaques du moteur |
| Safe areas | env(safe-area-inset-*), rien de tappable dans les ~30 px du geste home |
Géré par le preset layout |
| Touch targets | ≥ 44×44 px | Lint de layout du Factory |
3. Structure des rouleaux
- Grilles types : 5×3 (lines 10–25 / ways 243), 5×4 (1 024 ways), 6×5 (scatter-pays tumble), 5×5 (grid/cluster), Megaways 6×2–7 (dynamique).
- Timing : spin normal 2,0–3,0 s (arrêt gauche→droite, stagger 150–300 ms) ; turbo 0,5–1 s ; tap-to-stop = slam au résultat. ⚠
disabledTurbo(flag RGS) à respecter (marchés ≥2,5 s/cycle). Anticipation (ralenti + highlight) sur le dernier rouleau quand 2 scatters sont posés. - Masque/cadre/fond de grille : masque rectangulaire systématique, blur des strips pendant le spin (texture floue ou motion blur procédural).
- Cascades/tumble : explode ~300 ms → slide ~300–500 ms → drop avec rebond ; multiplicateurs collectés volent vers un compteur en fin de séquence.
- Ordre & anticipation = pure présentation : le board final vient du book ; la chorégraphie est paramétrable sans toucher aux maths.
4. Symboles (conventions)
- 10–12 symboles distincts : 4–5 low (royals/gemmes), 4–5 high (thème), 1 wild, 1 scatter/bonus, 0–2 spéciaux (orbe multiplicateur, collector).
- Pays : low 5-oak ≈ 0,5–2× ; premium 5-oak ≈ 10–50× ; scatter-pays 8–9 = 0,25–10×, 12+ = 2–50×.
- États : statique (idle) ✔ · variante floue de spin · anim win/land · état « dim » des positions non gagnantes ✔ · anticipation (scatter) · states spéciaux selon features (sticky, locked, transformed, géants).
- Anim : Spine squelettique = norme premium ; sprite-sheets = alternative légère ; notre v1 = frame win + effets procéduraux (suffisant, upgrade Spine possible plus tard).
5. Interface utilisateur (inventaire standard)
Composants attendus : Spin · Stop/slam · Autoplay (compte + conditions d'arrêt) · Turbo (si flag OK) · Mise −/+ (pilotée par betLevels[] du RGS, jamais une liste custom) · MAX · Balance · Mise · Dernier gain · Compteur de gain (rollup) · Menu/burger · Info/règles · Paytable (valeurs mises à jour avec la mise) · Settings · Son/musique on-off · Fullscreen (si flag OK) · Historique (opéré par la plateforme) · Bonus Buy (prix en multiple de mise, à côté de la grille) · Retour · Fermer · Modales · Tooltips · Notifications · Erreurs (codes RGS mappés) · Écran de chargement (logo + barre déterminée + « tap to continue » = geste de déverrouillage audio).
États par bouton : normal ✔ / pressed ✔ / disabled ✔ / hover (desktop) / selected / loading / highlighted — fallbacks procéduraux au moteur.
6. Bonus & features (conventions du marché)
| Feature | Convention | Notes factory |
|---|---|---|
| Free spins | 3+ scatters (4 en 6×5) → célébration → écran intro « X FREE SPINS » → fond/musique dédiés → compteurs spins/gain persistants → retrigger toast → écran récap « TOTAL WIN » | = books du mode BONUS ; module v1 |
| Bonus buy | ≈ 100× standard (gamme 25–500×, ladders multi-tiers 80/200/400×) ; buy-RTP déclaré séparément ; désactivé si ante bet | Déjà maîtrisé (TNF ×100) ; module v1 |
| Ante bet | +25 % de coût → ×2 fréquence du trigger (désactive le buy) | Module v2 |
| Multiplicateurs | Orbes 2×–500× sommés (scatter-pays) ou progressifs (cascade : +1×/tumble, persistants en FS) | Module v1 (présentation) |
| Hold & Win / respins | 3×3 cash symbols → 3 respins reset | Module v2 |
| Pick / Wheel | Écrans dédiés, résultat du book | Modules v2 |
| Wilds spéciaux (expanding/sticky/walking/stacked) | Présentation d'events du book | Selon demande de jeu |
| Max win cap | 5 000–50 000× déclaré ; le round s'arrête au cap avec célébration « MAX WIN » ; books cappés dans les maths | Déjà maîtrisé (TNF ×15 000) |
| Gamble | Rare sur Stake, contraintes réglementaires | Hors périmètre v1 |
Présentation des gains (tiers) : régulier < 10× · Big ≥ 10–15× · Mega ≥ 30–50× · Epic ≥ 100× (ladders 25/50/100/250× aussi observés). Takeover plein écran escaladant + pluie de pièces + rollup skippable (~1 s petit gain, 3–8 s gros, tap-to-skip obligatoire). Pas de célébration pour un gain ≤ mise (règle UKGC saine à appliquer partout).
7. Vidéo & animations — quand utiliser quoi
| Besoin | Solution la plus légère/robuste |
|---|---|
| Micro-feedback (boutons, glow, pulse, compteurs) | CSS/procédural — zéro asset |
| Anim de symbole | Frame win + tween moteur (v1) → Spine (v2 si besoin) |
| Explosions/FX localisés | Sprite-sheet atlas |
| Transition de scène | Fondu/shader léger moteur |
| Intro bonus / max win | Vidéo MP4 plein écran muette + piste Web Audio synchro (pattern TNF validé, contourne les autoplay policies) |
| Personnage réactif | Chroma-key runtime sur canvas (clips MP4 fond uni, keying distance couleur + de-spill) — différenciateur Cool Kids, module opt-in |
| Scène bonus séparée | Overlay DOM/Pixi (pas une page) |
8. Audio (catalogue standard)
bgm base (loop) · bgm bonus (loop) · ambiance · spin · reel stop (par rouleau) · anticipation (riser) · win + tiers (big/mega/epic) · scatter/wild/bonus trigger · rollup tick + ding terminal · boutons · erreur · voix (opt-in). Déverrouillage sur premier geste, mute persisté, duck/hold de la bgm pendant les cinématiques (pattern TNF). Format : MP3 (notre pipeline Web Audio buffers validé) ; audio-sprites en option d'optimisation.
9. Compliance (checklist condensée — détail dans STAKE_SUBMISSION_CHECKLIST.md)
RTP par mode (buy inclus) dans les règles · max win déclaré · clause « malfunction voids all pays » · paytable complète et liée à la mise courante · autoplay avec conditions d'arrêt (flag-able) · turbo/fullscreen derrière les flags RGS · balance/mise/gain toujours visibles · social stake.us : XGC/XSC, wording sans bet/cash/$ (couche moteur, auditée 0 résidu sur TNF) · reprise de round exacte (authenticate + bet/event) · 16 langues ou fallback en propre · rien qui vise les mineurs · pas de « near-miss » fabriqué hors maths certifiées.
10. Budgets de perf observés (détail dans PERFORMANCE_BUDGET.md)
Payload initial jouable < 5–10 Mo (reste lazy) · total type 5–20 Mo (premium Spine-heavy 20–50 Mo gaté) · first playable < 5–10 s en 4G · 60 fps mobile milieu de gamme (WebGL) · atlas ≤ 2048² · audio ≤ 2–4 Mo · WebP partout (~−50 % vs PNG). Note Cool Kids : TNF (123 Mo, jeu vidéo-heavy) est l'exception assumée du style « personnage vidéo » — les slots reels du factory doivent tenir les budgets ci-dessus.
11. Ce que ça implique pour le moteur (synthèse)
- Le contrat RGS est la spec dure → la couche
stake-rgs(déjà éprouvée) est le socle commun n°1. - Les 5 archétypes web-sdk (lines/ways/cluster/scatter/price) = nos templates cibles ; v1 :
lines-5x3,ways-5x3,ultra-simple(price-like, ADN TNF). - Le pattern bookEvents → emitterEvents structure toute la présentation (déjà le nôtre).
- Les attentes joueurs les plus fortes : thumb-zone portrait, spin 2–3 s + turbo flag-é, ladder Big/Mega/Epic skippable, intro/récap de free spins, buy ~100×, RTP+max win dans l'info, wording social-safe.