Added public files

Roughly added all public files. Probably missed some, though.
diff --git a/std/player/description.c b/std/player/description.c
new file mode 100644
index 0000000..4a0663f
--- /dev/null
+++ b/std/player/description.c
@@ -0,0 +1,292 @@
+// MorgenGrauen MUDlib
+//
+// player/description.c -- player description handling
+//
+// $Id: description.c 8755 2014-04-26 13:13:40Z Zesstra $
+#pragma strong_types
+#pragma save_types
+#pragma range_check
+#pragma no_clone
+#pragma pedantic
+
+inherit "/std/living/description";
+
+#include <thing/language.h>
+#include <player/description.h>
+#include <living/clothing.h>
+#include <properties.h>
+#include <wizlevels.h>
+#include <defines.h>
+#include <combat.h>
+#include <sys_debug.h>
+
+#define NEED_PROTOTYPES
+#include <player/command.h>
+
+protected void create()
+{
+  ::create();
+  Set(P_NAME, NOSETMETHOD, F_SET_METHOD);
+  Set(P_PRESAY, SAVE, F_MODE_AS);
+  Set(P_TITLE, SAVE, F_MODE_AS);
+  Set(P_EXTRA_LOOK, SAVE, F_MODE_AS);
+  Set(P_GENDER, SAVE, F_MODE_AS);
+  Set(P_SIZE, SAVE, F_MODE_AS);
+  Set(P_INFO, NOSETMETHOD, F_SET_METHOD);
+  // Avatar-URIs speichern. Ausserdem hat an denen keiner rumzufummeln.
+  Set(P_AVATAR_URI, SAVE|SECURED, F_MODE_AS);
+}
+
+string _query_info()
+{
+  string info;
+  info = Query(P_INFO);
+  if(!info)info=="";
+  info = (string)query_wiz_level(this_object());
+  if(IS_GOD(this_object()))
+    return info+" [Gott]\n";
+  if(IS_ARCH(this_object()))
+    return info+" [Erzmagier]\n";
+  if(IS_ELDER(this_object()))
+    return info+" [Weiser]\n";
+  if(IS_LORD(this_object()))
+    return info+" [Regionschef]\n";
+  if(IS_SPECIAL(this_object()))
+    return info+" [Special]\n";
+  if(IS_DOMAINMEMBER(this_object()))
+    return info+" [Regionsmitarbeiter]\n";
+  if(IS_WIZARD(this_object()))
+    return info+" [Magier]\n";
+  if(IS_LEARNER(this_object()))
+    return info+" [Magieranwaerter]\n";
+  info = QueryProp(P_LEVEL);
+  if(IS_SEER(this_object()))
+    return info+" [Seher]\n";
+  return info+" [Spieler]\n";
+}
+
+int _query_size() {
+  if (QueryProp(P_FROG))
+    return 20;
+  return Query(P_SIZE);
+}
+
+// short() -- get the short description of a player
+string short()
+{
+  string answer;
+  string title;
+
+  if(QueryProp(P_INVIS))
+    if(interactive(previous_object()) && IS_LEARNING(previous_object()))
+      return "("+QueryProp(P_NAME)+") \n";
+    else
+      return 0;
+
+  if(QueryProp(P_GHOST))
+  {
+    if (QueryProp(P_FROG))
+      return "Der Geist eines kleinen Frosches namens "+QueryProp(P_NAME)+
+       ".\n";
+    else
+      return "Der Geist von "+QueryProp(P_NAME)+".\n";
+  }
+
+  if (QueryProp(P_FROG))
+    return "Ein kleiner Frosch namens "+QueryProp(P_NAME)+".\n";
+
+  answer = QueryProp(P_PRESAY) + QueryProp(P_NAME);
+  if (QueryProp(P_ARTICLE)) answer=QueryArticle(0,0)+answer;
+  if((title=QueryProp(P_TITLE)) && title != "") answer += " " + title;
+  if(!interactive(ME)) answer += " (netztot)";
+  return answer+".\n";
+}
+
+private string andlist(object *arr) {
+  string *tmp;
+  if(!pointerp(arr)) return "";
+  if(sizeof(tmp = map_objects(arr, "name", WEN)))
+    return(CountUp(tmp));
+  return "";
+}
+
+// gibt fuer nicht-Invis-Objekte den Namen zurueck
+private string get_vis_name(object ob) {
+  if (ob->QueryProp(P_INVIS))
+    return 0;
+  return (ob->name(WEN));
+}
+
+varargs string long()
+{
+  string exl, descr, tmp, size_descr;
+  object ob;
+  mixed trans, w, a, r;
+  int per;
+  string fill, fill2;
+  /* fuer groessenvergleich */
+  string comparesize, pers1, pers2;
+  int relation;
+
+  per=1000*QueryProp(P_SIZE)/QueryProp(P_AVERAGE_SIZE);
+  switch(per)
+  {
+    case 0..800: size_descr="ziemlich winzig"; break;
+    case 801..850: size_descr="eher winzig"; break;
+    case 851..900: size_descr="recht klein"; break;
+    case 901..950: size_descr="eher klein"; break;
+    case 951..1050: size_descr="mittelgross"; break;
+    case 1051..1100: size_descr="relativ gross"; break;
+    case 1101..1150: size_descr="ziemlich gross"; break;
+    case 1151..1200: size_descr="sehr gross"; break;
+    default: size_descr="riesig"; break;
+  }
+#define RassenString() ((QueryProp(P_FROG) ? "en Frosch" :\
+       (!QueryProp(P_GENDER)?" ":QueryProp(P_GENDER)==2?"e ":"en ")+\
+       (pointerp(QueryProp(P_RACESTRING))?\
+        QueryProp(P_RACESTRING)[WEN]:QueryProp(P_RACE))))
+  fill2=fill=0;
+  if (QueryProp(P_AVERAGE_SIZE)<170)
+  {
+    if (per<950)
+      fill="selbst fuer ein"+RassenString()+" ";
+    else
+      if (per>1050)
+  fill2=", wenn auch nur fuer ein"+RassenString();
+  }
+  else
+  {
+    if (QueryProp(P_AVERAGE_SIZE)>170)
+      if (per>1050)
+  fill="sogar fuer ein"+RassenString()+" ";
+      else
+  if (per<950)
+    fill2=", wenn auch nur fuer ein"+RassenString();
+  }
+  if (!fill&&!fill2) fill="fuer ein"+RassenString()+" ";
+  descr = "Das ist "+name(WER,1)+". "+capitalize(QueryPronoun())+" ist "+
+    (fill||"")+size_descr+(fill2||"")+".\n";
+
+  if(this_player()) {
+    /* groessenvergleich_anfang (NEU) */
+    pers1 = QueryPronoun(WER);
+    pers2 = QueryPronoun(WEM);
+ 
+    // || falls TP keine Groesse gesetzt hat... Warum auch immer...
+    relation = (QueryProp(P_SIZE)*100) / 
+                  (this_player()->QueryProp(P_SIZE) || 1);
+    switch (relation) 
+     {
+     case   0 ..  25 : comparesize = "Damit gibt "+pers1+" einen guten"
+                                     " Fusschemel fuer Dich ab"; 
+                                     break;
+     case  26 ..  50 : comparesize = "Damit reicht "+pers1+" Dir nicht mal bis"
+                                     " zur Huefte"; 
+                                     break;
+     case  51 ..  75 : comparesize = "Damit kannst Du "+pers2+" locker auf den"
+                                     " Kopf spucken"; 
+                                     break;
+     case  76 ..  90 : comparesize = "Damit ist "+pers1+" einen Kopf kleiner"
+                                     " als Du"; 
+                                     break;
+     case  91 .. 110 : comparesize = "Damit hat "+pers1+" etwa Deine Groesse";
+                                     break;  
+     case 111 .. 120 : comparesize = "Damit ist "+pers1+" einen Kopf groesser" 
+                                     " als Du";
+                                     break;
+     case 121 .. 150 : comparesize = "Damit holst Du Dir einen steifen Nacken,"
+                                     " wenn Du "+pers2+" in die Augen siehst";
+                                     break;
+     case 151 .. 200 : comparesize = "Damit versperrt "+pers1+" Dir absolut"
+		                     " die Sicht"; 
+                                     break;
+     case 201 .. 300 : comparesize = "Damit waere jeder Schlag von Dir ein" 
+                                     " Tiefschlag";
+                                     break;
+     default         : comparesize = "Damit kannst Du "+pers2+" bequem zwischen"
+                                     " den Beinen durchlaufen";
+                                     break;
+     }
+  
+     descr+=comparesize+".\n";
+     /* groessenvergleich_ende (NEU) */
+   }
+
+  if(QueryProp(P_GHOST)) return descr;
+
+  trans = QueryProp(P_TRANSPARENT); SetProp(P_TRANSPARENT, 0);
+  descr += ::long(); SetProp(P_TRANSPARENT, trans);
+
+  // Waffen, Ruestungen/Kleidung und Sonstiges ermitteln
+  w = ({QueryProp(P_WEAPON), QueryProp(P_PARRY_WEAPON)}) - ({0});
+  a = QueryProp(P_ARMOURS) + QueryProp(P_CLOTHING) - ({0});
+  r = all_inventory(ME) - w - a; //Rest logischerweise
+
+  // rest noch nach sichbarkeit von ausserhalb des SPielers filtern.
+  r=map(r,function string (object ob) {
+	  if(sizeof(all_inventory(ob)) || ob->QueryProp(P_LIGHT) || 
+	     ob->QueryProp(P_LIGHTED) || ob->QueryProp(P_SHOW_INV))
+	    return(get_vis_name(ob));
+          return(0); } ) - ({0});
+
+  // Invis-Objekte ausfiltern und Namen ermitteln, anschliessend sind in w, a
+  // und r je ein Array von Strings
+  w = map(w, #'get_vis_name) - ({0});
+  a = map(a, #'get_vis_name) - ({0});
+
+  return descr +
+         (QueryProp(P_TRANSPARENT) ?
+          break_string(capitalize(name(WER, 1))+" hat "
+                      +(sizeof(a)?CountUp(a):"keine Ruestung")+" an"
+                      +(sizeof(r)?", ":" und ")
+                      +(sizeof(w)?CountUp(w):"keine Waffe")+" gezueckt"
+          +(sizeof(r)?" und traegt "+CountUp(r):"")+".", 78): "");
+}
+
+
+// **** local property methods
+static mixed _query_presay()
+{
+  string presay;
+  if((presay = Query(P_PRESAY)) && (presay != "")) return presay + " ";
+  return "";
+}
+
+static string _query_name()
+{
+  return capitalize(Query(P_NAME) || "NoName");
+}
+// ****
+
+// Local commands
+static mixed _query_localcmds() {
+  return
+    ({
+      ({"avatar","set_avataruri",0,0}),
+    });
+}
+
+int set_avataruri(string arg) {
+  arg = _unparsed_args(0);
+  if (!arg || !sizeof(arg)) {
+    string uri = QueryProp(P_AVATAR_URI);
+    if (stringp(uri))
+      tell_object(ME,
+          "Aktuelle Avatar-URI: " + uri + "\n");
+    else
+      tell_object(ME, "Du hast keine Avatar-URI eingestellt.\n");
+  }
+  else if (arg == "keine") {
+      SetProp(P_AVATAR_URI, 0);
+      tell_object(ME, "Deine Avatar-URI wurde geloescht.\n");
+  }
+  else if (sizeof(arg) > 512)
+      tell_object(ME, "Deine neue Avatar-URI ist zu lang!\n");
+  else {
+      SetProp(P_AVATAR_URI, arg);
+      tell_object(ME,
+          "Aktuelle Avatar-URI: " + arg + "\n");
+  }
+  return 1;
+}
+