/*
 * Der ultimative NPC : mnpc.c (C) by Sir Lunch a lot
 * $Id: mnpc.c,v 1.1 1993/10/12 16:23:07 djc Exp djc $
 */

Dieser urspruengliche mnpc wurde von mir weiterentwickelt und stark
optimiert. Er ist gedacht um relativ einfach, effiziente Laufnpcs zu
programmieren und erspart einem dadurch das Rad erneut erfinden zu muessen.
Der Urspruengliche mnpc.c von Sir liegt fuer interessierte weiterhin in
+d/unterwelt/std/mnpc.sir.

Die Eigenschaften im Ueberblick:

MNPC_AREA - In diesem Feld stehen die Raeume, in denen der NPC herumlaufen
   kann, ({}) bedeutet, das der NPC ueberall hin kann (bitte nur mit
   aeusserster Vorsicht und Absprache des RMs benutzen!!!).
   Bsp.: SetProp(MNPC_AREA, ({ "/d/ebene/room/ak_str" }));
     Dieser NPC kann ueber saemtliche Raeume der Akademiestrasse laufen, also
     z.b. in einen Raum mit dem Filenamen /d/ebene/room/ak_str1
     aber auch in alle Raeume in einem Verzeichnis /d/ebene/room/ak_str/*

MNPC_HOME - der Startraum des NPCs in den er spaeter ggf. auch wieder
   zurueckkehrt. Setzt man diese Property nicht, wird versucht, den Ort des
   Clonens zu erraten/bestimmen, aber wenn man sicher gehen moechte, dass der
   MNPC das Home hat, was man denkt, sollte man es explizit setzen.

MNPC_DELAY und. MNPC_RANDOM
  MNPC_DELAY + random(MNPC_RANDOM) ergibt den Abstand zwischen zwei
  Bewegungen des NPCs.
  Die minimale Verzoegerung eines MNPC ist jedoch ein __HEART_BEAT_INTERVAL__
  (aktuell 2s).

  ACHTUNG:
    1. Diese Werte muessen gesetzt werden, _bevor_ MNPC_FLAGS 
    gesetzt werden, da die Set-Methode von MNPC_FLAGS die Anmeldung im
    walk_master durchfuehrt. Sonst werden die Default-Werte benutzt!
    2. Wenn diese Werte geaendert werden, muss eine Neuanmeldung im
    walk_master erfolgen. Hierzu muss entweder MNPC_WALK in MNPC_FLAGS
    geloescht (und bis zum naechsten Walk gewartet werden) oder es muss
    Stop(), gefolgt von RegisterWalker() gerufen werden.

MNPC_WALK_TIME - Zeitangabe wie lange es dauert bis der NPC stehen bleibt
   falls er keinen Spieler mehr trifft. Dieser Wert sollte etwa 3-10 mal so
   gross sein, wie die durchschnittliche Laufgeschwindigkeit. Wenn der NPC
   dann einen reset lang keinen Spieler mehr trifft, movt er wieder in
   seinen Startraum und wartet dort auf neue Spieler.
   Defaultmaessig 600 sek.

MNPC_FLAGS - property mit einem oder mehreren gesetzten Flags
  MNPC_WALK  -  ueber dieses Flag kann das laufen ein- bzw. ausgeschaltet
     werden.

  MNPC_FOLLOW_PLAYER  -  der NPC verfolgt die Spieler, die er trifft

  MNPC_NO_WALK_IN_FIGHT  -  der NPC bleibt beim kaempfen und rennt nicht weg

  MNPC_GO_HOME_WHEN_STOPPED  -  der NPC geht sofort nach Hause wenn seine
     Zeit abgelaufen ist.

  MNPC_ONLY_EXITS - der NPC benutzt beim laufen keine SpecialExits
     Diese Funktion ist sehr wichtig, da durch SpecialExits auch Raeume
     betreten werden koennen die nicht in MNPC_AREA erlaubt wurden! Hierauf
     muss dann bereits bei der Gebietskonstruktion geachtet werden.

  MNPC_EXACT_AREA_MATCH - Die in MNPC_AREA angebeben Filenamen werden exakt
     geprueft, d.h. tempel1 matcht auch nur tempel1, aber nicht mehr tempel14.
     Folge: in MNPC_AREA muessten nun _alle_ Raeume einzeln angegeben werden, die
     betreten werden duerfen.

  MNPC_NO_MOVE_HOME - Der MNPC geht im reset() nicht nach Hause, wenn er
     laenger keinen Spielerkontakt hatte, sondern bleibt an dem Standort,
     wo er stehen blieb.
     Achtung: sollte dieser Raum entladen werden, wird der MNPC dort
     zuerstoert. Der Heimatraum des MNPC sollte dafuer vorsorgen (s. AddItem).
     Ebenso kann es passieren, dass der MNPC sehr sehr lange nicht mehr
     loslaeuft, sollte sein Standort einsam liegen.

/***************************************************************************/

Nun noch ein Beispiel fuer einen Laufnpc im Glockenwald:

  create()
  {
     ::create();
     SetProp(MNPC_DELAY, 30);
     SetProp(MNPC_RANDOM, 30);
     SetProp(MNPC_FLAGS, MNPC_WALK|MNPC_FOLLOW_PLAYER|MNPC_NO_WALK_IN_FIGHT);
     SetProp(MNPC_AREA, ({ "/d/wald/troy/glockenwald" }));
     ...
  }

  // diese Funktion entscheidet darueber ob ein Raum betreten werden darf,
  // oder nicht (hier wird also auch MNPC_AREA abgearbeitet). Ein
  // Ueberschreiben dieser Funktion kann manchmal sinnvoll sein, um
  // komplexere Bedingungen zu implementieren.
  int PreventEnter(string file)
  {
    call_other(file, "???");
    if (::PreventEnter(file) || present("elster", find_object(file)))
      return 1;
    return 0;
  }
 
Dieser NPC laeuft durch den Glockenwald und sobald er einen Spieler trifft,
verfolgt er diesen, bis zum Rande des Glockenwaldes. Wenn ein Spieler ihn
angreift, bleibt er automatisch stehen. Die Spieler sind nur in Raeumen
sicher, in denen sich eine Elster befindet, denn diese Raeume betritt der
NPC nicht.
