- yarn und node installieren
- repository klonen und
socha
submodul initialisieren (entweder direkt pergit clone --recursive
odergit submodule update --init --recursive
nach dem klonen ausführen) yarn compile-server
ausführen, damit der server im Verzeichnisserver
verfügbar wird- GUI per
yarn start
starten
yarn update-server
pullt und kompiliert die aktuelle Server-Version vom socha repo in das server-Verzeichnisyarn start --dev
startet die GUI mit geöffneten Developer Toolsyarn start --kiosk
führt die GUI im Kiosk-Modus aus. Dies funktioniert auch beim gepackten Programm durch anhängen von--kiosk
im Terminal.
Es gibt drei Teile, jeweils in einem eigenen Hauptverzeichnis unter src: GUI, API und Viewer.
Die API ist das Backend der Anwendung. Sie teilt sich wiederum in drei Komponenten auf: Den synchronen Teil (Unterverzeichnis synchronous), welcher im Electron-Prozess (Client) laeuft, den asynchronen Teil (Unterverzeichnis asynchronous), welcher in eigenen Prozessen (NodeJS, Server) laueft sowie der Regel-Teil (Unterverzeichnis rules) welcher die eigentliche Spiellogik (und geteilte Interfaces) enthaelt und von den beiden anderen Teilen verwendet wird.
GUI definiert das Benutzerinterface. Es verwendet das Javascript Framework React und laeuft in Electron, sollte aber auch weitestgehend in einem Browser laufen koennen.
Der Viewer ist der Teil des Benutzerinterfaces, welcher das eigentliche Spiel darstellt. Er ist in das uebrige Benutzerinterface eingebettet und stellt einen Spielzustand dar. Weiterhin werden Spiel-spezifische Kontrollelemente verwaltet (Eingabe von Zuegen bei menschlichen Spielern, Auswahl der angezeigten Runde, Abspielgeschwindigkeit). Dabei wird das Framework Phaser verwendet.
Wenn man ein neues Spiel erstellt, sieht man zuerst GameCreation. Bei einem Klick auf Start
ruft dieser dann in App die Methode startGameWithOptions
auf, welche über den GameManager die Methode createGameWithOptions
im GameManagerWorkerInterface aufruft. Diese sendet dann die GameCreationOptions als JSON an den Server.
Der AsyncGameManager empfängt diese über die Route /start-game
und startet je nach Konfiguration ein neues LiveGame oder ein Replay mit der übermittelten gameId
. Wenn alles klappt, sendet er die gameId
wieder als JSON zurück. Sobald diese Antwort gekommen ist, ruft die App showGame
mit der empfangenen gameId
auf, wodurch das Game dann angezeigt wird.
Da die Anwendung in mehreren Prozessen laeuft (Render-Thread und mehrere Node.js Worker) werden nicht alle Fehler/Lognachrichten in der Dev Tools-Console ausgegeben, sondern auch einige im Terminal.
yarn dist
baut ein Paket für das aktuelle Betriebssystem im Verzeichnis dist
, während dist-all
Pakete für Windows, Linux und macOS baut. Der Dateiname enthält die Versionsnummer aus package.json
, diese sollte also vorher dort richtig eingestellt werden. Für Releases sollte auch ein entsprechendes Git Tag angelegt werden, damit man es später zuordnen kann.
Es wird auch immer ein Game Server mit in den Release gepackt. Dieser sollte vorher ebenfalls mit der version getaggt werden. Er wird aus dem server
-Verzeichnis genommen und kann dahin durch yarn update-server
initialisiert und aktualisiert werden.
Fehler: xorriso: error while loading shared libraries: libreadline.so.6: cannot open shared object file: No such file or directory
Loesung: export USE_SYSTEM_XORRISO=true
Fehler: Error: Exit code: ENOENT. spawn xorriso ENOENT
Loesung: xorriso installieren
Siehe Issue microsoft/vscode#7015
Diese extension installieren, dann geht das: https://github.com/mrcrowl/vscode/releases
VSCode compiliert den Code dann, sobald man speichert. In der laufenden Anwendung muss man nur F5 druecken, um die Aenderungen zu laden (geht nur, wenn die Entwicklerwerkzeuge aktiv sind, Strg-Shift-I. Laedt die gesamte Anwendung neu).
Es kann eine manuelle Installation von Kotlin sowie Gradle erforderlich sein, sollte die Fehlermeldung von missing tools
auftreten bei der Ausführung von yarn update-server
.
Die Windows-CMD sowie PowerShell werden nicht unterstützt. Eine Shell wie beispielsweise git for windows wird vorausgesetzt.