blob: ae5bb96299088c90ad8a821cd9009156e4953361 [file] [log] [blame]
/************************************************************************************
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;
}