Im Zusammenspiel mit der Entwicklung der Regeln unseres Kartenspiels entwickeln wir bei Beyond Worlds derzeit auch einen spielbaren Prototyp des Kartenspiels für den PC.

Entwicklungsgeschichte

Die Möglichkeit, unser Spiel online miteinander zu spielen und zu testen, ist essentiell für unseren Entwicklungsprozess. Da wir derzeit noch in ganz Deutschland verteilt leben, ist es schwer mit zum Beispiel ausgedruckten Karten ein Testspiel durchzuführen.

Von Anfang an setzten wir daher auf eine online Testumgebung für unser Spiel.

Die erste Variante war dabei eine Google-Sheets-Tabelle, in welcher Karten in Form von Zellbereichen verschoben werden konnten. Hauptgrund für die Verwendung von Google Sheets war im Grunde nur die Möglichkeit, remote mit anderen Personen gleichzeitig zu spielen. Das Gameplay selbst war aber sehr mühsam.

Relativ schnell trafen wir deshalb die Entscheidung, die Entwicklung des Spiels „richtig“ umzusetzen. Da es sich dennoch noch um einen Prototypen, und nicht um die endgültige Version des Spiels handelte, fiel die Wahl auf die Umsetzung als Browsergame. Unser Entwicklerteam hatte mit Webtechnologien mehr Erfahrung als etwa mit richtigen Game-Engines, dadurch erhofften wir uns eine schnellere Entwicklung. Der große Nachteil von der Umsetzung als Browsergame, nämlich die Komplexität der Umsetzung der Grafiken und Grafikeffekte, wurde als unbedenklich eingestuft, da der Fokus des Gameprotypen eher auf der Logik und dem Spielfluss als auf der Grafik liegen sollte.

Technologien

Derzeit sind das Browsergame und die weiteren Komponenten der Entwicklung wie folgt aufgebaut:

In der Kartendatenbank sind alle unsere bisherigen Ideen zu Spielkarten gespeichert. Hier werden ebenfalls die internen Daten für die Implementierungen von gewissen Effekten gespeichert (dazu später mehr).
Die Kartendatenbank basiert auf PostgreSQL und besitzt eine Webschnittstelle, welche in Scala geschrieben ist. Diese bietet eine API für das Spiel und eine Oberfläche für das Pflegen der Kartendaten.

Das Browsergame selbst ist in JavaScript geschrieben. Wir benutzen das quelloffene boardgame.io-Framework für die Umsetzung der Spielmechaniken. Die grafische Darstellung im Browser wird, wie bei boardgame.io-Projekten üblich, mit React gelöst. Als Datenbank hinter dem Spiel wird MongoDB verwendet, hier ist aber eine Vereinheitlichung auf PostgreSQL geplant.

Für das interne Deployment werden die Datenbank, die Kartenoberfläche, das Frontend des Gameprototyp und das Backend jeweils in eigene Docker-Images verpackt und mittels docker-compose orchestriert. Für das Aktualisieren der Container sind derzeit einfache Shell-Skripte in Verwendung, hier könnte man etwa eine CI/CD Pipeline einbauen.

Für die Versionsverwaltung aller Projekte und auch der Spielregeln wird git benutzt. Eine auf einem eigenen Server laufende Instanz von Gitea bietet Features wie Issues und Pull Requests, ähnlich wie bei GitHub oder GitLab.

boardgame.io

Für die Entwicklung des Browsergames verwenden wir das JavaScript-Framework boardgame.io. Wie der Name es vermuten lässt, bietet dieses Framework besonders Funktionen zur Umsetzung von Brettspielen (zu denen man auch Kartenspiele zählen könnte).

Hierbei wird der aktuelle Spielzustand in einem großen GameState-Objekt abgebildet. Spielzüge stellen Übergänge von einem bestimmten GameState in einen Nächsten dar.

Der große Vorteil von boardgame.io ist die Unterstützung von Brettspiel-typischen Systemen wie abwechselnden Zügen und Spiel- oder Zugphasen. Außerdem besteht die Möglichkeit, mit nur wenig Programmcode Multiplayer über Netzwerk zu spielen. Boardgame.io übernimmt hierbei komplett die Synchronisierung und Kommunikation der Clients mit dem Spielserver über socket.io.

Entwicklungsschritte

Die Umsetzung der verschiedenen Karten erfolgte nicht sofort, da dies bei der Anzahl der Karten zu lange gedauert hätte (>350 Karten). Um das Spiel mit nicht implementierten Karten trotzdem spielbar zu halten, wurden ähnlich wie bei der ersten Version mit der Tabellenkalkulation auch manuelle Spielzüge eingebaut.

Somit ist es ohne die Beachtung von Spielregeln jederzeit möglich, Karten zu verschieben oder gewisse Werte auf Karten zu ändern.

Im Laufe der Entwicklung wurden dann immer mehr Effekte automatisiert. Begonnen mit einfachen Mechaniken wie zum Beispiel der periodischen Erzeugung von Kampfmoral oder Gütern bis hin zu komplizierten Effekten wie etwa dem automatischen Erzeugen von Tokens beim Ausspielen bestimmter Karten. Die Implementierung aller Karteneffekte ist jedoch noch nicht vollends beendet und hier muss noch etwas Arbeit investiert werden. Es ist hierbei ein andauernder Prozess, möglichst viele Informationen über die einzelnen Karteneffekte in der Kartendatenbank zu speichern und somit direkt an den Karten konfigurierbar zu machen, statt sie fest im Code zu verankern („hardcoden“).

Im Laufe der Entwicklungsarbeit hat sich gezeigt, dass die Entwicklung der Logik für ein Kartenspiel doch komplexer sein kann, als vielleicht zu Beginn gedacht. Die Vielzahl an verschiedenen möglichen Effekten und vor allem ihr Zusammenspiel stellen hierbei die größten Herausforderungen dar. Insbesondere Überlegungen, wie man ein solches Effektsystem anpassbar und erweiterbar konzipiert, um auch zukünftige Effekte zu unterstützen, waren und sind immer noch ein Hauptteil unserer Überlegungen. Daher haben wir im Rahmen der Entwicklung auch mehr als einmal unseren Code umgebaut und die Funktionen immer weiter abstrahiert. Doch genau dafür ist ein Prototyp schließlich da. Für die spätere Umsetzung in einer echten Game-Engine haben wir dann viele wichtige Lektionen schon gelernt.

Ich hoffe, ihr fandet diesen kleinen Überblick interessant. Falls ihr Fragen zu technischen Details oder dem Framework habt, erreicht ihr mich jederzeit auf unserem Discord-Server.

Teilen: