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