Autor |
Nachricht |
< Problem bei Antwort auf "Was meinst du, den....." |
|
Verfasst am:
Sa, 22 Jan 2005 - 15:20
|
|
|
Abenteurer
Anmeldungsdatum: 26.08.2002
Beiträge: 278
Wohnort: Leipzig
|
|
So, hab das jetzt mal in einer Glulx+ZCode-Fassung umgesetzt, die zumindest bei mir bisher den Tests standgehalten hat. Wäre aber sehr dankbar, wenn sich das nochmal jemand anders anschauen oder es ausprobieren könnte. (Kris, du könntest es vielleicht mal testweise in deinem Projekt versuchen. Sicherheitskopie der german.h anlegen, die paar Änderungen hier durchführen und schauen, ob alles wie gewohnt läuft.)
Den Längencheck für UmlautAux im ZCode habe ich rausgelassen, weil die Gefahr eines Überlaufes aktuell ja nicht besteht. Ab 6/11 gibts im Rahmen der Glulx/ZCode-Angleichung dann endlich ne Library-Routine dafür.
In der german.h ab Zeile 824 eingefügt:
Code: | array UmlautAux -> 12;
[UmlautAddress i letter next last skip start length;
! Vokabel auf Hilfsfeld schreiben
#ifdef TARGET_GLULX;
length = PrintAnyToArray(UmlautAux,9,i);
start = 0;
#ifnot;
@output_stream 3 UmlautAux;
print (address) i;
@output_stream -3;
length = UmlautAux-->0;
start = 2;
#endif;
! Vokabel mit ersetzten Umlauten ausgeben
for (i=0 : i < length : i++) {
letter = UmlautAux->(i+start);
if(i+1 >= length)
next = 0;
else next = UmlautAux ->(i+start+1);
if(letter == 'a' && next == 'e') {
print "ä"; skip = true; }
else if(letter == 'o' && next == 'e') {
print "ö"; skip = true; }
else if(letter == 'u' && next == 'e' &&
last ~= 'q' or 'e') {
print "ü"; skip = true; }
else if(skip)
skip = false;
else
print (char)letter;
last = letter;
};
]; |
LanguageVerb ab Zeile 957 ersetzt durch diese Variante:
Code: | [ LanguageVerb i;
switch(i) {
'l//': print "schaue"; rtrue;
'z//': print "warte"; rtrue;
'j//': print "ja"; rtrue;
'x//','u//','b//': print "betrachte"; rtrue;
'v//': print "verlasse"; rtrue;
'i//','inv','inventory': print "Inventar"; rtrue;
'giess': print "gieße"; rtrue;
'uebertrag': print "übertrage"; rtrue;
'ueberreich': print "überreiche"; rtrue;
'praesentier': print "präsentiere"; rtrue;
'konsultier': print "konsultiere"; rtrue;
'durchquer': print "durchquere"; rtrue;
'begutacht': print "begutachte"; rtrue;
'durchsuch', 'durchwuehl', 'durchstoeber':
print "durchsuche"; rtrue;
'schliess': print "schließe"; rtrue;
'verschliess': print "verschließe"; rtrue;
'verriegel': print "verriegle"; rtrue;
'zertruemmer': print "zertrümmere"; rtrue;
'unterricht': print "unterrichte"; rtrue;
'zerdrueck': print "zerdrücke"; rtrue;
'zerquetsch': print "zerquetsche"; rtrue;
'durchschneid': print "durchschneide"; rtrue;
'zerschneid': print "zerschneide"; rtrue;
'betritt','tritt','nimm','gib','wirf','brich','zerbrich',
'iss','friss', 'sprich', 'sieh', 'lies',
'erklimm', 'erwirb' : print (UmlautAddress)i; rtrue;
default: if(PrintVerb(i) == 0)
print (UmlautAddress)i, "e";
rtrue;
};
]; |
Die unterschiedlichen Startpunkte für Glulx und ZCode sind nötig, weil PrintAnyToArray nicht die Arraylänge nach Array-->0 kopiert. _________________ "Ein Musiker! Was will der hier so spät?" Stolzing (Meistersinger v.N.) |
|
|
|
|
|
Verfasst am:
Sa, 22 Jan 2005 - 17:46
|
|
|
Experte
Anmeldungsdatum: 25.08.2002
Beiträge: 677
Wohnort: München
|
|
ChrisW hat folgendes geschrieben: | So, hab das jetzt mal in einer Glulx+ZCode-Fassung umgesetzt, ... |
Sehr schön!
Du könntest die LanguageVerb noch etwas abkürzen, wenn du 'übertrag', 'durchquer', 'begutacht', 'durchsuch', 'zerdrück' und wenn dich die etwas holprige Endung nicht stört auch 'verriegel' rausschmeißt.
ChrisW hat folgendes geschrieben: | Die Unterstützung für double-v8, also Z-Code-Dateien mit 1024KByte, ist nett, wenngleich im deutschsprachigen Raum auch noch niemand am aktuellen 512er-Limit gescheitert ist. |
Double v8 wäre nicht schlecht, obwohl bei richtig großen Spielen dann wahrscheinlich eher die 64k-Begrenzung für den lesbaren Speicher ein Problem wäre.
Clever wäre ein "Variable v8", so dass der packing factor im Header festgelegt würde und nicht durch die Versionsnummer. (z5 und z8 unterscheiden sich ja allein durch diesen Faktor.) Die Länge der Vokabeln könnte man auch dort festlegen.
ChrisW hat folgendes geschrieben: | In der Library endlich ein intelligentes UNLOCK, welches, wenn der Spieler den benötigten Schlüssel mit sich führt, automatisch diesen zum Aufschließen auswählt. usw. usf. *träum* |
So etwas wäre wohl besser in einer Library Extension aufgehoben, denke ich, denn nicht jedes Adventure hat viele Schlüssel. Grundsätzlich sind solche Erleichterungen für den Spieler aber eine tolle Sache. (Und leider für meinen Alltags-Schlüsselbund noch nicht implementiert.)
ChrisW hat folgendes geschrieben: | In Glulx gilt die 9-Zeichen-Beschränkung im Dictionary standardmäßig ebenfalls, kann allerdings per Compiler-Switch DICT_WORD_SIZE angehoben werden. |
Die Z-Maschine erlaubt es, die Größe der Dictionary-Einträge zu modifizieren. Allerdings sind die Vokabeln selbst immer neun Zeichen lang, die in sechs Bytes abgelegt werden. Die darauf folgenden Bytes enthalten lediglich Flaggen. In Inform werden meines Wissens Sieben-Byte-Einträge benutzt, im letzten Byte ist die Information enthalten, ob ein Wort ein Verb ist, oder ob es mit '...//p' als Plural definiert wurde. _________________ Every silver lining has a cloud. |
|
|
|
|
|
Verfasst am:
Sa, 22 Jan 2005 - 17:52
|
|
|
Kompassleser
Anmeldungsdatum: 21.02.2004
Beiträge: 198
Wohnort: Rheinmain
|
|
Ich habe das erstmal auf neutralem Boden getestet (erstmal nur Glulx), und es funktioniert.
Allerdings habe ich den Code (also beide Teile) in einer separaten LangVerb.h gespeichert.
Dann folgendes:
Code: | Replace LanguageVerb;
Include "Parser.h";
Include "LangVerb.h"; |
Damit bleibt die german.h erstmal unverändert, außerdem kann man der Extension jederzeit noch Verben hinzufügen wenn einem etwas einfällt ohne in die german.h eingreifen zu müssen.
Ich werde die LangVerb.h ab sofort in mein Spiel einbauen, sollte mir (oder den Testern) etwas auffallen, melde ich mich.
Sollte sie so laufen, würde ich sie mal ins Archiv hochladen, es sieht doch wirklich netter aus bei der Ausgabe :-)
Danke für die Mühe und Gruß
Kris
NACHTRAG:
ChrisW:
Mit "würde ich sie mal ins Archiv hochladen" meine ich natürlich dich, falls das falsch verstanden wurde :-) |
|
|
|
|
|
Verfasst am:
Sa, 22 Jan 2005 - 19:49
|
|
|
Abenteurer
Anmeldungsdatum: 26.08.2002
Beiträge: 278
Wohnort: Leipzig
|
|
Martin hat folgendes geschrieben: | Du könntest die LanguageVerb noch etwas abkürzen... |
Argh, stimmt. Diese Verben haben ja nur neun Zeichen. :)
Martin hat folgendes geschrieben: | So etwas (intelligentes UNLOCK) wäre wohl besser in einer Library Extension aufgehoben, denke ich.... |
Schon richtig. Viele Änderungen in der 6/11 und der geplanten darauffolgenden Version sind Dinge, die schon vorher in Extensions existierten. So bspw. die Möglichkeit mit LOOK TO THE NORTH usw. in verschiedene Himmelsrichtungen zu schauen. Ob das in die Standardlibrary muss, darüber kann man streiten.
Zitat: | Die Z-Maschine erlaubt es, die Größe der Dictionary-Einträge zu modifizieren. Allerdings sind die Vokabeln selbst immer neun Zeichen lang, die in sechs Bytes abgelegt werden. |
Eben das wird in Glulx nur vom Compiler festgelegt, laut Glulx Technical Reference, die Vokabeln können dort also auch länger sein:
Glulx TR hat folgendes geschrieben: | * The Dictionary
This structure is generated by the compiler, and used by the library.
long: number of words
...each word: {
byte: 60 (type identifier for dict words)
bytes[9]: nine bytes of lower-case text, zero-padded
short: flags
short: verb number
short: unused (zero)
}
...
The nine-character word length is actually variable, controlled by the
$DICT_WORD_SIZE memory setting.
... |
Kris hat folgendes geschrieben: | Allerdings habe ich den Code (also beide Teile) in einer separaten LangVerb.h gespeichert. ... Damit bleibt die german.h erstmal unverändert, außerdem kann man der Extension jederzeit noch Verben hinzufügen wenn einem etwas einfällt ohne in die german.h eingreifen zu müssen. |
Schöne Variante. Und toll, dass du es gleich ausprobiert hast. Allerdings finde ich schon, dass die neue Variante, so wir sie denn ausführlich getestet haben, in die offizielle german.h sollte.
Trotzdem kannst du sie noch im Quellcode deines Spiels erweitern: Dazu wird am Ende die Routine PrintVerb aufgerufen, so sie denn vorhanden ist. Wenn du in deinem eigenen Quellcode diese Routine anlegst, kannst du dort nach Lust und Laune noch Ersetzungen hinzufügen, ohne irgend etwas an der german.h ändern zu müssen. _________________ "Ein Musiker! Was will der hier so spät?" Stolzing (Meistersinger v.N.) |
|
|
|
|
|
Verfasst am:
So, 23 Jan 2005 - 8:26
|
|
|
Kompassleser
Anmeldungsdatum: 21.02.2004
Beiträge: 198
Wohnort: Rheinmain
|
|
ChrisW hat folgendes geschrieben: | Allerdings finde ich schon, dass die neue Variante, so wir sie denn ausführlich getestet haben, in die offizielle german.h sollte. |
Klar, keine Frage.
Nur so lange es keine neue offizielle german.h gibt, arbeite ich lieber mit Extensions. Ich habe schon eine Liste von Änderungen (wie z.B. der Akk-Nom Fehler in der WritListFrom) die ich direkt in der lib vorgenommen habe.
Damit ich nicht den Überblick verliere, wenn es eine neue lib gibt, halte ich die Liste lieber so klein wie möglich :-)
Gruß
Kris |
|
|
|
|
|
Verfasst am:
Fr, 25 März 2005 - 13:14
|
|
|
Kompassleser
Anmeldungsdatum: 21.02.2004
Beiträge: 198
Wohnort: Rheinmain
|
|
Hallo,
ich habe mich jetzt nochmal mit der Thematik beschäftigt (also parse_name - nicht die Sache mit LanguageVerb):
Martin hat folgendes geschrieben: | Wenn dir parse_name gefällt, interessiert dich vielleicht dieser Link zu Zarfs Parse-Name-Variationen..
|
Vielen Dank, das ist genau das, was man dafür brauchen kann, und zwar das dritte Beispiel (hier angepasst und der Einfachheithalber auf Synonyme verzichtet):
Code: | name 'gestein' 'vom' 'mars',
parse_name [ wd num gotit;
wd = NextWord();
while (WordInProperty(wd, self, name)) {
if (wd == 'gestein')
gotit = true;
num++;
wd = NextWord();
}
if (~~gotit)
return 0;
return num;
],
name 'gestein' 'vom' 'mond',
parse_name [ wd num gotit;
wd = NextWord();
while (WordInProperty(wd, self, name)) {
if (wd == 'gestein')
gotit = true;
num++;
wd = NextWord();
}
if (~~gotit)
return 0;
return num;
],
|
Es wird auf jedenfall das Wort 'gestein' benötigt, um zu reagieren:
>untersuche gestein
Was meinst du, das Gestein vom Mars oder das Gestein vom Mond?
... und nun wird alles akzeptiert:
>vom mond
>mond
>gestein vom mond
Und gibt man folgendes ein:
>untersuche mond
könnte die Beschreibung des Obtektes Mond erscheinen, da 'gestein' nicht vorkam - wirklich klasse!
Es sind halt doch oft die kleinen Codefragmente, die ungklaubliche Wirkung haben.
Vielen Dank nochmal für den Hinweis.
Gruß
Christof |
|
|
|
|
|
|
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.
|
|