Bibliothèque

Parties, IS blob et spectateurs

Comment démarrer des parties avec le bon état initial et synchroniser ceux qui arrivent en cours de route.

Démarrer une partie sur bonk.io demande plus qu'appuyer sur « démarrer » : l'hôte envoie l'état initial de la physique (l'IS blob) et les réglages du jeu. La bibliothèque s'occupe de l'envoi, mais c'est à vous de fournir le bon blob.

Démarrer et arrêter

ts
room.startGame({ is: isBlob, gs: { bal: { 0: 0, 5: 1, 7: 2 } } });
room.stopGame();
OptionCe que c'est
isL'état initial de la physique (une chaîne LZ-String).
gsSurcharges des réglages du jeu (Partial<GameSettings>), comme bal.

Le serveur renvoie le blob tel quel à tous les clients. Un blob vide empêche le moteur physique de démarrer : les joueurs n'apparaissent pas sur le terrain et le jeu semble bloqué au chargement.

L'IS blob

L'IS blob encode les positions d'apparition, les rotations et les corps qui existent dans la partie. Il dépend de deux facteurs :

  • La carte. Un blob capturé sur une carte ne fonctionne pas sur une autre.
  • Le nombre de joueurs actifs. Le blob du 1v1 (2 joueurs) ne fonctionne pas pour le 2v2 (4 joueurs).

Blobs par défaut

Pour la carte de football par défaut et quelques modes, la bibliothèque fournit des blobs prêts à l'emploi :

ts
import { getFootballDefaultBlob, getGamemodeDefaultBlob } from 'bonktools';

getFootballDefaultBlob(2);              // 1v1
getFootballDefaultBlob(4);              // 2v2
getGamemodeDefaultBlob('football', 2);  // par mode de jeu

Pour les cartes qui varient selon le salon (classic, arrows, etc.), utilisez le cache par carte.

Cache par carte

ts
import { MapBlobCache } from 'bonktools';

const cache = new MapBlobCache('./map-blob-cache.json');

const blob = cache.getForMap(room.currentMap, 4);   // blob de cette carte pour 4 joueurs
if (!blob) { /* capture um (veja abaixo) */ }
cache.setForMap(room.currentMap, 4, capturedBlob);

Capturer un blob

La méthode fiable consiste à le capturer depuis une vraie session. La bibliothèque inclut un utilitaire :

bash
BONK_USERNAME=votre_utilisateur BONK_PASSWORD=votre_mot_de_passe npx bonktools-capture-is https://bonk.io/123456abcde

Il rejoint le salon en spectateur et attend. Quand un vrai hôte démarre une partie dans le navigateur, il affiche le blob au format BONK_INITIAL_STATE=..., prêt à coller dans votre .env ou dans le cache par carte. Capturez un blob pour chaque nombre de joueurs actifs que vous comptez utiliser.

Le champ bal

bal indique quel corps chaque joueur contrôle, sous la forme { playerId: bodyIndex }.

ts
// bot (id 0) sans corps ; joueurs 5 et 7 avec les corps 1 et 2
room.startGame({ is, gs: { bal: { 0: 0, 5: 1, 7: 2 } } });

Utilisez toujours le mappage explicite. Avec bal: [], les corps sont attribués par ordre croissant d'id, et si des joueurs sont entrés et partis, les ids ont des trous : un joueur de l'équipe bleue peut apparaître du côté rouge.

Joueurs qui arrivent pendant une partie

Quand un joueur arrive, l'hôte doit lui remettre les données initiales. Il y a deux paquets possibles, et le client n'en accepte qu'un :

SituationPaquet envoyé
Salon au lobbyINFORM_IN_LOBBY
Partie en coursINFORM_IN_GAME (contient l'état de la partie)

La bibliothèque choisit toute seule : si une partie a été démarrée avec startGame({ is }) et est toujours active, le nouveau joueur reçoit INFORM_IN_GAME à la place de INFORM_IN_LOBBY, et voit la partie sans la redémarrer pour les autres.

Si votre bot redémarre la partie juste après l'arrivée de quelqu'un (comme le fait le salon 24h/24 pour compléter les équipes), tout fonctionne : le joueur reçoit le bon paquet puis le début de la nouvelle partie.