write() auf ReceiveMsg() umgestellt.

write() geht immer an this_player(). Ruft man Spells nicht per
command(), sondern UseSpell() auf, ist this_player() aber nicht
unbedingt der caster.

Change-Id: I2968632568472a93a2368a0849ef6a2367217871
diff --git a/std/spellbook.c b/std/spellbook.c
index cda78bb..76c9d48 100644
--- a/std/spellbook.c
+++ b/std/spellbook.c
@@ -109,13 +109,22 @@
 
   if (no_attack = (mixed)victim->QueryProp(P_NO_ATTACK)) {
     if (stringp(no_attack))
-      write(no_attack);
+      caster->ReceiveMsg(
+        no_attack,
+        MT_NOTIFICATION,
+        MA_FIGHT);
     else
-      write(victim->Name(WER,1)+" laesst sich nicht angreifen!\n");
+      caster->ReceiveMsg(
+        victim->Name(WER,1)+" laesst sich nicht angreifen!",
+        MT_NOTIFICATION,
+        MA_FIGHT);
     return 0;
   }
   if (victim->QueryProp(P_GHOST)) {
-    write(victim->Name(WER,1)+" ist ein Geist!\n");
+    caster->ReceiveMsg(
+      victim->Name(WER,1)+" ist ein Geist!",
+      MT_NOTIFICATION,
+      MA_FIGHT);
     return 0;
   }
 
@@ -204,12 +213,18 @@
   string res;
 
   if (caster->QueryProp(P_GHOST)) {
-    write("Als Geist kannst Du nicht zaubern.\n");
+    caster->ReceiveMsg(
+      "Als Geist kannst Du nicht zaubern.",
+      MT_NOTIFICATION,
+      MA_SPELL);
     return 0;
   }
   if ((rmap=sinfo[SI_SKILLRESTR_USE])
       && (res=check_restrictions(caster,rmap))) {
-    write(res);
+    caster->ReceiveMsg(
+      res,
+      MT_NOTIFICATION,
+      MA_SPELL);
     return 0;
   }
   return 1;
@@ -260,8 +275,11 @@
 
 void
 Misserfolg(object caster, string spell, mapping sinfo) {
-  write("Der Zauberspruch ist missglueckt.\n");
-  write("Du lernst aus Deinem Fehler.\n");
+  caster->ReceiveMsg(
+    "Der Zauberspruch ist missglueckt.\n"
+    "Du lernst aus Deinem Fehler.\n",
+    MT_NOTIFICATION|MSG_DONT_WRAP,
+    MA_SPELL);
   Learn(caster,spell,sinfo);
 }
 
@@ -306,8 +324,16 @@
     return 1;
 
   if (caster->QueryProp(P_SP) < (cost=GetFValueO(SI_SPELLCOST,ski,caster))) {
-    if(txt=ski[SI_SP_LOW_MSG])write(txt);
-    else write("Du hast zu wenig Zauberpunkte fuer diesen Spruch.\n");
+    if(txt=ski[SI_SP_LOW_MSG])
+      caster->ReceiveMsg(
+        txt,
+        MT_NOTIFICATION,
+        MA_SPELL);
+    else
+      caster->ReceiveMsg(
+      "Du hast zu wenig Zauberpunkte fuer diesen Spruch.",
+      MT_NOTIFICATION,
+      MA_SPELL);
     return 1;
   }
   // printf("cost: %d\n",cost);
@@ -319,23 +345,37 @@
         function int (string key, int val)
         { return (int)caster->CheckSpellFatigue(key); } );
     if (sizeof(tmp)) {
-        write(ski[SI_TIME_MSG] ||
-            "Du bist noch zu erschoepft von Deinem letzten Spruch.\n");
+        caster->ReceiveMsg(
+          ski[SI_TIME_MSG] || 
+          "Du bist noch zu erschoepft von Deinem letzten Spruch.",
+          MT_NOTIFICATION,
+          MA_SPELL);
       return 1;
     }
   }
   else {
     if (caster->CheckSpellFatigue()) {
-        write(ski[SI_TIME_MSG] ||
-            "Du bist noch zu erschoepft von Deinem letzten Spruch.\n");
+        caster->ReceiveMsg(
+          ski[SI_TIME_MSG] ||
+          "Du bist noch zu erschoepft von Deinem letzten Spruch.",
+          MT_NOTIFICATION,
+          MA_SPELL);
       return 1;
     }
   }
 
   if (!(ski[SI_NO_ATTACK_BUSY]&NO_ATTACK_BUSY_QUERY) &&
       caster->QueryProp(P_ATTACK_BUSY)) {
-    if (txt=ski[SI_ATTACK_BUSY_MSG]) write(txt);
-    else write("Du bist schon zu sehr beschaeftigt.\n");
+    if (txt=ski[SI_ATTACK_BUSY_MSG])
+      caster->ReceiveMsg(
+        txt,
+        MT_NOTIFICATION,
+        MA_SPELL);
+    else
+      caster->ReceiveMsg(
+        "Du bist schon zu sehr beschaeftigt.",
+        MT_NOTIFICATION,
+        MA_SPELL);
     return 1;
   }
 
@@ -346,7 +386,10 @@
       if (time()<ps[0]) {
         if (!stringp(txt=ski[SI_PREPARE_BUSY_MSG]))
           txt="Du bist noch mit der Spruchvorbereitung beschaeftigt.\n";
-        write(txt);
+        caster->ReceiveMsg(
+          txt,
+          MT_NOTIFICATION,
+          MA_SPELL);
         return 1;
       }
     }
@@ -381,9 +424,15 @@
   if((ski[SI_NOMAGIC] < environment(caster)->QueryProp(P_NOMAGIC)) &&
       random(100) < environment(caster)->QueryProp(P_NOMAGIC)) {
     if (txt=ski[SI_NOMAGIC_MSG])
-      write(txt);
+      caster->ReceiveMsg(
+        txt,
+        MT_NOTIFICATION,
+        MA_SPELL);
     else
-      write("Dein Zauberspruch verpufft im Nichts.\n");
+      caster->ReceiveMsg(
+        "Dein Zauberspruch verpufft im Nichts.",
+        MT_NOTIFICATION,
+        MA_SPELL);
     res=ABGEWEHRT;
   }
   else {
@@ -624,7 +673,10 @@
   object vic;
 
   if (!(vic=find_victim(wen,pl)) && msg)
-    write(msg);
+    pl->ReceiveMsg(
+      msg,
+      MT_NOTIFICATION,
+      MA_SPELL);
   return vic;
 }
 varargs object
@@ -663,24 +715,39 @@
   }
   if (no_attack = (mixed)vic->QueryProp(P_NO_ATTACK)) {
     if (stringp(no_attack))
-      write(no_attack);
+      pl->ReceiveMsg(
+        no_attack,
+        MT_NOTIFICATION,
+        MA_FIGHT);
     else
-      write(vic->Name(WER,1)+" laesst sich nicht angreifen.\n");
+      pl->ReceiveMsg(
+        vic->Name(WER,1)+" laesst sich nicht angreifen.",
+        MT_NOTIFICATION,
+        MA_FIGHT);
     return 0;
   }
   if (vic==pl) {
-    write("Du koenntest Dir dabei wehtun.\n");
+    pl->ReceiveMsg(
+      "Du koenntest Dir dabei wehtun.",
+      MT_NOTIFICATION,
+      MA_FIGHT);
     return 0;
   }
   if (stringp(func)) {
     switch(func) {
     case "SelectNearEnemy":
       if (pl->PresentPosition()>1) {
-        write("Du stehst nicht in der ersten Kampfreihe.\n");
+        pl->ReceiveMsg(
+          "Du stehst nicht in der ersten Kampfreihe.",
+          MT_NOTIFICATION,
+          MA_FIGHT);
         return 0;
       }
       if (vic->PresentPosition()>1) {
-        write(vic->Name(WER,1)+" ist in einer hinteren Kampfreihe.\n");
+        pl->ReceiveMsg(
+          vic->Name(WER,1)+" ist in einer hinteren Kampfreihe.",
+          MT_NOTIFICATION,
+          MA_FIGHT);
         return 0;
       }
       break;
@@ -690,17 +757,29 @@
       if (row>=min && row<=max)
         break;
       if (row<min)
-        write(vic->Name(WER,1)+" ist zu nahe.\n");
+        pl->ReceiveMsg(
+          vic->Name(WER,1)+" ist zu nahe.",
+          MT_NOTIFICATION,
+          MA_FIGHT);
       else if (row>max)
-        write(vic->Name(WER,1)+" ist zu weit weg.\n");
+        pl->ReceiveMsg(
+          vic->Name(WER,1)+" ist zu weit weg.",
+          MT_NOTIFICATION,
+          MA_FIGHT);
       else
-        write(vic->Name(WER,1)+" ist unerreichbar.\n");
+        pl->ReceiveMsg(
+          vic->Name(WER,1)+" ist unerreichbar.",
+          MT_NOTIFICATION,
+          MA_FIGHT);
       return 0;
     default:;
     }
   } else if (pointerp(func)) {
     if (member(func,vic)<0) {
-      write(vic->Name(WER,1)+" ist unerreichbar.\n");
+      pl->ReceiveMsg(
+        vic->Name(WER,1)+" ist unerreichbar.",
+        MT_NOTIFICATION,
+        MA_FIGHT);
       return 0;
     }
   }