init() mit vorherigem Environment rufen

Bislang ist es bei Lebewesen schwierig, festzustellen,
wo es eigentlich herkommt, wenn es ein neues
Environment betritt. init() hat aus historischen
Gruenden kein Argument.
Im Gegensatz dazu wird das neue Environment an das
Gegenstueck exit() uebergeben.
Daher wird der Movehook so geaendert, dass an alle init()
die Ursprungsumgebung der Bewegung uebergeben wird.

Change-Id: If7b0628d304d6eea7ade2ff257d8ba78eace4e67
diff --git a/secure/master.c b/secure/master.c
index 0f25533..2eacfb9 100644
--- a/secure/master.c
+++ b/secure/master.c
@@ -158,12 +158,13 @@
          ({#'?,({#'!=,'item,({#'this_object})}),
            ({#'raise_error,                        // ->Fehler!
              "Illegal to move other object than this_object()\n"}) }),
+         ({#'=,'oldenv,({#'environment,'item}) }), // altes Env merken
          ({#'efun::set_environment,'item,'dest}),  // item nach dest bewegen
          ({#'?,
            ({#'living,'item}),                     // living(item)?
            ({#',,
              ({#'efun::set_this_player,'item}),    // set_this_player(item)
-             ({#'call_other,'dest,"init"}),        // dest->init()
+             ({#'call_other,'dest,"init",'oldenv}),// dest->init(oldenv)
              ({#'?!, 
                ({#'&&,                             // !objectp(item)||
                  ({#'objectp, 'item}),             // env(item)!=dest?
@@ -173,7 +174,7 @@
 #ifdef EMACS_NERV 
          })   // Emacs kann ({#'({ nicht parsen    // others=all_inv(dest)-
 #endif                                             //        ({item})
-         ({#'filter,'others,lambda(({'ob,'item}),
+         ({#'filter,'others,lambda(({'ob,'item,'lastenv}),
             ({#'?,                                     
               ({#'&&,
                 ({#'objectp,'item}),               // objectp(item)&&
@@ -181,21 +182,21 @@
                 ({#'==,({#'environment,'item}),({#'environment,'ob})})}),
               ({#',,                               // env(item)==env(ob)?
                 ({#'efun::set_this_player, 'ob}),  // set_this_player(ob)
-                ({#'call_other,'item, "init"})     // item->init()
-              })})),'item}),
+                ({#'call_other,'item, "init",'lastenv}) // item->init(lastenv)
+              })})),'item,'oldenv}),
          ({#'?,
            ({#'living,'item}),                     // living(item)?
               ({#',,
                 ({#'efun::set_this_player,'item}), // set_this_player(item)
-                ({#'filter,'others,lambda(({'ob,'item}),
+                ({#'filter,'others,lambda(({'ob,'item,'lastenv}),
                     ({#'?,                          
                       ({#'&&,                 
                         ({#'objectp,'item}),       // objectp(item)&&
                         ({#'objectp,'ob}),         // objectp(ob)&&
                         ({#'==,({#'environment,'item}),({#'environment,'ob})})
                       }),                          // env(item)==env(ob)?
-                      ({#'call_other,'ob,"init"})  // ob->init()
-                    })),'item})})}),
+                      ({#'call_other,'ob,"init",'lastenv}) // ob->init(lastenv)
+                    })),'item, 'oldenv})})}),
          ({#'?,
            ({#'&&,
              ({#'objectp,'item}),                  // objectp(item)&&
@@ -204,7 +205,7 @@
            }),
            ({#',,
              ({#'efun::set_this_player,'dest}),    // set_this_player(dest)
-             ({#'call_other,'item,"init"})})})})));// item->init()
+             ({#'call_other,'item,"init",'oldenv})})})}))); //item->init(oldenv)
   DEBUG("Master inaugurated");
   return;
 }