Forum moved to if-forum.org
Autor Nachricht
<  "Gehe zu <Raum>"-Befehl
Tanan
BeitragVerfasst am: Mo, 28 Okt 2002 - 10:19  Antworten mit Zitat
Abenteurer
Abenteurer


Anmeldungsdatum: 25.08.2002
Beiträge: 416
Wohnort: Essen

Sicher kennt ihr aus verschiedenen Adventures diese Funktion, mit der ihr "Gehe zur Kammer" eingeben könnt, und die SpF macht sich dahin auf den Weg. Wenn sie unterwegs aufgehalten wird, bleibt sie stehen.

So was hab ich für TAG geschrieben. Ich bin mir allerdings nicht sicher, ob man's nicht auch einfacher machen könnte. Immerhin, ich habe zum ersten Mal erfolgreich TAG-Felder eingesetzt, aber die Zahlenkolonnen bei einer sehr großen Karte würden doch arg lang werden.

Wer a) selbst so einen Befehl einbauen möchte, aber nicht weiß, wie
b) einfach neugierig ist oder
c) auf der Grundlage meines Codes eine bessere Lösung finden möchte,
der schreibe mir eine kurze Mail (jens@tanan.de). Ich schicke ihm dann die Demo samt Quelltext.

*

Insbesondere Dich, Martin, würde ich bitten, mal einen Blick drauf zu werfen, denn der Workaround, den Du mir für mein "fragen über"-Beispiel gesendet hast, funktioniert hier nicht: Es nützt nichts, den Raum (bzw. dessen Objekt) "insicht" zu bewegen, weil der Parser dann nämlich denkt, er wäre schon da:

Code:
Bed /(aObj hier) 'Da bist du schon.'

(aObj) ist das Objekt, das stellvertretend für einen Raum steht.

Danke im Voraus!
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Martin
BeitragVerfasst am: Mo, 28 Okt 2002 - 13:40  Antworten mit Zitat
Experte
Experte


Anmeldungsdatum: 25.08.2002
Beiträge: 677
Wohnort: München

Tanan der Wanderer hat folgendes geschrieben:
Sicher kennt ihr aus verschiedenen Adventures diese Funktion, mit der ihr "Gehe zur Kammer" eingeben könnt, und die SpF macht sich dahin auf den Weg. Wenn sie unterwegs aufgehalten wird, bleibt sie stehen.

Ja, das kenne ich aus Guild of Thieves. Das war manchmal recht praktisch, obwohl ich es nie richtig benutzt habe. Aus anderen Spielen ist mir kein ähnliches Konzept bekannt.

Tanan hat folgendes geschrieben:
So was hab ich für TAG geschrieben. Ich bin mir allerdings nicht sicher, ob man's nicht auch einfacher machen könnte. Immerhin, ich habe zum ersten Mal erfolgreich TAG-Felder eingesetzt, aber die Zahlenkolonnen bei einer sehr großen Karte würden doch arg lang werden.


Die Idee, den nächsten Schritt für jeden Raum auf ein Feld zu legen, ist sehr gut. Ich hätte wahrscheinlich versucht, jeden Pfad abzuspeichern. (Oder gar ein U-Bahn-Modell nach Volker Lanz zu implementieren.)

Bei einem Adventure mit vielen Räumen (und nur für so eines ist diese Abkürzung ja sinnvoll) müsste man halt sehr viele Felddaten einlesen. Allerdings kann man wahrscheinlich in einem großen Spiel nicht ueberall hingehen, sondern nur zu ein paar ausgewaehlten, markanten Punkten. Das spart auch Objekte, die ja mit 250 recht knapp bemessen sind.

Seit Kurzem ist es in T.A.G. möglich, mit einem vorangestellten & Variablen jeden Typs als Zahlen zu betrachten. Felder können nur Zahlen als Inhalt haben, aber man könnte etwas schreiben wie:

Code:

    Jenach araum
        (gangA)    
            Daten rritg 0 ( 0 &O &O &N &N &O &O)
        (gangB)    
            Daten rritg 0 (&W  0 &O &W &N &N &O)
        ...
    Ende


Ob das jetzt übersichtlicher ist, sei dahingestellt. Aber es erspart die jenach-Abfrage und reduziert sie auf:

Code:

    sei &aRitg lesRitg
    wenn (aRitg = 0) Stop


||| ||| ||| ||| |||

Tanan hat folgendes geschrieben:
Insbesondere Dich, Martin, würde ich bitten, mal einen Blick drauf zu werfen, denn der Workaround, den Du mir für mein "fragen über"-Beispiel gesendet hast, funktioniert hier nicht: Es nützt nichts, den Raum (bzw. dessen Objekt) "insicht" zu bewegen, weil der Parser dann nämlich denkt, er wäre schon da:


Zunächst vielleicht ein paar Worte zum oben angesprochenen Workaround: Die Angabe (Allg) lässt Objekte zu, die sich überall im Spiel befinden, auch im nirgendwo und im Nirwana. Sie ist speziell für verben wie "frage" oder "schlage nach" gedacht. Bei mehrdeutigen Angaben fragt der Parser nicht nach, sondern nimmt einfach das zürst im Quelltext auftauchende Objekt.

Um das zu umgehen, kann man für die Syntax von "frage" anstatt (Allg) einfach (hier) beziehungsweise gar nichts, da (hier) der Default ist, setzen:

Code:

    Bef     fragen
    Name    'fragen'
    Verb    'frage'
    Syntax  dasObj (Person) über dasObj
    ...

Dann kann man in der Routine SichtUndRW, die aus dem Parser heraus aufgerufen wird, um zu prüfen, ob sich Objekte in Sicht oder Reichweite befinden, folgendes schreiben:

Code:

    Aktion SichtUndRW
    Ausf
        wenn (aBef = fragen) und (%obj = 2) dann
            wenn (iObj bekannt) ObjInSicht iObj
        Ende
    EndeAusf

Das Attribut bekannt wird automatisch gesetzt: Alle Objekte, die der Spieler einmal gesehen hat, d.h. in der Regel alle, die einmal in einer Raumbeschreibung aufgelistet wurde, bekommen es. Wer will, dass ein Objekt, das der Spieler noch nicht gesehen hat, von dem er aber vielleicht gehört hat, als Gesprächsthema bekannt ist muss bekannt halt von Hand setzen.

Code:

    Text 'Der Söldner spuckt auf den Boden und
        sagt "Dazu brauchst Du den Bergkristall
        von Asgaroth. Fingar der Wanderer kann
        dir bestimmt mehr darüber sagen."'
    AttrHin Bergkristall bekannt
    AttrHin Fingar bekannt

||| ||| ||| ||| |||

Die Lösung für Dein Problem ist, nicht die Funktion hier zu verwenden, die berücksichtigt, ob Objekte mit ObjInSicht in Sichtweite geholt wurden, sondern die direkte Abhängigkeit zu prüfen:

Code:

    Bed /(aObj.Stammraum = aRaum) 'Da bist du schon.'


Außerdem steht an der entsprechenden Stelle des Feldes ja eine Null, die könnte man auch prüfen. (Was aber dank der komplizierten Feldoperationen in T.A.G. kompliziert wäre.)
_________________
Every silver lining has a cloud.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Tanan
BeitragVerfasst am: Mo, 28 Okt 2002 - 14:09  Antworten mit Zitat
Abenteurer
Abenteurer


Anmeldungsdatum: 25.08.2002
Beiträge: 416
Wohnort: Essen

Martin hat folgendes geschrieben:
Code:
Bed /(aObj.Stammraum = aRaum) 'Da bist du schon.'


Klar! So funktioniert's. Warum sieht die Lösung immer so einfach aus?

Danke.

Zitat:
Allerdings kann man wahrscheinlich in einem großen Spiel nicht ueberall hingehen, sondern nur zu ein paar ausgewaehlten, markanten Punkten. Das spart auch Objekte, die ja mit 250 recht knapp bemessen sind.

Ich habe bisher immer alle Räume auch als Objekte eingebunden. Das hat den Vorteil, daß man auch "u Zimmer" eingeben kann, und dann kommt die Raumbeschreibung. Ich mag solche Details. Klar, sparen kann man trotzdem, wenn man z.B. einen langen Gang mit einer einzigen Deko ausstattet, die dann überall dort zu sehen ist. Aber ich weiß nicht, ob ich es verkrafte, wenn man in dem Spiel nachher nicht alles direkt ansteuern kann. Mal sehen.

Zitat:
Ja, das kenne ich aus Guild of Thieves. Das war manchmal recht praktisch, obwohl ich es nie richtig benutzt habe. Aus anderen Spielen ist mir kein ähnliches Konzept bekannt.

Es gibt mindestens ein Infocom-Spiel, in dem es das auch gab. Mir fällt gerade der Titel nicht ein, aber hier gibt es ja Spezialisten für sowas...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ryn
BeitragVerfasst am: Mo, 28 Okt 2002 - 14:36  Antworten mit Zitat
Wasserträger
Wasserträger


Anmeldungsdatum: 08.09.2002
Beiträge: 58
Wohnort: Essen

Tanan hat folgendes geschrieben:
Martin hat folgendes geschrieben:
Ja, das kenne ich aus Guild of Thieves. Das war manchmal recht praktisch, obwohl ich es nie richtig benutzt habe. Aus anderen Spielen ist mir kein ähnliches Konzept bekannt.

Es gibt mindestens ein Infocom-Spiel, in dem es das auch gab. Mir fällt gerade der Titel nicht ein, aber hier gibt es ja Spezialisten für sowas...


Ha! Es war Moonmist. Das Spiel ist zwar nicht so besonders, aber das 'go to'-feature hat es mir hier echt angetan - Man bewegt sich durch die halbwegs bekannten Räume eines Schlosses, da macht die Funktion Sinn.

Ich bin übrigens kein Spezialist für Infocom-Spiele. :wink:
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Walafrid
BeitragVerfasst am: Mo, 28 Okt 2002 - 14:56  Antworten mit Zitat
Abenteurer
Abenteurer


Anmeldungsdatum: 26.08.2002
Beiträge: 238

http://www.textadventures.de/

Zuletzt bearbeitet von Walafrid am Mo, 24 Feb 2003 - 17:46, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Gast
BeitragVerfasst am: Mo, 28 Okt 2002 - 16:49  Antworten mit Zitat






Walafrid hat folgendes geschrieben:

Ich muss ehrlich sagen, ich habe das in Moonmist nicht benutzt. Vielleicht hab ich's deshalb nicht zu Ende gespielt...


Möglich. Schließlich läuft bei dem Spiel (leider) auch die Uhr mit, und mit 'Go to' bewegt man sich merklich schneller durchs Gebäude, als wenn man jeden Raum einzeln durchquert. :)
Nach oben
ryn
BeitragVerfasst am: Mo, 28 Okt 2002 - 16:50  Antworten mit Zitat
Wasserträger
Wasserträger


Anmeldungsdatum: 08.09.2002
Beiträge: 58
Wohnort: Essen

Ein geheimnisvoller Fremder? hat folgendes geschrieben:

Möglich. Schließlich läuft bei dem Spiel...


Das war ich. Einloggen vergessen, tschuldigung.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Gast
BeitragVerfasst am: Mo, 28 Okt 2002 - 18:01  Antworten mit Zitat






Ein Moonmist-Spieler namens ryn hat folgendes geschrieben:
Schließlich läuft bei dem Spiel (leider) auch die Uhr mit, und mit 'Go to' bewegt man sich merklich schneller durchs Gebäude, als wenn man jeden Raum einzeln durchquert. :)

Bist du sicher? Das ist aber dann eine fehlerhafte Implementierung, oder?

Normalerweise dauert

> TAKE APPLE AND BANANA

zwei Runden (zumindest in Inform-Spielen, so weit ich weiß). Und wenn die Kirche drei Räume vom Acker entfernt ist, sollte

> GEHE ZUR KIRCHE

(vom Acker aus) drei Runden dauern.
Nach oben
Walafrid
BeitragVerfasst am: Mo, 28 Okt 2002 - 18:02  Antworten mit Zitat
Abenteurer
Abenteurer


Anmeldungsdatum: 26.08.2002
Beiträge: 238

http://www.textadventures.de/

Zuletzt bearbeitet von Walafrid am Mo, 24 Feb 2003 - 17:47, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ryn
BeitragVerfasst am: Mo, 28 Okt 2002 - 18:37  Antworten mit Zitat
Wasserträger
Wasserträger


Anmeldungsdatum: 08.09.2002
Beiträge: 58
Wohnort: Essen

Eigentlich Walafrid hat folgendes geschrieben:
Ein Moonmist-Spieler namens ryn hat folgendes geschrieben:
Schließlich läuft bei dem Spiel (leider) auch die Uhr mit, und mit 'Go to' bewegt man sich merklich schneller durchs Gebäude, als wenn man jeden Raum einzeln durchquert. :)

Bist du sicher? Das ist aber dann eine fehlerhafte Implementierung, oder?


Ich hab extra nochmal nachgeschaut: Das ist wirklich so, und vielleicht auch Absicht. Als Rückmeldung auf einen 'Go to'-Befehl kommt nämlich z.B. "You go quickly toward the dining room."

In Verbindung mit der schön gemachten beiliegenden Karte, auf der alle offiziellen Raumnamen verzeichnet sind, wirkt das auf mich wie eine Abwehrmaßnahme gegen Raubkopierer.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Tanan
BeitragVerfasst am: Mo, 28 Okt 2002 - 21:38  Antworten mit Zitat
Abenteurer
Abenteurer


Anmeldungsdatum: 25.08.2002
Beiträge: 416
Wohnort: Essen

Das ist übrigens ein Mangel, den auch meine Lösung hat: Es vergeht immer nur ein Zug, egal, wie weit man geht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Martin
BeitragVerfasst am: Di, 29 Okt 2002 - 8:48  Antworten mit Zitat
Experte
Experte


Anmeldungsdatum: 25.08.2002
Beiträge: 677
Wohnort: München

Tanan hat folgendes geschrieben:
Das ist übrigens ein Mangel, den auch meine Lösung hat: Es vergeht immer nur ein Zug, egal, wie weit man geht.

Dieser Mangel lässt sich mit der momentanen Version von T.A.G. aber nicht beheben. Weder ist es möglich, die Eingabe zu überbrücken, noch kann man einen kompletten Spielzug aus einem anderen heraus aufrufen.

Eine Möglichkeit, die ich einmal (im Zusammenhang mit einem Modul, das es dem Spieler erlaubt, eine bestimmte Zeit lang zu warten) überlegt hatte, ist die Einführung einer weiteren globalen Systemflagge, sagen wir mal, hmmm, Verzögerung.

Wenn diese Flagge Null ist, läuft ein Spielzug wie gewohnt ab: Eingabe einer Anweisung, Analyse, und schließlich, wenn der Satz verstanden wurde, darf der Spieler seine Aktion ausführen, danach bekommen alle anderen (etwa mit einer Aktion *) die Chance, etwas zu tun.

Wenn Verzögerung gesetzt ist, passiert folgendes: der Spieler darf keinen Befehl eingeben, aBef ist Null und der Spieler fürhrt keine Aktion aus. Damit entfällt der ganze Block mit VorAusfen und NachAusfen. Alles andere, wie z.B. umherwandernde NPCs, brennende Zündschnüre und natürlich auch die Zeit, verhalten sich normal, so als ob der Spieler lediglich "warte" eigegeben hätte. (Am Ende des Zuges könnte Verzögerung um eins vermindert werden, was verhindert, dass der Spieler nie wieder einen Prompt sieht, weil schlampig programmiert wurde.)

Im gehezu-Beispiel würde (Verzögerung) bedeuten, dass der Spieler noch in Bewegung ist. Der Befehl "gehe_zu" würde nur den Zielort und Verzögerung setzen, die eigentliche Bewegung müsste aus einer Aktion * aufgerufen werden.

<> <> <> <> <> <> <> <> <> <>

Die Änderung wäre natürlich ein Eingriff in das bestehende T.A.G.-Format. Das heißt, es gäbe wieder eine neue T.A.M. (Die wievielte?) Alte Spiele würden aber weiterhin funktionieren, das es vier oder so freie Systemvariablen gibt, die bislang immer Null sind.
_________________
Every silver lining has a cloud.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Mo
BeitragVerfasst am: Di, 29 Okt 2002 - 12:47  Antworten mit Zitat
Administrator
Administrator


Anmeldungsdatum: 25.08.2002
Beiträge: 303
Wohnort: Berlin

Tanan hat folgendes geschrieben:
Das ist übrigens ein Mangel, den auch meine Lösung hat: Es vergeht immer nur ein Zug, egal, wie weit man geht.

Nun kenne ich TAG leider nicht, aber wenn die Anzahl der Züge in einer Variablen gespeichert wird, könnte man diese Variable nicht auch manuell hochsetzen?
_________________
d-frag.de - Ein oder zwei Dinge, die wir über Spiele wissen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Martin
BeitragVerfasst am: Di, 29 Okt 2002 - 13:11  Antworten mit Zitat
Experte
Experte


Anmeldungsdatum: 25.08.2002
Beiträge: 677
Wohnort: München

Mo hat folgendes geschrieben:
Nun kenne ich TAG leider nicht, aber wenn die Anzahl der Züge in einer Variablen gespeichert wird, könnte man diese Variable nicht auch manuell hochsetzen?

Das wäre für ein einfaches Spiel OK. Die Zeit würde verstreichen, die Anzahl der Züge erhöht. Aber die Spielwelt bliebe dann auch stehen, und mit ihr alle NPCs, U-Bahnen, Aufzüge, fallende Steine, tickende Bomben und Taschenlampenbatterien.

Eine (vielleicht bessere) Alternative zu meinen Gedanken oben wäre deshalb ein Befehl ZeitVergeht, der einen Zug verstreichen lässt, das heißt, jeder darf was machen, nur der Spieler nicht. Konkret bedeutet das, dass alle Aktionen * ausgeführt werden und die Aktion Nachher.

Was ich oben gesagt habe, könnte dann einfach in T.A.G. programmiert werden:

Code:

    Flagge Verzögerung
   
    Aktion Nachher
    Ausf
        solange (Verzögerung)
            Zeitvergeht
            dekr Verzögerung
        Ende
    EndeAusf


Ja, das gefällt mir.
_________________
Every silver lining has a cloud.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Tanan
BeitragVerfasst am: Di, 29 Okt 2002 - 15:21  Antworten mit Zitat
Abenteurer
Abenteurer


Anmeldungsdatum: 25.08.2002
Beiträge: 416
Wohnort: Essen

Klingt gut!

Martin hat folgendes geschrieben:
Das heißt, es gäbe wieder eine neue T.A.M. (Die wievielte?)

Und von mir aus kannst Du jede Woche ne neue TAG-Version rausbringen, solange sie auch mit alten Spielen klappt und immer schöne neue Features drin sind. *g*


Zuletzt bearbeitet von Tanan am Mi, 30 Okt 2002 - 10:26, insgesamt einmal bearbeitet
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 2
Gehe zu Seite 1, 2  Weiter
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