# FreeDoko Netzwerkprotokoll

## Nachrichttypen

FreeDoko kennt drei Arten von Nachrichten:

- einfache Nachrichten (Syntax)
- spezielle Nachrichten (Syntax)
- normale Nachrichten (Syntax)

### einfache Nachrichten

Einfache Nachrichten werden nur für die Verbindung genutzt.

### spezielle Nachrichten

Spezielle Nachrichten sind Nachrichten, die nichts mit dem Spiel an sich zu tun haben. Sie sind Hilfsmittel für die Kommunikation. Die wichtigste spezielle Nachricht ist die Empfangsbestätigung.

### normale Nachrichten

Alle Nachrichten die den Spielverlauf betreffen sind normale Nachrichten. Auch die Nachrichten zum Chatten fallen unter die normalen Nachrichten.

### Zeit

Die Zeit gibt an, zu welchem Zeitpunkt (bzgl. des absendenden Rechners) die Nachricht losgeschickt wurde. Sie kann z.B. verwendet werden, um die Rechner zu synchronisieren. Die Zeit wird bei jeder speziellen und normalen Nachricht mit übertragen.

Statt einer Zeit kann auch `-` verwendet werden, dann wird die Zeit ignoriert.

### Nummer

Jede normale Nachricht wird mit einer (fortlaufenden) Nummer versehen. Diese wird genutzt, um die Nachrichten in der richtigen Reihenfolge abzuarbeiten und um den Verlust von Nachrichten zu bemerken.

Statt einer Nummer kann auch - verwendet werden, dann wird die Nachricht sofort ausgewertet.

## Syntax

Eine Nachricht von FreeDoko besteht immer aus eine Zeile, d.h. sie endet mit einem Zeilenendezeichen (\n).

### einfache Nachrichten

Eine einfache Nachricht besteht nur aus Text. Das erste Zeichen darf weder eine Ziffer noch ein Minuszeichen sein.

Beispiel: `FreeDoko server`

### spezielle Nachrichten

Eine spezielle Nachricht beginnt mit der Zeit, gefolgt von einem Doppelpunkt. Dahinter folgt der Nachrichteninhalt.

Beispiel: `12345.67: ping: 10`

### normale Nachrichten

Eine spezielle Nachricht beginnt mit der Zeit, gefolgt von einem Doppelpunkt. Darauf folgt die laufende Nummer, gefolgt von einem Doppelpunkt. Dahinter folgt der Nachrichteninhalt.

Beispiel: `12345.67: 12: Name: Diether`

### Zeit

Der Syntax der Zeit ist `Sekunden.Milisekunden` oder `-`.

Beispiel: `12345.67`

### Nummer

Die Nummer ist eine ganze positive Zahl oder `-`.

Beispiel: `12`

## Nachrichten

### einfache Nachrichten

`FreeDoko server`
  Diese Nachricht wird beim Aufbei einer Verbindung vom Server gesendet. Daran kann erkannt werden, daß es eine Verbindung zu einem FreeDoko-Server ist.
`bye`
  Diese Verbindung wird geschlossen.

### spezielle Nachrichten

`received: $Nummer`
  Rückmeldung, daß die (normale) Nachricht mit der Nummer $Nummer empfangen wurde.
`ping`
  Mit `pong` antworten. Damit kann z.B. die Verbindung getestet werden
`pong`
  Anwort auf ein ping
`ping: $Nummer`
  Wie ping, hier wird zusätzlich eine Nummer mitgegeben um mehrere pings unterscheiden zu können.
`pong: $Nummer`
  Antwort auf ping: $Nummer.

### normale Nachrichten

Die normalen Nachrichten steuern den Spielverlauf. Daher werde diese nicht jederzeit akzeptiert. Außerdem gibt es noch die Unterscheidung zwischen Elter und Kind-Nachrichten.

#### jederzeit

`name: $Name`
  Der Name der Verbindung (der Spielername)
`chat: $Text`
  Chatten von $Text
`ask: $Frage`
  Fragt nach $Frage (z.B. `name`)
  Erlaubte Fragen:
  - name
  - rules

#### Turniereinstellung

Nachrichten, die vor dem Start des Turniers gesendet werden:

`player $Nummer: $Einstellung`
  Für den Spieler $Nummer wird eine der folgenden Einstellungen getätigt:
  `type = $Typ`
    Gibt an, wer für die Spieleraktionen zuständig ist. $Typ kann folgende Werte annehmen:
    network
      Der Elter kümmert sich um den Spieler.
    local
      Das Kind kümmert sich um den Spieler. Normalerweise hat jedes Kind nur einen Spieler, um den es sich kümmert.
  `name = $Name`
    Der Spieler hat den Namen $Name
`players switch: $1 $2`
  Die beiden Spieler $1 und $2 werden vertauscht, dabei sind '$1' und '$2' Zahlen zwischen 0 und 3.
`rules`
  Als nächstes werden die Regeln in einem Block (`{ ... }`) übertragen. Bis der Block beendet wird bestehen die Nachrichten nur aus `$Typ = $Wert`.
`rule: $Typ = $Wert`
  Die Regel $Typ wird auf $Wert gesetzt
  Beispiel: `rule: with nines = false`

#### Turnier

Nachrichten, die während eines Turniers gesendet werden:

`party start`
  Das Turnier startet.
`party start round: $Runde`
  Die Runde $Runde des Turniers startet.
`party finish`
  Das Turnier endet.

### Wer darf was?

Elter | Kind | Nachricht
--- | --- | ---
E | K | name
E | K | chat
E | K | ask
E |  | player $Nummer: type
E | K | player $Nummer: name
E |  | players switch
E |  | rules
E |  | rule
E |  | party start
E |  | party start round
E |  | party finish

## Kommunikation

Nachfolgend ist eine beispielhafte Übersicht über die Kommunikation zwischen dem Elter und dem Kind.

Elter | Kind
--- | ---
Servertypinformation |
Name |
| Name
Regeln |
Spielernummer |
Regeländerung |
starte Turnier |
starte Spiel |
verteile Karten |
Frage nach Vorbehalt |
| Vorbehalt
Spieltyp (+ Solospieler, ...) |
gespielte Karten |
Frage nach zu spielender Karte |
| zu spielende Karte
schließe Stich |
Ansage |
| Ansage
Spielende |
Turnierende |
Verbindungsabbruch |