hier
ich bin dabei, das AOQML Variablen-Konzept (store/fetch mit name=/mark=) zu überarbeiten. Hier ein paar Vorab-Infos: Dafür wird mark= wieder entfallen und dafür kann man dann zum einen bei store einen Geltungsbereich (Scope) angeben und zum anderen auch für Varible mit name= eine Gültigkeitsdauer angeben.
Folgende Scopes habe ich dabei vorgesehen:
- scene:
Die Variable wird gar nicht erst in der Datenbank gespeichert, ist nur bis zum Ende der Szene (aber auch über include-Grenzen hinweg) gültig. Damit sollen Seiteneffekte eingeschränkt und die Datenbank sauber gehalten werden. - quest:
Dieser Scope entspricht dem derzeitigen Scope für Variable, die mit name= angelegt wurden. Sie gelten nur für den aktuellen Helden und für das laufende Quest. Andere Helden sehen diesen Wert also nicht und bei Ende des Quests (nicht bei pending!) werden diese Variablen automatisch gelöscht. - dungeon:
Der Begriff 'dungeon' ist hier sehr weit zu sehen, eigentlich ist so etwas wie ein "Quest-Konfigurations-Ort" gemeint. Vielleicht fällt uns noch ein besserer Name ein. Diese Variablen gelten jedenfalls für eine eine Zeile in der Tabelle ant_quest. Sie können von allen Helden gesehen werden und bleiben auch nach Questende erhalten. Gelöscht werden sie explizit oder automatisch wenn die zugehörige Quest-Konfiguration gelöscht wird. Mit diesem Scope-Typ kann man z.B. gemeinsame Inventare abbilden (was der Held verliert oder ablegt, könnte ein anderer finden). - hero:
Diese Variablen entsprechen dem bisherigen mark=. Sie gelten nur für einen Helden, sind aber Quest-unabhängig. Gelöscht werden sie explizit oder automatisch, wenn der Held gelöscht wird. Damit kann man z.B. spezielles in-game-Heldenwissen abbilden, welches nicht weitergegeben werden kann. - global:
Diese Variablen gelten für alle Helden und alle Quests. Gelöscht werden sie nur explizit.
Ist der Scope einmal definiert, dann braucht er, z.B. bei Wertänderungen oder Abfragen nicht mehr angegeben zu werden. Es wird dann in obiger Liste von oben nach unten gesucht. Wird die Variable gar nicht gefunden, dann wird sie (wie jetzt) im Quest-Scope angelegt. Sollte ein Variablen-Name in mehreren der o.g. Scopes definiert sein, wird also immer der nach obiger Liste erste Scope, in dem sie gefunden wird, genommen.
Das Konzept erspart in den meisten Fällen, darüber nachzudenken, wie eine Variable nun gefunden werden kann (also ob mit name= oder mark= - und für die o.g. Möglichkeiten bräuchte man ja noch viel mehr davon). Nur beim Anlegen muss man über die Gültigkeit nachdenken. Die Scopes gelten auch z.B. für Inventare d.h. scope= gäbe es in <store> und <inventory>. Bei gespeicherten Proben sehe ich keinen Sinn darin, sie in einem anderen Scope als "quest" anzulegen. Vielmehr sind es meist eher die konkreten Folgen (geknacktes Schloss oder sowas) die ggf. in einem anderen Scope gemerkt werden - dann aber explizit.
- Code: Alles auswählen
<!-- ein Inventar definieren, dass für alle Helden gemeinsam gilt -->
<inventory name="GrosseSchatzkammer" scope="dungeon">
...
<!-- z.B. bei Gefangennahme die Ausrüstung des Helden in die gemeinsame Schatzkammer legen -->
<drop item="*" to="GrosseSchatzkammer"/>
...
<!-- jeder Held kann die Sachen dort finden -->
<take from="GrosseSchatzkammer"/>
p.s. Das folgende mehr für Entwickler: Ein Problem ist wohl nach wie vor, dass nicht jeder Seitenabruf in einer Datenbank-Transaktion stattfindet. Bei gemeinsam genutzten Variablen könnte es somit Inkonsistenzen geben (z.B. zwei Helden entnehmen einen Gegenstand). Evlt. kapsele ich wenigstens eine Szenen-Verarbeitung in eine Datenbank-Transaktion.