Added public files

Roughly added all public files. Probably missed some, though.
diff --git a/std/thing/language.c b/std/thing/language.c
new file mode 100644
index 0000000..4a3d6f9
--- /dev/null
+++ b/std/thing/language.c
@@ -0,0 +1,199 @@
+// MorgenGrauen MUDlib
+//
+// thing/language.c -- language handling object
+//
+// $Id: language.c 8359 2013-02-09 11:43:39Z Zesstra $
+
+#pragma strict_types
+#pragma save_types
+#pragma range_check
+#pragma no_clone
+#pragma pedantic
+
+#include <thing/language.h>
+#include <thing/description.h>
+
+#define NEED_PROTOTYPES
+#include <thing/properties.h>
+
+// Kein create()
+void create()
+{
+  return;
+}
+
+//Inversion, damit Defaultwert von 0 einen Artikel ausgibt
+static int _query_article() { return !Query(P_ARTICLE); }
+
+static int _set_article(int art) { return !Set(P_ARTICLE,!art); }
+
+// Bestimmten Artikel bestimmen
+private string query_c_article(int casus)
+{
+  if (QueryProp(P_PLURAL))
+    return ({ "die ", "der ", "den ", "die "})[casus];
+
+  return ({ ({ "das ", "des ", "dem ", "das " }),
+            ({ "der ", "des ", "dem ", "den " }),
+            ({ "die ", "der ", "der ", "die " }) })
+    [(int)QueryProp(P_GENDER)][casus];
+}
+
+// Ende fuer Artikel und Adjektive
+private varargs string query_g_suffix(int gen, int casus, int anzahl)
+{
+  return ({ ({ ({ "","e"}), ({"es","er"}), ({"em","en"}), ({  "","e"}) }),
+	    ({ ({ "","e"}), ({"es","er"}), ({"em","en"}), ({"en","e"}) }),
+	    ({ ({"e","e"}), ({"er","er"}), ({"er","en"}), ({ "e","e"}) }) })
+    [gen][casus][anzahl];
+}
+
+// Artikel vorschlagen: gibt es noch mehr Objekte im inv?
+varargs int SuggestArticle(string id)
+{
+  object ob,*obs;
+
+  // Raum oder Master: Bestimmt.
+  if (!environment()) return 1;
+
+  // Keine id? Dann raus
+  if (!id) return 1;
+
+  // Objekt mit gleichem Namen im env? Dann unbestimmt
+  for ( ob=first_inventory(environment()) ; ob ; ob=next_inventory(ob) )
+    if ( ob!=this_object()&& id==(string)ob->QueryProp(P_NAME) )
+      return 0;
+
+  // sonst bestimmt
+  return 1;
+}
+
+// Artikel bestimmen
+varargs string QueryArticle(int casus, int dem, int force)
+{
+  // Kein Artikel
+  if (!force &&!(QueryProp(P_ARTICLE))) return "";
+
+  // Artikelart aussuchen
+  if ( dem==2 ) dem = SuggestArticle(QueryProp(P_NAME));
+
+  // Bestimmter Artikel
+  if (dem) return query_c_article(casus);
+
+  // Unbestimmter Artikel
+  if (QueryProp(P_PLURAL)) return "";
+  
+  return sprintf("ein%s ",query_g_suffix((int)QueryProp(P_GENDER),casus));
+}
+
+// Besitzanzeiger fuer Objekt bestimmen
+varargs string QueryOwn(int casus)
+{
+  return sprintf("Dein%s",query_g_suffix(QueryProp(P_GENDER),casus));
+}
+
+// Possessivpronomen bestimmen
+varargs string QueryPossPronoun(mixed what, int casus, int number)
+{
+  int gen2;
+
+  // Geschlecht ermitteln
+  gen2 = (objectp(what)?(int)what->QueryProp(P_GENDER):(int)what);
+
+  // Plural ist schoen einfach
+  if (QueryProp(P_PLURAL)) return "ihr"+query_g_suffix(gen2, casus, number);
+
+  return (((((int)QueryProp( P_GENDER ))==FEMALE )? "ihr":"sein")+
+          query_g_suffix(gen2%3, casus, number));
+}
+
+// Pronomen bestimmen nach KNG
+varargs string QueryPronoun(int casus)
+{
+  int gender;
+
+  // Plural ist immer einfach ...
+  if (QueryProp(P_PLURAL)) 
+  {
+     if (casus==WEM) return "ihnen";
+     return "sie";
+  }
+
+  switch(QueryProp(P_GENDER))
+  {
+    case FEMALE:
+      if (casus==WESSEN) return "ihrer";
+      if (casus==WEM) return "ihr";
+      return "sie";
+
+    case MALE:
+      if (casus==WER) return "er";
+      if (casus==WESSEN) return "seiner";
+      if (casus==WEM) return "ihm";
+      return "ihn";
+  }    
+  if (casus==WESSEN) return "seiner";
+  if (casus==WEM) return "ihm";
+  return "es"; //fall-through
+}
+
+// Anrede fuer Spieler bestimmen
+varargs string QueryDu(int casus,int gender,int zahl)
+{
+  return
+    ({ ({({    "du",   "ihr"}),({    "du",   "ihr"}),({    "du",   "ihr"})}),
+       ({({"deiner",  "euer"}),({"deiner",  "euer"}),({"deiner",  "euer"})}),
+       ({({   "dir",  "euch"}),({   "dir",  "euch"}),({   "dir",  "euch"})}),
+       ({({  "dich",  "euch"}),({  "dich",  "euch"}),({  "dich",  "euch"})})
+     })[casus][gender][zahl];
+}
+
+// Welches Geschlecht hat das Objekt als String?
+string QueryGenderString()
+{
+  switch( (int)QueryProp( P_GENDER ))
+  {
+    case MALE:   return "maennlich";
+    case FEMALE: return "weiblich";
+  }
+  return("saechlich"); //fall-through
+}
+
+// Artikel durchdeklinieren nach Kasus, Numerus, Genus und Art
+// des Artikels (demon==bestimmt)
+varargs string DeclAdj(mixed adj, int casus, int demon)
+{
+	// Unregelmaessige Adjektive
+	if( pointerp(adj) ) return adj[casus]+" ";
+
+  // Falscher Typ? Und Tschuess ...
+  if (!stringp(adj)) return "";
+
+  // Plural ist einfach
+  if (QueryProp(P_PLURAL))
+  {
+    // Bestimmt
+    if (demon) return adj+"en ";
+
+    // Unbestimmt
+    return adj + ({ "e ", "er ", "en ", "e " })[casus];
+  }
+  
+  if ( demon )
+    return adj + ({ ({ "e " , "en ", "en ", "e "  }),
+		    ({ "e " , "en ", "en ", "en " }),
+		    ({ "e " , "en ", "en ", "e "  }) })
+      [(int)QueryProp( P_GENDER )][casus];
+  else
+    return adj + ({ ({ "es ", "en ", "en ", "es " }),
+		    ({ "er ", "en ", "en ", "en " }),
+		    ({ "e " , "en ", "en ", "e "  }) })
+      [(int)QueryProp( P_GENDER )][casus];
+}
+
+// P_GENDER setzen. Es sind nur 0,1 und 2 (MALE,FEMALE,NEUTER) erlaubt
+static int _set_gender(int i)
+{
+  if (i>-1&&i<3) return Set(P_GENDER,i);
+  return Query(P_GENDER);
+}