Die Untiefen der Grammatik II

Ich möchte mal das Beispiel mit dem Reh aufgreifen und ein wenig aufzeigen, welche technische Entwicklung die Mudlib durch hat.

Am Anfang gab es die bereits erwähnten Grammatikfunktionen:

Der(taeter) + " trifft " + den(opfer) + " an " + dem(koerperstelle) + "."

Jetzt kann man sich vorstellen, daß das nicht der lesbarste Code wird. Für eine normale Kampfzeile muß ich bereits drei Meldungen erzeugen:

Der(taeter) + " trifft " + den( opfer ) + " an " + dem(koerperstelle) + "."

"Du triffst " + den(opfer) + " an " + dem(koerperstelle) + "."

Der(taeter) + " trifft Dich an " + dem(koerperstelle) + "."

Sowas mag ich immer sehr. Ohne Syntax-Highlighting bin ich bei sowas sofort verloren. Es gibt Codestellen, wo man ganze Bildschirmseiten voll mit solchen Meldungsblöcken hat :(

Dabei gibt es so schöne Methoden, um Code und Daten (die Meldung) zu trennen. Ganz simpel z.B. mit

msg = "%s trifft %s an %s.";

sprintf( msg, Der(taeter), den(opfer), dem(koerperstelle) );

Das halte ich für tausendmal lesbarer als obigen Dreck.

In der Mudlib hat man diesen Ansatz weiterverfolgt. Man kann die Grammatikfunktionen direkt in den Text schreiben und zur Laufzeit wird dann daraus die eigentliche Meldung gebaut:

"$Der('taeter) trifft $den('opfer) an $dem('koerperstelle)."

Na das sieht doch schon besser aus. Leider müssen wir immer noch drei Meldungen einzeln bauen:

"$Der('taeter) trifft $den('opfer) an $dem('koerperstelle)."

"Du triffst $den('opfer) an $dem('koerperstelle)."

"$Der('taeter) trifft Dich an $dem('koerperstelle)."

Zum Glück gibts dafür seit kurzem aber auch eine Lösung:

verb = "treffen";

msg = "$Du_der() $machst_macht('arg1) $den_dich('arg2) $prep(an,'arg3)."

taeter -> message_room( msg, verb, opfer, koerperstelle );

Das generiert mir automatisch alle drei verschiedenen Meldungen für Täter, Opfer und alle anderen Person im Raum. Perfekt!

Hier sind wir also wieder an dem Punkt, wo wirklich alles automatisch geht, egal wie die Datenlage ist. Und der Code sieht auch noch aufgeräumt und übersichtlich aus! Was will man mehr? Also ich find das mal so richtig Klasse! Hat ja auch nur 20 Jahre gedauert ;)

Die Untiefen der Grammatik

Die UNItopia-Mudlib steht ja frei zum Download bereit. Ich weiß auch, daß ein Teil der Spielerschaft da auch fröhlich drin rumschmökert, um vielleicht Rückschlüsse auf Avalon zu ziehen ;) Da kann ich ja auch mal was über die Technik unter der Haube berichten.

Die Schnittstelle zum Spieler sind lesbare, deutsche Texte. Die deutsche Sprache zeichnet sich nun leider nicht unbedingt durch Geradlinigkeit aus. Vier Fälle, lustige Artikel, drei Geschlechter statt nur zweien, usw. Grammatik ist die pure Lust ;)

Wenn man fürs MUD programmiert, hat man zwei Fälle:

Zum einen schreibt man statische Texte, wie z.B. bei Raumbeschreibungen:

In der Praerie. Das Gras ist kurz und trocken. Viel waechst hier nicht,
ausser ein paar dornigen Bueschen und duerren Baeumen.

Da braucht man keine große Technik für. Das schreibt man runter, speichert es weg und fertig. Wenn der Spieler den Raum betritt, wird es 1:1 angezeigt.

Auf der anderen Seite es eine Vielzahl Situationen, wo man zur Laufzeit Texte zusammenbauen will. Beispielsweise im Kampfscroll:

Bei mir steht:

   Das Reh tritt Dich mit seinem Huf an der Hand.

Beim Reh steht:

   Du trittst Selena mit Deinem Huf an der Hand.

Und alle anderen bekommen:

   Das Reh tritt Selena mit seinem Huf an der Hand.

Und hier kommen die ganzen Grammatikfunktionen ins Spiel, z.B. könnte man die letzte Meldung folgendermaßen zusammenbauen:

string msg = Der(taeter) + " " + verb + " " + den(opfer) + " mit " +
             seinem(waffe,0,taeter) + " an " + dem(koerperstelle) + ".";

So in der Art wird das an ganz vielen Stellen gemacht.

Jetzt gab es bei genau diesem Beispiel ein klitzekleines Restproblem:

Trifft man jemanden z.B. am Kopf, dann heißt es halt ‘am Kopf’ und nicht ‘an dem Kopf’.

Lösen konnte man das bisher nur, indem man das Geschlecht abfragt und das dann manuell zusammenbaut. Also eine nervige Sonderbehandlung.

Zu meiner großen Freude gibt es aber seit dieser Woche in der Mudlib eine neue Funktion und endlich auch dafür eine Lösung:

string msg = Der(taeter) + " " + verb + " " + den(opfer) + " mit " +
             seinem(waffe,0,taeter) + " " + prep("an",koerperstelle) + ".";

Egal, ob da man an Kopf, Fuß, Hand, Bein, Rücken oder Exxenschwanz getroffen wird, der Satz wird immer automatisch richtig sein.

Die Präpositionsfunktion konsequent angewendet, könnte man das Beispiel noch weiter umbauen:

string msg = Der(taeter) + " " + verb + " " + den(opfer) + " " +
             prep("mit",seinem(waffe,0,taeter)) + " " +
             prep("an",koerperstelle) + ".";

Sehr, sehr, sehr, sehr cool! Vermutlich kann die Hälfte der Leserschaft das nicht nachvollziehen, aber über sowas kann ich mir echt nen Ast freuen. Sowas macht das Leben eines Adeligen echt leichter:

Über je weniger blöde Sonderfälle ich mir den Kopf zerbrechen muß, um so weniger Code muß ich am Ende schreiben und umso produktiver kann ich sein. Es bleiben ja mehr als genug inhaltliche Probleme übrig.