Merge branch 'master' of ssh://mgg/mudlib-public
diff --git a/secure/inetd.c b/secure/inetd.c
index d015602..921a41e 100644
--- a/secure/inetd.c
+++ b/secure/inetd.c
@@ -263,17 +263,13 @@
  * Decode a string from a UDP packet.
  * Returns:   The actual value of the argument (either int or string)
  */
-mixed decode(string arg) {
-
+string|int decode(string arg)
+{
     if (sizeof(arg) && arg[0] == '$')
         return arg[1..];
-#ifdef RESTRICTED_CASTS
-    if (to_string(to_int(arg)) == arg)
+    else if ((arg & "0123456789") == arg)
         return to_int(arg);
-#else
-    if ((string)((int)arg) == arg)
-        return (int)arg;
-#endif
+
     return arg;
 }
 
@@ -569,17 +565,21 @@
 #endif
 
 string encode(mixed arg) {
+    // Objektnamen mit nicht-ASCII hier ist in allen Faellen doof, wenn sie
+    // koennen auch mit Transliteration nicht mehr verlustfrei zurueck
+    // konvertiert werden...
     if (objectp(arg))
-        return object_name(arg);
-    if (stringp(arg) && sizeof(arg) &&
-        (arg[0] == '$' ||
-#ifdef RESTRICTED_CASTS
-    to_string(to_int(arg)) == (string)arg))
-#else
-    (string)to_int(arg) == (string)arg))
-#endif
-        return "$" + arg;
-    return to_string(arg);
+        arg = object_name(arg);
+    else if (!stringp(arg))
+        arg = to_string(arg);
+
+    // faengt es mit $ an oder ist es ne zahl (als string, d.h. enthaelt nur
+    // 0-9)? Dann muss nen $ davor.
+    // TODO: Mhmm. Oder vielleicht doch per RegExp?
+    if ( (arg[0] == '$') || ((arg & "0123456789") == arg))
+        arg = '$' + arg;
+
+    return arg;
 }
 
 string encode_packet(mapping data) {
diff --git a/secure/master.c b/secure/master.c
index 22d4675..a677902 100644
--- a/secure/master.c
+++ b/secure/master.c
@@ -30,7 +30,6 @@
 //for limited, set_limit(), etc. Abs. Pfad noetig, da noch kein Include-Hook
 #include "/sys/rtlimits.h"
 #include "/sys/debug_info.h"
-#include "/sys/debug_message.h"
 #include "/sys/configuration.h"
 #include "/sys/regexp.h"
 
@@ -220,11 +219,13 @@
   ReloadInsecureFile();
 
   if (eflag) {
-    write("-e angegeben -> Preloading unterdrueckt ...\n");
+    debug_message(
+        "epilog(): -e angegeben -> Preloading unterdrueckt ...\n",
+        DMSG_STAMP);
     return 0;
   }
 
-  printf("Preloading gestartet: %s\n\n",ctime(time()));
+  debug_message("Preloading gestartet.\n", DMSG_STAMP);
 
   //Files fuers Preloading und Regionen holen
   files=explode_files("/std/preload_file") + explode_files("/d/preload_file");
@@ -232,9 +233,7 @@
 
   for (i=sizeof(domains);i--;)
     files+=explode_files("/d/"+domains[i]+"/preload_file");
-  
-  write("\n");
- 
+
   return files;
 }
 
@@ -250,13 +249,12 @@
   // Kein Besitzer -> Meldung ausgeben, fertig
   if (!(name=creator_file(file)))
   {
-    printf("Kein Besitzer gefunden fuer Datei %s.\n",file);
+    debug_message(
+        sprintf("preload: Kein Besitzer gefunden fuer Datei %s.\n",file),
+        DMSG_STDOUT|DMSG_STDERR);
     return;
   }
 
-  // Datei und Besitzer ausgeben
-  printf("%-50s%-15s",file,name);
-
   efun::configure_object(this_object(), OC_EUID, name);
 
   // Dann mal laden .. dabei Zeit messen
@@ -269,11 +267,14 @@
   err = catch(limited(#'load_object,({5000000}),file));
 
   if (err != 0)
-    printf("\nFehler beim Laden von %s:\n%s\n",file,err);
+    debug_message(sprintf("\nFehler beim Laden von %s:\n%s\n",file,err),
+                  DMSG_STDOUT|DMSG_STDERR);
   else
   {
+    // Datei, Besitzer und Ladezeit ausgeben
     zeit=apply(#'+,rusage()[0..1])-zeit;
-    printf("(%2d.%:02d s)\n",zeit/1000,zeit%1000);
+    debug_message(sprintf("%-50s%-15s (%2d.%:02d s)\n",
+          file, name, zeit/1000,zeit%1000));
   }
 
   // Noch EUID zuruecksetzen
@@ -295,23 +296,21 @@
     --loading_simul_efuns;
     return ({SIMUL_EFUN_FILE});
   }
-  
-  write("Failed to load simul efun " + SIMUL_EFUN_FILE + "\n");
+
   debug_message("Failed to load simul efun " + SIMUL_EFUN_FILE +
-      " " + err, DMSG_STDOUT | DMSG_LOGFILE);
+      " " + err, DMSG_STDOUT | DMSG_LOGFILE | DMSG_STAMP);
 
   if (!(err=catch(SPARE_SIMUL_EFUN_FILE->start_simul_efun())) ) {
     --loading_simul_efuns;
     return ({SPARE_SIMUL_EFUN_FILE});
   }
-  
-  write("Failed to load spare simul efun" + SPARE_SIMUL_EFUN_FILE + "\n");
-  debug_message("Failed to load spare simul efun " + SPARE_SIMUL_EFUN_FILE +
-      " " + err, DMSG_STDOUT | DMSG_LOGFILE);
 
- 
+  debug_message("Failed to load spare simul efun " + SPARE_SIMUL_EFUN_FILE +
+      " " + err, DMSG_STDOUT | DMSG_LOGFILE | DMSG_STAMP);
+
+
   efun::shutdown();
-  
+
   return 0;
 }
 
diff --git a/secure/master.h b/secure/master.h
index 51f579b..242a640 100644
--- a/secure/master.h
+++ b/secure/master.h
@@ -23,7 +23,11 @@
 #define P_DEFAULT_NOTIFY_FAIL "default_notify_fail"
 #endif
 
+#include "/sys/functionlist.h"
+#include "/sys/debug_message.h"
+
 #include "/secure/config.h"
+#include "/secure/wizlevels.h"
 
 #include "/sys/userinfo.h"
 #include "/sys/player/base.h"
@@ -32,10 +36,6 @@
 #include "/sys/wizlist.h"
 #include "/sys/daemon.h"
 #include "/sys/mail.h"
-#include "/sys/driver_hook.h"
-#include "/sys/functionlist.h"
-
-#include "/secure/wizlevels.h"
 
 //#define DEBUG(x)
 #ifndef DEBUG
diff --git a/secure/master/misc.c b/secure/master/misc.c
index 8cdbb8c..9bb274f 100644
--- a/secure/master/misc.c
+++ b/secure/master/misc.c
@@ -61,7 +61,9 @@
     if (!stringp(exploded[i]) || exploded[i]=="" || exploded[i][0]=='#')
       exploded[i]=0;
   exploded-=({0});
-  printf("%-30s: %3d Objekt%s\n",file,i=sizeof(exploded),(i==1?"":"e"));
+  debug_message(
+      sprintf("%-30s: %3d Objekt%s\n",file,i=sizeof(exploded),(i==1?"":"e")),
+      DMSG_STAMP);
   return exploded;
 }
 
diff --git a/secure/master/players_deny.c b/secure/master/players_deny.c
index 6471243..20cf7cb 100644
--- a/secure/master/players_deny.c
+++ b/secure/master/players_deny.c
@@ -88,7 +88,7 @@
   if ( extern_call() && call_sefun("secure_level") < ARCH_LVL )
     return;
 
-  write("Loading PLDenylists\n");
+  debug_message("Loading PLDenylists\n", DMSG_STAMP);
 
   if (stringp(tmp=read_file(WHITELIST))) {
     // savefile exists
diff --git a/secure/materialdb.c b/secure/materialdb.c
index 12dce06..11d3554 100644
--- a/secure/materialdb.c
+++ b/secure/materialdb.c
@@ -19,6 +19,8 @@
 #pragma no_shadow
 #pragma pedantic
 
+#include <debug_message.h>
+
 // Die Propertydefinition reinholen
 #include <language.h>
 #include <thing/description.h>
@@ -27,6 +29,7 @@
 #include <thing/material.h>
 #include <player/description.h>
 #include <rtlimits.h>
+#include <living/comm.h>
 
 // Basisverzeichnis der Materialien
 #define MAT_DIR "/doc/materials"
@@ -47,8 +50,12 @@
 #define P_MEMBERS "members"
 #define P_MG_FRACTIONS "mg_fractions"
 
-#define LOG_ERROR(x) if(find_player("raschaua")&&find_player("raschaua")->QueryProp("mdb-debug"))tell_object(find_player("raschaua"),"MDB-Error:"+x)
-#define LOG_WARN(x) if(find_player("raschaua")&&find_player("raschaua")->QueryProp("mdb-debug"))tell_object(find_player("raschaua"),"MDB-Warn:"+x)
+#define LOG_ERROR(x) if (this_player()) this_player()->ReceiveMsg(\
+    x, MT_DEBUG|MSG_DONT_IGNORE, MA_UNKNOWN, "MDB-Error: ",\
+    "MatDB")
+#define LOG_WARN(x) if (this_player()) this_player()->ReceiveMsg(\
+    x, MT_DEBUG|MSG_DONT_IGNORE, MA_UNKNOWN, "MDB-Warn: ",\
+    "MatDB")
 
 // Prototypes:
 // (Liefert den Anteil der Materialgruppe grp an mats)
@@ -370,7 +377,7 @@
   mats = AllMaterials();
   txt += sprintf("%@s", map(grps, #'gen_material_h_materials_grp,
                                   &mats));
-  // Übriggebliene Materialien ausgeben
+  // Uebriggebliene Materialien ausgeben
   txt += "// sonstige Materialien:\n";
   txt += sprintf("%@s", map(mats, #'gen_material_h_material));
   return txt;
@@ -426,7 +433,7 @@
   mats = AllMaterials();
   txt = sprintf("%@s", map(grps, #'gen_material_list_materials_grp,
                                  &mats));
-  // Übriggebliene Materialien ausgeben
+  // Uebriggebliene Materialien ausgeben
   txt += "sonstige Materialien:\n";
   txt += sprintf("%@s", map(mats, #'gen_material_list_material));
   write_file(fn, txt) ||
@@ -467,15 +474,23 @@
     if (!stringp(fn) || !sizeof(fn))
       fn = DOC_DIR("materialliste");
     if (file_size(fn) >= 0) {
-      printf("Datei %s existiert bereits, loesche sie\n", fn);
+      debug_message(
+          sprintf("Datei %s existiert bereits, loesche sie\n", fn),
+          DMSG_STAMP);
       rm(fn);
     }
-    if (write_file(fn, "Material Liste\n==============\n\n")) {
+    if (write_file(fn, "Material Liste\n==============\n\n"))
+    {
       dump_material(fn);
       write_file(fn, gen_doc_foot("materialgruppen"));
-      printf("Materialliste erfolgreich in Datei %s geschrieben\n", fn);
-    } else
-      printf("Konnte Liste nicht in Datei %s schreiben, Abbruch\n", fn);
+      debug_message(
+        sprintf("Materialliste erfolgreich in Datei %s geschrieben\n", fn),
+        DMSG_STAMP);
+    }
+    else
+      debug_message(
+          sprintf("Konnte Liste nicht in Datei %s schreiben, Abbruch\n", fn),
+          DMSG_STAMP);
   }
 }
 
@@ -490,15 +505,23 @@
     if (!stringp(fn) || !sizeof(fn))
       fn = DOC_DIR("materialgruppen");
     if (file_size(fn) >= 0) {
-      printf("Datei %s existiert bereits, loesche sie\n", fn);
+      debug_message(
+          sprintf("Datei %s existiert bereits, loesche sie\n", fn),
+          DMSG_STAMP);
       rm(fn);
     }
-    if (write_file(fn, "Materialgruppen\n===============\n")) {
+    if (write_file(fn, "Materialgruppen\n===============\n"))
+    {
       map(sort_array(m_indices(material_groups), #'>), #'dump_group, fn);
       write_file(fn, gen_doc_foot("materialliste"));
-      printf("Materialliste erfolgreich in Datei %s geschrieben\n", fn);
-    } else
-      printf("Konnte Liste nicht in Datei %s schreiben, Abbruch\n", fn);
+      debug_message(
+        sprintf("Materialliste erfolgreich in Datei %s geschrieben\n", fn),
+        DMSG_STAMP);
+    }
+    else
+      debug_message(
+          sprintf("Konnte Liste nicht in Datei %s schreiben, Abbruch\n", fn),
+          DMSG_STAMP);
   }
 }
 
@@ -513,14 +536,21 @@
     string txt;
     if (!stringp(fn) || !sizeof(fn))
       fn = HEADERFILE;
-    if (file_size(fn) >= 0) {
-      printf("Datei %s existiert bereits, loesche sie\n", fn);
+    if (file_size(fn) >= 0)
+    {
+      debug_message(
+          sprintf("Datei %s existiert bereits, loesche sie\n", fn),
+          DMSG_STAMP);
       rm(fn);
     }
     if (dump_material_h(fn))
-      printf("Headerdatei erfolgreich in %s geschrieben\n", fn);
+      debug_message(
+          sprintf("Headerdatei erfolgreich in %s geschrieben\n", fn),
+          DMSG_STAMP);
     else
-      printf("Konnte Headerdatei nicht in Datei %s schreiben, Abbruch\n", fn);
+      debug_message(
+        sprintf("Konnte Headerdatei nicht in Datei %s schreiben, Abbruch\n",
+                fn), DMSG_STAMP);
   }
 }
 
diff --git a/std/living/life.c b/std/living/life.c
index 4e8490a..2d86bb5 100644
--- a/std/living/life.c
+++ b/std/living/life.c
@@ -1288,7 +1288,7 @@
   if (QueryProp(P_GHOST))
     return Query(P_ALCOHOL, F_VALUE);
 
-  // nur Änderungen und Werte >=0 werden gesetzt...
+  // nur Aenderungen und Werte >=0 werden gesetzt...
   n = n < 0 ? 0 : n;
   int old = Query(P_ALCOHOL, F_VALUE);
   if ( old == n)
@@ -1324,7 +1324,7 @@
   if (QueryProp(P_GHOST))
     return Query(P_DRINK, F_VALUE);
 
-  // nur Änderungen und Werte >=0 werden gesetzt...
+  // nur Aenderungen und Werte >=0 werden gesetzt...
   n = n < 0 ? 0 : n;
   int old = Query(P_DRINK, F_VALUE);
   if ( old == n)
@@ -1360,7 +1360,7 @@
   if (QueryProp(P_GHOST))
     return Query(P_FOOD, F_VALUE);
 
-  // nur Änderungen und Werte >=0 werden gesetzt...
+  // nur Aenderungen und Werte >=0 werden gesetzt...
   n = n < 0 ? 0 : n;
   int old = Query(P_FOOD, F_VALUE);
   if ( old == n)
diff --git a/std/player/combat.c b/std/player/combat.c
index abb5a1b..64d945c 100644
--- a/std/player/combat.c
+++ b/std/player/combat.c
@@ -204,7 +204,7 @@
   return res;
 }
 
-// Spieler koennen als Geist nicht kämpfen
+// Spieler koennen als Geist nicht kaempfen
 // TODO: pruefen, ob das Setzen und Loeschen der Prop in set_ghost() nicht
 // auch ausreichen wuerde. In dem Fall muesste man aber P_NO_ATTACK auch
 // speichern, da P_GHOST gespeichert wird...
diff --git a/std/player/skills.c b/std/player/skills.c
index 8f6b8f0..03755da 100644
--- a/std/player/skills.c
+++ b/std/player/skills.c
@@ -236,8 +236,8 @@
     log_file("WEAPON_SKILLS", sprintf("%s: Zu hoher Schaden von: "
     +"TO: %O, TI: %O, PO: %O, val: %d, A_DEX: %d, A_STR: %d, "
                                    +"P_WEAPON: %O, P_WC: %d\n", dtime(time()),
-                                   this_object(), this_interactive(), 
-                                   previous_object(), val, 
+                                   this_object(), this_interactive(),
+                                   previous_object(), val,
                                    QueryAttribute(A_DEX),
                                    QueryAttribute(A_STR), sinfo[P_WEAPON],
                                    sinfo[P_WEAPON]->QueryProp(P_WC)));
@@ -245,7 +245,7 @@
   }
 
   /*
-    Der zusätzliche Schaden der allgemeinen Waffenskills berechnet
+    Der zusaetzliche Schaden der allgemeinen Waffenskills berechnet
     sich wie folgt: 
 
     sinfo[SI_SKILLABILITY)* (P_WC * ( X ) / 800) / MAX_ABILITY
diff --git a/std/shells/magier/upd.c b/std/shells/magier/upd.c
index f09ea9a..9c9af5f 100644
--- a/std/shells/magier/upd.c
+++ b/std/shells/magier/upd.c
@@ -116,8 +116,8 @@
   {
     // Schreibrechte nur pruefen, wenn echt aktualisiert werden soll.
     if(!dummy && !MAY_WRITE(file))
-      return (printf("upd: %s: Keine Schreibrechte!\n",file), -1);
-    if(!MAY_READ(file)) 
+      return (printf("upd: %s: Keine Schreibrechte!\n",file), -1);
+    if(!MAY_READ(file))
       return (printf("upd: %s: Keine Leserechte!\n", file), -1);
   }
   if (dummy) return 1;
diff --git a/std/thing/commands.c b/std/thing/commands.c
index 8f93449..72f50cd 100644
--- a/std/thing/commands.c
+++ b/std/thing/commands.c
@@ -336,19 +336,19 @@
     while(j--) {
      int k;
      // DBG(rule[j]);
-    	// Regeln nicht löschen und Regel?
+    	// Regeln nicht loeschen und Regel?
      if(!(del_norule && pointerp(rule[j])) &&
-        // nur bestimmte ID löschen und ID passt nicht?
+        // nur bestimmte ID loeschen und ID passt nicht?
         !(onlyid && (!pointerp(ids) || sizeof(ids)<=j || ids[j]!=onlyid)) &&
-        // Löschregel existiert und passt nicht auf Regel?
+        // Loeschregel existiert und passt nicht auf Regel?
         !(delrule && (k=sizeof(rule[j]))!=sizeof(delrule))) {
-      // partielles Testen einer Löschregel ...
+      // partielles Testen einer Loeschregel ...
       if(delrule) {
        while(k--)
         if(!sizeof(rule[j][k]&delrule[k])) break;
        if(k>=0) continue;
       }
-      // alles korrekt: Löschen!
+      // alles korrekt: Loeschen!
       // (Arraybereich durch leeres Array loeschen)
       flag[j..j]    = allocate(0);
       fun[j..j]     = allocate(0);
diff --git a/sys/living/life.h b/sys/living/life.h
index 81ba3dd..3dc0311 100644
--- a/sys/living/life.h
+++ b/sys/living/life.h
@@ -53,7 +53,7 @@
 
 // H_EFFECTS - Zu aendernde Properties fuer den Effekt
 #define H_EFFECTS "effects"
-// H_CONDITIONS - Zu pruefende Properties für den Effekt (Saettigung, ...)
+// H_CONDITIONS - Zu pruefende Properties fuer den Effekt (Saettigung, ...)
 #define H_CONDITIONS "conditions"
 // H_DISTRIBUTION - Wie die Aenderung an HP/SP austeilen, sofort, zeitlich
 // versetzt, ...
diff --git a/sys/magier.h b/sys/magier.h
index 33cd98f..f6eb3a8 100644
--- a/sys/magier.h
+++ b/sys/magier.h
@@ -102,7 +102,7 @@
 #define LS_L            2            // Lange Ausgabe
 #define LS_R            4            // Rueckwaerts ausgeben
 #define LS_T            8            // Nach Zeit ordnen
-#define LS_S            16           // Nach Größe ordnen
+#define LS_S            16           // Nach Groesse ordnen
 #define LS_U            32           // UID anzeigen
 #define LS_G            64           // Gruppe anzeigen
 
diff --git a/sys/notify_fail.h b/sys/notify_fail.h
index 97d1786..6f0eaf5 100644
--- a/sys/notify_fail.h
+++ b/sys/notify_fail.h
@@ -8,7 +8,7 @@
 #define _NOTIFY_FAIL_H_
 
 // Prioritaeten / 'Nice levels' von notify_fail()s:
-// Wie 'nice' bin ich? Je groessere Zahl/Priorität, desto wenig lieb. ;-)
+// Wie 'nice' bin ich? Je groessere Zahl/Prioritaet, desto wenig lieb. ;-)
 #define NF_NL_NONE   -1   //max 'niceness', wird von allem ueberschrieben
 #define NF_NL_OWN    100  //eigenes Objekt (soul verben) ueberschreiben kaum was
 #define NF_NL_THING  100000
diff --git a/sys/player/fao.h b/sys/player/fao.h
index 3c016a4..c773cf1 100644
--- a/sys/player/fao.h
+++ b/sys/player/fao.h
@@ -6,9 +6,9 @@
 
 #define FAO_MASTER      "/d/ebene/miril/fraternitas/secure/faomaster" // die zentrale stelle des fao
 
-// die Liste der verfügbaren Portale fuer das erste portalgeschenk
+// die Liste der verfuegbaren Portale fuer das erste portalgeschenk
 #define FAO_PORTALS1_LIST ({2,3,4,5,6,7,8,9,10,13,14,15,16,19,20,21,25,29,33})
-// die Liste der verfügbaren Portale fuer das zweite portalgeschenk
+// die Liste der verfuegbaren Portale fuer das zweite portalgeschenk
 #define FAO_PORTALS2_LIST FAO_PORTALS1_LIST+({1,11,12,17,18,24,26,27,28,31,34,36,37,38})
 // die anzahl der zu waehlenden portale fuer das erste portalgeschenk
 #define FAO_PORTALS1_NUM  5