| /* 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; |
| } |
| |