Added public files

Roughly added all public files. Probably missed some, though.
diff --git a/obj/shut.c b/obj/shut.c
new file mode 100644
index 0000000..aa82694
--- /dev/null
+++ b/obj/shut.c
@@ -0,0 +1,377 @@
+/* Shutdown-Daemon -- die Messages muessen wohl nochmal ueberarbeitet werden */
+/*
+ *  04.04.2004   Vanion  die() ueberschrieben, ignorierbar gemacht
+ *  15.01.2000   Tiamak  aufgeraeumt, sicherer gemacht 
+ *  15.02.1998   Wargon  Armageddon teilt einem die Restzeit mit
+ *  07.01.1998         Rumata  IS_ELDER ausgebaut.
+ *
+ *  23.07.1997         17.00         Yantro
+ *    Ich hab mal die shouts Zeitabhaengig gemacht, also sie sollten
+ *    heftiger werden mit Annaeherung an den Reboot. Deswegen gibt
+ *    es nun 4 arrays mit messages und die Entsprechende Aufrufaenderung
+ *    in ArmasShout()
+ */
+
+#pragma combine_strings
+#pragma strong_types
+#pragma strict_types
+#pragma no_inherit
+#pragma no_clone
+#pragma no_shadow
+
+inherit "std/npc";
+
+#define S_PRESAY 1
+#define S_IGNORE 2
+
+#include <properties.h>
+#include <defines.h>
+#include <language.h>
+#include <moving.h>
+#include "/secure/wizlevels.h"
+
+#define messages1 ({ \
+  "Wolken ballen sich am Himmel. Es scheint wohl ein Unwetter aufzuziehen. " \
+  "Du hast ein ungutes Gefuehl in Deiner Haut.", \
+  "Aus der Ferne hoerst Du ein Donnern ... ob das ein Gewitter ist?", \
+  "Wolken ziehen schnell vorbei und verdunkeln die Sonne und die Sterne. " \
+  "Dies scheint keines der normalen Unwetter zu sein, die Du schon erlebt " \
+  "hast.", \
+  "Das ferne Rauschen der Baeche und Fluesse wird lauter. Die Wassermassen " \
+  "scheinen nicht mehr kontrolliert zu fliessen und Du bekommst Angst!", \
+  "Der Himmel faerbt sich violett. Das Unwetter scheint gewaltiger zu " \
+  "werden als sonst. Dir laeuft ein Schauer ueber den Ruecken." \
+  })
+
+#define messages2 ({ \
+  "Die Wolken verdunkeln den Himmel. Es wird ueberall duester in der Welt " \
+  "und Du kannst kaum noch erkennen, was um Dich herum geschieht.", \
+  "Ein starker Wind weht durch alle Gegenden und zerrt an allem, was nicht " \
+  "fest ist. Hoffentlich wird das nicht noch schlimmer.", \
+  "Regen prasselt ueberall nieder und fuellt die Baeche und Seen, die das " \
+  "Wasser aber kaum noch halten koennen. Du versucht eine trockene Stelle " \
+  "zu finden.", \
+  "Der Himmel ist fast schwarz. Der Regen faellt in einer Menge, als haetten " \
+  "alle Schleusen der Welt geoeffnet, um sie fuer immer zu ertraenken.", \
+  "Die Luft scheint zu knistern! Das Ende des Unwetters ist sicher noch nicht "\
+  "in Sicht. Elektrizitaet entlaedt sich im Himmel zwischen den Wolken. " \
+  "Was fuer ein Lichtspiel!", \
+  "Blitz und Donner hallen durch die Welt. Es scheint keine Stelle zu geben, " \
+  "an der man sicher sein kann." \
+  })
+
+#define messages3 ({ \
+  "Du siehst, wie die Einwohner der Welt versuchen, sich panisch vor dem " \
+  "Unwetter zu retten, aber es ist fuer sie zu spaet.", \
+  "Blitze nie gesehener Gewalt schlagen rund um Dich ein. Feuer flammen auf " \
+  "und scheinen alles verbrennen zu wollen, was um Dich herum existiert.", \
+  "Dicke Wolken tuermen sich immer weiter auf und scheinen Dich erdruecken zu "\
+  "wollen. Sie sind nicht mehr schwarz, sondern blutrot wie das Wasser, was " \
+  "sie von sich geben.", \
+  "Die Fluesse und Meere der Welt treten ueber ihre Ufer und zerstoeren alles "\
+  "Leben. Das Wasser hat sich zu Blut gewandelt! Um Dich herum wird alles " \
+  "rot!", \
+  "Der Donner grollt mit roher Gewalt durch die Welt. Die Schallwellen " \
+  "schlagen mit aller Kraft gegen die Gebirge und scheinen sie reizen zu " \
+  "wollen. Du kriegst Angst!", \
+  "Der Regen faerbt sich rot! Das ist kein Wasser mehr, sondern Blut, was da " \
+  "auf Dich herabregnet. Dir schwinden kurz die Sinne beim Gedanken an das, " \
+  "was noch kommen mag." \
+  })
+
+#define messages4 ({ \
+  "Das Blut des Regens scheint Dich fortzuschwemmen. Ueberall ist das Blut " \
+  "ueber die Ufer getreten und sucht sich seinen toedlichen Weg.", \
+  "Die Vulkane der Welt brechen aus und die Lava verbrennt alles, was sich " \
+  "ihr in den Weg stellt. Sie bringt das Blut zum Verdampfen und erfuellt " \
+  "alles mit ihrer zerstoererischen, grausamen Hitze.", \
+  "Ploetzlich ist alles mit Feuer und Hitze erfuellt. Die Meere und " \
+  "Fluesse verdampfen und der Dampf treibt heiss ueber die Welt, um alles " \
+  "zu verbruehen, was sich nicht schuetzt!", \
+  "Von ueberall hoerst Du Schreie und Du erkennst panische Angst in den " \
+  "Augen der Eingeborenen. Elendig verenden sie in der Hitze zwischen Feuer " \
+  "und Lava. Dir wird uebel.", \
+  "Um Dich herum siehst Du nur brennende Truemmer. Die Welt scheint vor " \
+  "ihrem Untergang, denn ueberall oeffnet sich der Boden und spuckt Feuer. " \
+  "Heisses Magma quillt aus ihm heraus und mischt sich zischend mit dem Blut " \
+  "der Meere. Es gibt nun sicher kein Entrinnen mehr.", \
+  "Du kannst Dich kaum noch halten. Erdbeben erschuettern alles um Dich " \
+  "herum. Ueberall kannst Du nur noch Truemmer erkennen, wo einmal Haeuser " \
+  "standen. Alles ist erfuellt vom Geruch des Todes!" \
+  })
+
+static int restzeit;
+static string *ignorierer = ({});
+
+static int _query_restzeit() { return restzeit + find_call_out("NextStep"); }
+static string *_query_ignore() { return ignorierer; }
+
+public varargs void die(int poisondeath,int extern)
+{
+  object tp;
+  object room;
+
+  if (objectp(room=environment(this_object())))
+    if (!objectp(tp=this_player()))
+      tell_room(room,"Armageddon kratzt sich ratlos am Kopf.\n");
+    else 
+      tell_room(room,
+        "Armageddon sagt: Ich weigere mich, einfach so zu sterben, "+
+        (tp->Name())+".\n");
+  return;
+}
+
+status access_check() {
+    //wer darf rebooten?
+
+    //in einem process_string() gar nicht.
+    if (process_call()) return(0);
+
+    //Master darf natuerlich. (->slow_shut_down(), vom Driver bei
+    //Speicherknappheit gerufen.)
+    if (previous_object() && 
+        previous_object()==find_object(__MASTER_OBJECT__))
+        return(1);
+
+    // rebooten duerfen ansonsten nur [W]+
+    if ( ELDER_SECURITY) {
+        return(1);
+    }
+
+    //andere nicht.
+    return(0);
+}
+
+public void create()
+{    
+    ::create();
+    
+    SetProp( P_NAME, "Armageddon" );
+    SetProp( P_GENDER, MALE );
+    SetProp( P_SHORT, "Armageddon, der Weltenvernichter" );
+    AddId( "armageddon" );
+    set_living_name( "armageddon" );
+    SetProp( P_ARTICLE, 0 );
+    SetProp( P_XP, 0 );
+    SetProp( P_NO_ATTACK,
+             "Armageddon grinst: Dein Ende kommt noch frueh genug!\n" );
+
+    if (!access_check()) {
+        destruct(this_object());
+        raise_error("Armageddon darf nur von W+ aktiviert werden!");
+    }
+}
+
+
+static varargs string text_time( int sec, int flag )
+{
+    string s;
+    int tage, stunden, minuten, sekunden;
+
+    sekunden = sec;
+    tage = sekunden / 86400;
+    stunden = (sekunden % 86400) / 3600;
+    minuten = (sekunden % 3600) / 60;
+    sekunden = sec % 60;
+    s = "";
+    
+    if ( sec >= 86400 )
+        s += tage + " Tag" + (tage == 1 ? ", " : (flag ? "en, " : "e, "));
+    
+    if ( sec >= 3600 )
+        s += stunden + " Stunde" + (stunden == 1 ? ", " : "n, ");
+    
+    if ( sec >= 60 )
+        s += minuten + " Minute" + (minuten == 1 ? "" : "n");
+    
+    s += (sec/60 ? " und " : " ") + sekunden + " Sekunde" +
+        (sekunden == 1 ? "" : "n");
+    
+    return s;
+}
+
+
+public string _query_long()
+{
+    return break_string( "Dies ist Armageddon, der Weltenvernichter. Als Du "
+                         "ihn ansiehst, blickt er auf und fluestert Dir zu: "
+                         "Noch " + text_time(_query_restzeit()) +
+                         " muessen vergehen, ehe ich die Welt vernichte.", 78 );
+}
+
+
+public string _query_short()
+{
+    return "Armageddon, der Weltenvernichter";
+}
+
+
+public int shut( mixed minutes )
+{
+    int a, b, c;
+
+    if (!access_check()) {
+        destruct(this_object());
+        raise_error("Armageddon darf nur von W+ aktiviert werden!");
+        return(-1);   //never reached
+    }
+    
+    a = b = c = 0;
+    move( "/gilden/abenteurer", M_GO );
+    
+    if ( intp(minutes) )
+        c = minutes;
+    else if ( stringp(minutes) ){
+        if ( sscanf( minutes, "%d:%d:%d", a, b, c ) == 3 )
+            c += b * 60 + a * 24 * 60;
+        else if( sscanf( minutes, "%d:%d", b, c) == 2 )
+            c += b * 60;
+        else if( sscanf( minutes, "%d", c ) != 1 )
+            return -2;
+    }
+    else {
+      destruct(ME);
+      raise_error("Illegal argument type to shut()\n");
+    }
+
+    while ( remove_call_out("NextStep") >= 0 )
+        ;
+    
+    restzeit = c * 60;
+    call_out( "NextStep", 0, restzeit );
+    return restzeit;
+}
+
+// Schickt die Meldung str an alle Spieler, die Armageddon nicht ignorieren
+// Flags: S_IGNORE - Shout kann von Spielern ignoriert werden.
+//        S_PRESAY - Es wird ein "Armageddon ruft:" vorangestellt.
+static void SHOUT( string str, int flags )
+{
+   if (flags&S_PRESAY)
+     str = break_string(str, 78, "Armageddon ruft: ");
+   else
+     str = break_string(str, 78);
+     
+   if (flags&S_IGNORE)
+     filter(
+       users()-filter_objects(users(),"TestIgnore",({"armageddon"}))
+              -map(ignorierer, #'find_player),
+       #'tell_object, str);
+   else
+     filter( users(), #'tell_object, str);
+}
+
+
+static void NextStep( int seconds )
+{
+    int neu;
+
+    if ( seconds <= 0 ){
+        SHOUT( "Ich starte das Spiel jetzt neu !", S_PRESAY);
+        shutdown("");
+        return;
+    }
+    
+    if ( seconds <= 600 )
+      SHOUT( "Teile mir mit, wenn Du in den Laden gebracht werden willst!", 
+              S_PRESAY|S_IGNORE);
+    
+    if ( seconds > 2 * 86400 )
+        neu = seconds - 5 * 3600;
+    else if ( seconds > 4800 )
+        neu = seconds - 1800;
+    else
+        neu = seconds * 3 / 4 - 10;
+    
+    restzeit = neu;
+    call_out( "NextStep", seconds-neu, neu );
+    
+    SHOUT( "In " + text_time( seconds, 1 ) + " werde ich die Welt "
+           "zerstoeren und neu erschaffen!", S_PRESAY|S_IGNORE);
+    
+    if ( neu < 900 && find_call_out("ArmasShout") == -1 )
+        call_out( "ArmasShout", random(60)+10 );
+}
+
+
+static void ArmasShout()
+{
+    int dauer;
+    
+    dauer = _query_restzeit();
+    call_out( "ArmasShout", 40+random(40) );
+    
+    if ( 701 < dauer )
+        SHOUT( messages1[ random(sizeof(messages1))], S_IGNORE);
+    else if ( 501 < dauer )
+        SHOUT( messages2[ random(sizeof(messages2))], S_IGNORE);
+    else if ( 251 < dauer )
+        SHOUT( messages3[ random(sizeof(messages3))], S_IGNORE);
+    else
+        SHOUT( messages4[ random(sizeof(messages4))], S_IGNORE);
+}
+
+
+public void catch_tell( string str )
+{
+    string who, what;
+    object ob;
+
+    if ( sscanf( str, "%s teilt Dir mit: %s", who, what ) != 2 ||
+         !this_player() )
+        return;
+    
+    // Ein Spieler will fuer dieses Reboot ignoriert werden, oder
+    // das Ignoriere soll aufgehoben werden.
+    if (lower_case(what)[0..<2]=="ruhe"){
+      if (member(ignorierer, getuid(this_player()))>-1)
+      {
+         ignorierer -= ({ getuid(this_player()) });
+         tell_object( this_player(), break_string(
+          "Gut, ich notier's mir. Ab nun hast Du wieder am grossen Showdown "
+          "teil. Viel Spass dabei.\n", 78, "Armageddon teilt Dir mit: "));
+      } else {
+         ignorierer += ({ getuid(this_player()) });
+         tell_object( this_player(), break_string(
+          "Gut, ich notier's mir. Der Weltuntergang soll Dich beim Spielen "
+          "nicht weiter stoeren.\n", 78, "Armageddon teilt Dir mit: "));
+      }
+      return;
+    }
+   
+    // In den Laden
+    if ( _query_restzeit() < 600 ){
+        this_player()->move( "/d/ebene/room/PortVain/laden", M_TPORT );
+        return;
+    }
+    
+    tell_object( this_player(),
+                 break_string( "Es ist noch zu frueh! Probier es 10 Minuten "
+                               "vor dem Ende nochmal!\nIn " +
+                               text_time( _query_restzeit(), 1 ) +
+                               " ist es soweit!", 78,
+                               "Armageddon teilt Dir mit: ", 1 ) );
+    return;
+}
+
+
+public varargs int remove()
+{
+    write( "Armageddon will nicht removed werden!\n" );
+    return 0;
+}
+
+
+public int do_damage( int dam, object enemy )
+{
+    return 0;
+}
+
+// Nicht jeder Magier darf Armageddon destructen.
+string NotifyDestruct(object caller) {
+    if( (caller!=this_object() && !ELDER_SECURITY) || process_call() ) {
+      return "Du darfst Armageddon nicht zerstoeren!\n";
+    }
+    return 0;
+}
+