Zugriffsfunktionen fuer P_DEFENDERS

P_DEFENDERS sollte nicht von Hand verwaltet werden, daher gibt es jetzt
auch Funktionen fuer die Abfrage.

- QueryDefenders() liefert alle eingetragenen Defender.
- QueryPresentDefenders() alle anwesenden.
- QueryNearDefenders() alle anwesenden in Reihe 1 fuer physikalische
  Angriffe.

Change-Id: I90d49ac8a65b05178f5cfeb9e91fb694e5b7ac12
diff --git a/std/living/combat.c b/std/living/combat.c
index 2cab731..2a98e3e 100644
--- a/std/living/combat.c
+++ b/std/living/combat.c
@@ -888,6 +888,36 @@
   SetProp(P_DEFENDERS,defs);
 }
 
+public object* QueryDefenders()
+{
+  return filter(QueryProp(P_DEFENDERS) || ({}), #'objectp);
+}
+
+public object* QueryPresentDefenders(object* defenders =
+    QueryProp(P_DEFENDERS))
+{
+  // Alles selbst pruefen, um Durchlaeufe zu sparen.
+  return filter(defenders,
+    function int(object o)
+    {
+      return (objectp(o) && 
+        (environment(o) == environment(ME) || environment(o) == ME));
+    });
+}
+
+public object* QueryNearDefenders(object* defenders =
+    QueryProp(P_DEFENDERS))
+{
+  // alles selbst pruefen, um Durchlaeufe zu sparen.
+  return filter(defenders,
+    function int(object o)
+    {
+      return (objectp(o) &&
+        ((environment(o) == environment(ME) || environment(o) == ME) &&
+        o->PresentPosition() == 1;
+    });
+}
+
 public void InformDefend(object enemy)
 {
   UseSkill(SK_INFORM_DEFEND,([ SI_ENEMY  : enemy,