Added public files

Roughly added all public files. Probably missed some, though.
diff --git a/p/daemon/tmp_prop_master.c b/p/daemon/tmp_prop_master.c
new file mode 100644
index 0000000..0ce1de7
--- /dev/null
+++ b/p/daemon/tmp_prop_master.c
@@ -0,0 +1,338 @@
+#pragma strong_types,save_types
+#pragma no_clone,no_shadow
+
+#include <thing/properties.h>
+
+#define SAVEFILE "/p/daemon/save/tmp_prop_master"
+#define PROPMASTER "/p/daemon/tmp_prop_master"
+#define INDEX(a,b) (object_name(a)+"##"+b)
+
+
+#ifdef DEBUG
+#   undef DEBUG
+#endif
+
+#ifdef DEBUG
+#   define DBG(x) if ( find_player("rikus") ) \
+                     tell_object( find_player("rikus"), x );
+#else
+#   define DBG(x)
+#endif
+
+
+mixed *reset_times;
+mapping in_progress;
+
+
+varargs public int remove( int silent );
+public void reset();
+public void print_debug_info();
+static void call_next_update();
+static void do_update();
+public int IsTmpProp( object ob, string prop );
+public void RemoveTmpProp( string prop );
+varargs public void SetTmpProp( object ob, string prop, mixed newval,
+                                int tm, int sp );
+
+
+public void create()
+{
+
+    seteuid(getuid(this_object()));
+    
+    if ( !restore_object(SAVEFILE) ){
+        in_progress = ([]);
+        reset_times = ({});
+    }
+
+    call_next_update();
+}
+
+
+varargs public int remove( int silent )
+{
+    save_object(SAVEFILE);
+    destruct(this_object());
+    
+    return 1;
+}
+
+
+public void reset()
+{
+    save_object(SAVEFILE);
+}
+
+
+public void print_debug_info()
+{
+    printf( "in_progress: %O\nreset_times: %O\n", in_progress, reset_times );
+}
+
+
+static void call_next_update()
+{
+    int dt;
+    
+    while ( remove_call_out("do_update") != -1 )
+        ;
+    
+    if ( sizeof(reset_times) ){
+        dt = reset_times[0][0] - time();
+
+        if ( dt <= 0 )
+            dt = 5;
+        
+        call_out( "do_update", dt );
+    }
+}
+
+
+static void do_update()
+{
+    int i, max;
+    string index;
+    mixed *val;
+
+    DBG( "do_update() aufgerufen!\n" );
+
+    while ( remove_call_out("do_update") != -1 )
+        ;
+    
+    call_out( "do_update", 30 ); // Zur Sicherheit...
+
+    if ( !(max = sizeof(reset_times)) )
+        return;
+    
+    for ( i = 0; i < max && reset_times[i][0] <= time(); i++ ){
+        index = reset_times[i][1];
+
+        if ( !pointerp(val = in_progress[index]) || !objectp(val[0]) )
+	{
+            m_delete( in_progress ,index );
+            continue;
+        }
+
+        DBG( sprintf("Entferne Eintrag %O!\n", index) );
+
+        if ( val[4] ){
+            if ( val[0]->Query(val[1], F_VALUE) == val[3] ){
+                DBG( "Alte Property per SetProp() restauriert!\n" );
+                val[0]->SetProp( val[1], val[2] );
+            }
+        }
+        else {
+            if ( val[0]->Query( val[1], F_QUERY_METHOD ) == val[2] ){
+                val[0]->Set( val[1], 0, F_QUERY_METHOD );
+                DBG( "F_QUERY_METHOD entfernt!\n" );
+            }
+            
+            if ( val[0]->Query( val[1], F_SET_METHOD ) == val[3] ){
+                val[0]->Set( val[1], 0, F_SET_METHOD );
+                DBG( "F_SET_METHOD entfernt!\n" );
+            }
+        }
+
+        m_delete( in_progress ,index );
+    }
+    
+    reset_times = reset_times[i..];
+    call_next_update();
+}
+
+
+// Zur Abfrage, ob eine temporaere Property schon gesetzt ist
+public int IsTmpProp( object ob, string prop )
+{
+    mixed oldval;
+
+    if ( !objectp(ob) || !prop )
+        return 0;
+    
+    if ( (oldval = in_progress[INDEX(ob, prop)])
+         && ob == oldval[0] && prop == oldval[1] )
+        return 1;
+    
+    return 0;
+}
+
+
+// Entfernen einer temporaeren Property.
+// Ist nicht zum Entfernen per Hand gedacht, sondern kann nur vom Objekt selber
+// aufgerufen werden. Geschieht, wenn bei gesetzter temporaerer F_SET_METHOD
+// ein fremdes SetProp() auf die Property kommt.
+public void RemoveTmpProp( string prop )
+{
+    string index;
+    mixed *val;
+    int i;
+    
+    DBG( "RemoveTmpProp!\n");
+    if ( !previous_object() || !stringp(prop) || !sizeof(prop) )
+        return;
+
+    index = INDEX(previous_object(), prop);
+    DBG( sprintf("RemoveTmpProp(%O)!\n", index) );
+
+    if ( !(val = in_progress[index]) ){
+        DBG( "Kein Eintrag vorhanden!\n" );
+        return;
+    }
+
+    if ( objectp(val[0]) ){
+        DBG( "Restauriere alten Zustand ...\n" );
+
+        if ( val[4] ){
+            if ( val[0]->Query(val[1], F_VALUE) == val[3] ){
+                DBG( "Alte Property per SetProp() restauriert!\n" );
+                val[0]->SetProp( val[1], val[2] );
+            }
+        }
+        else {
+            if ( val[0]->Query( val[1], F_QUERY_METHOD ) == val[2] ){
+                val[0]->Set( val[1], 0, F_QUERY_METHOD );
+                DBG( "F_QUERY_METHOD entfernt!\n" );
+            }
+            
+            if ( val[0]->Query( val[1], F_SET_METHOD ) == val[3] ){
+                val[0]->Set( val[1], 0, F_SET_METHOD );
+                DBG( "F_SET_METHOD entfernt!\n" );
+            }
+        }
+    }
+
+    for ( i = sizeof(reset_times); i--; )
+        if ( reset_times[i][1] == index ){
+            reset_times[i..i] = ({});
+            break;
+        }
+    
+    DBG( "Eintrag entfernt!\n" );
+    m_delete( in_progress, index );
+}
+
+
+// Property 'prop' im Objekt 'ob' fuer 'tm' Sekunden auf Wert 'newval' setzen.
+// Wenn der Schalter 'sp' gesetzt ist, wird dafuer SetProp() verwendet,
+// anstatt eine F_QUERY_METHOD zu benutzen.
+//
+// ACHTUNG:
+//
+// Das Setzen von 'sp' ist hoechst fehleranfaellig und sollte nur in wenigen
+// Spezialfaellen geschehen, in denen eine SET-Methode aufgerufen werden muss
+// (wie bei P_LIGHT z.B.). Ansonsten bitte den Default-Aufruf ohne 'sp'
+// verwenden!
+// 
+// Es besteht sonst die Gefahr, dass die Property nicht korrekt zurueckgesetzt
+// wird (wenn dieser Master oder 'ob' zerstoert wird - oder beides wie bei einem
+// Crash) oder dass durch Wechselwirkungen mit anderen Query- oder Set-Methoden
+// ein falscher Wert "restauriert" wird.
+
+varargs public void SetTmpProp( object ob, string prop, mixed newval,
+                                int tm, int sp )
+{
+    string index;
+    mixed oldval, tmp;
+    int max, pos, l, r;
+    closure a, b;
+
+    if ( !objectp(ob) || !stringp(prop) || !sizeof(prop) || tm <= 0 )
+        return;
+
+    index = INDEX(ob, prop);
+    DBG( sprintf("SetTmpProp( %O, %O, %O, %O, %O )!\n", ob, prop, newval,
+                 tm, sp) );
+
+    // wenn bereits ein temporaerer Prozess laeuft, diesen nun beenden!
+    if ( (oldval = in_progress[index])
+         && ob == oldval[0] && prop == oldval[1] ){
+        DBG( "Es laeuft bereits ein Vorgang fuer diese Property!\n" );
+        
+        // Wurde die alte temporaere Property per SetProp() gesetzt, muss der
+        // urspruengliche Wert erst restauriert werden. 
+        if ( oldval[4] ){
+            if ( oldval[0]->Query(oldval[1], F_VALUE) == oldval[3] ){
+            DBG( "Alte Property per SetProp() restauriert!\n" );
+            oldval[0]->SetProp( oldval[1], oldval[2] );
+            }
+        }
+        // Ansonsten einfach die F_QUERY- und F_SET_METHOD loeschen.
+        else {
+            if ( oldval[0]->Query( oldval[1], F_QUERY_METHOD ) == oldval[2] ){
+                oldval[0]->Set( oldval[1], 0, F_QUERY_METHOD );
+                DBG( "F_QUERY_METHOD entfernt!\n" );
+            }
+
+            if ( oldval[0]->Query( oldval[1], F_SET_METHOD ) == oldval[3] ){
+                oldval[0]->Set( oldval[1], 0, F_SET_METHOD );
+                DBG( "F_SET_METHOD entfernt!\n" );
+            }
+        }
+        
+        for ( l = sizeof(reset_times); l--; )
+            if ( reset_times[l][1] == index ){
+                reset_times[l..l] = ({});
+                DBG( "Timer-Eintrag entfernt!\n" );
+                break;
+            }
+    }
+
+    if ( tm < 1000000 )
+        tm += time();
+
+    if ( tm < time() )
+        return;
+
+    if ( !sp ){
+        // Default: F_QUERY_METHOD setzen
+        oldval = ob->Set( prop, newval,  F_QUERY_METHOD );
+
+        // F_SET_METHOD, damit die temporaere Property keinen zwischenzeitlich
+        // gesetzten anderen Wert wieder "restauriert".
+
+        a=symbol_function("RemoveTmpProp",this_object());
+        b=symbol_function("SetProp",ob);
+        tmp=ob->Set(prop,lambda(({'set_value,'prop_name}),({#',,({a,'prop_name}),({#'return,({b,'prop_name,'set_value})})})),F_SET_METHOD);
+    }
+    else{
+        // Fuer Spezialfaelle (P_LIGHT z.B.) wird die Property direkt mit
+        // SetProp() gesetzt und spaeter mit dem alten Wert restauriert.
+        // Achtung - extrem fehleranfaellig und wirklich nur fuer Spezialfaelle!
+
+        // Alten Wert mit Query() sichern anstatt mit QueryProp(), um nicht
+        // irgendwelchen F_QUERY_METHODs auf den Leim zu gehen.
+        oldval = ob->Query( prop, F_VALUE );
+
+        // Rueckgabewert des SetProp() speichern, um spaeter erkennen zu
+        // koennen, ob die Property zwischenzeitlich veraendert wurde.
+        tmp = ob->SetProp( prop, newval );
+    }
+
+    in_progress[index] = ({ ob, prop, oldval, tmp, sp });
+    
+    if ( !(max = sizeof(reset_times)) )
+        pos = 0;
+    else{
+        l = 0;
+        r = max - 1;
+        
+        while ( l < r ){
+            pos = (l + r) / 2;
+            
+            if ( tm < reset_times[pos][0] )
+                r = --pos;
+            else
+                l = ++pos;
+        }
+        
+        while ( pos >= 0 && pos < max && tm < reset_times[pos][0] )
+            pos--;
+    }
+    
+    reset_times = reset_times[0..pos] + ({ ({tm, index}) })
+        + reset_times[pos+1..];
+
+    DBG( sprintf("Property an Stelle %O eingefuegt!\n", pos+1) );
+
+    call_next_update();
+}