Entferne Wiederherstellen von Properties

Diese Funktionalitaet ist schon lange extrem kaputt.
1. Es wird zwar nach Closures gefiltert, allerdings erst, nachdem das
   Objekt zerstört wurde. Closures auf this_object() sind jetzt 0, damit
   werden diese beim Wiederherstellen überschrieben.
2. Nach Objekten wird gar nicht gefiltert.

Diese Probleme sind quasi nicht zu fixen. Vor dem Zerstören filtern
bringt auch nichts, da nicht bekannt ist, welche Objekte oder Closures
im remove() noch mit zerstört werden.

Da die aktuelle Funktionsweise bei Fehlerhafter Anwendung Objekte
ernsthaft kaputtmachen kann (z.B. Waffen mit P_HIT_FUNC =
this_object()), ist sie auszubauen die beste Lösung.

Change-Id: I0b66fa0f9230cba44e3849713547de1f19c63cfe
diff --git a/doc/mcmd/upd b/doc/mcmd/upd
index d66236a..4ca4c97 100644
--- a/doc/mcmd/upd
+++ b/doc/mcmd/upd
@@ -3,7 +3,7 @@
 ---
 
  MAGIERKOMMANDO:
-    upd [ -abcdhfilmrv ] <datei> [...]
+    upd [ -abdhfilmrv ] <datei> [...]
 
  ARGUMENTE:
 
@@ -32,9 +32,6 @@
      -C  Die Nutzung von Configure() wird erzwungen, d.h. Objekte, die kein
          oeffentliches Configure() haben, werden nicht zerstoert/ersetzt.
          (im Zusammenspiel mit -l oder -r, inkompatibel mit -c)
-     -c  Die Properties des Originalobjektes werden kopiert. In diesem Fall
-         wird Configure() _nicht_ benutzt (im Zusammenspiel mit -l und -r,
-         inkompatibel mit -C)
      -d  Beim Zerstoeren der Instanzen werden auch evtl. in ihnen vorhandene
          Objekte zerstoert. Nuetzlich, um z.B. NPCs samt ihrer Ausruestung zu
          entsorgen.
@@ -75,5 +72,5 @@
     destruct, load
     Configure()
 
- LETZTE AENDERUNG:
-    Tue, Oct 10 18:50:00 2000 von Mandragon
+Letzte Aenderung: 03.07.2025, Bugfix
+
diff --git a/std/shells/magier/upd.c b/std/shells/magier/upd.c
index ebee975..7482156 100644
--- a/std/shells/magier/upd.c
+++ b/std/shells/magier/upd.c
@@ -260,37 +260,6 @@
   return ret;
 }
 
-
-//
-// _illegal_closure(): ist closure in arg an objekt gebunden?
-// arg: closure(-array/mapping)
-// Rueckgabe: 0 wenn alles okay
-//            1 wenn closure geloescht werden muss
-//
-
-private int _illegal_closure( mixed arg )
-{
-  int i, j;
-  string *indices;
-  
-  if ( closurep(arg) && !objectp(query_closure_object(arg)) )
-    return 1;
-  
-  if ( pointerp(arg) ){
-    for ( i = sizeof(arg); i--; )
-      if ( _illegal_closure(arg[i]) )
-        return 1;
-  }
-  else if ( mappingp(arg) ){
-    indices = m_indices(arg);
-    for ( i = sizeof(indices); i--; )
-      for ( j = get_type_info( arg, 1 ); j--; )
-        if ( _illegal_closure(arg[indices[i], j]) )
-          return 1;
-  }
-  return 0;
-}
-
 //
 // _make(): Update file
 // file:  Filename
@@ -361,24 +330,18 @@
     mixed configdata;
     int restore_config;
 
-    // Wenn Objekt existiert, dann Inhalt und ggf. Daten aus Configure() oder
-    // Props sichern:
+    // Wenn Objekt existiert, dann Inhalt und ggf. Daten aus Configure() sichern
     if (obj)
     {
-      // im Fall UPD_C erfolgt _kein_ Auslesen und _keine_ Restauration
-      // mittels Configure()
-      if ( ! (flags & UPD_C ) )
+      catch(restore_config=call_resolved(&configdata,obj,
+                                                "Configure",0);
+            publish);
+      // Wenn UPD_CONF gesetzt wird, _muss_ das Objekt ein oeffentliches
+      // Configure() definieren, sonst erfolgt Abbruch.
+      if ((flags & UPD_CONF) && !restore_config)
       {
-        catch(restore_config=call_resolved(&configdata,obj,
-                                                  "Configure",0);
-              publish);
-        // Wenn UPD_CONF gesetzt wird, _muss_ das Objekt ein oeffentliches
-        // Configure() definieren, sonst erfolgt Abbruch.
-        if ((flags & UPD_CONF) && !restore_config)
-        {
-          printf("upd: %s: hat kein Configure(), Zerstoerung abgebrochen.\n",file);
-          return RET_FAIL;
-        }
+        printf("upd: %s: hat kein Configure(), Zerstoerung abgebrochen.\n",file);
+        return RET_FAIL;
       }
       if (!(flags&UPD_D)&&(flags&(UPD_L|UPD_R)))
       {
@@ -404,10 +367,6 @@
         inv=map( deep_inventory(obj), #'_save/*'*/, inv_saver )-({0});
       }
       env = environment(obj);
-      if ( flags & UPD_C )
-      {
-        pro = ({mapping})(obj->QueryProperties());
-      }
     }
     else inv = ({});
 
@@ -431,33 +390,12 @@
       if ( obj = _reload( blue,inst,flags, &err ) )
         msg += ", " + (inst ? "neu geclont" : "neu geladen");
      
-// Neu geladen: Properties wiederherstellen, Closures filtern 
+// Neu geladen: Konfiguration wiederherstellen
       if (!err)
       {
         if (!obj) obj = find_object(file);
-        // Wenn gewuenscht, Props zurueckschreiben (hat Prioritaet vor
-        // Configure(), weil explizit vom Magier angefordert).
-        if ( pro && (flags & UPD_C) )
-        {
-          string *names;
-          
-          names = m_indices(pro);
-          
-          // Closures in (mittlerweile) zerstoerten Objekten
-          // rausfiltern, damit die (hoffentlich korrekten) Closures
-          // im neu geclonten Objekt erhalten bleiben
-          for ( i = sizeof(names); i--; )
-            if ( _illegal_closure(pro[names[i], F_VALUE]) ||
-                 _illegal_closure(pro[names[i], F_QUERY_METHOD]) ||
-                 _illegal_closure(pro[names[i], F_SET_METHOD]) )
-              m_delete( pro, names[i] );
-          
-          ({mapping})obj->SetProperties(pro);
-          msg += ", Properties gesetzt";
-        }
-        // Wenn kein UPD_C, wird ggf. das Ergebnis von Configure() wieder
-        // uebergeben.
-        else if (restore_config)
+        // Ggf. Ergebnis von Configure() uebergeben
+        if (restore_config)
         {
           int conf_res;
           if (!catch(conf_res=({int})obj->Configure(configdata); publish)
@@ -517,11 +455,6 @@
   args=parseargs(cmdline,&flags,UPD_OPTS,1);
   if(flags==-1||!sizeof(args))
     return USAGE("upd [-"+UPD_OPTS+"] <datei> [<datei> ..]");
-  if ((flags & UPD_C) && (flags & UPD_CONF))
-  {
-    printf("upd: -c und -C gleichzeitig werden nicht unterstuetzt.\n");
-    return 1;
-  }
   args=file_list(args,MODE_UPD,0,"/");
   if(!sizeof(args)) return printf("upd: Keine passende Datei gefunden!\n"),1;
 
diff --git a/sys/magier.h b/sys/magier.h
index 0f51d1d..820d960 100644
--- a/sys/magier.h
+++ b/sys/magier.h
@@ -56,7 +56,7 @@
 #define RM_M            4            // DateiMASKE beachten
 #define RM_I            8            // Interaktiv loeschen (immer fragen)
 
-#define UPD_OPTS  "afilrmbvcdhsC"
+#define UPD_OPTS  "afilrmbvdhsC"
 #define UPD_A            1           // Alle Instanzen bearbeiten
 #define UPD_F            2           // Alle Instanzen finden und anzeigen
 #define UPD_I            4           // Geerbte Klassen aktualisieren
@@ -67,13 +67,12 @@
                                      // ggf. aktualisieren
 #define UPD_B           64           // Backtrace bei Fehlern
 #define UPD_V          128           // Erbschaftslisten mit ausgeben
-#define UPD_C          256           // Properties erhalten
-#define UPD_D          512           // Objektinhalt komplett destructen
-#define UPD_H         1024           // Hard-Destruct (kein remove())
-#define UPD_S         2048           // Silent
-#define UPD_CONF      4096           // Configure() erzwingen (d.h. kein Update,
+#define UPD_D          256           // Objektinhalt komplett destructen
+#define UPD_H          512           // Hard-Destruct (kein remove())
+#define UPD_S         1024           // Silent
+#define UPD_CONF      2048           // Configure() erzwingen (d.h. kein Update,
                                      // wenn Configure() nicht definiert ist)
-#define UPD_LOAD      8192           // laden, falls nicht geladen (nur
+#define UPD_LOAD      4096           // laden, falls nicht geladen (nur
                                      // intern fuer 'load)
 
 #define CP_OPTS         "vrfmi"