Battle de gooning
Sessions compétitives 2 à 4 joueurs — PvP libre ou PvE sur un lien du registre. Chrono par participant, lobby par code, battles publiques ou privées, spectateurs sans compte.
Accès
| Entrée | Route / UI |
|---|---|
| Modal chrono | Tableau de bord → « Lancer le chrono » → onglet Battle |
| Page publique join / spectateur | /battle-gooning (alias /battles) — join membre ou ?watch=ID / ?battle_id=ID sans login |
| Registre PvE | Bouton « Battle sur ce lien » sur une fiche lien |
| Bannière dashboard | Nouveauté « Battle de gooning » + tutoriel intégré |
| Invitations amis | Bannière dashboard-battle-invite-banner sur le tableau de bord |
Modes
- PvP libre (
standalone) — chacun goone à sa sauce ; critères Mix / Durée / Liens ouverts - PvE lien registre (
pve_link) — même lien pour tous ; victoire à la durée ; lien via roulette favoris, aléatoire ou fiche registre
Configuration lobby
| Paramètre | Valeurs |
|---|---|
| Joueurs max | 2, 3 ou 4 |
| Timer | Défaut site · durée fixe · fourchette min–max (ex. 20–30 min, tirage au lancement) |
| Visibilité | Privée (code uniquement) · Publique (listée sur /battle-gooning et spectatable) |
| Code join | 6 caractères alphanumériques — l'hôte peut le régénérer en lobby (POST regenerate-code) |
| Opt-in pseudo public | Case à cocher lobby / profil — setting battle_show_name_public (défaut masqué) |
Page publique & anonymat
Sur /battle-gooning, hero refondu et slides d'intro (gb_public_intro_v1 en localStorage). Les battles publiques en attente apparaissent dans un select ; les pseudos sont masqués (format M***o : première + dernière lettre visibles). Rejoindre nécessite une session membre ; la redirection login conserve le contexte (?code=, ?watch=, battle active).
Si un participant a activé battle_show_name_public, son pseudo complet est visible des spectateurs et visiteurs publics (sauf mode score caché → « Anonyme »).
Mode spectateur public (sans compte)
Accès direct : /battle-gooning?watch=ID ou ?battle_id=ID pour une battle publique (waiting, active ou finished).
- Pseudos masqués (
M***o) sauf opt-inbattle_show_name_public - Liens registre PvE : libellé « Lien masqué » / « Contenu registre masqué » — pas d'URL exposée
- Classement live, indicateur chrono actif par joueur (
session_open) - Réactions emoji : 🔥 👏 😂 💀 🏆 👀 — toggle par visiteur (
visitor_keysession ouu:{user_id})
| Action API | Méthode | Auth |
|---|---|---|
public-list | GET | Non — battles publiques en attente |
public-spectator-list | GET | Non — battles publiques actives + en attente |
public-spectator-watch | GET | Non — détail battle + participants masqués (battle_id ou join_code) |
public-spectator-react | POST | Non — body JSON { battle_id, emoji } |
Invitations amis
Depuis le lobby (hôte, statut waiting), panneau « Inviter un ami » : liste amis via /api/friends, envoi POST battle-invite-friend. Le destinataire voit une bannière sur le tableau de bord (dashboard-battle-invite-banner) alimentée par GET pending-invites ; actions Rejoindre / Ignorer (POST battle-invite-dismiss).
Barre de statut battle
Pendant une battle (waiting ou active), bandeau sticky .gb-banner sur le registre (#gbRegistreBanner) : kicker « Battle gooning · En cours » (ou « En attente »), mode, leader + score ou code lobby, bouton Chrono pour rouvrir le modal. Masqué une fois la battle terminée.
Chrono, victoire & scores
- Chrono par participant — chaque joueur démarre/arrête sa session ; arrêt via « J'ai terminé » fige durée et comptage liens à
participantEndedAt - Alertes adversaires — toast + popup quand un adversaire termine ; rappel modal si d'autres ont déjà fini alors que ton chrono tourne encore ; alertes timer (5 min / 1 min)
- Clôture battle — automatique quand toutes les sessions sont arrêtées ; hôte peut forcer (
battle-end) - Critère Mix — score effectif = durée + (liens × 30 s bonus) ; critère Liens ou Durée selon config
- Vainqueur — meilleur tuple selon critère ; égalité parfaite →
winner_user_idnull, flagis_tie(pas de victoire auto hôte) - Recap — classement par participant (durée, liens, score mix, rang) ; victoire ou message égalité
Tracking clics registre (critère Liens / Mix)
En PvP, le score LIENS compte les clics registre ouverts pendant la session de chaque participant, via le raccourcisseur du site — y compris pour les membres premium. Voir aussi Registre gooning.
API authentifiée (/api/gooning-battle)
| Action | Méthode | Rôle |
|---|---|---|
battle-create | POST | Créer lobby |
battle-join | POST | Rejoindre (code ou battle publique) |
battle-start | POST | Lancer (hôte, ≥ 2 joueurs) |
battle-status | GET | Polling lobby / scores (participant) |
battle-leave | POST | Quitter lobby (pas en active) |
battle-end | POST | Clôture anticipée (hôte) |
regenerate-code | POST | Nouveau code join (hôte, waiting) |
battle-random-link / battle-favorite-links | GET | Liens PvE (roulette / favoris registre) |
pending-invites | GET | Invitations battle reçues |
battle-invite-friend | POST | Inviter un ami au lobby |
battle-invite-dismiss | POST | Ignorer une invitation |
battle-show-name-public | POST | Opt-in pseudo visible spectateurs ({ enabled: bool }) |
Arrêt chrono individuel : bouton J'ai terminé dans le widget chrono (ou arrêt depuis le QR mobile).