Extended am Sonntag #18
Hinter den Kulissen der Datenbank
In diesem Beitrag von Enestress werden bereits alle wichtigen Funktionen der Objektdatenbank vorgestellt.
Im Folgenden wird es um das Konzept dahinter gehen, denn wenn man das Prinzip versteht, fällt es leichter, Kreationen zu verstehen.
Item ist nicht gleich Item
Wenn von „Item/Kampagne erstellen“ die Rede ist, ist üblicherweise das Festlegen von Eigenschaften, Arbeitsabläufen, etc. gemeint.
Mit einem Item in der Datenbank hat man aber noch kein Item in Inventar, denn die Datenbank ist keine Sammlung von Items, sondern von Itemvorlagen, man spricht hier üblicherweise von Klassen.
Dass die Datenbank kein „Lager“ ist, wird auch klar, wenn man die Datenbank-Funktion „Zu Inventar hinzufügen“ verwendet. Das betreffende Item verschwindet nicht aus der Datenbank, sondern ein Exemplar (Instanz) entsteht. Wenn dieses erstellte Exemplar zerstört wird, bleibt es in der Datenbank erhalten. Umgedreht bleibt ein Item im Inventar erhalten, wenn der zugehörige Datenbankeintrag verschwindet. Das Item ist dann aber nicht mehr benutzbar. Extended meldet uns „Missing Class“.
Datenbank = Bauplanbibliothek
Während das Inventar speichert, welche Items in meinem Besitz sind, speichert die Datenbank, was diese Items können, also ihre Eigenschaften.
Ein typischer Itemdatensatz ist sehr klein:
- Item-Klasse
- Taschenplatz
- Anzahl (falls stapelbar)
- ggf. Item-Variablen
Wenn das Item benutzt wird, konsultiert Extended die Datenbank:
- Gibt es die Item-Klasse in der Datenbank?
- Wenn ja, ist ein Verhalten „Bei Benutzug“ angegeben?
- Wenn ja, gibt es den angegebenen Arbeitsablauf?
- Wenn ja, führe den Arbeitsablauf aus.
Ohne Datenbankeintrag gibt es also kein Verhalten und auch keine Eigenschaften.
Austausch von Items
Wenn man einem anderen Spieler ein Item gibt, müssen folglich beide Teile (Klasse und Instanz) übertragen werden.
Wenn der Empfänger den Datenbankeintag bereits besitzt, wird die Klasseninformation ausgespart, aber halt:
Hier kommt die Version ins Spiel. Wer sich jemals gefragt hat, warum Extended zu jeder Item-Klasse eine Versionsnummer abspeichert, bekommt hier die Antwort. Die Versionsnummer wird verwendet, um nachzuprüfen, ob Absender und Empfänger eines Items oder einer Kampagne auf dem selben Stand sind. Sollte das nicht der Fall sein, fragt Extended nach, ob man die Version des Senders übernehmen möchte.
Die Datenbank kann immer nur eine einzige Version eines Objekts abspeichern, jedes Item der selben Klasse verhält sich also gleich. Wenn man eine neue Version eines Items erhält (entweder, weil man abspeichert, oder weil man einen neuen Import-Code einfügt), werden automatisch alle Inventar-Instanzen des Items aktualisiert.
Durchbrochene Hierarchien
In der Datenbank wird über innere Objekte eine Hierarchie aufgebaut. Diese Objekthierarchie hat genau zwei Aufgaben:
- Übersicht beim Erstellen verschaffen
- dafür sorgen, dass beim Handeln alle notwendigen Klassendaten mitgeliefert werden
Und das war’s. Im Inventar hat sie keinerlei (*) Bedeutung. Das einzige Ordnungsprinzip, das das Inventar kennt, ist die Anordnung der Taschen.
Jedes innere Item wird im Inventar zu einem eigenständigen Gegenstand, selbst, wenn das äußere Item suggeriert, dass das innere Item von diesem produziert/erschaffen/etc. wird oder auf sonstige Weise mit ihm zu tun hat.
(*) Bis auf eine Ausnahme: Wenn man bei einer Tasche festlegt, dass sie nur innere Items enthalten darf, wird es nicht möglich sein, ein anderes Item darin abzulegen.
Jedes Item steht für sich
Dass jedes Item (d.h. jede Instanz) losgelöst von der Objekthierarchie in der Datenbank existiert, hat zwei Konsequenzen.
Einerseits ist es möglich, jedem einzelnen Item einen individuellen Satz von Variablen zu verpassen, also einen individuellen Zustand.
Andererseits ist es nicht mehr möglich, mit einem Item im Inventar Einfluss auf ein anderes zu nehmen.
Typische Fragestellungen:
Wie kann ich die Variablen eines inneren Items verändern?
- Es ist nicht klar, welches innere Item gemeint ist, denn es könnten mehrere Exemplare im Inventar liegen.
- Hier liegt ein kategorisches Missverständnis vor: Innere Items sind Eigenschaften der Klasse, aber Variablen gehören zur Instanz.
Wie kann ich das äußere Item löschen?
- Wie bei der ersten Frage ist nicht klar, welches Exemplar gelöscht werden soll.
- In diesem konkreten Fall kann man sich behelfen, indem man das Item direkt über die Id anspricht, statt sich auf die Eigenschaft „äußeres Item“ zu verlassen.
Viel Spaß beim Experimentieren und
bis zum nächsten Sonntag…