
notify_fail()
*************


FUNKTION
========

   #include <notify_fail.h>

   varargs void notify_fail(string str, int prio)
   varargs void notify_fail(closure cl, int prio)


ARGUMENTE
=========

   str   Meldung die an den Spieler anstatt des 'Wie bitte' ausgegeben
         werden soll
   cl    Closure, die bei Fehlschlag ausgefuehrt werden soll
   prio  Prioritaet dieses Objekts bei diesem Setzen der Meldung


BESCHREIBUNG
============

   Merkt sich den angegebenen str und gibt ihn im Falle einer inkorrekten
   Eingabe des Spielers anstatt eines 'Wie bitte' aus.

   Gedacht ist notify_fail, um dem Spieler eine bessere Hilfestellung
   bei Kommandos / Eingaben zu geben, um ihn u.U. auf die richtige
   Syntax hinzuweisen.

   Wird notify_fail mehrfach (durch verschiedene Objekte o.ae.) auf-
   gerufen, wird der letzte erfolgreiche Aufruf gewertet. Eine Meldung wird
   dann tatsaechlich gesetzt, wenn die Prioritaet dieses Objekts gleich
   gross oder groesser ist als die Prioritaet des Objekts, was das bisher
   gueltige notify_fail() gesetzt hat. Folgende Prioritaeten sind
   vordefiniert und werden automatisch ermittelt:
   NF_NL_OWN    100         // eigenes Objekt (soul) ueberschreibt kaum was
   NF_NL_THING  100000
   NF_NL_ROOM   1000000     // Raeume ueberschreiben sonstigen Krams
   NF_NL_LIVING 10000000    // Lebewesen ueberschreiben auch Raeume
   2 weitere vordefinierte koennen von Magier angegeben werden:
   NF_NL_NONE   -1          // wird von allem ueberschrieben
   NF_NL_MAX    __INT_MAX__ // hoechste Prioritaet, ueberschreibt alles

   Wird eine Closure als Argument gegeben, wird sie im Fehlerfall
   (also erst wenn ein Kommando endgueltig fehlgeschlagen hat)
   ausgefuehrt und hat die Fehlermeldung als Resultat
   zurueckzugeben. Die Closure erhaelt als Argument den
   originalen Befehlsgeber; in der Regel dies ist this_player(),
   was aber vom MODIFY_CMD hook geaendert werden kann.

   notify_fail() erkennt verschachtelte Kommandos (siehe Efun
   command()), und ein notify_fail() in einem Unterkommando
   hat keinen Einfluss auf das uebergeordnete Kommando.


BEMERKUNGEN
===========

   - solange man sich nicht absolut sicher ist, dass ein bestimmtes Objekt
     mit dem Kommando gemeint ist (Identifikation ueber id()), sollte man
     - notify_fail(str); return 0;
     nutzen anstatt mit
     - write(str) return 1;
     die Kommandoauswertung abzubrechen (und anderen Objekten die Chance
     zu nehmen das Kommando zu erfuellen)
   - Kommandos werden uebrigens oft erst vom betretenen Raum, dann von den
     Objekten abgearbeitet (je nachdem wann diese dazukamen)
   - die Prioritaet wird momentan nicht gespeichert, sie ist nur beim Setzen
     relevant. Will spaeter ein anderes Objekt eine Meldung setzen, wird
     fuer das eigene Objekt die Standardprioritaet ermittelt, auch wenn man
     eine andere hier uebergeben hat
   - Die NF_NL_* sind in /sys/notify_fail.h defniert.


BEISPIELE
=========

   Ein Raum erwartet die korrekte Eingabe von 'iss suppe':

   int iss_cmd(string str){
     // zu Anfang der Funktion das notify_fail definieren
     notify_fail("Moechtest Du vielleicht von der Suppe essen?\n");

     // Spieler hat nur 'iss' ohne Parameter eingegeben oder einen anderen
     // Parameter angegeben ... Abbruch!
     // Falls kein weiteres Objekt das Kommando erfuellt oder das
     // notify_fail() mit einer eigenen Meldung ueberschreibt, wird obige
     // Meldung an den Spieler ausgegeben.

     if(!str || str!="suppe") return 0;
     // ab hier ist die Eingabe dann wirklich 'suppe' und die Funktion
     // kann beliebig fortgefuehrt werden
     ...
     return   1;


SIEHE AUCH
==========

   add_action(E), AddCmd(L), AddAction(L),
   query_verb(E), query_notify_fail(E)

8.Aug 2007 Gloinson
