IF-Forum

» IF-Forum - Autorencafé - Schreiben! - I6: Verben überprüfen
AntwortenNeues ThemaNeue Umfrage

I6: Verben überprüfen

Geschrieben um 17:20 am 14.09.2010 | Zitat | Editieren | Löschen
ChristianB
Mitglied
Retired Gumby
Beiträge: 1062

Ich möchte gerne das Verben-Wörterbuch eines Spiels durchsuchen und überprüfen, ob Verben definiert wurden, die bestimmte Endungen tragen ('e' und 'en').

Wie man die Endungen bei einer Vokabel prüft, kann ich mir gerade noch zurechtlegen, aber wie man das Lexikon von Z-Machine und Glulx durchsucht, ist mir ein Rätsel.

Was muss ich machen? Wo muss ich nachschlagen?

Hilfe!

Edit: Okay, für die Z-Maschine habe ich etwas in der Art hinbekommen. Muss ja wohl in Glulx auch irgendwie gehen ...

Es werden nur neue, vom Autor definierte, Verben berücksichtigt.



    'baumle'   'durchstoe' 'ende'    'klettre'   'konsultie'

    'lage'     'meldungen' 'nee'     'noe'       'oeffne'

    'pronomen' 'punkte'    'restore' 'save'      'schnueffe'

    'scope'    'score'     'showme'  'streichle' 'superbrie'

    'trace'    'tree'      'verbose' 'verschlie' 'wedle'

;

[ YLibcheck i j k l last last2 ignore_verbs_num;

    ignore_verbs_num = LibcheckIgnoreVerbs-->0;

    for (i = dict_start : i <= dict_end-dict_entry_size : i=i+dict_entry_size ) {

        j = i->#dict_par1;

        if (0 ~= j&1) {

            for (k = 1 : k <= ignore_verbs_num : k++ )

                  if (LibcheckIgnoreVerbs-->k == i) j=-1;

            if (j==-1) continue;

            last = LastCharacterAddress(i);

            last2 = LastCharacterAddress(i, 1);

            if (last == 'e' || (last == 'n' && last2 == 'e') )

                print "Das Verb '", (address) (i),

                      "' endet mit 'e' oder 'en'.^";

        }

     }

     print "^^";

];```
Geschrieben um 08:46 am 15.09.2010 | Zitat | Editieren | Löschen
Martin
Avatar
Mitglied
Prof Gumby
Beiträge: 634

Blöderweise werden die globalen Variablen dict_start, dict_end und dict_entry_size nur für Z-Code, aber nicht für Glulx gesetzt. Ansonsten würde Dein Code auch für Glulx funktionieren.

Leider gibt die Glulx Inform Technical Reference keinen genauen Aufschluss über den Ort des Dictionaries, daher muss man sich diese Werte aus der Rouitine Tokenise__ zusammensuchen.

Schneller Fix:



    ignore_verbs_num = LibcheckIgnoreVerbs-->0;

 

    #ifdef TARGET_GLULX;   

    dict_start = #dictionary_table + WORDSIZE;

    dict_entry_size = DICT_WORD_SIZE + 7;

    dict_end = dict_start + #dictionary_table-->0 * dict_entry_size;

    #endif;

   

    for (i = dict_start : i < dict_end : i = i + dict_entry_size ) {

        j = i->#dict_par1;

        if (0 ~= j&1) {

            for (k = 1 : k <= ignore_verbs_num : k++ )

                  if (LibcheckIgnoreVerbs-->k == i) j=-1;

            if (j==-1) continue;

            last = LastCharacterAddress(i);

            last2 = LastCharacterAddress(i, 1);

            if (last == 'e' || (last == 'n' && last2 == 'e') )

                print "Das Verb '", (address) (i),

                      "' endet mit 'e' oder 'en'.^";

        }

     }

     print "^^";

];```

Natürlich wäre es sauberer, diese Variablen dort, wo auch die Z-Code-Pendants gesetzt werden, zu definieren, damit alles durchgängig ist.

Das habe ich unter I6 mit Latin1-Glulx getestet. Ich hoffe, dass der Code auch mit Unicode-Glulx funktioniert.

Oh, und wenn man das Kleiner-Gleich in ein einfaches Kleiner-Als umwandelt, spart man sich die Subtraktion von dict_entry_size.
Geschrieben um 10:49 am 15.09.2010 | Zitat | Editieren | Löschen
ChristianB
Mitglied
Retired Gumby
Beiträge: 1062

Super, alles perfekt!

Danke!

AntwortenNeues ThemaNeue Umfrage
Powered by Spam Board SVN © 2007 - 2021
Impressum / Datenschutz