Architekturübersicht
Core
BoardArray
BoardArray
extends RefCounted (Godot interne Klasse)
Ist ein multidimensionales Array, welches aus Ermangelung einer eigenen Datenstruktur in GDScript erstellt werden musste. Das BoardArray stellt das Fundament des gesamten Projekts dar. Zugriffe erfolgen ausschliesslich über die API der Klasse.
Erbt von RefCounted und ist kein Node. RefCounted kann als Godot-interne Basisklasse für Wertetypen und Datenstrukturen verwendet werden.
Wird in BoardLayout als BoardArray <int> und im BoardManager als BoardArray <Tile> verwendet. Anmerkung: BoardArray ist Typ-offen und wird nur durch den Parameter default_value "festgelegt". Unbedingt den Kontext beachten.
GameManager
GameManager extends Node2D
Ist die zentrale Steuereinheit für alle anderen, spielrelevanten Systeme. Der GameManager "orchestriert" die Zusammenarbeit und zeitlichen Abläufe aller anderen Systeme.
Statt ein Singleton zu sein, besitzt der GameManager Referenzen über alle anderen Instanzen und kann somit DIs oder Signals steuern.
Systems
BoardManager
BoardManager extends Node2D
Ist für den Aufbau und Abbau von Tiles zuständig. Der BoardManager erhält eine BoardLayout Resource und instanziert daraus Tiles dem Layout entsprechend.
(TODO: Tiles sollen während der Instanzierung ihren TileType und TileValue zufällig(?) zugeordnet bekommen.)
Wenn Tiles entfernt werden müssen, handled BoardManager den Board-State entsprechend.
Alle Tiles werden in einem Child $TileContainer instanziert, nicht im BoardManager selbst.
Gameplay Features
Tile
Tile extends Area2D
Ist die visuelle Repräsentation eines Mahjong-Spielsteins. Besteht aus einer Area2D und einer CollisionShape2D um MouseInputs zu verarbeiten.
Zwei Texturen, $Body für den 'Stein' selbst, und $Face für das Bild auf dem Stein, kümmern sich um die visuelle Darstellung.
Ein Tile verfügt zudem über einen TileType und einen TileValue, welche das Aussehen bestimmen und für die Match-Logik wichtig sind.
Resources
TileStyle
TileStyle extends Resource
Hält Texturdaten für eine Tile bereit. Nametlich tile_body Texture2d und tile_face Texture2D
(TODO: Muss ggf. in ein TileSet aufgenommen werden, aus dem sich ein Tile dann die passenden TileStyle Daten zieht.)
RuleSet
RuleSet extends Resource
Ist eine (pseudo) abstrakte Klasse, die als Basisklasse für alle ableitenden RuleSet Klassen dient. GameManager hält eine Referenz auf RuleSet, wodurch ein beliebiges RuleSet geladen werden kann.
SolitaireRuleSet
SolitaireRuleSet extends RuleSet
Überschreibt die virtuelle can_match() aus der abstrakten RuleSet Klasse, um die klassischen Solitär Mahjong Regeln spielen zu können.
BoardLayout
BoardLayout extends Resource
Ist eine (pseudo) abstrakte Klasse, die als Basisklasse für alle ableitenden BoardLayout dient. Sie definiert Dimensionen des verwendeten BoardArrays, Stellt das CellType Enum und eine Initialisierungs-Methode bereit. BoardManager hält eine Referenz auf ein BoardLayout wodurch verschiedene BoardLayouts geladen werden können.
(TODO: BoardLayouts sollen später als .tres Datei automatisch durch ein Editor-internes tool erzeugt werden.)
Zusammenarbeit der Systeme
Die main.tscn ist der Einstiegspunkt des Spiels. Root ist der Main Node. Unter den Main werden alle anderen benötigten Systeme "eingehangen" und sind danach Child von Main. Es soll kein 'Übergang' zu anderen Szenen stattfinden. Szenen sind immer nur weiterer Bestandteil der main.tscn und müssen dort eingebettet werden.
Auf dem Root-Node Main liegt das GameManager Script. Von hier aus wird die Zusammenarbeit aller beteiligter Systeme orchestriert.
Wo sind Szenen zu finden und anzulegen?
Szenen oder Komponenten sind einer der Kategorien Core , Systems, Gameplay oder Resource zuzuordnen.