- yarn und node installieren
- repository klonen und
sochasubmodul initialisieren (entweder direkt pergit clone --recursiveodergit submodule update --init --recursivenach dem klonen ausführen) yarn compile-serverausführen, damit der server im Verzeichnisserververfügbar wird- GUI per
yarn startstarten
yarn update-serverpullt und kompiliert die aktuelle Server-Version vom socha repo in das server-Verzeichnisyarn start --devstartet die GUI mit geöffneten Developer Toolsyarn start --kioskführt die GUI im Kiosk-Modus aus. Dies funktioniert auch beim gepackten Programm durch anhängen von--kioskim 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.