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

