AddSpell(): Auf ReceiveMsg() umgestellt.

AddSpell() akzeptiert statt Strings fuer die Meldungen
jetzt auch Arrays der Form ({string,int}), um einen
Messagetyp mit zu uebergeben.

Change-Id: I2522c06f80c36c4305e12a72907046d4910f6e09
diff --git a/doc/sphinx/lfun/AddSpell.rst b/doc/sphinx/lfun/AddSpell.rst
index 2ac4932..c4f8dbb 100644
--- a/doc/sphinx/lfun/AddSpell.rst
+++ b/doc/sphinx/lfun/AddSpell.rst
@@ -5,9 +5,9 @@
 --------
 ::
 
-    varargs int AddSpell(int rate, int damage, string TextForEnemy,
-                         string TextForOthers, string|string* dam_type,
-                         string|closure func, int|mapping spellarg)
+  varargs int AddSpell(int rate, int damage,
+    string|<int|spell>* TextForEnemy, string|<int|string>* TextForOthers,
+    string|string* dam_type, string|closure func, int|mapping spellarg)
 
 DEFINIERT IN
 ------------
@@ -25,7 +25,13 @@
                     muss >= 0 sein. Bei Schaden von 0 MUSS eine Funktion
                     eingetragen werden.
     TextForEnemy  - Text, den der Feind erhalten soll
+                    String <text> oder
+                    Array der Form ({<text>,<messagetype>})
+                    (Siehe ReceiveMsg())
     TextForOthers - Text, den andere im Raum erhalten sollen
+                    String <text> oder
+                    Array der Form ({<text>,<messagetype>})
+                    (Siehe ReceiveMsg())
     dam_type      - Schadenstyp(en) fuer Defend(),
                     (Default: ({DT_MAGIC}) )
     func          - Funktionsname oder Closure, die nach Anwendung
@@ -170,5 +176,4 @@
      Abwehr:     Defend, Defend_bsp, SpellDefend
      Methoden:   modifiers
 
-Zuletzt geaendert: 20.11.2016, Bugfix
-
+Letzte Aenderung: 15.02.2018, Bugfix
diff --git a/std/npc/combat.c b/std/npc/combat.c
index f49a3c2..de0200d 100644
--- a/std/npc/combat.c
+++ b/std/npc/combat.c
@@ -132,9 +132,9 @@
 #define SPELL_FUNC 5
 #define SPELL_ARG 6
 
-varargs int AddSpell(int rate, int damage, string TextForEnemy,
-                     string TextForOthers, string|string* dam_type, 
-                     string|closure func, int|mapping spellarg)
+varargs int AddSpell(int rate, int damage,
+  string|<int|string>* TextForEnemy, string|<int|string>* TextForOthers,
+  string|string* dam_type, string|closure func, int|mapping spellarg)
 {
   mixed *spells;
   int total_rates;
@@ -201,18 +201,51 @@
     return 0;
   }
 
+  if(!sizeof(TextForEnemy) ||
+    (pointerp(TextForEnemy) && !sizeof(TextForEnemy[0])))
+  {
+    TextForEnemy=0;
+  }
+  else if(stringp(TextForEnemy))
+  {
+    TextForEnemy=({TextForEnemy,MT_LOOK});
+  }
+  else if(pointerp(TextForEnemy) && 
+    (!stringp(TextForEnemy[0]) || !intp(TextForEnemy[1])))
+  {
+    raise_error(
+      "AddSpell(): Falsche Datentypen fuer TextForEnemy");
+  }
+  
+  if(!sizeof(TextForOthers) || 
+    (pointerp(TextForOthers) && !sizeof(TextForOthers[0])))
+  {
+    TextForOthers=0;
+  }
+  else if(stringp(TextForOthers))
+  {
+    TextForOthers=({TextForOthers,MT_LOOK});
+  }
+  else if(pointerp(TextForOthers) && 
+    (!stringp(TextForOthers[0]) || !intp(TextForOthers[1])))
+  {
+    raise_error(
+      "AddSpell(): Falsche Datentypen fuer TextForOthers");
+  }
+  
+
   // Falls vorhanden, alte Syntax auf die von replace_personal() anpassen,
   // die im heart_beat() beim Ausgeben der Meldung verwendet wird.
-  if ( strstr(TextForOthers, "@", 0) != -1 )
+  if ( strstr(TextForOthers[0], "@", 0) != -1 )
   {
     // Zeichen nach @WER & Co in runde Klammern einschliessen, damit es als
     // Sub-Pattern im Ausgabestring wiederholt werden kann. Ansonsten wuerde
     // es mit ersetzt.
-    TextForOthers = regreplace(TextForOthers, "@WER([^1-9QU])", "@WER1\\1", 1);
-    TextForOthers = regreplace(TextForOthers, "@WESSEN([^1-9QU])",
+    TextForOthers[0] = regreplace(TextForOthers[0], "@WER([^1-9QU])", "@WER1\\1", 1);
+    TextForOthers[0] = regreplace(TextForOthers[0], "@WESSEN([^1-9QU])",
                                "@WESSEN1\\1", 1);
-    TextForOthers = regreplace(TextForOthers, "@WEM([^1-9QU])", "@WEM1\\1", 1);
-    TextForOthers = regreplace(TextForOthers, "@WEN([^1-9QU])", "@WEN1\\1", 1);
+    TextForOthers[0] = regreplace(TextForOthers[0], "@WEM([^1-9QU])", "@WEM1\\1", 1);
+    TextForOthers[0] = regreplace(TextForOthers[0], "@WEN([^1-9QU])", "@WEN1\\1", 1);
   }
   total_rates=Query("npc:total_rates")+rate;
   spells=Query(P_SPELLS);
@@ -329,16 +362,27 @@
   r=random(Query("npc:total_rates"));
   for (i=sizeof(spells)-1;(i>0 && spells[i-1][SPELL_TOTALRATE]>r);i--)
     ;
-  string akt_spell_mess = spells[i][SPELL_TEXT_FOR_ENEMY];
-  if ( sizeof(akt_spell_mess) )
-    tell_object(enemy, break_string(akt_spell_mess, 78));
-  akt_spell_mess = spells[i][SPELL_TEXT_FOR_OTHERS];
+  <int|string>* akt_spell_mess=spells[i][SPELL_TEXT_FOR_ENEMY];
   // Nur, wenn ueberhaupt eine Meldung gesetzt wurde, muss diese verarbeitet
   // werden.
-  if (stringp(akt_spell_mess) && sizeof(akt_spell_mess))
+  if(pointerp(akt_spell_mess))
   {
-    akt_spell_mess = replace_personal(akt_spell_mess, ({enemy}), 1);
-    say(break_string(akt_spell_mess, 78),({enemy, this_object()}));
+    enemy->ReceiveMsg(
+      akt_spell_mess[0],
+      akt_spell_mess[1],
+      MA_SPELL);
+  }
+  akt_spell_mess=spells[i][SPELL_TEXT_FOR_OTHERS];
+  if(pointerp(akt_spell_mess))
+  {
+    akt_spell_mess[0]=replace_personal(akt_spell_mess[0], ({enemy}), 1);
+    send_room(environment(),
+      akt_spell_mess[0],
+      akt_spell_mess[1],
+      MA_SPELL,
+      0,
+      ({enemy,this_object()}),
+      this_object());
   }
   sinfo = deep_copy(spells[i][SPELL_ARG]);
   if(!mappingp(sinfo))
@@ -348,9 +392,16 @@
   if(!sinfo[SP_PHYSICAL_ATTACK] &&
      (enemy->SpellDefend(this_object(),sinfo) >
       random(MAX_ABILITY+QueryProp(P_LEVEL)*50))){
-    tell_object(enemy,"Du wehrst den Spruch ab.\n");
-    say(enemy->Name(WER,1)+" wehrt den Spruch ab.\n",
-        ({ enemy, this_object()}));
+    enemy->ReceiveMsg(
+      "Du wehrst den Spruch ab.",
+      MT_NOTIFICATION,
+      MA_SPELL);
+    send_room(environment(),
+      enemy->Name(WER,1)+" wehrt den Spruch ab.",
+      MT_LOOK,
+      MA_SPELL,
+      0,
+      ({ enemy, this_object()}));
     return ;
   }
   int damage;