if-de :: Forum Foren-Übersicht
Autor Nachricht
<  Wörter durch ObjParser handhaben
Midas
BeitragVerfasst am: Do, 27 Feb 2014 - 14:46  Antworten mit Zitat
Neuling
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
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Mikawa
BeitragVerfasst am: Fr, 7 März 2014 - 10:12  Antworten mit Zitat
Abenteurer
Abenteurer


Anmeldungsdatum: 03.09.2009
Beiträge: 437
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?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Midas
BeitragVerfasst am: Fr, 7 März 2014 - 21:54  Antworten mit Zitat
Neuling
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?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Midas
BeitragVerfasst am: Fr, 7 März 2014 - 22:04  Antworten mit Zitat
Neuling
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.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ChristianB
BeitragVerfasst am: Sa, 8 März 2014 - 15:59  Antworten mit Zitat
Experte
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
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Midas
BeitragVerfasst am: Sa, 8 März 2014 - 17:11  Antworten mit Zitat
Neuling
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!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ChristianB
BeitragVerfasst am: Sa, 8 März 2014 - 17:36  Antworten mit Zitat
Experte
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.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Alle Zeiten sind GMT + 1 Stunde (MEZ)

Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Seite 1 von 1
if-de :: Forum Foren-Übersicht  >  T.A.G.

Neues Thema eröffnen   Neue Antwort erstellen


 
Gehe zu:  
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.



Kontakt: Administrator

Powered by phpBB and NoseBleed v1.05