XYZ: Das Wölfe Spiel


Es ist nun „endlich“ soweit, das Wölfe Spiel, das wir vorerst „Tinopolis“ getauft haben, zieht auf die XYZ-API um.
Und dieser Beitrag soll nun kurz erklären, was das bedeutet.

Update (2016-06-10)

Der Endpunkt /get/phases/ wurde hinzugefügt, um die einzelnen Spielphasen zu beschreiben.

Update (2016-06-14)

Die Runden, deren Daten „öffentlich“ sind, sind nun auch per API abrufbar: /get/rounds/

Die API

Eine API ist ein Application Programming Interface. Klingt super komplex, ist aber super einfach – es beschreibt, wie man mit meinen Servern sprechen muss, um an Daten zu kommen. In diesem Fall REST. Was das ist beschreibe ich nicht, der Wikipedia-Artikel tut das gut.
Meine API unterstützt nur „GET“, also das Anfragen von Daten. Das ist irgendwie logisch, immerhin sollst du das Spiel nicht manipulieren können.

JSON

JSON ist eine Art, Daten zu „kodieren“. Javascript Object Notification, also die Art und Weise, wie man in Javascript „Objekte“ niederschreibt. Standartmäßig wird JSON zurückgegeben. Die zwei Endpunkte lauten:
https://woelfe.tionsys.xyz/get/rules/ (um die Regeln zu bekommen)
https://woelfe.tionsys.xyz/get/rounds/ (um die Runden zu bekommen)
https://woelfe.tionsys.xyz/get/phases/ (um die Phasen zu bekommen)
https://woelfe.tionsys.xyz/get/[Runde]/ (um Informationen zu einer Runde zu bekommen)
Eine mögliche Antwort sähe dann so aus:

{
  "error": false,
  "code": 200,
  "message": "ok",
  "data": {
    roles:[
      {
        "name": "Wishies",
        "team": 0,
        "count": 1,
        "descr": "Ein guter St\u00e4dtler, der einmal eine Person retten kann, wenn diese durch einen Nachtmord get\u00f6tet werden kann und einmal eine Person direkt t\u00f6ten kann"
      },
      {
        "name": "Kleriker",
        "team": 0,
        "count": 2,
        "descr": "Kann jede Nacht das Haus einer Person besuchen. Sollte diese Person Mordopfer der Lunatiker werden, wird sie verschont. Kann sich nicht selber besuchen."
      }
    ],
    "actions": [
      {
        "visibility": "public",
        "type": "debug",
        "message": "Der Tag bricht an, die Lynchwahlen m\u00f6gen beginnen.",
        "timestamp": 1465012800
      },
      {
        "visibility": "public",
        "type": "lynchvote",
        "message": "Spieler \"A\" w\u00e4hlt f\u00fcr die Lynchwahl \"B\".",
        "timestamp": 1465018685
      }
    ],
    "players": [
      {
        "name": "Lebender Spieler",
        "role": -1
      },
      {
        "name": Toter Spieler",
        "role": 1
      }
    ],
    "done": false
  }
}

Anmerkung: das, was ihr zurückbekommt, ist nicht hübsch eingerückt, aber man kann es einmal durch json.parser.online.fr jagen, damit es wieder nice aussieht.

XML

Um die Daten im XML-Format zu bekommen, einfach an beides „?xml“ anhängen, also:
https://woelfe.tionsys.xyz/get/rules/?xml (um die Regeln zu bekommen)
https://woelfe.tionsys.xyz/get/rounds/?xml (um die Phasen zu bekommen)
https://woelfe.tionsys.xyz/get/phases/?xml (um die Phasen zu bekommen)
https://woelfe.tionsys.xyz/get/[Runde]/?xml (um Informationen zu einer Runde zu bekommen)
Beispiel für einen Datensatz:

<?xml version="1.0"?>
<response>
    <error/>
    <code>200</code>
    <message>ok</message>
    <data>
        <roles>
            <entry>
                <name>Wishies</name>
                <team>0</team>
                <count>1</count>
                <descr>Ein guter St&#xE4;dtler, der einmal eine Person retten kann, wenn diese durch einen Nachtmord get&#xF6;tet werden kann und einmal eine Person direkt t&#xF6;ten kann</descr>
            </entry>
            <entry>
                <name>Kleriker</name>
                <team>0</team>
                <count>2</count>
                <descr>Kann jede Nacht das Haus einer Person besuchen. Sollte diese Person Mordopfer der Lunatiker werden, wird sie verschont. Kann sich nicht selber besuchen.</descr>
            </entry>
        </roles>
        <actions>
            <entry>
                <visibility>public</visibility>
                <type>debug</type>
                <message>Der Tag bricht an, die Lynchwahlen m&#xF6;gen beginnen.</message>
                <timestamp>1465012800</timestamp>
            </entry>
            <entry>
                <visibility>public</visibility>
                <type>lynchvote</type>
                <message>Spieler "A" w&#xE4;hlt f&#xFC;r die Lynchwahl "B".</message>
                <timestamp>1465019270</timestamp>
            </entry>
        </actions>
        <players>
            <entry>
                <name>Lebender Spieler</name>
                <role>-1</role>
            </entry>
            <entry>
                <name>Toter Spieler</name>
                <role>-1</role>
            </entry>
        </players>
        <done/>
    </data>
</response>

Anmerkung: ihr bekommt wieder nichts ordentliches, sondern eine alles-in-einer-Zeile-Lösung. Das spart Traffic.

Was bedeuten die Daten?

Fangen wir mit dem leichtesten an: „data.players“. Jeder Eintrag ist zuerst der Name, die Rolle steht auf „-1“ (wenn die Runde läuft und der Spieler lebt) oder auf den Index seiner Rolle. Die Rollen stehen in „data.roles“.
„data.actions“ ist sicherlich das Interessanteste, denn dies enthält alles, was passiert. Während das Spiel läuft, bekommt man nur Nachrichten mit der „visibility“ = „public“ zu sehen, danach auch die mit „private“.
„type“ gibt an, was für ein Log-Eintrag das ist. Es gibt folgende:
debug für Debug-Meldungen – es ist Tag, es ist Nacht, die Schutzrollen werden informiert.
warn ist noch unbenutzt.
wishiesheal, wenn Wishies jemanden rettet.
wishieskill, wenn Wishies jemanden tötet. Wird immer zwei mal gefeuert, zuerst öffentlich, dass ein Wishies jemanden tötet, danach privat, welcher Wishies wen tötet.
kleriker, wenn der Kleriker auf Streife geht.
sma, wenn der SMA sich in die Luft jagt.
lynchvote, wenn ein Spieler für(gegen?) einen anderen Spieler stimmt.
daykill das Ergebnis der Tagesmorde.
nightkill das Ergebnis der Nachtmorde.

Das wars.
Fragen? Telegram oder Email an mich! 🙂