![]() |
||
Das Enchanter-Magiesystem |
||
Ein beliebtes Textadventure-Genre ist »Sword and Sorcery«, eine pseudomittelalterliche Welt, in der Magie eine wichtige Rolle spielt. Zur Funktionsweise der Magie gibt es verschiedene Ansätze. Ein klassisches System ist das von Infocom in der Enchanter-Trilogie verwendete. Dieses System arbeitet mit Zaubersprüchen, die entweder auf Schriftrollen stehen oder in einem Zauberbuch. Werden Sprüche von einer Rolle gelesen, verschwindet diese danach. Ein Spruch, der in einem Buch steht, muss zunächst ins Gedächtnis gerufen werden, danach kann er, auch ohne Buch, gesprochen werden. Der Magier kann nur eine bestimmte Anzahl von Sprüchen im Gedächtnis behalten. (Mir ist dabei nicht ganz klar, wieso man Sprüche von einer Rolle direkt lesen kann, sie aber erst lernen muss, wenn sie im Zauberbuch stehen. Aber mit alten Traditionen soll man nicht brechen.) Dieses Magie-System habe ich für Im Bannkreis [1] in TAG implementiert, und die wichtigsten Routinen in einer separaten Datei magie.adv zusammengestellt, die mit #DAT 'magie.adv' in TAG eingebunden werden kann. Die Funktionsweise wird hier kurz erklärt: Zunächst gibt es die Objektklassen Spruch und Pergament sowie das Zauberbuch. Es kann nur ein Zauberbuch geben, und auf einem Pergament kann nur ein Spruch stehen. Die einzelnen Sprüche sind Befehle. Die Wirkung der Sprüche wird im Ausführungsteil des Befehls beschrieben. Hier ist der Spruch Frotz mit dem dazugehörigen Objekten: Bef frotz Name 'frotzen' Verb 'frotze' Syntax dasObj (evtl) Ausf Bed /(aObj = 0) 'Da der Frotz-Spruch auf nichts gerichtet war, wird es nur eine Nuance heller.' SeiBed Aux (Licht_in aRaum) Bed /(aObj fest immobil) und /(aObj Deko) '[Der aObj] schimmer[t] einen Moment lang, aber [er] [ist] wohl zu groß und deine Zauberkraft zu gering. Der Spruch verpufft.' Text 'Ein blendender Blitz zuckt um [den aObj] und [er] [fängt/fangen] an zu leuchten. Die Intensität lässt rasch nach, aber [der aObj] [gibt/geben] nun eine ganz brauchbare Lichtquelle ab.' AttrHin aObj Licht Wenn /(Aux) dann Absatz Ausf Lage Ende EndeAusf Obj frotz_Spruch (Spruch) Name 'Frotz-Spruch' m Vor 'frotz' subst 'frotz' m 'spruch' m 'zauber' m Ort in Zauberbuch Text 'frotz: [+8]Macht, dass ein Gegenstand Licht spendet.' (Dieser Spruch steht bereits im Zauberbuch, daher wird keine Schriftrolle benötigt.) Ob ein Spruch gelernt wurde oder nicht muss in der Aktion Vorher abgefragt werden. Das ist nicht ganz elegant, da jeder neu hinzugefügte Zauberspruch hier explizit nachgetragen werden muss, aber es funktioniert: Flagge Spruch_gecheckt Aktion Vorher Ausf Jenach aBef (frotz) sei benutzter_Spruch frotz_Spruch (gnusto) sei benutzter_Spruch gnusto_Spruch (rezrov) sei benutzter_Spruch rezrov_Spruch |... hier weitere Sprüche einfügen ...| (sonst) sei benutzter_Spruch 0 Ende |... hier steht der eigentliche Code ...| EndeAusf Und zu guter Letzt gibt es noch den Befehl lernen sowie den Meta-Befehl Sprüche, der die gelernten Zauber auflistet. Wer sein Schwert-und-Magie-Opus lieber in Inform schreiben möchte, schaut sich am besten den Quellcode von Graham Nelsons Balances [2] [3] an, der im GMD-Archiv erhältlich ist. |
![]() |
![]() |
![]() |
![]() |