Goto: Lesbarkeit der Funktion gesteigert

Ausserdem fehlende Information dokumentiert.

Change-Id: I3e444b003a2a8519fc6a0d354bbf780997917b2b
diff --git a/std/shells/magier/moving.c b/std/shells/magier/moving.c
index 4d99b32..bb42718 100644
--- a/std/shells/magier/moving.c
+++ b/std/shells/magier/moving.c
@@ -19,6 +19,7 @@
 #include <wizlevels.h>
 #include <moving.h>
 #include <properties.h>
+#include <files.h>
 
 private mixed verfolger()
 {
@@ -127,36 +128,59 @@
   return livings[nr-1];
 }
 
-static int _goto(string dest){
-  mixed target;
-  string target2,err;
+static int _goto(string dest)
+{
+  string|object target;
 
-  if (!sizeof(dest=_unparsed_args()))
+  dest = _unparsed_args();
+  if(!sizeof(dest))
     return USAGE("goto [lebewesen|filename]\n");
-  if (!((target=find_living_nr(dest)) && (target=environment(target))))
+  // Zuerst nur Spieler suchen, wenn keine existieren auch andere Livings.
+  target = (find_player(dest) || find_living_nr(dest));
+  if(objectp(target) && environment(target))
   {
-     target2=target=normalize_path(dest, getuid(), 1);
-     if (!find_object(target))
-     {
-       // ggf. .c dranhaengen
-       if (target2[<2..<1]!=".c") target2+=".c";
-       notify_fail(sprintf("goto: Datei %O nicht vorhanden.\n",target));
-       if (!(file_size(target2)>-1||
-           file_size(implode(explode(target,"/")[0..<2],"/")+
-               "/virtual_compiler.c")>-1)||(err=catch(load_object(target))))
-       {
-         if (err)
-              notify_fail(sprintf("goto: Fehler beim Teleport nach %O:\n%s\n",
-                      dest,implode(explode(err,"\n")," ")));
-         target=match_living(dest,1);
-         if (!(stringp(target)&&(target=find_living(target))&&
-               (target=environment(target))))
-           return 0;
-       }
-     }
+    target = environment(target);
   }
+  else
+  {
+    // Kein passendes Living, jetzt Raeume suchen.
+    string target2;
+    target2 = target = normalize_path(dest, getuid(), 1);
+    if (!find_object(target))
+    {
+      // ggf. .c dranhaengen
+      if (target2[<2..<1]!=".c") target2+=".c";
+      notify_fail(sprintf("goto: Datei %O nicht vorhanden.\n",target));
+      // Erst schauen, ob die Datei existiert, falls nicht pruefen, ob im
+      // gleichen Verzeichnis ein VC vorhanden ist, der sie liefern koennte.
+      // Die Ueberpruefung ob das File moeglicherweise Ladbar sein koennte
+      // vor load_object() dient einer spezifischeren Fehlermeldung.
+      // Die Variable vc dient nur dazu, weniger Zeilenumbrueche in
+      // der if-Abfrage zu haben und sie damit besser lesbar zu machen.
+      string vc;
+      vc = implode(explode(target, "/")[0..<2], "/") + "/virtual_compiler.c";
+      if(file_size(target2) > FSIZE_NOFILE ||
+        (file_size(vc) > FSIZE_NOFILE) &&
+        ({int})vc->QueryValidObject(target2))
+      {
+        string err = catch(load_object(target));
+        if(stringp(err))
+        {
+           notify_fail(sprintf("goto: Fehler beim Teleport nach %O:\n%s\n",
+                    dest,implode(explode(err,"\n")," ")));
+        }
+      }
+      else
+      {
+        // Kein Ziel gefunden.
+        return 0;
+      }
+    }
+  }
+  if(!target)
+    return 0;
   if (verfolger()) _verfolge("");
-  if (move(target,M_TPORT|M_NOCHECK)<0)
+  if (move(target,M_TPORT|M_NOCHECK) != MOVE_OK)
     printf("Bewegung fehlgeschlagen!\n");
   return 1;
 }