Autor |
Nachricht |
< Wörter durch ObjParser handhaben |
|
Verfasst am:
Do, 27 Feb 2014 - 14:46
|
|
|
Neuling
Anmeldungsdatum: 01.07.2013
Beiträge: 17
Wohnort: Göttingen
|
|
Hi.
Es ist mir fast unangenehm, dieses alte Forum wieder zu bemühen, aber nachdem ich mich nun lange allein mit TAG beschäftigt habe, muss ich schließlich doch um Hilfe bitten.
Ich will, dass mit einem Wort (Subst) ein Objekt angesprochen wird, das nicht mit diesem Subst genannt werden kann und nicht werden soll, weil dieses Subst später eindeutig auf ein anderes Objekt hinweisen soll.
Dazu hab ich die Aktion ObjParser verwendet:
Code: |
Aktion ObjParser
Ausf
lokal x
LeseArt m x
Wenn (Wort = 'Obj2') oder (Wort = 'Obj3') dann
Wenn (obj1 hier) und /(obj2 hier) und /(obj3 hier) dann
Sei aObj obj1
Ende
Wenn (aRaum = raum1) und /(obj2 hier) und /(obj2 beimir) und
/(obj3 hier) und /(obj3 beimir) dann
Sei aObj obj4
Ende
Ende
lokal y
LeseArt m y
Wenn (Wort = 'Obj5') und
(aRaum = raum2) und /(obj5 hier) dann
Sei aObj obj6
Ende
Wenn dann
. . .
Ende
. . .
EndeAusf
|
Das nun geht nicht, und es ist doppelt seltsam, weil es schon einmal ging, ziemlich genau in dieser Syntax. Kein einziges der obigen Wort-Verlagerungen wird erkannt, selbst wenn ich eines isoliere. Stattdessen sagt der Parser nur noch: Ich sehe hier keinen Obj1, etc.
Hat jemand eine ähnliche Erfahrung mit dieser Aktion gemacht? Kennt jemand Anhaltspunkte, wo der Fehler liegen könnte? Schließlich habe ich seither einiges verändert und hinzugefügt, woran es womöglich liegt, wenn es jetzt nicht mehr geht. Allerdings ist der Code recht umfangreich und ich kann nicht jede einzelne Änderung zurückverfolgen.
Ich wäre für eure Hilfe, auch nur für Hinweise, äußerst dankbar!
Grüße!
Zuletzt bearbeitet von Midas am Fr, 7 März 2014 - 21:56, insgesamt einmal bearbeitet |
|
|
|
|
|
Verfasst am:
Fr, 7 März 2014 - 10:12
|
|
|
Abenteurer
Anmeldungsdatum: 03.09.2009
Beiträge: 453
Wohnort: Cham
|
|
Ich bin jetzt nicht der TAG Experte, aber vielleicht kannst du das Problem doch noch mal in einen kompletten und von der Länge auf das Wesentliche gekürzte Quellcodefassung packen, damit es ein Außenstehender testen kann.
Schreib doch bitte noch mal ausführlicher, was genau du erreichen willst. Du willst offenbar das Vokabular dynamisch machen, oder? Und der ObjParser soll anhand der vorhandenen Objekte das passende auswählen. Habe ich das richtig verstanden? |
|
|
|
|
|
Verfasst am:
Fr, 7 März 2014 - 21:54
|
|
|
Neuling
Anmeldungsdatum: 01.07.2013
Beiträge: 17
Wohnort: Göttingen
|
|
Zitat: | Ich bin jetzt nicht der TAG Experte, aber vielleicht kannst du das Problem doch noch mal in einen kompletten und von der Länge auf das Wesentliche gekürzte Quellcodefassung packen, damit es ein Außenstehender testen kann. |
Ich versuch's! Die Struktur der ObjParser-Aktion kann denkbar einfach gehalten sein, wie in folgendem Code (gebaut anhand Beispielen, etwa http://textfire.de/teile/giessen.htm):
Code: |
Aktion ObjParser
Ausf
lokal x
LeseArt m x
Wenn (Wort = 'boden') und
(aRaum = Landschaft) und /(Erde hier) dann
Sei aObj Schnee
Ende
EndeAusf
Raum Landschaft
Name 'Auf dem Feld' m
Besch 'Eine einsame Winterlandschaft.'
Obj Schnee
Name 'Schnee' m
Subst 'schnee' m
Ort Landschaft
Attr fest
Besch 'Flockiger Neuschnee.'
VorAusf
(hier_graben)
Text 'Du gräbst dich durch den Schnee zur Erde.'
ObjNach Erde Landschaft
Stop
EndeAusf
Obj Erde
Name 'Erde' f
Subst 'erde' f 'boden' m
Attr fest
Besch 'Hartgefrorene Erde.'
Bef hier_graben
Name 'graben'
Verb 'grabe'
Syntax in demObj
Ausf
Text 'Ich kann nicht in [dem aObj] graben.'
EndeAusf
|
Raum und Objekte sind nun improvisiert. Diejenigen meines Codes sind zu lang, um übersichtlich hier Platz zu finden, unterscheiden sich aber im Prinzip nur durch mehr Bedingungen in den Ausführungsblöcken sowie Richtungen bezüglich des Raumes. Wenn ich ein SPiel mit diesen Beispielen kreiere, funktioniert das ganze.
So ähnlich habe ich die ObjParser-Aktion während eines früheren Stadiums meines Spiels gebraucht. Da erzielte sie den gewünschten Effekt. Und, richtig, es sollte Vokabular dynamisch gemacht werden, hier ein Objekt mit Namen eines anderen ansprechbar machen, während jenes noch nicht im Spiel ist.
Später habe ich weitere Blöcke unter den ersten (hier Boden zu Schnee) gefügt. Und irgendwann merkte ich dann, dass kein einziges mehr ging. Seither verweigert ObjParser mir seinen Dienst. Ich habe schon versucht, die Aktion neu aufzurollen, einzelne Blöcke auszuklammern; ohne Erfolg. Ich mutmaße also, dass der Hund anderswo begraben liegt als in der Aktion selbst. Wenn dem so wäre, hätte ich aber nicht die leiseste Idee, wo und warum. Dass die Referenzobjekte selbst das Problem bergen, halte ich für unwahrscheinlich, weil ja keine einzige der Blöcke zu funktionieren scheint.
Ich hoffe, es anschaulicher gemacht zu haben. Konnte ich einen Verdacht aufwerfen? |
|
|
|
|
|
Verfasst am:
Fr, 7 März 2014 - 22:04
|
|
|
Neuling
Anmeldungsdatum: 01.07.2013
Beiträge: 17
Wohnort: Göttingen
|
|
Übrigens fällt mir in diesem kleinen Beispiel-Code ein Fehler auf, der mich schon lange begleitet. Grabe ich die Erde frei und erkundige mich dann nach der Lage, erscheint:
Hier liegt noch eine Erde. 119
Kennt jemand ein Mittel, das abzustellen? Bei mir taucht dieser Fehler häufig auf, wenn Gegenstände hingelegt worden sind. Manchmal, scheinbar regellos, in der Variante:
Hier liegt noch der . 119
(indem das Objekt nicht angezeigt wird)
Ich vermute, letzteres liegt an der Spaltung des Namens durch einen Ausführungsblock statt des Namen-Strings. Aber auch dagegen weiß ich keine Lösung. |
|
|
|
|
|
Verfasst am:
Sa, 8 März 2014 - 15:59
|
|
|
Experte
Anmeldungsdatum: 05.05.2004
Beiträge: 633
Wohnort: Hamburg
|
|
Also, wenn ich das richtig verstanden habe, möchtest Du einfach nur den Schnee auch "Boden" oder "Erde" nennen können. In diesem Fall schießt Du mit dem Objektparser auf Spatzen, denn ein Objekt kann (und sollte) immer durchaus mehrere Synonyme bekommen.
Wenn Du die Vokabel 'boden' m zum Schnee hinzufügst, kannst Du >GRAB IM BODEN sagen, und die Aktion für das Graben im Schnee wird ausgeführt -- vorausgesetzt das Objekt Erde ist in diesem Moment nicht sichtbar.
Code: | Obj Schnee
Name 'Schnee' m
Subst 'schnee' m 'boden' m 'erde' f !!! Hier geändert
Ort Landschaft
Attr fest
Besch 'Flockiger Neuschnee.'
VorAusf
(hier_graben)
Text 'Du gräbst dich durch den Schnee zur Erde.'
ObjNach Erde Landschaft
Stop
EndeAusf |
Beste Grüße
Christian |
|
|
|
|
|
Verfasst am:
Sa, 8 März 2014 - 17:11
|
|
|
Neuling
Anmeldungsdatum: 01.07.2013
Beiträge: 17
Wohnort: Göttingen
|
|
Danke, Christian,
natürlich, das wäre die leichteste Variante. Die Folge aber ist, dass, nachdem ich hier die Erde freigelegt habe, jeder Spielerbefehl, der 'boden' oder 'erde' als Objekt anspricht, beantwortet wird mit:
Welche Erde/Welcher Boden? Den Schnee oder die Erde?
Das sieht zwar zunächst und bei diesem Beispiel nicht umständlich aus, wird aber lästig, sobald ich es in meinen Original-Code übertrage. Nicht nur, dass Erde dann eindeutig die Erde bezeichnen und der Parser nicht mehr den Schnee in Erwägung ziehen soll. Im Äquvalent dort nämlich wäre die Erde über längere Dauer ein zentrales Element des Spiels. Mithin will ich dem Spieler diesen Umstand ersparen, zumal er teils ja grundsätzlich Unlogisches hervorbringt (Welche Erde? die Erde oder den Schnee).
Außerdem funktionieren ja auch die anderen Blöcke im ObjParser nicht. Etwa dieser:
Code: |
lokal Aux
LeseArt m Aux
Wenn (Wort = 'Nadel') dann
NächstesWort
wenn (Wort = 'und') dann
NächstesWort
LeseArt m Aux
wenn (Wort = 'Faden') sei aObj Nadel
wenn /(aObj = 0) NächstesWort
Ende
Ende
|
Auch das tut seinen Dienst im Behelfsspiel, das wir hier bisher zusammenfügen, nicht aber in meinem großen Code: "Hier sind keine Aufzählungen vorgesehen."
Ich kann mich also mit deinem Vorschlag nicht ganz zufrieden geben. Ich denke, dass der ObjParser, selbst als schwieriges Instrument, meine Vorstellungen doch sehr gut erfüllen könnte. Ich würde euch bitten, wenn ihr mögt, den Fall nochmals zu abstrahieren.
Danke schonmal! |
|
|
|
|
|
Verfasst am:
Sa, 8 März 2014 - 17:36
|
|
|
Experte
Anmeldungsdatum: 05.05.2004
Beiträge: 633
Wohnort: Hamburg
|
|
Midas hat folgendes geschrieben: | natürlich, das wäre die leichteste Variante. Die Folge aber ist, dass, nachdem ich hier die Erde freigelegt habe, jeder Spielerbefehl, der 'boden' oder 'erde' als Objekt anspricht, beantwortet wird mit: [...] |
Ich habe in solchen Fällen zwei Objekte benutzt, eines für den Schnee vor und eines für nach dem Graben, die dann gleich nach der Aktion vertauscht werden. Ich erinnere mich, dass ich das für weniger fehleranfällig hielt; vielleicht hatte ich auch Probleme mit ObjParser, das weiß ich nicht mehr. Dein ObjParser-Code sieht auf den ersten Blick jedenfalls OK aus. |
|
|
|
|
|
|
Alle Zeiten sind GMT + 1 Stunde (MEZ) |
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|