Wie mache ich Eigenschaften von V-Items dynamisch? Dazu kann man Pseudoclosures oder Closures als Wert einer Eigenschaft angeben. Pseudoclosures sind Strings, welche an einigen Stellen Aufrufe von Grammatik- Funktionen eingelaeutet durch das Dollarzeichen besitzen. Man kann sie bei "look_msg", "look_msg_night", "read_msg", "smell_msg", "hear_msg", "take_msg", "attack_msg" und "feel_msg" angeben. Dort wird OBJ_TP durch den Ausfuehrenden und 'vitem durch das aktuelle V-Item ersetzt. Weitere Dokumentation zu Pseudoclosures findet sich in /doc/funktionsweisen/pseudoclosures. Beispiel: "look_msg": "$Der(OBJ_TP) schaut $seinen('vitem) an.", "smell_msg":"Uah, $der() traut sich wirklich, an $dem('vitem) zu riechen." Reichen Pseudoclosures nicht aus, oder sind sie nicht verfuegbar (z.B. bei "long" oder "smell"), so kann man richtige Closures angeben. Diese Closures erhalten das eigene V-Item als 1. Parameter uebergeben. Bei diesem uebergebenen V-Item gibt es dann aber einen zusaetzlichen Eintrag "environment", welcher auf das V-Item, den Gegenstand bzw. Raum, an welchem dieses V-Item haengt, verweist. Closures fuer den "long"-Eintrag eines V-Items erhalten zusaetzlich noch wie bei query_long den Betrachter als 2. Parameter uebergeben. Closures fuer "read" erhalten string parse_rest, string str, mapping vitem, object leser (der 1., 2. und 4. Parameter entsprechen denen von query_read) uebergeben. Beispiele: string vitem_long(mapping vitem, object betrachter) { if(wizp(betrachter)) return "Beim ersten Blick auf "+dem(vitem)+" erkennst Du sofort, " "dass fuer dich folgende Befehle zur Verfuegung stehen:\n" " abschuss - Das solltest Du lieber nicht machen\n" " ende - Loggt Dich selber aus\n"; else return "Das ist einfach "+ein(vitem,({"stinknormales"}))+"."; } string vitem_text(string parse_rest, string str, mapping vitem, object betrachter) { betrachter->more("/doc/hilfe/toll"); return ""; } void create() { add_v_item( ([ "long": #'vitem_long, "read": #'vitem_text, "smell": lambda(({'vitem}),({#'call_other,SMELL_MASTER, "get_the_smell", 'vitem})), // Ich sag mit diesem Beispiel nicht, dass obige Lambda // sinnvoll ist, sondern nur wie sie aussehen sollte. // // Bei "long" waere es zum Beispiel: // lambda(({'vitem,'viewer}), ({#'call_other, // , "query_long", 'viewer}) ) "name": "wasweissich", "gender": "saechlich", ]) ); // ... } Wie frage ich dynamische Eigenschaften ab? Dies sollte entweder mit dem Define QUERY oder QUERY_PARS aus parse_com.h geschehen. Man kann sie sowohl auf Objekte und V-Items anwenden. Die Abfrage des Geruchs eines V-Items vitem wuerde dann einfach mit QUERY("smell",vitem) durchgefuehrt werden. Genauso bei einem Objekt ob (QUERY("smell",ob)). Muss man noch weitere Parameter bei der Abfrage angeben (z.B. bei "long", wo der Betrachter erwartet wird), so geht das mittels QUERY_PARS, wo man noch zusaetzlich ein Array mit allen Parametern angeben muss: QUERY_PARS("long", vitem, ({ this_player() }) )