Neue Funktion: GetHelperObject()

Damit nicht jeder eine eigene Funktion bauen muss,
um irgendein Helferobjekt zu finden, was bestimmten
Kriterien genuegt, gibt es jetzt eine in der Mudlib.

Change-Id: Id627046bc3da6685b7509cab448fe76b45a16293
diff --git a/doc/sphinx/lfun/GetHelperObject.rst b/doc/sphinx/lfun/GetHelperObject.rst
new file mode 100644
index 0000000..cf9baab
--- /dev/null
+++ b/doc/sphinx/lfun/GetHelperObject.rst
@@ -0,0 +1,41 @@
+GetHelperObject()
+=================
+
+FUNKTION
+--------
+
+  public varargs object GetHelperObject(int type, int|closure strength)
+
+DEFINIERT IN
+------------
+
+  /std/living/helpers.c
+
+ARGUMENTE
+---------
+
+  * type: Eine der in helpers.h definierten Konstanten
+  * strength: Staerke des Helfers
+    (Rueckgabewert der Callback-Methode, siehe :doc:`RegisterHelperObject`.)
+    oder Closure, die als Argumente das Living und die Callback-Closure des
+    Helpers uebergeben bekommt. Gibt die an GetHelperObject() uebergebe
+    Closure 1 zurueck, wird das aktuelle Objekt zurueckgegeben.
+
+BESCHREIBUNG
+------------
+
+  Gibt das zuerst gefundene als Helfer registrierte Objekt zurueck, welches
+  die Anforderungen erfuellt.
+
+RUECKGABEWERT
+-------------
+
+  Objekt welches den uebergebenen Anforderungen entspricht.
+
+SIEHE AUCH
+----------
+
+  :doc:`RegisterHelperObject`, :doc:ÙnregisterHelperObject`
+  :doc:`../props/P_AERIAL_HELPERS`, :doc:`../props/P_AQUATIC_HELPERS`, :doc:`../props/P_HELPER_OBJECTS`
+
+Letzte Aenderung: 27.02.2018, Bugfix
diff --git a/doc/sphinx/lfun/RegisterHelperObject.rst b/doc/sphinx/lfun/RegisterHelperObject.rst
index 2d0def4..d162728 100644
--- a/doc/sphinx/lfun/RegisterHelperObject.rst
+++ b/doc/sphinx/lfun/RegisterHelperObject.rst
@@ -137,7 +137,7 @@
 ----------
 ::
 
-     Funktionen:  UnregisterHelperObject()
+     Funktionen:  UnregisterHelperObject(), GetHelperObject()
      Properties:  P_HELPER_OBJECTS, P_AERIAL_HELPERS, P_AQUATIC_HELPERS
      Sonstiges:   /sys/living/helpers.h
 
diff --git a/std/living/helpers.c b/std/living/helpers.c
index 3d292c0..26c94e5 100644
--- a/std/living/helpers.c
+++ b/std/living/helpers.c
@@ -147,3 +147,23 @@
   return deep_copy(Query(P_HELPER_OBJECTS,F_VALUE));
 }
 
+public varargs object GetHelperObject(int type, int|closure strength)
+{
+  object ob;
+  // Wir brauchen strength als kleineren Wert, als den minimal akzeptierten,
+  // damit wir mit > arbeiten koennen, ist meistens egal, aber wenn kein
+  // Wert uebergeben wird ist strength = 0, in dem Fall duerfte aber
+  // mehrheitlich 1 gemeint sein.
+  --strength;
+  foreach(closure cl : Query(P_HELPER_OBJECTS)[type]-({0}))
+  {
+    if((intp(strength) && 
+      funcall(cl,this_object(),previous_object())>strength) ||
+      (closurep(strength) && funcall(strength,this_object(),cl)))
+    {
+      ob=get_type_info(cl,2);
+      break;
+    }
+  }
+  return ob;
+}