Normieren des Ziels in Funktion ausgelagert.

Das Normieren des Ziels der Bewegung auf ein Objekt
wird manchmal auch woanders gebraucht als in dem
move(). Da es P_PARA beruecksichtigen muss, ist es
auch komplexer und rechtfertigt eine wiederverwendbare
Funktion.

Change-Id: I0123994f01f19ebdff204d1c262efee6df4941b4
diff --git a/std/thing/moving.c b/std/thing/moving.c
index 8845c10..8f7fd64 100644
--- a/std/thing/moving.c
+++ b/std/thing/moving.c
@@ -22,7 +22,7 @@
 // b) zum Ueberschreiben
 protected int PreventMove(object dest, object oldenv, int method) {
   int tmp;
-  
+
   // M_NOCHECK? -> Bewegung eh erlaubt (und Rueckgabewert wuerde ignoriert)
   if ((method&M_NOCHECK)) {
     // Bei M_NOCHECK zwar Prevent* aufrufen, aber das Resultat ignorieren
@@ -43,7 +43,7 @@
   // Gewicht ermitteln
   if ( !(tmp = ({int})QueryProp(P_TOTAL_WEIGHT)) )
       tmp = ({int})QueryProp(P_WEIGHT);
-        
+
   // Ist das Objekt nicht zu schwer?
   if ( (tmp = ({int})dest->MayAddWeight(tmp)) < 0) {
       if ( tmp == -2 ) return ME_TOO_HEAVY_FOR_ENV;
@@ -69,40 +69,35 @@
 protected void NotifyMove(object dest, object oldenv, int method) {
 }
 
-public varargs int move( object|string dest, int method )
+protected object move_norm_dest(object|string dest)
 {
-  object oldenv;
-  int tmp;
-  string fn,vc;
-  mixed sens;
+  if (objectp(dest))
+    return dest;
 
-  if (!objectp(dest) && !stringp(dest))
-      raise_error(sprintf("Wrong argument 1 to move(). 'dest' must be a "
-            "string or object! Argument was: %.100O\n",
-            dest));
+  int parawelt;
+  // Wenn dieses Objekt gerade in einem Lebewesen ist, dann soll das Ziel der
+  // Bewegung implizit in dieselbe Para-Welt erfolgen wie das Living.
+  // parawelt ist die Ziel-Parallelweltnummer
+  if (!environment() || !living(environment()) ||
+      !intp(parawelt =({int})environment()->Query(P_PARA)))
+    parawelt=0;
 
-  // Jetzige Umgebung merken
-  oldenv = environment();
-
-  // Bewegung in Para-Welt-Raeume?
-  // tmp ist die Ziel-Parallelweltnummer
-  if (!environment()||!living(environment())||
-      !intp(tmp =({int})environment()->Query(P_PARA)))
-    tmp=0;
-    
   // Wenn das Objekt von einem in der Parawelt befindlichen Spieler
   // oder NPC bewegt wird, sollte es auch wieder in der Parawelt landen.
   // Um Rechenzeit zu sparen, wird angenommen, dass bei Bewegungen in
   // das Inv oder Env des Spielers 'dest' als Objekt uebergeben wird,
   // wohingegen bei Bewegungen in Nachbarraeume (die eigentlich nur
   // interessant sind) 'dest' als Filename angegeben wird.
-  if (tmp&&!objectp(dest)&&!environment(dest)) {
+  if (parawelt && !environment(dest))
+  {
       // Falls der Zielraum nicht schon explizit in der Parallelwelt ist,
       // neuen Zielraum suchen. Aber nur, wenn das Ziel kein Clone ist. Sonst
       // buggt, wenn man versucht, nach raum#42^para zu bewegen.
-      if (!IS_PARA(dest) && strrstr(dest,"#")==-1) {
-        fn=dest+"^"+tmp;
-
+      if (!IS_PARA(dest) && strrstr(dest,"#")==-1)
+      {
+        string fn=dest+"^"+parawelt;
+        string vc;
+        int valid;
         // Der Parawelt-Raum wird nur zum Ziel, wenn er a) existiert
         // und b) auch von Spielern betreten werden darf. Letzteres
         // Kriterium kann nur mit im Objekt gesetzter Property
@@ -110,31 +105,45 @@
           if ( (find_object(fn) || ((file_size(fn+".c")>0||
                   (file_size(vc=implode(explode(fn,"/")[0..<2],"/")+
                   "/virtual_compiler.c")>0 &&
-                  !catch(tmp=({int})call_other(vc,"QueryValidObject",fn);
-                    publish) && tmp>0)) &&
-                  !catch(load_object( fn );publish))) &&
+                  !catch(valid=({int})vc->QueryValidObject(fn);publish)
+                  && valid>0)) &&
+                  !catch(load_object(fn);publish))) &&
               (!fn->QueryProp(P_NO_PLAYERS) || QueryProp(P_TESTPLAYER)) )
            dest = fn;
       }
   }
-    
   // dest auf Objekt normieren.
   if (stringp(dest))
       dest = load_object(dest);
-    
+  return dest;
+}
+
+public varargs int move( object|string dest, int method )
+{
+  if (!objectp(dest) && !stringp(dest))
+      raise_error(sprintf("Wrong argument 1 to move(). 'dest' must be a "
+            "string or object! Argument was: %.100O\n",
+            dest));
+
+  // Jetzige Umgebung merken
+  object oldenv = environment();
+
+  dest = move_norm_dest(dest);
+
   // testen, ob das Objekt bewegt werden will
-  if (tmp=PreventMove(dest, oldenv, method)) {
+  int valid = PreventMove(dest, oldenv, method);
+  if (valid)
+  {
       // auf gueltigen Fehler pruefen, wer weiss, was Magier da evtl.
       // versehentliche zurueckgeben.
-      if (VALID_MOVE_ERROR(tmp))
-        return(tmp);
+      if (VALID_MOVE_ERROR(valid))
+        return(valid);
       else
-        return(ME_DONT_WANT_TO_BE_MOVED);
+        return ME_DONT_WANT_TO_BE_MOVED;
   }
 
   // Sensitive Objekte muessen entfernt werden
-  sens = QueryProp(P_SENSITIVE);
-
+  mixed *sens = QueryProp(P_SENSITIVE);
   if (sens && environment())
   {
     environment()->RemoveSensitiveObject( this_object() );
@@ -165,7 +174,7 @@
   }
   //wurde das Objekt vielleicht noch zerstoert?
   if (!objectp(ME)) return(ME_WAS_DESTRUCTED);
-  
+
   //scheint wohl alles ok zu sein.
   return MOVE_OK;
 }