find_base: Objekt aus present_objects auswaehlen

present_objects() liefert natuerlich eine Liste von
Objekten. Daher muss find_base hieraus eins auswaehlen.

Change-Id: I7a31096915dbdcca1b2e7073b71f2aade0f0db4a
diff --git a/std/player/viewcmd.c b/std/player/viewcmd.c
index 7fec946..26eb99f 100644
--- a/std/player/viewcmd.c
+++ b/std/player/viewcmd.c
@@ -435,18 +435,34 @@
   // wird.
   for (int i = sizeof(tokens)-1; i > 1; i--)
   {
-    object ob;
+    object ob, *objs;
     // In env oder mir oder umgebung gucken, ob ein passendes Objekt da ist.
     // Hierfuer werden mit jedem Schleifendurchlauf von hinten mehr worte aus
     // tokens benutzt. (Beispiel "muenze in boerse 2")
+    // present waere schneller und die Komplexitaet von present_objects waere
+    // hier nicht noetig. Allerdings beruecksichtigt es die Sichtbarkeit und
+    // ggf. virtuell anwesende Objekte, was present nicht tut.
+    string suchid=implode(tokens[i..], " ");
     if (env)
-        ob = env->present_objects(implode(tokens[i..], " "));
+        objs = env->present_objects(suchid) || ({});
     else
-        ob = environment()->present_objects(implode(tokens[i..], " ")) ||
-             this_object()->present_objects(implode(tokens[i..], " "));
-    // Naechster durchlauf, mit einem Wort mehr aus tokens
-    if (!ob)
+        objs = environment()->present_objects(suchid) ||
+               this_object()->present_objects(suchid);
+    // wenn nicht genau ein Objekt gefunden wird, wird weitergesucht, im
+    // naechsten Durchlauf mit einem Wort mehr aus tokens
+    switch(sizeof(objs))
+    {
+      case 0:
+        notify_fail("Hier ist kein(e) "+capitalize(suchid)+".\n");
         continue;
+      case 1:
+        // Objekt gefunden.
+        ob = objs[0];
+        break;
+      default:
+        notify_fail("Es gibt mehr als eine(n) "+capitalize(suchid)+".\n");
+        continue;
+    }
 
     // an dieser Stelle wird (noch) nicht geprueft, ob man in das gefundene
     // Objekt hineinforschen kann.