XML-Elemente des Spiels Blokus
Diese Dokumentation beschreibt die spielspezifischen Elemente des XML-Protokolls für das Spiel Blokus.
Spielstatus
Die folgende XML-Struktur beschreibt den regelmäßig mitgeteilten Spielstatus. Gesendet wird diese Nachricht immer dann, wenn sich etwas am Spielfeld ändert. Er wird außerdem vor der ersten Zugaufforderung gesendet.
In dem Status sind folgende Informationen enthalten:
- Das Team, welches als Erstes zum Zug aufgefordert wird
- Wie viele Züge gemacht wurden
- Welcher Stein im ersten Zug gelegt werden muss
- Die wievielte Runde es ist
- Das aktuelle Spielfeld
- Welche Steine welche Farbe noch zur Verfügung hat
Das Spielfeld enthält für jede Koordinaten, die belegt ist, ein field-Element mit den Koordinaten und der Farbe die an der Stelle ist.
Der Koordinatenursprung (0,0) liegt oben-links.
Der zuletzt im Spiel gespielte Zug lastMove ist wie ein gewöhnlicher Zug aufgebaut.
Das Element <lastMove>...</lastMove> ist nur enthalten,
wenn bereits ein Zug gemacht wurde.
Der erste Spielstatus enthält es garantiert nicht.
<room roomId="ROOM_ID">
<data class="memento">
<state class="state" startTeam="ONE" turn="1" startPiece="PENTO_X" round="1">
<lastMove class="sc.plugin2027.SetMove">
<piece color="BLUE" kind="PENTO_X" rotation="NONE" isFlipped="false">
<position x="6" y="17"/>
</piece>
</lastMove>
<board>
<field x="7" y="17" content="BLUE"/>
<field x="6" y="18" content="BLUE"/>
<field x="7" y="18" content="BLUE"/>
<field x="8" y="18" content="BLUE"/>
<field x="7" y="19" content="BLUE"/>
</board>
<lastMoveMono/>
<blueShapes>
<shape>MONO</shape>
<shape>DOMINO</shape>
<shape>TRIO_L</shape>
<shape>TRIO_I</shape>
<shape>TETRO_O</shape>
<shape>TETRO_T</shape>
<shape>TETRO_I</shape>
<shape>TETRO_L</shape>
<shape>TETRO_Z</shape>
<shape>PENTO_L</shape>
<shape>PENTO_T</shape>
<shape>PENTO_V</shape>
<shape>PENTO_S</shape>
<shape>PENTO_Z</shape>
<shape>PENTO_I</shape>
<shape>PENTO_P</shape>
<shape>PENTO_W</shape>
<shape>PENTO_U</shape>
<shape>PENTO_R</shape>
<shape>PENTO_Y</shape>
</blueShapes>
<yellowShapes>
<shape>MONO</shape>
<shape>DOMINO</shape>
<shape>TRIO_L</shape>
<shape>TRIO_I</shape>
<shape>TETRO_O</shape>
<shape>TETRO_T</shape>
<shape>TETRO_I</shape>
<shape>TETRO_L</shape>
<shape>TETRO_Z</shape>
<shape>PENTO_L</shape>
<shape>PENTO_T</shape>
<shape>PENTO_V</shape>
<shape>PENTO_S</shape>
<shape>PENTO_Z</shape>
<shape>PENTO_I</shape>
<shape>PENTO_P</shape>
<shape>PENTO_W</shape>
<shape>PENTO_U</shape>
<shape>PENTO_R</shape>
<shape>PENTO_X</shape>
<shape>PENTO_Y</shape>
</yellowShapes>
<redShapes>
<shape>MONO</shape>
<shape>DOMINO</shape>
<shape>TRIO_L</shape>
<shape>TRIO_I</shape>
<shape>TETRO_O</shape>
<shape>TETRO_T</shape>
<shape>TETRO_I</shape>
<shape>TETRO_L</shape>
<shape>TETRO_Z</shape>
<shape>PENTO_L</shape>
<shape>PENTO_T</shape>
<shape>PENTO_V</shape>
<shape>PENTO_S</shape>
<shape>PENTO_Z</shape>
<shape>PENTO_I</shape>
<shape>PENTO_P</shape>
<shape>PENTO_W</shape>
<shape>PENTO_U</shape>
<shape>PENTO_R</shape>
<shape>PENTO_X</shape>
<shape>PENTO_Y</shape>
</redShapes>
<greenShapes>
<shape>MONO</shape>
<shape>DOMINO</shape>
<shape>TRIO_L</shape>
<shape>TRIO_I</shape>
<shape>TETRO_O</shape>
<shape>TETRO_T</shape>
<shape>TETRO_I</shape>
<shape>TETRO_L</shape>
<shape>TETRO_Z</shape>
<shape>PENTO_L</shape>
<shape>PENTO_T</shape>
<shape>PENTO_V</shape>
<shape>PENTO_S</shape>
<shape>PENTO_Z</shape>
<shape>PENTO_I</shape>
<shape>PENTO_P</shape>
<shape>PENTO_W</shape>
<shape>PENTO_U</shape>
<shape>PENTO_R</shape>
<shape>PENTO_X</shape>
<shape>PENTO_Y</shape>
</greenShapes>
<validColors>
<color>BLUE</color>
<color>YELLOW</color>
<color>RED</color>
<color>GREEN</color>
</validColors>
</state>
</data>
</room>
Spiel betreten ohne Reservierungscode
Betritt ein beliebiges offenes Spiel:
<join gameType="swc_2027_blokus"/>
Sollte kein Spiel offen sein, wird so ein neues erstellt.
Je nachdem ob paused in server.properties true oder false ist,
wird das Spiel pausiert gestartet oder nicht.
Spielzug
Aufforderung
Wenn der eigene Client am Zug ist, folgt nach dem Spielstatus diese Aufforderung, dass der Server einen Zug erwartet:
<room roomId="ROOM_ID">
<data class="moveRequest"/>
</room>
Zug senden
Beim ersten Zug muss ein Stein platziert werden. Danach gibt es immer die Option zu passen.
Passen
Ein Passen-Zug sieht wie folgt aus:
<room roomId="ROOM_ID">
<data class="sc.plugin2027.SkipMove">
<color>TEAM_FARBE</color>
</data>
</room>
Die Teamfarbe muss angegeben werden wie im Memento angegeben in validColors,
also BLUE, YELLOW, RED oder GREEN.
Hier muss die Farbe eingetragen werden,
die eigentlich dran wäre,
aber passt.
Setzen
Ein Zug im Spiel Blokus besteht immer aus einem Stein (kind),
einer Farbe (color),
ob und wie der Stein rotiert ist (rotation),
ob der Stein gespiegelt ist (isFlipped)
und Koordinaten an die der Stein platziert werden soll (position):
<room roomId="ROOM_ID">
<data class="sc.plugin2027.SetMove">
<piece color="BLUE" kind="PENTO_U" rotation="NONE" isFlipped="false">
<position x="0" y="0"/>
</piece>
</data>
</room>",
Die Koordinaten geben hierbei die Ecke oben-links vom Stein an.
An der Koordinate muss nicht zwingend ein Stück des Steins liegen (Beispiel: Pento-X).
Die Farbe muss nach den Regeln angegeben sein.
Wenn Spieler 1 anfängt,
muss er im ersten Zug also BLUEangeben,
dann Spieler 2 im zweiten Zug YELLOW,
dann Spieler 1 im dritten Zug RED
und dann Spieler 2 im vierten Zug GREEN.
Die Rotation kann mit folgenden Werten angegeben werden:
RIGHTMIRRORLEFT-
NONEDie Spiegelung ist auf der vertikalen-Achse und wird mittrueoderfalseangegeben. Die Steine haben die gleichen Namen wie in der Anleitung, müssen aber wie folgt geschrieben sein: MONODOMINOTRIO_LTRIO_ITETRO_OTETRO_TTETRO_ITETRO_LTETRO_ZPENTO_LPENTO_TPENTO_VPENTO_SPENTO_ZPENTO_IPENTO_PPENTO_WPENTO_UPENTO_RPENTO_XPENTO_Y
Spielergebnis
Wenn das Spiel vorbei ist, erhalten die Clients das Ergebnis der Partie:
<room roomId="ROOM_ID">
<data class="result">
<definition>
<fragment name="Siegpunkte">
<aggregation>SUM</aggregation>
<relevantForRanking>true</relevantForRanking>
</fragment>
<fragment name="Punkte">
<aggregation>AVERAGE</aggregation>
<relevantForRanking>true</relevantForRanking>
</fragment>
</definition>
<scores>
<entry>
<player name="Spieler 1" team="ONE"/>
<score>
<part>2</part>
<part>137</part>
</score>
</entry>
<entry>
<player name="Spieler 2" team="TWO"/>
<score>
<part>0</part>
<part>74</part>
</score>
</entry>
</scores>
<winner team="ONE" regular="true" reason="Spieler 1 hat am meisten Punkte erzielt."/>
</data>
</room>
Unter scores werden jeweils die beiden Spieler mit den erreichten Punkten aufgezählt.
Was genau die Werte in part bedeuten,
steht in der definition.
Für Blokus ist das die Anzahl der Siegpunkte,
die im Wettkampfsystem angerechnet werden
und die am Ende des Spiels belegten Felder plus extra Punkte, wie in der Wertung beschrieben.
In diesem Beispiel sieht man, dass Spieler 1 mit 137 Punkten dieses Spiel gewonnen hat.
Bei einem Unentschieden erhalten beide Spieler jeweils einen Siegpunkt und der winner-Tag führt kein Team:
<winner regular="true" reason="Beide Spieler sind gleichauf"/>