Verbesserung Pruefung Referenzobjekt

Statt immer das ganze deep_inventory() der Umgebung des
Livings zusammen zu sammeln und zu pruefen, ob das
Referenzobjekt drin ist, werden jetzt (nur) die
all_environment geprueft.
Ausserdem Kommentare ergaenzt. ;-)

Change-Id: I33d0ec6501d780ae0c7a562ca6b37192cc2025d4
diff --git a/std/player/viewcmd.c b/std/player/viewcmd.c
index 4dce807..d055c88 100644
--- a/std/player/viewcmd.c
+++ b/std/player/viewcmd.c
@@ -327,27 +327,38 @@
         // Das Referenzobjekt darf nicht unsichtbar sein.
         else if (!ref_object->short())
           ref_object = 0;
-        // Nur wenn unser environment() 
-        else if(member(deep_inventory(environment()), ref_object) != -1)
+        // Nur wenn das Ref-Objekt irgendwie in unserer Umgebung ist (direkt,
+        // in uns, in einem Container etc.) kommt es in Frage. Es wird daher
+        // geprueft, ob all_environments() des Ref-Objekts auch unser
+        // environment enthaelt.
+        else
         {
-          foreach(object env : all_environment(ref_object)) {
-            // 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())
-                ref_object = 0;
-              break;
+          object *all_envs=all_environment(ref_object);
+          int i=member(all_envs, environment());
+          if (i >= 0)
+          {
+            // dann von dem Environment an entlanglaufen und alle
+            // intermediaeren Objekt pruefen, ob sie einsehbar und sichtbar
+            // sind.
+            foreach(object env : all_envs[..i]) {
+              // Ist eine Umgebung Living oder intransparenter Container oder
+              // unsichtbar?
+              if (living(env) || !env->QueryProp(P_TRANSPARENT)
+                  || !env->short())
+              {
+                // Kette zum Ref-Objekt unterbrochen. Wenn das unterbrechende
+                // Env nicht dieses Living selber oder sein Env ist, wird das
+                // Referenzobjekt zusaetzlich genullt.
+                if (env != this_object() && env != environment())
+                  ref_object = 0;
+                break;
+              }
             }
           }
+          else
+            ref_object = 0; // nicht im Raum oder Inventory
         }
-        else
-          ref_object = 0; // nicht im Raum oder Inventory
-      }
+      } // ref_object exists
   }
   return ref_object;
 }