diff --git a/std/npc/combat.c b/std/npc/combat.c
index 47d6769..f49a3c2 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|<int|string>* TextForEnemy, string|<int|string>* TextForOthers,
-  string|string* dam_type, string|closure func, int|mapping spellarg)
+varargs int AddSpell(int rate, int damage, string TextForEnemy,
+                     string TextForOthers, string|string* dam_type, 
+                     string|closure func, int|mapping spellarg)
 {
   mixed *spells;
   int total_rates;
@@ -201,39 +201,6 @@
     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 )
@@ -362,27 +329,16 @@
   r=random(Query("npc:total_rates"));
   for (i=sizeof(spells)-1;(i>0 && spells[i-1][SPELL_TOTALRATE]>r);i--)
     ;
-  <int|string>* akt_spell_mess=spells[i][SPELL_TEXT_FOR_ENEMY];
+  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];
   // Nur, wenn ueberhaupt eine Meldung gesetzt wurde, muss diese verarbeitet
   // werden.
-  if(pointerp(akt_spell_mess))
+  if (stringp(akt_spell_mess) && sizeof(akt_spell_mess))
   {
-    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());
+    akt_spell_mess = replace_personal(akt_spell_mess, ({enemy}), 1);
+    say(break_string(akt_spell_mess, 78),({enemy, this_object()}));
   }
   sinfo = deep_copy(spells[i][SPELL_ARG]);
   if(!mappingp(sinfo))
@@ -392,16 +348,9 @@
   if(!sinfo[SP_PHYSICAL_ATTACK] &&
      (enemy->SpellDefend(this_object(),sinfo) >
       random(MAX_ABILITY+QueryProp(P_LEVEL)*50))){
-    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()}));
+    tell_object(enemy,"Du wehrst den Spruch ab.\n");
+    say(enemy->Name(WER,1)+" wehrt den Spruch ab.\n",
+        ({ enemy, this_object()}));
     return ;
   }
   int damage;
