Added public files

Roughly added all public files. Probably missed some, though.
diff --git a/std/player/viewcmd.c b/std/player/viewcmd.c
new file mode 100644
index 0000000..5d7e618
--- /dev/null
+++ b/std/player/viewcmd.c
@@ -0,0 +1,754 @@
+// MorgenGrauen MUDlib
+//
+// player/viewcmd.c -- player view command handling
+//
+// $Id: viewcmd.c 9548 2016-04-17 19:28:22Z Zesstra $
+
+#pragma strong_types
+#pragma save_types
+#pragma range_check
+#pragma no_clone
+#pragma pedantic
+
+#define NEED_PROTOTYPES
+#include "/sys/thing/properties.h"
+#include "/sys/living/put_and_get.h"
+#include "/sys/living/description.h"
+
+#include <container.h>
+#include <player.h>
+#include <properties.h>
+#include <rooms.h>
+#include <wizlevels.h>
+#include <defines.h>
+#include <moving.h>
+#include <new_skills.h>
+#include <ansi.h>
+
+#include <sys_debug.h>
+
+varargs mixed More(string str, int fflag, string returnto);
+
+void create()
+{
+  Set(P_BRIEF, SAVE, F_MODE);
+  Set(P_BLIND, SAVE, F_MODE);
+}
+
+int _toggle_brief()
+{
+  int brief;
+
+  if (query_verb()=="kurz")
+    brief=1;
+  else if (query_verb()=="ultrakurz")
+    brief=2;
+  else brief=0;
+  SetProp(P_BRIEF, brief);
+  write("Du bist nun im \""+
+        (brief?(brief==1?"Kurz":"Ultrakurz"):"Lang")+"\"modus.\n");
+  return 1;
+}
+
+private int sortinv(mixed a, mixed b) { return a[0] > b[0]; }
+
+private string collectinv(mixed obj)
+{
+  if(obj[0]=="") return 0;
+  return (obj[2] ? " " : "")
+       + obj[0]
+       + (obj[1] > 1 ? " ("+obj[1]+")" : "");
+}
+
+#define I_AUTOLOAD      1
+#define I_KEEP          4
+#define I_FORMATTED     16
+#define I_ARMOUR        64
+#define I_SORT          256
+#define I_WEAPON        1024
+#define I_FORCE_SORT    4096
+#define I_NO_TABLE      16384
+
+private string getflags(string arg, int flags)
+{
+  int no, i;
+  if(sizeof(arg) < 2) return 0;
+  no = (arg[0] == '-');
+
+  for(i = 1; i < sizeof(arg); i++)
+  {
+    switch(arg[i])
+    {
+    case 'a': flags |= I_AUTOLOAD << no; break;
+    case 'b': flags |= I_KEEP << no; break;
+    case 'f': flags |= I_FORMATTED << no; break;
+    case 'r': flags |= I_ARMOUR << no; break;
+    case 's': flags |= I_SORT << no; break;
+    case 'w': flags |= I_WEAPON << no; break;
+    case 'v': flags |= (I_ARMOUR | I_WEAPON) << !no; break;
+    case '1': flags |= I_NO_TABLE; break;
+        // Die Option macht nur Aerger und kommentiert ist sie eh nicht.
+        // Wer das dringend braucht, soll Wargons Schiebepuzzle benutzen.
+        //
+        // Tiamak, 15.10.2000
+        //    case 'S': flags |= I_FORCE_SORT << no; break;
+    default : return arg[i..i]; // wird ausgegeben an Spieler als unbekannt.
+    }
+  }
+  return 0;
+}
+
+static int _check_keep(object ob)
+{
+  return (ob->QueryProp(P_KEEP_ON_SELL))==geteuid(ME);
+}
+
+int _inventory(string str)
+{
+  mixed *args, output;
+  int ansi, i, flags, minv;
+  mixed inventory, weapons, armours, misc;
+  string format;
+
+  if(CannotSee()) return 1;
+
+  if((str = _unparsed_args()) && str!="")
+  {
+    string error;
+    error = "Benutzung: i[nventar] [-/+1abfrsvw]\n";
+    args = regexp(regexplode(str, "[-+][1abfrswv][1abfrswv]*"),
+                  "[-+][1abfrswv][1abfrswv]*");
+    if(!sizeof(args)) return (_notify_fail(error), 0);
+    if(sizeof(args = map(args, #'getflags/*'*/, &flags) - ({ 0 })))
+    {
+      printf("%s: Unbekanntes Argument.\n"+error, implode(args, ", "));
+      return 1;
+    }
+  }
+  // Fuer Spieler gehen nur sichtbare Objekte in den Algorithmus
+  if (IS_LEARNING(ME))  
+    inventory = all_inventory(ME);
+  else
+    inventory = filter_objects(all_inventory(ME), "short");
+  
+  ansi = member(({"vt100", "ansi"}), QueryProp(P_TTY)) != -1;
+  minv = 1 | (flags & (I_FORMATTED | (I_FORMATTED << 1)) ? 2 : 0);
+  format = (flags & I_NO_TABLE) ? "=" : "#";
+
+//  if(flags & (I_FORCE_SORT | I_FORCE_SORT << 1))
+//  {
+//    closure sf;
+//    sf = flags & I_FORCE_SORT ? #'> : #'<;
+//    s = sort_array(s, lambda(({'a, 'b}),
+//                             ({#'funcall, sf,
+//                                   ({#'||,({#'call_other,'a,"short"}),""}),
+//                                   ({#'||,({#'call_other,'b,"short"}),""})})));
+//    map_objects(s, "move", this_object());
+//    s = all_inventory(ME);
+//  }
+
+  if (flags & I_AUTOLOAD)
+    inventory = filter_objects(inventory,"QueryProp",P_AUTOLOADOBJ);
+  else if (flags & (I_AUTOLOAD << 1))
+    inventory -= filter_objects(inventory,"QueryProp",P_AUTOLOADOBJ);
+
+  if(flags & I_KEEP)
+    inventory = filter(inventory,#'_check_keep);
+  else if(flags & (I_KEEP << 1))
+    inventory -= filter(inventory,#'_check_keep);
+
+  armours = filter_objects(inventory, "QueryProp", P_ARMOUR_TYPE);
+  // Kleidung dazu addieren, vorher die erkannten Ruestungen abziehen, die
+  // muessen nicht nochmal durchiteriert werden.
+  armours += filter_objects(inventory-armours, "IsClothing");
+  // Ruestungen werden hier nicht abgezogen, weil es Kram gibt, welche sowohl
+  // Ruestung als auch Waffe ist.
+  weapons = filter_objects(inventory, "QueryProp", P_WEAPON_TYPE);
+  misc = inventory - weapons - armours; // rest ;-)
+
+  if(flags & I_WEAPON)
+  {
+    inventory = weapons; misc = ({});
+    if(!(flags & (I_ARMOUR))) armours = ({});
+  }
+  if(flags & I_ARMOUR)
+  {
+     inventory = armours; misc = ({});
+     if(!(flags & I_WEAPON)) weapons = ({});
+  }
+  if(flags & (I_WEAPON << 1)) { weapons = ({}); inventory = armours + misc; }
+  if(flags & (I_ARMOUR << 1)) { armours = ({}); inventory = weapons + misc; }
+
+  output = "";
+  if(flags & (I_FORMATTED | (I_FORMATTED << 1)))
+  {
+    inventory = make_invlist(this_player(), inventory, minv);
+    if(flags & (I_SORT | (I_SORT << 1)))
+    inventory = sort_array(inventory, #'sortinv/*'*/);
+    output += sprintf("%"+format+"-78s\n",
+                      implode(map(inventory,#'collectinv/*'*/),"\n"));
+  }
+  else
+  {
+    if(weapons && sizeof(weapons))
+    {
+      weapons = make_invlist(this_player(), weapons, minv);
+      if(flags & (I_SORT | (I_SORT << 1)))
+        weapons = sort_array(weapons, #'sortinv/*'*/);
+      output += (ansi?ANSI_BOLD:"") + "Waffen:" + (ansi?ANSI_NORMAL:"")+"\n"
+              + sprintf("%"+format+"-78s\n",
+                        implode(map(weapons, #'collectinv/*'*/), "\n"));
+    }
+    if(armours && sizeof(armours))
+    {
+      armours = make_invlist(this_player(), armours, minv);
+      if(flags & (I_SORT | (I_SORT << 1)))
+        armours = sort_array(armours, #'sortinv/*'*/);
+      output += (ansi?ANSI_BOLD:"") 
+              + "Kleidung & Ruestungen:" + (ansi?ANSI_NORMAL:"")+"\n"
+              + sprintf("%"+format+"-78s\n",
+                        implode(map(armours, #'collectinv/*'*/), "\n"));
+    }
+    if(misc && sizeof(misc))
+    {
+      misc = make_invlist(this_player(), misc, minv);
+      if(flags & (I_SORT | (I_SORT << 1)))
+        misc = sort_array(misc, #'sortinv/*'*/);
+      output += (ansi?ANSI_BOLD:"") + "Verschiedenes:" + (ansi?ANSI_NORMAL:"")+"\n"
+              + sprintf("%"+format+"-78s\n",
+                        implode(map(misc, #'collectinv/*'*/), "\n"));
+    }
+  }
+
+  // Spielerwunsch: 'inventar' sollte doch das Bezugsobjekt auf den Spieler
+  // aendern.
+  SetProp(P_REFERENCE_OBJECT, this_object());
+
+  if (output=="") 
+    output += (ansi?ANSI_BOLD:"")+"Die Liste ist leer."+(ansi?ANSI_NORMAL:"");
+  More(output);
+  return 1;
+}
+
+private nosave int exa_cnt;
+private nosave int exa_time;
+private nosave string *exa;
+
+varargs int _examine(string str, int mode)
+{
+  object base, *objs, env;
+  string what, detail, parent, out, error;
+  int i, size, done;
+
+  if(CannotSee()) return 1;
+
+  _notify_fail("Was willst Du denn untersuchen?\n");
+  if (!str) return 0;
+
+  if (member(({"boden","decke","wand","waende"}),old_explode(str," ")[0]) == -1) {
+    exa_cnt -= (time() - exa_time)/2;
+    exa_time = time();
+    exa_cnt++;
+    if (!exa)
+      exa = ({ str });
+    else
+      exa += ({ str });
+    if (exa_cnt > 10) {
+      log_file("ARCH/LOOK", 
+          sprintf("%s: %s in %s\n%@O\n",dtime(time()),getuid(this_object()), 
+            environment() ? object_name(environment()) : "???",exa), 150000);
+      exa_cnt = 0;
+      exa = ({});
+    }
+    else if (exa_cnt < 0) {
+      exa_cnt = 0;
+      exa = ({});
+    }
+  }
+  // do we look at an object in our environment ?
+  if (sscanf(str,"%s in raum", what) || sscanf(str,"%s im raum", what))
+      base = environment();
+  // is the object inside of me (inventory)
+  else if (sscanf(str,"%s in mir", what) || sscanf(str,"%s in dir", what))
+      base = this_object();
+  else {
+      what = str;
+      // get the last object we looked at
+      base = QueryProp(P_REFERENCE_OBJECT);
+      
+      // if a reference object exists, test for its existance in the room
+      // or in our inventory
+      if (objectp(base))
+      {
+       if (base == environment() || base==this_object())
+        {
+          // Umgebung oder Spieler selber sind als Bezugsobjekt immer in
+          // Ordnung, nichts machen.
+        }
+        // Das Referenzobjekt darf nicht unsichtbar sein.
+        else if (!base->short())
+          base = 0;
+        else if(member(deep_inventory(environment()), base) != -1)
+        {
+          foreach(env : all_environment(base)) {
+            // Ist eine Umgebung Living oder intransparenter Container oder
+            // unsichtbar?
+            if (living(env) || !env->QueryProp(P_TRANSPARENT)
+                || !env->short())
+            {
+              // in dem Fall ist ende, aber wenn das gefundene Env nicht
+              // dieses Living selber oder sein Env ist, wird das
+              // Referenzobjekt zusaetzlich genullt.
+              if (env != this_object() && env != environment())
+                base = 0;
+              break;
+            }
+          }
+        }
+        else
+          base = 0; // nicht im Raum oder Inventory
+      }
+  }
+
+  // scan input if we want a specific object to look at
+  if(sscanf(what, "%s an %s", detail, parent) == 2 ||
+     sscanf(what, "%s am %s", detail, parent) == 2 ||
+     sscanf(what, "%s in %s", detail, parent) == 2 ||
+     sscanf(what, "%s im %s", detail, parent) == 2)
+  {
+    // if an ref object exists get its inventory. (Oben wurde sichergestellt,
+    // dass das Referenzobjekt einsehbar ist)
+    if(base)
+      objs = base->locate_objects(parent, 1) || ({});
+    else {
+      // else get our inv and env
+      objs = environment()->locate_objects(parent, 1)
+           + locate_objects(parent, 1);
+    }
+    objs = filter_objects(objs, "short"); // nur sichtbare...
+    if(sizeof(objs) > 1)
+      return (notify_fail("Es gibt mehr als eine(n) "+capitalize(parent)+".\n"), 0);
+    else
+    {
+      if (sizeof(objs))
+        base = objs[0];
+      else
+        return (notify_fail("Hier ist kein(e) "+capitalize(parent)+".\n"), 0);
+    }
+    objs = 0;
+  }
+  else detail = what;
+
+  int base_was_env = 1;
+  do {
+    // if a base exists get its inventory, else get our inv and env
+    if (base)
+    {
+      if  (base == this_object() || base == environment() ||
+          (base->QueryProp(P_TRANSPARENT) && !living(base)))
+      {
+        // ich kann in base reingucken...
+        objs = base->locate_objects(detail, 1) || ({});
+      }
+      else
+      {
+        // Referenzobjekt da, aber nicht reinguckbar. base aber nicht nullen,
+        // denn es ist ja noch gueltig fuer Detailsuchen an base...
+        objs = ({});
+      }
+    }
+    else
+    {
+      objs = environment()->locate_objects(detail, 1)
+           + locate_objects(detail, 1);
+      base = environment();
+    }
+    objs = filter_objects(objs, "short"); // nur sichtbare...
+
+    if(!sizeof(objs))
+    {
+      // wenn keine Objekte gefunden wurden, wird nach Details gesucht...
+      if((out = base->GetDetail(detail, QueryProp(P_REAL_RACE),SENSE_VIEW)) ||
+         (out = base->GetDoorDesc(detail)))
+      {
+        SetProp(P_REFERENCE_OBJECT, base);
+        return (write(out), 1);
+      }
+      else
+      {
+        // wenn auch keine Details gefunden, dann schauen, ob Ende ist
+        // (base==env) oder wir evtl. noch im env suchen koennen.
+        if (base == environment())
+        {
+          if (base_was_env) {
+            // in diesem Fall war das Env das Bezugsobjekt - daher wegwerfen.
+            SetProp(P_REFERENCE_OBJECT, 0);
+            _notify_fail("Sowas siehst Du da nicht!\n");
+          }
+          else {
+            _notify_fail("Sowas siehst Du auch da nicht!\n");
+            // in diesem Fall war nicht das Env das Bezugsobjekt - es soll
+            // behalten und nicht geloescht werden.
+          }
+          return 0;
+        }
+        else {
+          base_was_env=0;
+          write(break_string("Du findest an "+base->name(WEM)
+                +" kein \"" + capitalize(detail) + "\"."
+                 " Dein Blick wendet sich der Umgebung zu.",78));
+          base = 0;
+        }
+      }
+    }
+    else  // Objekte gefunden!
+      done = 1;
+  } while(!done);
+
+  // Es muss min. ein (sichtbares) Objekt geben, sonst waere man hier nicht
+  // hingekommen.
+  object ob = objs[0];
+  SetProp(P_REFERENCE_OBJECT, ob);
+  tell_object(ME, ob->long(mode));
+  return 1;
+}
+
+varargs int _sense_exa(string str)
+{
+  object base, *objs, env;
+  string what, detail, parent, out, error;
+  int sense;
+
+  if(member(({"riech","rieche","schnupper","schnuppere"}),query_verb())!=-1)
+  {
+    _notify_fail("Du kannst nichts Besonderes riechen.\n");
+    sense = SENSE_SMELL;
+  }
+  else if(member(({"lausche","lausch","hoer","hoere"}),query_verb())!=-1)
+  {
+    if(QueryProp(P_DEAF))
+      return notify_fail("Du bist taub!\n"), 0;
+
+    _notify_fail("Du kannst nichts Besonderes hoeren.\n");
+    sense = SENSE_SOUND;
+  }
+  else if(member(({"taste","beruehre","beruehr"}),query_verb())!=-1)
+  {
+    sense = SENSE_TOUCH;
+    // ein "ab" ganz am Ende von str wird abgeschnitten, es soll sowohl "taste
+    // x ab" als auch "taste x" funktionieren.
+    if (str) {
+      _notify_fail("Sowas kannst Du hier nicht ertasten!\n");
+      string *tmp = explode(str," ");
+      if (sizeof(tmp) > 1 && tmp[<1] == "ab")
+        str = implode(tmp[0..<2], " ");
+    }
+    else
+      _notify_fail("Was willst Du denn abtasten?\n");
+  }
+  else if (member(({"lies","lese","les"}), query_verb()) > -1)
+  {
+    _notify_fail("Was willst Du lesen?\n");
+    if ( !str ) // Kein SENSE_DEFAULT zulassen.
+      return 0;
+    if (this_object()->CannotSee()) {
+      notify_fail("Du kannst nichts sehen!\n");
+      return 0;
+    }
+    sense = SENSE_READ;
+  }
+
+  if (!str) {
+    if(!detail =
+        environment()->GetDetail(SENSE_DEFAULT,QueryProp(P_REAL_RACE),sense))
+      return 0;
+    write(detail);
+    return 1;
+  }
+  else if(sscanf(str,"an %s",what)==1)
+    str=what;
+
+  // do we look at an object in our environment ?
+  if (sscanf(str,"%s in raum", what) || sscanf(str,"%s im raum", what))
+      base = environment();
+  // is the object inside of me (inventory)
+  else if (sscanf(str,"%s in mir", what) || sscanf(str,"%s in dir", what))
+      base = this_object();
+  else {
+      what = str;
+      // get the last object we looked at
+      base = QueryProp(P_REFERENCE_OBJECT);
+      
+      // if a reference object exists, test for its existance in the room
+      // or in our inventory
+      if (objectp(base))
+      {
+        if (base == environment() || base==this_object())
+        {
+          // Umgebung oder Spieler selber sind als Bezugsobjekt immer in
+          // Ordnung, nichts machen.
+        }
+        // Das Referenzobjekt darf nicht unsichtbar sein.
+        else if (!base->short())
+          base = 0;
+        else if(member(deep_inventory(environment()), base) != -1)
+        {
+          foreach(env : all_environment(base)) {
+            // Ist eine Umgebung Living oder intransparenter Container oder
+            // unsichtbar?
+            if (living(env) || !env->QueryProp(P_TRANSPARENT)
+                || !env->short())
+            {
+              // in dem Fall ist ende, aber wenn das gefundene Env nicht
+              // dieses Living selber oder sein Env ist, wird das
+              // Referenzobjekt zusaetzlich genullt.
+              if (env != this_object() && env != environment())
+                base = 0;
+              break;
+            }
+          }
+        }
+        else
+          base = 0; // nicht im Raum oder Inventory
+      }
+  }
+
+  // scan input if we want a specific object to look at
+  if(sscanf(what, "%s an %s", detail, parent) == 2 ||
+     sscanf(what, "%s am %s", detail, parent) == 2 ||
+     sscanf(what, "%s in %s", detail, parent) == 2 ||
+     sscanf(what, "%s im %s", detail, parent) == 2)
+  {
+    // if an ref object exists get its inventory. (Oben wurde sichergestellt,
+    // dass das Referenzobjekt einsehbar ist)
+
+    if(base)
+      objs = base->locate_objects(parent, 1) || ({});
+    else
+    {
+      // else get our inv and env
+      objs = environment()->locate_objects(parent, 1)
+           + locate_objects(parent, 1);
+    }
+    objs = filter_objects(objs, "short"); // nur sichtbare...
+    if(sizeof(objs) > 1)
+      return (notify_fail("Es gibt mehr als eine(n) "+capitalize(parent)+".\n"), 0);
+    else
+    {
+      if(sizeof(objs))
+          base = objs[0];
+      else
+          return (notify_fail("Hier ist kein(e) "+capitalize(parent)+".\n"), 0);
+    }
+    objs = 0;
+  }
+  else detail = what;
+
+  // wie auch immer haben wir jetzt ein Bezugsobjekt.
+  int maxtries=3;
+  do {
+    int base_was_env=1;
+    // als ersten werden in Frage kommende Objekte gesucht. Wenn base
+    // existiert (idR nur im ersten Durchlauf), wird dort gesucht, sonst in
+    // Env und Inv.
+    if (base)
+    {
+      if  (base == this_object() || base == environment() ||
+          (base->QueryProp(P_TRANSPARENT) && !living(base)))
+      {
+        // ich kann in base reingucken...
+        objs = base->locate_objects(detail, 1) || ({});
+      }
+      else
+      {
+        // Referenzobjekt da, aber nicht reinguckbar. base aber nicht nullen,
+        // denn es ist ja noch gueltig fuer Detailsuchen an base...
+        objs = ({});
+      }
+    }
+    else
+    {
+      objs = environment()->locate_objects(detail, 1)
+           + locate_objects(detail, 1);
+      base = environment();
+    }
+    objs = filter_objects(objs, "short"); // nur sichtbare...
+
+    if (sizeof(objs))
+    {
+      // Objekte gefunden, mal schauen, ob die taugen (d.h. fuer den jew. Sinn
+      // Infos haben. Wenn nicht, muessen wir weitersuchen.
+      // Aber erstmal die Objekte durchlaufen.
+      foreach(object ob: objs)
+      {
+        if (sense == SENSE_READ)
+        {
+          // Extrawurst: P_READ_MSG auch noch abfragen.
+          out = ob->QueryProp(P_READ_MSG);
+          if (!stringp(out))
+            out = ob->GetDetail(SENSE_DEFAULT,QueryProp(P_REAL_RACE),SENSE_READ);
+        }
+        else 
+          out=ob->GetDetail(SENSE_DEFAULT,QueryProp(P_REAL_RACE),sense);
+        if (stringp(out))
+        {
+          SetProp(P_REFERENCE_OBJECT, ob);
+          tell_object(ME, out);
+          return 1;
+        }
+      }
+    }
+
+    // Keine Objekte gefunden, die in Frage kommen. Nach Details suchen.
+    if(out = base->GetDetail(detail, QueryProp(P_REAL_RACE),sense))
+    {
+      SetProp(P_REFERENCE_OBJECT, base);
+      return (write(out), 1);
+    }
+    else
+    {
+      // Auch keine Details gefunden... Wenn wir uns noch das Env angucken
+      // koennen (weil base != env), dann machen wir das, ansonsten ist
+      // jetzt hier leider Ende...
+      if(base == environment())
+      {
+        if (base_was_env)
+          SetProp(P_REFERENCE_OBJECT, 0);
+        return 0;
+      }
+      else
+      {
+        // nochmal im naechsten Schleifendurchlauf ohne base probieren.
+        base = 0;
+        base_was_env = 0; 
+      }
+    }
+  } while(--maxtries);
+
+  // nach dieser Schleife sollte man nie ankommen...
+  raise_error(sprintf("_sense_exa(): zuviele Versuche, etwas zu finden."));
+
+  return 0;
+}
+
+varargs int look_into(string str,int mode)
+{
+  object *found_obs;
+
+  if( CannotSee() ) return 1;
+  _notify_fail("Wo willst Du denn reinschauen ?\n");
+  found_obs=find_obs(str,PUT_GET_NONE);
+  if (!found_obs)
+  {
+    if (environment() &&
+        (environment()->GetDetail(str,QueryProp(P_REAL_RACE))||
+         environment()->GetDoorDesc(str)))
+      _notify_fail("Da kannst Du so nicht reinsehen.\n");
+    return 0;
+  }
+  return _examine(str, mode);
+}
+
+/* Gebe die Umgebung des aktiven Spielers zurueck, lasse dabei  */
+/* rekursiv geschachtelte Raeume zu.                            */
+/* Wenn allow_short 0 ist, so wird immer die long-descr benutzt */
+varargs string env_descr(int allow_short,int flags, int force_short )
+{
+  object env;
+  int brief;
+
+  env = environment(ME);
+
+  if(!env)
+    return "Du schwebst im Nichts ... Du siehst nichts, rein gar nichts ...\n";
+
+  if (!force_short && (!allow_short || !QueryProp(P_BRIEF)))
+      return env->int_long(ME,ME,flags);
+
+  if (!flags && ((brief=QueryProp(P_BRIEF))>=2))
+      return "";
+
+  return env->int_short(ME,ME);
+}
+
+int _look(string str)
+{
+  string s;
+  int flag;
+
+  if(CannotSee()) return 1;
+
+  if(!str)
+  {
+    SetProp(P_REFERENCE_OBJECT, 0);
+    write( env_descr() );
+    return 1;
+  }
+  if(str=="-f" || str=="genau")
+  {
+    SetProp(P_REFERENCE_OBJECT, 0);
+    write( env_descr(0,2) );
+    return 1;
+  }
+  if(str=="-k" || str=="kurz")
+  {
+    SetProp(P_REFERENCE_OBJECT, 0);
+    write( env_descr(1,2,1) );
+    return 1;
+  }
+  if(str[0..2]=="-f "){
+    flag=2;
+    str=str[3..];
+  }
+  else if(str[0..5]=="genau "){
+    flag=2;
+    str=str[6..];
+  }
+  else flag = 0;
+  if (sscanf(str,"%s an",s)) str=s;
+  if (sscanf(str,"%s in mir",s)||sscanf(str,"%s in dir",s)) return _examine(str,flag);
+  if (sscanf(str,"in %s",s)) return look_into(s,flag);
+  return _examine(str,flag);
+}
+
+int _equipment(string arg)
+{
+  if (CannotSee()) return 1;
+  call_other("/std/player/invmaster/invmaster", "ShowInv", ME, arg);
+  return 1;
+}
+
+static mixed _query_localcmds()
+{
+  return
+    ({({"ausruestung", "_equipment",0,0}),
+      ({"i","_inventory",0,0}),
+      ({"inv","_inventory",0,0}),
+      ({"inventur","_inventory",0,0}),
+      ({"schau","_look",0,0}),
+      ({"schaue","_look",0,0}),
+      ({"unt","_examine",0,0}),
+      ({"untersuch","_examine",0,0}),
+      ({"betracht","_examine",0,0}),
+      ({"untersuche","_examine",0,0}),
+      ({"betrachte","_examine",0,0}),
+      ({"betr","_examine",0,0}),
+      ({"lausche","_sense_exa",0,0}),
+      ({"lausch","_sense_exa",0,0}),
+      ({"hoer","_sense_exa",0,0}),
+      ({"hoere","_sense_exa",0,0}),
+      ({"lies","_sense_exa",0,0}),
+      ({"lese","_sense_exa",0,0}),
+      ({"les","_sense_exa",0,0}),
+      ({"schnupper","_sense_exa",0,0}),
+      ({"schnuppere","_sense_exa",0,0}),
+      ({"riech","_sense_exa",0,0}),
+      ({"rieche","_sense_exa",0,0}),
+      ({"taste","_sense_exa",0,0}),
+      ({"beruehre","_sense_exa",0,0}),
+      ({"beruehr","_sense_exa",0,0}),
+      ({"kurz","_toggle_brief",0,0}),
+      ({"lang","_toggle_brief",0,0}),
+      ({"ultrakurz","_toggle_brief",0,0}) 
+    });
+}