Autor |
Nachricht |
< Gib deinen Namen ein! |
|
Verfasst am:
Fr, 28 Feb 2003 - 19:13
|
|
|
Abenteurer
Anmeldungsdatum: 25.08.2002
Beiträge: 416
Wohnort: Essen
|
|
Folgendes schwebt mir vor:
Code: | Bitte gebe deinen Namen ein!
> Jens
Hallo Jens! |
Wie läßt sich sowas mit TAG realisieren? Ich habe versucht, einen "String sname" zu definieren und in der "Aktion Verbparser"
zu schreiben. Das führt aber schon beim Kompilieren zu einer Fehlermeldung.
Danke im Voraus! |
|
|
|
|
|
Verfasst am:
Fr, 28 Feb 2003 - 21:02
|
|
|
Kompassleser
Anmeldungsdatum: 25.08.2002
Beiträge: 142
|
|
(Blah)
Zuletzt bearbeitet von Ally am Sa, 1 März 2003 - 11:47, insgesamt einmal bearbeitet |
|
|
|
|
|
Verfasst am:
Sa, 1 März 2003 - 11:36
|
|
|
Experte
Anmeldungsdatum: 25.08.2002
Beiträge: 677
Wohnort: München
|
|
T.A.G. arbeitet manchmal wie die Z-Maschine: Ihm bekannte Wörter werden in einem Wörterbuch abgelegt. Wenn Das Wort 'jens' irgendwo im Code vorkommt, wird es erkannt, als (beliebiger) Name eines Spielers nicht.
Man muss hier den Umweg über Felder gehen und den Namen in einem Verb- oder Objektparser erkennen. Ich hatte noch ein (einfaches) Beispiel, in dem der Spiele sagen kann "Ich heiße Bernd" und dann Bernd hieß:
Code: |
! Feld für den Namen
Feld MeinName (13)
! Ausgabe des Namens
Aktion TextName
Ausf
Schleife Aux 1 meinName.0
Sei Aux1 MeinName.Aux
Text '[Char Aux1]/'
Ende
EndeAusf
! Eine Deko als Hilfsobjekt
Deko Metaname
Name 'Name an sich' m
Subst '.' m
! Das Un-Verb 'ich heiße' definieren
Synonym 'ich heisse' 'ichheisse'
! Befehl zur namensgebung:
! Eigentlich wird bereits alles im ObjParser gemacht
Bef Ich_Heisse
Name 'dich nennen'
Verb 'ichheisse'
Syntax dasObj (allg)
Ausf
Text 'OK, du heißt jetzt [TextName].'
EndeAusf
! Belegen des Namens
Aktion ObjParser
Ausf
Wenn (aVerb = 'ichheisse') und (Wortlänge) dann
Sei MeinName.0 Wortlänge
Schleife Aux 1 Wortlänge
Sei MeinName.Aux Wort.Aux
Ende
Sei aObj Metaname
Ende
EndeAusf
|
Mit diesem Befehl kann sich der Spieler einen Namen geben, der genau ein Wort lang ist. Der Name wird auf meinName abgelegt: meinName.0 enthält die Länge des Namens, die weiteren Einträge den Namen selbst. (Hallo, Pascal!)
Folgende Erweiterung erlaubt es, längere Namen anzugeben, wobei allerdings jedes Wort auf zwölf Buchstaben beschränkt ist:
Code: |
Feld meinName (25)
Aktion TextName
Ausf
lokal aux ! Schleifenvariable
lokal caps ! Großschreibungs-Flagge
setze caps
Schleife Aux 1 meinName.0
! Ein Leerzeichen muss mit _ simuliert werden
wenn (MeinName.Aux = "_") dann
Text ' /'
sonst
wenn (caps) dann
! Großbuchstabe
Text '[Char MeinName.Aux]/'
sonst
! Kleinbuchstabe
Text '[char MeinName.Aux]/'
ende
ende
! Ein Leerzeichen oder Bindestrich
! bewirkt Großschreibung des nächsten Buchstabens
lösche caps
wenn (MeinName.Aux = "_" "-") setze caps
Ende
EndeAusf
...
Aktion ObjParser
Ausf
lokal x, y, z
Wenn (aVerb = 'ichheisse' 'heisse') dann
sei z MeinName.0
lösche MeinName.0
solange /(wort = '')
Inkr MeinName.0 Wortlänge
Schleife x 1 Wortlänge
inkr y
wenn (y < 25) Sei MeinName.y Wort.x
Ende
nächstesWort
wenn /(wort = '') dann
inkr y
Inkr MeinName.0
sei Meinname.y "_"
Ende
Ende
! Objekt belegen, wenn ein Name eingegeben wurde
wenn (MeinName.0) dann
Sei aObj Metaname
wenn (meinName.0 > 24) dann sei meinName 24
sonst
sei MeinName.0 z
Ende
Ende
EndeAusf
|
T.A.G. erkennt die Notation " " (Leerzeichen zwischen Gänsefüßchen) nicht als Leerzeichen, deshalb wird hier jedesmal, wenn ein Leerzeichen im namen ist ein Unterstrich eingefügt.
Man könnte natürlich das Ganze auch in einem Verbparser machen, so dass, wenn eine bestimmte Flagge gesetzt ist, kein Befehl abgefragt wird, sondern der Input als Name betrachtet wird.
Außerdem gibt es einen Bug bei Synonymen: Wenn 'ich' und 'heiße' zusammengefügt werden, taucht das letzte Wort zweimal auf. das ist gefixt, aber die neue Version kommt erst, wenn Allys Halbdunkel-Problem auch gelöst ist.
Die beiden Namensgebungsdemos gibt's hier: http://www.martin-oehm.de/tag/name.zip. _________________ Every silver lining has a cloud. |
|
|
|
|
|
Verfasst am:
Sa, 1 März 2003 - 11:46
|
|
|
|
Martin hat folgendes geschrieben: |
|
Ahhh! |
|
|
|
|
|
Verfasst am:
Sa, 1 März 2003 - 11:50
|
|
|
Kompassleser
Anmeldungsdatum: 25.08.2002
Beiträge: 142
|
|
Martin hat folgendes geschrieben: | Code: | Sei MeinName.0 Wortlänge |
|
Und gleich noch mal 'Ahhh!'... Okay, ich halte jetzt den Mund. |
|
|
|
|
|
Verfasst am:
Sa, 1 März 2003 - 14:23
|
|
|
Abenteurer
Anmeldungsdatum: 25.08.2002
Beiträge: 416
Wohnort: Essen
|
|
Super Martin! Einmal mehr vielen Dank. Werd den Code nachher mal ausprobieren. |
|
|
|
|
|
Verfasst am:
So, 2 März 2003 - 12:23
|
|
|
Abenteurer
Anmeldungsdatum: 25.08.2002
Beiträge: 416
Wohnort: Essen
|
|
Auch wenn ich den Code nur zu zwei Dritteln verstehe, er klappt wunderbar. Gibt es auch eine Möglichkeit, die Groß- und Kleinschreibung genauso auszugeben, wie der Spieler sie eingegeben hat? Bei Fehlermeldungen klappt das ja:
Code: | > sCHnöffT
Ich kenne das Wort "sCHnöffT" leider nicht. |
|
|
|
|
|
|
Verfasst am:
So, 2 März 2003 - 14:26
|
|
|
Experte
Anmeldungsdatum: 25.08.2002
Beiträge: 677
Wohnort: München
|
|
Tanan hat folgendes geschrieben: | Gibt es auch eine Möglichkeit, die Groß- und Kleinschreibung genauso auszugeben, wie der Spieler sie eingegeben hat? |
Nein, das geht nicht. Bei den Fehlermeldungen steht dem Parser etwas mehr Information zur Verfügung als im Verb- oder Objektparser. Hier hat der Autor nur das Einheitsformat der Vokabeln vorliegen: Alles in Kleinbuchstaben, mit Umlauten, ohne ß und alle Wörter sind auf zwölf Zeichen zusammengestutzt.
Man kann also mit diesem Code nicht Goethe (oder Oehm) heißen - TAG baut da immer ein ö rein. Die Idee hinter dem Objektparser ist auch eher, Input verstehen zu können, nicht so sehr neuen Output zu erzeugen. _________________ Every silver lining has a cloud. |
|
|
|
|
|
Verfasst am:
So, 2 März 2003 - 15:31
|
|
|
Abenteurer
Anmeldungsdatum: 25.08.2002
Beiträge: 416
Wohnort: Essen
|
|
Naja, nicht so schlimm. Trotzdem vielen Dank! |
|
|
|
|
|
Verfasst am:
So, 9 März 2003 - 14:48
|
|
|
Abenteurer
Anmeldungsdatum: 25.08.2002
Beiträge: 416
Wohnort: Essen
|
|
Was ich noch nicht verstehe... warum setzt er nach Einzelbuchstaben ín der Ausgabe einen Unterstrich? Also etwa:
Zitat: | Wie heißt du?
>norbert a meier
Willkommen Norbert A_Meier! |
Kann auch sein, daß ich ausversehen am Code was verändert habe, daß sowas auslöst. |
|
|
|
|
|
Verfasst am:
Mo, 10 März 2003 - 19:35
|
|
|
Experte
Anmeldungsdatum: 25.08.2002
Beiträge: 677
Wohnort: München
|
|
Tanan hat folgendes geschrieben: | Kann auch sein, daß ich ausversehen am Code was verändert habe, daß sowas auslöst. |
Scheint so. Im Original-Code klappt's. (Allerdings geben Namen wie "Robert R" oder "Hans H" komische Ergebnisse, wenn man normal.adv einbindet :-) )
T.A.G. erkennt zwar zwei Anführungszeichen mit Leerzeichen nicht als Leerzeichen, aber man kann die Krücke mit dem Unterstrich auch umgehen, wenn man für ein Leerzeichen den ASCII-Code 32 (oder $20) verwendet:
Code: |
...
nächstesWort
wenn /(wort = '') dann
inkr y
Inkr MeinName.0
sei Meinname.y 32
Ende
....
|
_________________ Every silver lining has a cloud. |
|
|
|
|
|
Verfasst am:
Fr, 27 Jun 2003 - 12:51
|
|
|
Wasserträger
Anmeldungsdatum: 13.06.2003
Beiträge: 33
Wohnort: Köln
|
|
Also ich habe denn Quelltext direkt in die adv-Datei Kopiert, aber das klappt nicht, es erscheinen viele Fehlermeldungen wie:
Zitat: |
"Metaname" Unbekannte Variable
|
|
|
|
|
|
|
Verfasst am:
Sa, 28 Jun 2003 - 9:26
|
|
|
Abenteurer
Anmeldungsdatum: 25.08.2002
Beiträge: 416
Wohnort: Essen
|
|
Bei mir hat es funktioniert. Hast Du den ganzen Quelltext genommen? Also auch die Zeile mit "Deko Metaname"? Dann sollte TAG mit dem Begriff nämlich eigentlich etwas anfangen können. |
|
|
|
|
|