mehrdimensionale Listen müssen leider händisch simuliert werden, indem man mehrere Listen verwendet.
Der Werwölfe-Spielleiter verwendet so etwas für seine Userstatistiken.
In der ersten Liste stehen alle Usernamen. In jeder weiteren Liste dann eine Information (Anzahl Spiele, Häufigkeit Rollen etc) aller Spieler.
Wie man die Daten eines speziellen Users findet:
Mit Findlist den Usernamen in der 1. Liste lokalisieren. Dann hast du die Position aller Informationen zu diesem Datensatz.
Anschließend kannst du dann mit einer For-Schleife mit 2-3 Zeilen alle Informationen in spezielle Variablen kopieren.
Hier als Beispiel mal der Code, der beim spielleiter prüft, ob ein Spieler schon in der Liste ist und entweder seine Daten updatet oder zusätzlich anlegt (sind zugegebenermaßen mehr als 3 Zeilen ;-)
SET statvars "spiele sieger ueberlebt verliebt verliebtgewonnen buerger werwolf jaeger hexe seherin dieb amor gegner chatzeilen"
# in obiger Zeile stehen alle gespeicherten Variablen
ACTION statistikenladen # kopiert die SAVEs in verständliche Variablen
EVAL gesamtspieler = LISTLENGTH [SAVE80]
SET counter "80"
FOR varspeichern IN "spieler [statvars]" DO
BEGIN
SET [varspeichern]_bisher [SAVE[counter]]
IF [SAVE[counter]] == ""
FOR wessenstat IN [SAVE80] DO
ADDLIST [varspeichern]_bisher 0
EVAL counter = [counter] + 1
END
END
ACTION statistikenspeichern # überträgt die SAVEs aus den verständlichen Variablen wieder zurück
SET counter "80"
FOR varspeichern IN "spieler [statvars]" DO
BEGIN
SET SAVE[counter] [[varspeichern]_bisher]
EVAL counter = [counter] + 1
END
SAVEDATA
END
ACTION statistikspielerladen
IF [wessenstat] INLIST [spieler_bisher]
BEGIN # Spieler war schon in Statistiken
FINDLIST spieler_bisher [wessenstat]
SET [wessenstat]_spielernr [INDEX1]
FOR varspeichern IN [statvars] DO
EVAL [varspeichern]_[wessenstat] = [[wessenstat]_spielernr] ELEMENTOF [[varspeichern]_bisher]
END
ELSE
BEGIN # Spieler war noch NICHT in Statistiken, also muss er angelegt und initialisiert werden
ADDLIST spieler_bisher [neuerspieler]
FOR varspeichern IN [statvars] DO
BEGIN
SET [varspeichern]_[wessenstat] 0
ADDLIST [varspeichern]_bisher 0
END
EVAL gesamtspieler = [gesamtspieler] + 1
SET [wessenstat]_spielernr [gesamtspieler]
END
END
Die ersten 2 Routinen dienen nur dem Luxus, dass ich im Puppet mit hübschen Variablennamen arbeiten kann und nicht die ganze Zeit auf SAVE80, 81 etc. zugreifen muss.
Außerdem wird so die Gefahr, dass ein Absturz des Puppets die Datenbank ruiniert, erheblich gemindert, da nur noch Abstürze während dieser schnellen Routine gefährlich sind.
Ich hoffe, die Routinen sind hilfreich.
Noch eine kleine Anmerkung. Das Ganze geht natürlich auch einfacher, wenn man keinen Wert darauf legt, dass die Datensätze einzeln ausgelesen werden sollen. Theoretisch kann man natürlich mit verschachtelten FORs alle Einträge beim Puppetstart auslesen, aber das würde beim spielleiter inzwischen wohl ca. 15 Minuten dauern und das wäre nach jeder Partie wohl inakzeptabel.