| /************************************************************************************ |
| Vitrine fuer die Pokale |
| Autor: Miril |
| letzte Aenderung: |
| 05.09.2011 |
| ************************************************************************************/ |
| |
| #include <properties.h> |
| #include <defines.h> |
| #include <wizlevels.h> |
| #include "/d/ebene/miril/fraternitas/fraternitas.h" |
| #include "/d/ebene/miril/fraternitas/trophy.h" |
| #pragma strong_types,rtt_checks |
| #include "/d/seher/haeuser/moebel/moebel.h" |
| #include "/d/seher/haeuser/haus.h" |
| |
| inherit LADEN("swift_std_container"); |
| |
| string besitzer; |
| int staub; |
| string *trophynamen; |
| |
| static string my_long(); |
| static string staub_descr(); |
| void GetTrophyDetails(); |
| string *GetAllTrophyNames(); |
| void NeueDetails(); |
| |
| protected void create() |
| { |
| if (!clonep(this_object())){ |
| set_next_reset(-1); |
| return; |
| } |
| set_next_reset(86400); |
| ::create(); |
| besitzer=""; |
| staub=0; |
| SetProp(P_NAME,"Vitrine"); |
| SetProp(P_SHORT,"Eine Vitrine"); |
| Set(P_LONG,#'my_long,F_QUERY_METHOD); |
| SetProp(P_GENDER,FEMALE); |
| SetProp(P_MATERIAL,([MAT_GLASS:50,MAT_EBONY:50])); |
| SetProp(P_VALUE,10000); |
| SetProp(P_WEIGHT,500000); |
| SetProp(P_MAX_OBJECTS,0); |
| SetProp(P_MAX_WEIGHT,0); |
| SetProp(H_FURNITURE,1); |
| SetProp(P_NOGET,"Die Vitrine ist viel zu schwer.\n"); |
| SetProp("cnt_version_obj",2); |
| GetTrophyDetails(); |
| AddId(({"\nmiril_pokal_vitrine","vitrine"})); |
| |
| NeueDetails(); |
| |
| AddCmd(({"saeubere","saeuber","reinige","reinig","mach","mache"}), |
| "saeuber_cmd"); |
| |
| AddCmd(({"stelle","stell"}),"stell_cmd"); |
| RemoveCmd(({"serlaube"})); |
| |
| } |
| |
| void reset(){ |
| ++staub; |
| set_next_reset(86400); |
| ::reset(); |
| return; |
| } |
| |
| void SetBesitzer(string uid,string uuid){ |
| besitzer=uuid; |
| GetTrophyDetails(); |
| return; |
| } |
| |
| string QueryBesitzer(){ |
| return besitzer; |
| } |
| |
| void NeueDetails(){ |
| AddDetail(({"holz","ebenholz"}),BS("Die Vitrine besteht teilweise " |
| "aus Ebenholz. Tueren, Deckel und Einlegeboeden sind aus Glas.")); |
| AddDetail(({"tueren","tuer","glastueren","glastuer","deckel"}),BS( |
| "Durch das Glas kannst Du ins Innere der Vitrine gucken.")); |
| AddDetail(({"inneres","gegenstaende","gegenstand"}), |
| BS("Dort kann man Pokale hineinstellen, aber nicht wieder " |
| "herausnehmen.")); |
| AddDetail(({"glas","scheibe","scheiben"}), |
| BS("Glas ist praktisch, solange es sauber ist: " |
| "Man kann dadurch ins Innere schauen.")); |
| AddDetail(({"reihe","platz","einlegeboeden","einlegeboden","boeden", |
| "boden"}), |
| BS("Die vielen Boeden bieten Platz fuer viele Pokale!")); |
| return; |
| } |
| |
| |
| static string my_long(){ |
| if(staub<21) |
| return BS( |
| "Die schlichte Vitrine aus dunklem Holz eignet sich hervorragend, um " |
| "wertvolle Gegenstaende darin auszustellen. Hinter den beiden Glastueren " |
| "siehst Du eine Reihe von Einlegeboeden, die ebenfalls aus Glas bestehen. "+ |
| staub_descr()); |
| else return BS(staub_descr()); |
| } |
| |
| |
| static string staub_descr(){ |
| string text; |
| text=""; |
| switch(staub){ |
| case 0..1: |
| text= |
| "Die Vitrine ist hervorragend gepflegt. Du siehst keinerlei Staub "+ |
| "darin, und die Scheiben sind voellig klar.\n"; |
| AddDetail(({"staub"}),BS("Keiner zu sehen.")); |
| break; |
| case 2..4: |
| text= |
| "Die Vitrine ist gut gepflegt. Es liegt kaum Staub darin, und die "+ |
| "Tueren sind klar.\n"; |
| AddDetail(({"staub"}),BS("Man sieht nur wenig davon.")); |
| break; |
| case 5..7: |
| text= |
| "Die Vitrine ist in einem ordentlichen Zustand, allerdings sammelt "+ |
| "sich so langsam Staub auf den Einlegeboeden.\n"; |
| AddDetail(({"staub"}),BS("So langsam koennte man die " |
| "Vitrine saeubern!")); |
| AddDetail(({"zustand"}),BS("Noch ist er ordentlich.")); |
| break; |
| case 8..10: |
| text= |
| "Die Vitrine wirkt schon etwas staubig. Man erkennt auch, dass "+ |
| "der ein oder andere Fingerabdruck die Tueren ziert."; |
| AddDetail(({"staub","fingerabdruck","tueren","glastueren", |
| "deckel","glastuer","tuer","zustand"}), |
| BS("Es lohnt sich jetzt schon, die Vitrine zu saeubern.")); |
| break; |
| case 11..15: |
| text= |
| "Du hast den Eindruck, dass die Vitrine langsam einmal gesaeubert "+ |
| "werden koennte. Die Einlegeboeden sind staubig und zahlreiche "+ |
| "Fingerabdruecke sind auf den Glastueren zu sehen."; |
| break; |
| case 16..20: |
| text= |
| "Die Vitrine macht einen recht ungepflegten Eindruck. Innen ist "+ |
| "sie schon sehr verstaubt und auch die Tueren sind schon recht "+ |
| "dreckig geworden."; |
| AddDetail(({"staub"}),BS("Nun wird es aber wirklich Zeit, die " |
| "Vitrine zu saeubern. Sonst sieht man bald nichts mehr darin.")); |
| break; |
| case 21..25: |
| text= |
| "Die Vitrine ist total zugestaubt. Ueber den Glastueren sind "+ |
| "erste Spinnweben zu erkennen und die Scheiben sind schon fast "+ |
| "blind von all den Fingerabdruecken unaufmerksamer Gaeste."; |
| RemoveDetail(m_indices(QueryProp(P_DETAILS))); |
| AddDetail(({"spinnweben","dreck","vitrine","glastueren","glastuer", |
| "tueren","tuer","scheibe","scheiben","deckel"}), |
| "Unter dem ganzen Dreck ist leider nichts mehr zu erkennen.\n"); |
| AddDetail(({"gaeste","gast","fingerabdruck","fingerabdruecke"}), |
| "Die Gaeste sind sicher schuld an dem Dreck.\n"); |
| break; |
| case 26..30: |
| text= |
| "Du kannst die Vitrine unter der dicken Staubschicht kaum noch "+ |
| "erkennen und die Glastueren sind blind geworden."; |
| AddDetail(({"staubschicht","schicht"}), |
| BS("Die ist verdammt dick und undurchsichtig.")); |
| break; |
| default: |
| text= |
| "Dass sich unter dieser Ansammlung von Spinnweben und Staub noch "+ |
| "eine Vitrine mit Glastueren verbergen soll, kannst Du kaum glauben. "+ |
| "Jedenfalls kann man durch die voellig blinden Scheiben nichts "+ |
| "mehr erkennen."; |
| AddDetail(({"dreck","spinnweben","staub","ansammlung"}),"Pfui Deibel!\n"); |
| } |
| return text; |
| } |
| |
| static int saeuber_cmd(string str){ |
| string text; |
| if(!str) return 0; |
| if(strstr(str,"vitrine")<0) return 0; |
| switch(staub){ |
| case 0: |
| write("Das ist noch nicht noetig!\n"); |
| return 1; |
| break; |
| case 1..20: |
| text="Du reinigst die Vitrine gruendlich. Das wurde auch langsam " |
| "Zeit!"; |
| if(getuuid(TP)!=besitzer) |
| text+="Du fragst Dich, wieso Du fremde Moebel reinigst."; |
| |
| write(BS(text)); |
| say(BS(TPN+" reinigt die Vitrine gruendlich. Das wurde auch langsam " |
| "Zeit!\n"),TP); |
| staub=0; //Hier darf noch jemand helfen! |
| break; |
| case 21..30: |
| text="Du beginnst die Vitrine zu reinigen. "; |
| if(getuuid(TP)!=besitzer){ |
| text+="Nach einiger Zeit fragst Du Dich, ob Du eigentlich spinnst, "+ |
| "denn das ist ueberhaupt nicht Deine Vitrine. Du laesst von dem "+ |
| "Vorhaben wieder ab."; |
| say(BS(TPN+" faengt kurz an, die Vitrine zu reinigen, laesst es aber " |
| "schnell wieder sein."),TP); |
| } |
| else{ |
| text+="Das dauert eine ganze Weile, aber dann strahlt die Vitrine " |
| "wieder."; |
| say(BS(TPN+" beginnt die Vitrine zu reinigen. Das dauert eine ganze " |
| "Weile, aber dann strahlt sie wieder."),TP); |
| staub=0; |
| } |
| write(BS(text)); |
| break; |
| default: |
| if(getuuid(TP)!=besitzer) |
| write("Das dreckige Teil fasst Du nicht an!\n"); |
| else{ |
| write(BS( |
| "Du schrubbst und schrubbst und es scheint kein Ende zu nehmen. " |
| "Als Du schon langsam aufgeben willst, ist so langsam ein kleiner " |
| "Erfolg zu sehen. Du nimmst Dir vor, die Vitrine in Zukunft " |
| "haeufiger zu reinigen!")); |
| say(BS( |
| TPN+" schrubbt stundenlang an der Vitrine rum, bis sie endlich " |
| "wieder richtig sauber ist."),TP); |
| staub=0; |
| } |
| } |
| if(staub==0){ |
| RemoveDetail(m_indices(QueryProp(P_DETAILS))); |
| GetTrophyDetails(); |
| NeueDetails(); |
| } |
| return 1; |
| } |
| |
| void GetTrophyDetails(){ |
| string *trophyliste,*shorts; |
| mapping trophydetails; |
| |
| shorts=({}); |
| |
| trophyliste=MIRIL_TROPHYMASTER->GetPlacedTrophies(besitzer); |
| |
| foreach( string tr : trophyliste ) |
| shorts+=({ MIRIL_TROPHYMASTER->GetTrophyShort(tr) }); |
| |
| shorts = sort_array(shorts, #'>); |
| if(!sizeof(shorts)) |
| AddDetail(({"pokale","pokal","in vitrine"}), |
| "Bislang ist die Vitrine noch leer.\n"); |
| else |
| AddDetail(({"pokale","pokal","in vitrine"}), |
| "Du siehst folgende Pokale in der Vitrine:\n" |
| +implode(shorts,".\n")+".\n"); |
| |
| foreach( string tr : trophyliste ) |
| { |
| AddDetail( MIRIL_TROPHYMASTER->GetTrophyIds(tr), |
| BS(MIRIL_TROPHYMASTER->GetTrophyLong(tr))); |
| |
| trophydetails = MIRIL_TROPHYMASTER->GetTrophyDetails(tr); |
| if ( !sizeof(trophydetails) ) |
| continue; |
| foreach ( mixed det, string det_desc : trophydetails ) |
| AddDetail( det, BS(det_desc) ); |
| } |
| return; |
| } |
| |
| string *GetAllTrophyNames(){ |
| int i,anzahl; |
| string *trophynamen; |
| |
| trophynamen=({}); |
| |
| foreach(string bla:MIRIL_TROPHYMASTER->GetTrophyListe()) |
| trophynamen+=MIRIL_TROPHYMASTER->GetTrophyIds(bla); |
| |
| return trophynamen; |
| } |
| |
| static int stell_cmd(string str){ |
| string was,identifier; |
| int resultat; |
| object ob; |
| if(!str) return 0; |
| if(strstr(str,"vitrine")<0) return 0; |
| notify_fail("Das ist nicht Deine Vitrine!\n"); |
| if(getuuid(TP)!=besitzer) |
| return 0; |
| notify_fail("Die Syntax ist: stelle <gegenstand> in vitrine!\n"); |
| if(sscanf(str,"%s in vitrine",was)!=1) |
| return 0; |
| |
| notify_fail("Die Vitrine sollte schon offen sein.\n"); |
| if(QueryProp(P_CNT_STATUS)!=CNT_STATUS_OPEN && !IS_LEARNER(TP)) |
| return 0; |
| notify_fail("Du solltest die Vitrine vorher erstmal saeubern!\n"); |
| if(staub>20) |
| return 0; |
| notify_fail("Das kannst Du leider nicht in die Vitrine stellen!\n"); |
| if(member(GetAllTrophyNames(),lower_case(was))<0 |
| && lower_case(was)!="pokal") |
| return 0; |
| notify_fail("Das hast Du nicht!\n"); |
| if(!ob=present(was,TP)) |
| return 0; |
| notify_fail("Das kannst Du leider nicht in die Vitrine stellen!\n"); |
| if(!ob->id("\nmiril_pokal")) |
| return 0; |
| |
| identifier=ob->QueryIdentifier(); |
| resultat=MIRIL_TROPHYMASTER->PlaceTrophy(getuuid(TP),identifier); |
| |
| notify_fail("Hier stimmt etwas nicht, sag bitte einem Erzmagier Bescheid! " |
| "Resultat="+resultat+"\n"); |
| if(resultat!=1) |
| return 0; |
| write(BS("Du stellst den Pokal in die Vitrine und bewunderst ihn noch ein " |
| "wenig.\n")); |
| say(TPN+" stellt einen Pokal in die Vitrine.\n",TP); |
| GetTrophyDetails(); |
| ob->remove(); |
| if(ob) |
| destruct(ob); |
| return 1; |
| } |
| |