- Kommunikation zeilenweise per UDP (utf8-kodierte Strings)
- Server öffnet einen bekannten Port
- Clients melden sich auf dem Port als Spieler an und werden ab da für jede Runde angeschrieben
- Clients haben für ihre Antwort ein recht enges Zeitfenster (250 ms)
- Ein Client kann sich als Zuschauer (Spectator) registrieren. Ein Zuschauer kann nicht aktiv an den Runden teilnehmen, erhält aber alle Nachrichten, die an alle Clients geschickt werden.
- client->server:
REGISTER;name - client->server:
REGISTER_SPECTATOR;name
Falls name gültig und neu ist, oder die Registrierung unter demselben Namen zuletzt von derselben IP kam:
- Server kommuniziert mit dem Client ab jetzt über die Ursprungs-IP und den Ursprungs-Port der Register-Nachricht.
- server->client:
REGISTERED
Ansonsten:
- server->client:
REJECTED
Bei erfolgreicher Anmeldung werden all Spectators über den aktuellen Score (auch 0 Punkte eines neuen Spielers) unterrichtet:
- server->spectators:
SCORE;spielerpunkte*(siehe unten)
Kriterien für gültige Spielernamen:
- enthalten keinen whitespace
- enthalten keine Doppelpunkte, Semikolons oder Kommas
- sind maximal 20 Zeichen lang
- client->server:
UNREGISTER - server->client:
UNREGISTERED
Alle 2 Sekunden bekommt jeder client den "Herzschlag" des Servers übermittelt, um beim Ausbleiben reagieren zu können.
- server->client:
HEARTBEAT
- server->clients:
ROUND STARTING;token - client->server:
JOIN;token
Falls mindestens ein Spieler teilnehmen will:
- Die teilnehmenden Spieler werden vom Server in eine zufällige Reihenfolge gebracht
- server->clients:
ROUND STARTED;rundennummer;spielernamen(wobeispielernameneine kommagetrennte List der Mitspieler ist, in der Reihenfolge, in der diese Runde gespielt wird)
Ansonsten:
- server->clients:
ROUND CANCELED;NO_PLAYERS(woraufhin eine neue Runde gestartet wird)
(Runden mit nur einem Spieler werden direkt nach dem Start mit ROUND CANCELED;ONLY_ONE_PLAYER abgebrochen)
Reihum:
- server->client:
YOUR TURN;token - client->server:
command;token(wobeicommandeins der folgenden ist:ROLL,SEE)
Bei ROLL:
- server->clients:
PLAYER ROLLS;name - server->client:
ROLLED;dice;token - client->server:
ANNOUNCE;dice;token - server->clients:
ANNOUNCED;name;dice
Falls Mäxchen angesagt wurde, wird sofort aufgedeckt. Wenn tatsächlich Mäxchen gewürfelt wurde, verlieren alle anderen Spieler, ansonsten der ansagende.
- server -> clients:
PLAYER LOST;names;reason(wobei names eine kommagetrennte liste ist)
Bei SEE:
- Server überprüft, ob zuletzt angesagte Würfel okay sind und bestimmt, wer verloren hat
- server->clients:
PLAYER WANTS TO SEE;name - server->clients:
ACTUAL DICE;dice - server->clients:
PLAYER LOST;name;reason
Wann immer ein Spieler nicht rechtzeitig antwortet oder etwas völlig falsch macht:
- server->clients:
PLAYER LOST;name;reason
Jeder Spieler, der NICHT VERLIERT, bekommt einen Punkt.
Nach Ende einer Runde:
- server->clients:
SCORE;spielerpunkte*(wobeispielerpunkteeine kommagetrennte Liste von Einträgen in der Formname:punkteist)
SEE_BEFORE_FIRST_ROLL: Spieler wollte sehen, war aber als erster am Zug (es gab also noch keine Ansage vorher)LIED_ABOUT_MIA: Spieler hat Mäxchen angesagt, ohne Mäxchen zu habenANNOUNCED_LOSING_DICE: Spieler hat zu niedrige Würfel angesagtDID_NOT_ANNOUNCE: Spieler hat nicht (rechtzeitig) angesagt, was gewürfelt wurdeDID_NOT_TAKE_TURN: Spieler hat nicht (rechtzeitig) einen Zug gemachtINVALID_TURN: Spieler hat einen ungültigen Zug gemachtSEE_FAILED: Spieler wollte sehen, Ansage des vorhergehenden Spielers war aber richtigCAUGHT_BLUFFING: Spieler hat mehr angesagt als er hatte, und der nachfolgende Spieler wollte sehenMIA: Es wurde Mäxchen aufgedeckt