# 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.

### 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.

## 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 einem Stern, gefolgt von 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. Dahinter folgt der Nachrichteninhalt.

Beispiel: `12345.67: Name: Diether`

### Zeit

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

Beispiel: `12345.67`

## 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.
`ping`
  Wie bei spezielle Nachrichten.

### spezielle Nachrichten

`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`
`party: seed: $Wert`
  Der Startwert ist $Wert.
  Beispiel: `party: seed: 3`
`party: startplayer: $Wert`
  Der Startspieler ist $Wert.
  Beispiel: `party: startplayer: 0`

#### 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.

#### Spiel

Nachrichten, die während eines Spiels gesendet werden:

`gameplay action`
  Eine Spielaktion (wie Vorbehalt und gespielte Karte).
`game: start`
  Das Spiel startet.
`game: finish`
  Das Spiel endet.
`game: startplayer: $Startspieler`
  Der Startspieler vom Spiel ist $Startspieler.
`game: seed: $Startwert`
  Der Startwert vom Spiel ist $Startwert.
`game: hand $Spieler: $Blatt`
  Spieler $Spieler hat das Blatt $Blatt.

### 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
E | K | gameplay action
E |  | game: start
E |  | game: finish
E |  | game: close
E |  | game: startplayer
E |  | game: seed
E |  | game: hand $Player

## 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 |
Vorbehalte |
| Vorbehalt
Spieltyp (+ Solospieler, ...) |
gespielte Karten |
| gespielte Karte
schließe Stich |
Ansage |
| Ansage
Spielende |
Turnierende |
Verbindungsabbruch | Verbindungsabbruch

offizielle Internetseite