Added public files

Roughly added all public files. Probably missed some, though.
diff --git a/std/living/helpers.c b/std/living/helpers.c
new file mode 100644
index 0000000..3d292c0
--- /dev/null
+++ b/std/living/helpers.c
@@ -0,0 +1,149 @@
+// MorgenGrauen MUDlib
+//
+// living/helpers.c -- (Query)Methoden fuer Hilfsobjekte, z.B. zum Tauchen
+//
+// $Id: moneyhandler.h,v 3.1 1997/02/12 13:29:09 Wargon Exp %
+
+#pragma strong_types
+#pragma save_types
+#pragma range_check
+#pragma no_clone
+#pragma pedantic
+
+#include <living/helpers.h>
+#define NEED_PROTOTYPES
+#include <thing/properties.h>
+#undef NEED_PROTOTYPES
+
+public int RegisterHelperObject(object helper, int type, 
+                                string|closure callback) 
+{
+  // cb: closure auf die Callback-Funktion in previous_object()
+  closure cb;
+  // helpers: Mapping aller eingetragenen Helfer-Objekte
+  mapping helpers;
+
+  // Kein positiver Integerwert als Helfertyp uebergeben?
+  if ( !intp(type) || type < 1 )
+     raise_error(sprintf( "Wrong argument 1 to RegisterHelperObject(). "
+        "Expected positive <int>, got %O.\n", type));
+  // Kein Objekt vorhanden, an dem die Callback-Funktion gerufen werden soll?
+  if ( !objectp(helper) )
+    return HELPER_NO_CALLBACK_OBJECT;
+
+  // Funktionsname zum Zweck des Callbacks uebergeben?
+  if ( stringp(callback) ) {
+    // Dann Closure davon erstellen.
+    cb = symbol_function(callback, helper);
+    // Wenn das nicht klappt (zB weil die Funktion private ist), dann
+    // Fehler werfen und abbrechen.
+    if ( !closurep(cb) )
+      raise_error(sprintf("Error in RegisterHelperObject(): Unable to call "
+        "function %s in object %O.\n", callback, helper));
+  }
+  // Wenn schon eine Closure uebergeben wurde, dann diese direkt speichern.
+  else if ( closurep(callback) ) {
+    cb = callback;
+  }
+  // Weder Funktionsname, noch Closure, dann Fehler werfen und abbrechen.
+  else
+    raise_error(sprintf("Wrong argument 2 to RegisterHelperObject(). "
+      "Expected <string/closure>, got %O.\n",callback));
+
+  // Property auslesen und zwischenspeichern
+  helpers = QueryProp(P_HELPER_OBJECTS);
+  // Wenn die Prop leer ist, hier initialisieren
+  if ( !helpers ) {
+    helpers = ([type:({})]);
+  }
+  // Wenn der Typ noch nicht existiert, hier nachtragen.
+  else if ( !pointerp(helpers[type]) ) {
+    helpers[type] = ({});
+  }
+
+  // Closure eintragen, wenn noch nicht vorhanden
+  if ( member(helpers[type], cb)==-1 ) {
+    helpers[type] = helpers[type]+({cb});
+    SetProp(P_HELPER_OBJECTS, helpers);
+    return HELPER_SUCCESS;
+  }
+  else
+    return HELPER_ALREADY_LISTED;
+}
+
+public int UnregisterHelperObject(object helper, int type) {
+  if ( !intp(type) || type < 1 )
+     raise_error(sprintf( "Wrong argument 2 to UnregisterHelperObject(). "
+        "Expected positive <int>, got %O.\n", type));
+  if ( !objectp(helper) )
+    return HELPER_NO_CALLBACK_OBJECT;
+
+  mapping helpers = Query(P_HELPER_OBJECTS, F_VALUE);
+
+  if ( mappingp(helpers) ) {
+    foreach(closure cl: helpers[type]) {
+      if ( get_type_info(cl,2) == helper ) {
+        helpers[type] = helpers[type]-({cl});
+        return HELPER_SUCCESS;
+      }
+    }
+  }
+  return HELPER_NOTHING_TO_UNREGISTER;
+}
+
+// Querymethode fuer P_AQUATIC_HELPERS
+public mapping _query_lib_p_aquatic_helpers() {
+  mapping ret = ([]);
+  // eingetragene Callback-Closures auslesen
+  closure *helpers = 
+    ( Query(P_HELPER_OBJECTS, F_VALUE) || ([]) )[HELPER_TYPE_AQUATIC];
+  // Es sind gar keine Werte eingetragen? Dann gleich rausspringen.
+  if ( !pointerp(helpers) )
+    return ret;
+
+  // Nullelement substrahieren
+  helpers -= ({0});
+
+  if ( sizeof(helpers) ) {
+    // Mapping erstellen: Keys sind die Objekte, deren Closures eingetragen
+    // sind. Values sind die Rueckgabewerte der Closures,
+    // die dabei das Spielerobjekt und das abfragende Objekt uebergeben
+    // bekommen.
+    object *keys = map(helpers, #'get_type_info, 2);
+    int *vals = map(helpers, #'funcall, this_object(), previous_object(1));
+    ret = mkmapping(keys,vals);
+  }
+  return ret;
+}
+
+// Querymethode fuer P_AERIAL_HELPERS
+public mapping _query_lib_p_aerial_helpers() {
+  mapping ret = ([]);
+  // eingetragene Callback-Closures auslesen
+  closure *helpers = 
+    ( Query(P_HELPER_OBJECTS, F_VALUE) || ([]) )[HELPER_TYPE_AERIAL];
+
+  // Es sind gar keine Werte eingetragen? Dann gleich rausspringen.
+  if ( !pointerp(helpers) )
+    return ret;
+  
+  // Nullelement substrahieren
+  helpers -= ({0});
+
+  if ( sizeof(helpers) ) {
+    // Mapping erstellen: Keys sind die Objekte, deren Closures eingetragen
+    // sind. Values sind die Rueckgabewerte der Closures,
+    // die dabei das Spielerobjekt und das abfragende Objekt uebergeben
+    // bekommen.
+    object *keys = map(helpers,#'get_type_info, 2);
+    int *vals = map(helpers, #'funcall, this_object(), previous_object(1));
+    ret = mkmapping(keys,vals);
+  }
+  return ret;
+}
+
+// Querymethode fuer P_HELPER_OBJECTS
+public mapping _query_lib_p_helper_objects() {
+  return deep_copy(Query(P_HELPER_OBJECTS,F_VALUE));
+}
+