Die Programmierung 'intelligenter' Monster, d.h. Monster, die auf Ansprache durch einen Spieler oder auf Verhaltensweisen eines Spielers angepasst reagieren koennen, kann man sich durch die eingebaute Routine: set_parse_conversation(object ob, string *regeln) stark vereinfachen. Anhand des Regelwerks werden saemtliche Meldungen, die das Monster erhaelt (das sind im Prinzip alle, die auch ein Spieler erhaelt !!), begutachtet, und im Falle einer Uebereinstimmung wird eine in den Regeln benannte Routine im Objekt aufgerufen. Diese bekommt als Parameter die entsprechende Meldung und kann diese bei Bedarf noch genauer unter die Lupe nehmen und entsprechend darauf reagieren. Wird ein Monster durch einen Raum ge"clone"t, so schreibt man zweckmaessiger- weise diese Routinen in den Raumfile und setzt ob auf den Raum. Ein anderes Beispiel ist /obj/leo. Er "inherit"et /i/monster/monster und wird nur geladen, nicht ge"clone"t. Hier stehen die Routinen in /obj/leo selbst, nicht in dem Raum, von dem aus Leo geladen wird. Syntax der Regeln: ({ Regel1, Regel2, ... }) Syntax einer Regel: "Funktionsname: Bedingung1 || Bedingung2 || ....." Syntax einer Bedingung: Wort1 && Wort2 && ...... und schlieslich die Syntax eines Wortes: wort oder {wort} oder [silbe] oder [{silbe}] Wie funktioniert das ? Eine Regel gilt dann als erfuellt, wenn MINDESTENS EINE ihrer Bedingungen erfuellt ist. Ein Bedingung wiederum ist dann erfuellt, wenn JEDES ihrer Worte in der angegebenen Reihenfolge innerhalb der Meldung gefunden wird. Wann wir ein Wort gefunden ? wort steht fuer ein einzelnes Wort, vor dem ein Leerzeichen steht. Nach ihm koennen ein weiteres Leerzeichen, ein Komma, ein Punkt, ein Doppelpunkt oder ein \n (LINEFEED) folgen. Dabei wird NICHT auf Gross- oder Klein-Schreibung geachtet. {wort} verhaelt sich wie letzteres; allerdings wird hier auf Gross- Klein-Schreibung geachtet. [silbe] Dies wird gefunden, sobald die angegebene Zeichenkette als einzelnes Wort ODER als Teil eines Wortes innerhalb der Meldung auftaucht. Gross- oder Klein-Schreibung ist hierbei NICHT signifikant. {[silbe]} Beide Schreibweisen verhalten sich identisch und wie [..], nur dass [{silbe}] auf Gross-Klein-Schreibung geachtet wird. WICHTIG: In den aufgerufenen Routinen gilt folgendes: this_player() == Spieler this_object() == ob (meistens der Raum, der das Monster erzeugt) previous_object() == Monster Beispiel: /* * In einem Raum-File koennte folgendes programmiert sein: */ void reset() { ......... monster->set_parse_conversation(this_object(),({ "gruss: hallo || gruess gott || guten tag || hi", "smalltalk: harry && wie geht || was macht && harry", "raetsel_geloest: gibt && dir && orkschlaechter", "bedanke: gibt && dir", "ansprache: naehert sich", "wetter: [wetter]", "antworte: sagt: || redet zu dir:", "aergere: {Francis naehert sich} || {Freaky} || {Maulwurf}" })); ........ } void smalltalk(string str) { previous_object()->message("Detlef verneigt sich und sagt: Danke der Nachfrage, mir gehts gut!"); } void antworte(string str) { previous_object()->do_command("sag Hallo "+der(this_player())+ ", ich hab dich nicht verstanden; Kannst Du das nochmal wiederholen?"); } void aergere(string str) { previous_object()->do_command("sag Mit DIR rede ich nicht mehr!"); } void bedanke(string str) { object *new; new = new_inv(); // Gibt eine Liste ALLER Objekte zurueck, // die seit dem letzten Aufruf von new_inv() // ins Monster gekommen sind. Das erste in der // Liste ist das neueste. if (sizeof(new) <= 0) { // Der Spieler hat nur ein echo gemacht. previous_object()->do_command( "sage Darauf falle ich nicht mehr rein!"); return; } previous_object()->do_command("sage Danke fuer "+den(new[0])+ ", "+der(this_player())+"."); }