Minimale Verzoegerung von 1 HB erzwingen.

Wenn Magier als Verzoegerung so wenig angeben, dass weniger
als ein HB nach random herauskommt, wird der MNPC in denselben
Zeitslot eingetragen, der gerade abgearbeitet wird. Da dieser
nach Abarbeiten aber geloescht wird, geht der MNPC in walker
verloren und laeuft nicht mehr (und buggt beim De-Registrieren).
Daher wird nun min. eine Verzoegerung (nach random) von einem
Heartbeat erzwungen.

Change-Id: Ic458c2fa9bac633d2a8f2de9aa91dc1be2e12884
diff --git a/p/service/padreic/mnpc/mnpc.doc b/p/service/padreic/mnpc/mnpc.doc
index 86a9fa4..9dfc91c 100644
--- a/p/service/padreic/mnpc/mnpc.doc
+++ b/p/service/padreic/mnpc/mnpc.doc
@@ -27,12 +27,17 @@
 MNPC_DELAY und. MNPC_RANDOM
   MNPC_DELAY + random(MNPC_RANDOM) ergibt den Abstand zwischen zwei
   Bewegungen des NPCs.
-  ACHTUNG: 
+  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, sollte man die MNPC_FLAGS neu
-    setzen, um so die Neuanmeldung im walk_master auszuloesen.
+    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
diff --git a/p/service/padreic/mnpc/walk_master.c b/p/service/padreic/mnpc/walk_master.c
index bec6d4f..6adffb0 100644
--- a/p/service/padreic/mnpc/walk_master.c
+++ b/p/service/padreic/mnpc/walk_master.c
@@ -153,7 +153,11 @@
              // Es gab keinen Fehler und das Objekt will weiterlaufen.
              // Naechsten Zeitslot bestimmen und dort die closure eintragen.
              int delay = clients[mnpc, WALK_DELAY];
-             int next = counter + (TIME(delay) + random(RANDOM(delay)))/2;
+             // das delay muss min. 1 sein, sonst tragen wir den MNPC in
+             // diesen aktuellen zeitslot wieder ein (ja, Magier tun solche
+             // Dinge), der ja nach Abarbeiten des Slots genullt wird.
+             int next = counter
+                        + max(1, (TIME(delay) + random(RANDOM(delay)))/2);
              if (next > MAX_DELAYTIME)
                next -= MAX_DELAYTIME;
              walker[next] += ({ func });